From: Tom Hughes Date: Sun, 12 Feb 2017 15:04:50 +0000 (+0000) Subject: Merge remote-tracking branch 'openstreetmap/pull/1030' into next X-Git-Tag: live~3617^2~4 X-Git-Url: https://git.openstreetmap.org/rails.git/commitdiff_plain/043d29fd7eb72048cf5d07edfbc20ec5c25af708?hp=6b0451124c0fe1cb7275ce973a069a125386558e Merge remote-tracking branch 'openstreetmap/pull/1030' into next --- diff --git a/.mailmap b/.mailmap index c576a560f..e4c19a34c 100644 --- a/.mailmap +++ b/.mailmap @@ -5,4 +5,5 @@ Grant Slater Harry Wood Kai Krueger Michael Glanznig +Petr Kadlec Richard Fairhurst diff --git a/.rubocop.yml b/.rubocop.yml index 19403fed5..477b2ab02 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -1,21 +1,51 @@ inherit_from: .rubocop_todo.yml AllCops: - RunRailsCops: true + Include: + - '**/*.gemspec' + - '**/*.podspec' + - '**/*.jbuilder' + - '**/*.rake' + - '**/*.opal' + - '**/config.ru' + - '**/Gemfile' + - '**/Rakefile' + - '**/Capfile' + - '**/Guardfile' + - '**/Podfile' + - '**/Thorfile' + - '**/Vagrantfile' + - '**/Berksfile' + - '**/Cheffile' + - '**/Vagabondfile' + - '**/Fastfile' + - '**/*.builder' + +Rails: + Enabled: true Style/BracesAroundHashParameters: EnforcedStyle: context_dependent +Style/ExtraSpacing: + AllowForAlignment: true + Style/FileName: Exclude: - 'script/deliver-message' - 'script/locale/reload-languages' - 'script/update-spam-blocks' +Style/IfInsideElse: + Enabled: false + Style/GlobalVars: Exclude: - 'lib/quad_tile/extconf.rb' - + +Style/GuardClause: + Enabled: false + Style/HashSyntax: EnforcedStyle: hash_rockets Exclude: @@ -24,3 +54,11 @@ Style/HashSyntax: Style/StringLiterals: EnforcedStyle: double_quotes + +Rails/HttpPositionalArguments: + Enabled: false + +Rails/SkipsModelValidations: + Exclude: + - 'db/migrate/*.rb' + - 'app/controllers/user_controller.rb' diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index e1b70a2d8..a7b456aec 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -1,5 +1,6 @@ -# This configuration was generated by `rubocop --auto-gen-config` -# on 2015-06-08 15:55:30 +0100 using RuboCop version 0.32.0. +# This configuration was generated by +# `rubocop --auto-gen-config` +# on 2016-10-20 21:45:27 +0100 using RuboCop version 0.44.1. # The point is for the user to remove these configuration records # one by one as the offenses are removed from the code base. # Note that changes in the inspected code, or installation of new @@ -7,28 +8,54 @@ # Offense count: 34 Lint/AmbiguousOperator: - Enabled: false + Exclude: + - 'test/controllers/amf_controller_test.rb' + - 'test/controllers/changeset_controller_test.rb' + - 'test/lib/bounding_box_test.rb' + - 'test/lib/country_test.rb' -# Offense count: 115 +# Offense count: 117 Lint/AmbiguousRegexpLiteral: Enabled: false # Offense count: 30 # Configuration parameters: AllowSafeAssignment. Lint/AssignmentInCondition: - Enabled: false + Exclude: + - 'app/controllers/application_controller.rb' + - 'app/controllers/geocoder_controller.rb' + - 'app/controllers/notes_controller.rb' + - 'app/controllers/trace_controller.rb' + - 'app/controllers/user_controller.rb' + - 'app/controllers/user_preference_controller.rb' + - 'app/helpers/application_helper.rb' + - 'app/helpers/browse_helper.rb' + - 'app/models/client_application.rb' + - 'app/models/notifier.rb' + - 'lib/nominatim.rb' + - 'lib/osm.rb' + - 'script/deliver-message' # Offense count: 5 Lint/HandleExceptions: - Enabled: false + Exclude: + - 'app/controllers/amf_controller.rb' + - 'app/controllers/user_controller.rb' + - 'config/initializers/session.rb' -# Offense count: 8 -Lint/ParenthesesAsGroupedExpression: - Enabled: false +# Offense count: 2 +Lint/ShadowingOuterLocalVariable: + Exclude: + - 'app/views/changeset/list.atom.builder' -# Offense count: 669 +# Offense count: 630 Metrics/AbcSize: - Max: 277 + Max: 271 + +# Offense count: 35 +# Configuration parameters: CountComments. +Metrics/BlockLength: + Max: 295 # Offense count: 12 Metrics/BlockNesting: @@ -37,18 +64,19 @@ Metrics/BlockNesting: # Offense count: 62 # Configuration parameters: CountComments. Metrics/ClassLength: - Max: 1653 + Max: 1660 -# Offense count: 67 +# Offense count: 69 Metrics/CyclomaticComplexity: Max: 20 -# Offense count: 2537 -# Configuration parameters: AllowURI, URISchemes. +# Offense count: 2826 +# Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives. +# URISchemes: http, https Metrics/LineLength: - Max: 694 + Max: 962 -# Offense count: 623 +# Offense count: 612 # Configuration parameters: CountComments. Metrics/MethodLength: Max: 179 @@ -56,81 +84,133 @@ Metrics/MethodLength: # Offense count: 1 # Configuration parameters: CountComments. Metrics/ModuleLength: - Max: 126 + Max: 147 # Offense count: 4 # Configuration parameters: CountKeywordArgs. Metrics/ParameterLists: Max: 9 -# Offense count: 69 +# Offense count: 71 Metrics/PerceivedComplexity: Max: 23 # Offense count: 2 # Configuration parameters: Include. +# Include: app/**/*.rb, config/**/*.rb, lib/**/*.rb +Rails/Exit: + Exclude: + - 'lib/**/*.rake' + - 'lib/daemons/gpx_import.rb' + +# Offense count: 2 +# Configuration parameters: Include. +# Include: app/models/**/*.rb Rails/HasAndBelongsToMany: - Enabled: false + Exclude: + - 'app/models/changeset.rb' + - 'app/models/user.rb' -# Offense count: 67 +# Offense count: 5 +# Configuration parameters: Include. +# Include: db/migrate/*.rb +Rails/NotNullColumn: + Exclude: + - 'db/migrate/002_cleanup_osm_db.rb' + - 'db/migrate/020_populate_node_tags_and_remove.rb' + - 'db/migrate/021_move_to_innodb.rb' + - 'db/migrate/025_add_end_time_to_changesets.rb' + - 'db/migrate/20120404205604_add_user_and_description_to_redaction.rb' + +# Offense count: 17 +Rails/OutputSafety: + Exclude: + - 'app/controllers/user_controller.rb' + - 'app/helpers/application_helper.rb' + - 'app/helpers/changeset_helper.rb' + - 'app/helpers/geocoder_helper.rb' + - 'app/helpers/note_helper.rb' + - 'app/helpers/open_graph_helper.rb' + - 'app/helpers/user_blocks_helper.rb' + - 'app/helpers/user_roles_helper.rb' + - 'lib/rich_text.rb' + - 'test/helpers/application_helper_test.rb' + +# Offense count: 74 # Configuration parameters: EnforcedStyle, SupportedStyles. +# SupportedStyles: strict, flexible Rails/TimeZone: Enabled: false # Offense count: 5 Style/AccessorMethodName: - Enabled: false + Exclude: + - 'app/controllers/application_controller.rb' + - 'app/helpers/title_helper.rb' + - 'app/models/old_way.rb' + - 'lib/osm.rb' + - 'lib/potlatch.rb' # Offense count: 1 Style/AsciiComments: - Enabled: false + Exclude: + - 'test/models/message_test.rb' -# Offense count: 308 +# Offense count: 220 Style/Documentation: Enabled: false -# Offense count: 38 -# Configuration parameters: MinBodyLength. -Style/GuardClause: - Enabled: false +# Offense count: 1 +# Cop supports --auto-correct. +# Configuration parameters: MaxLineLength. +Style/IfUnlessModifier: + Exclude: + - 'app/controllers/way_controller.rb' # Offense count: 60 # Cop supports --auto-correct. Style/LineEndConcatenation: - Enabled: false - -# Offense count: 69 + Exclude: + - 'db/migrate/008_remove_segments.rb' + - 'db/migrate/020_populate_node_tags_and_remove.rb' + - 'db/migrate/023_add_changesets.rb' + - 'lib/bounding_box.rb' + - 'lib/diff_reader.rb' + - 'lib/osm.rb' + - 'test/controllers/changeset_controller_test.rb' + - 'test/controllers/node_controller_test.rb' + - 'test/controllers/relation_controller_test.rb' + - 'test/controllers/way_controller_test.rb' + +# Offense count: 71 # Cop supports --auto-correct. Style/NumericLiterals: MinDigits: 11 -# Offense count: 42 -# Cop supports --auto-correct. -Style/PerlBackrefs: - Enabled: false - # Offense count: 8 -# Configuration parameters: NamePrefix, NamePrefixBlacklist. +# Configuration parameters: NamePrefix, NamePrefixBlacklist, NameWhitelist. +# NamePrefix: is_, has_, have_ +# NamePrefixBlacklist: is_, has_, have_ +# NameWhitelist: is_a? Style/PredicateName: - Enabled: false + Exclude: + - 'spec/**/*' + - 'app/models/changeset.rb' + - 'app/models/old_node.rb' + - 'app/models/old_relation.rb' + - 'app/models/old_way.rb' + - 'app/models/user.rb' + - 'lib/classic_pagination/pagination.rb' # Offense count: 97 -# Configuration parameters: EnforcedStyle, SupportedStyles. -Style/RaiseArgs: - Enabled: false - -# Offense count: 2 -Style/RescueModifier: - Enabled: false - -# Offense count: 8 # Cop supports --auto-correct. # Configuration parameters: EnforcedStyle, SupportedStyles. -Style/StringLiteralsInInterpolation: +# SupportedStyles: compact, exploded +Style/RaiseArgs: Enabled: false # Offense count: 2 # Cop supports --auto-correct. -# Configuration parameters: ExactNameMatch, AllowPredicates, AllowDSLWriters, IgnoreClassMethods, Whitelist. -Style/TrivialAccessors: - Enabled: false +Style/RescueModifier: + Exclude: + - 'app/helpers/browse_helper.rb' diff --git a/.travis.yml b/.travis.yml index e4f739093..ad8f7e599 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,7 @@ sudo: false language: ruby rvm: - - 1.9.3 + - 2.3.1 cache: bundler addons: postgresql: 9.1 @@ -14,6 +14,7 @@ env: global: - OSM_MEMCACHE_SERVERS="127.0.0.1" before_script: + - cp config/example.application.yml config/application.yml - psql -U postgres -c "CREATE DATABASE openstreetmap" - psql -U postgres -c "CREATE EXTENSION btree_gist" openstreetmap - make -C db/functions libpgosm.so @@ -25,4 +26,4 @@ before_script: script: - bundle exec rubocop -f fuubar - bundle exec rake jshint - - bundle exec rake test + - bundle exec rake test:db diff --git a/Gemfile b/Gemfile index e36912e73..34768095f 100644 --- a/Gemfile +++ b/Gemfile @@ -1,10 +1,7 @@ source "https://rubygems.org" # Require rails -gem "rails", "4.2.3" - -# Sprockets 3 seems to be buggy, so stick with 2 for now -gem "sprockets", "~> 2.12.3" +gem "rails", "4.2.7.1" # Require things which have moved to gems in ruby 1.9 gem "bigdecimal", "~> 1.1.0", :platforms => :ruby_19 @@ -40,25 +37,33 @@ gem "r2" # Use autoprefixer to generate CSS prefixes gem "autoprefixer-rails" +# Use image_optim to optimise images +gem "image_optim_rails" + # Load rails plugins -gem "rails-i18n", "~> 4.0.0" -gem "dynamic_form" -gem "rinku", ">= 1.2.2", :require => "rails_rinku" -gem "oauth-plugin", ">= 0.5.1" -gem "validates_email_format_of", ">= 1.5.1" +gem "actionpack-page_caching" gem "composite_primary_keys", "~> 8.1.0" -gem "http_accept_language", "~> 2.0.0" -gem "paperclip", "~> 4.0" gem "deadlock_retry", ">= 1.2.0" +gem "dynamic_form" +gem "http_accept_language", "~> 2.0.0" gem "i18n-js", ">= 3.0.0.rc10" +gem "oauth-plugin", ">= 0.5.1" +gem "paperclip", "~> 4.0" gem "rack-cors" -gem "actionpack-page_caching" +gem "rails-i18n", "~> 4.0.0" +gem "rinku", ">= 1.2.2", :require => "rails_rinku" +gem "validates_email_format_of", ">= 1.5.1" + +# Sanitise URIs +gem "rack-uri_sanitizer" # Omniauth for authentication gem "omniauth" -gem "omniauth-openid" -gem "openstreetmap-omniauth-google-oauth2", ">= 0.2.6.1", :require => "omniauth-google-oauth2" gem "omniauth-facebook" +gem "omniauth-github" +gem "omniauth-google-oauth2", ">= 0.2.7" +gem "omniauth-mediawiki", ">= 0.0.3" +gem "omniauth-openid" gem "omniauth-windowslive" # Markdown formatting support @@ -68,8 +73,8 @@ gem "redcarpet" gem "libxml-ruby", ">= 2.0.5", :require => "libxml" # Use for HTML sanitisation -gem "sanitize" gem "htmlentities" +gem "sanitize" # Load SystemTimer for implementing request timeouts gem "SystemTimer", ">= 1.1.3", :require => "system_timer", :platforms => :ruby_18 @@ -77,9 +82,11 @@ gem "SystemTimer", ">= 1.1.3", :require => "system_timer", :platforms => :ruby_1 # Load faraday for mockable HTTP client gem "faraday" -# Load httpclient and soap4r for SOAP support for Quova GeoIP queries -gem "httpclient" -gem "soap4r-ruby1.9" +# Load geoip for querying Maxmind GeoIP database +gem "geoip" + +# Load rotp to generate TOTP tokens +gem "rotp" # Load memcache client in case we are using it gem "dalli" @@ -95,15 +102,17 @@ end # Gems needed for running tests group :test do + gem "minitest", "~> 5.1", :platforms => [:ruby_19, :ruby_20] gem "rubocop" gem "timecop" - gem "minitest", "~> 5.1", :platforms => [:ruby_19, :ruby_20] + gem "webmock" end # Needed in development as well so rake can see konacha tasks group :development, :test do + gem "coveralls", :require => false + gem "factory_girl_rails" gem "jshint" gem "konacha" gem "poltergeist" - gem "coveralls", :require => false end diff --git a/Gemfile.lock b/Gemfile.lock index 341e95ccf..a8c91f460 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -2,146 +2,167 @@ GEM remote: https://rubygems.org/ specs: SystemTimer (1.2.3) - actionmailer (4.2.3) - actionpack (= 4.2.3) - actionview (= 4.2.3) - activejob (= 4.2.3) + actionmailer (4.2.7.1) + actionpack (= 4.2.7.1) + actionview (= 4.2.7.1) + activejob (= 4.2.7.1) mail (~> 2.5, >= 2.5.4) rails-dom-testing (~> 1.0, >= 1.0.5) - actionpack (4.2.3) - actionview (= 4.2.3) - activesupport (= 4.2.3) + actionpack (4.2.7.1) + actionview (= 4.2.7.1) + activesupport (= 4.2.7.1) rack (~> 1.6) rack-test (~> 0.6.2) rails-dom-testing (~> 1.0, >= 1.0.5) rails-html-sanitizer (~> 1.0, >= 1.0.2) - actionpack-page_caching (1.0.2) - actionpack (>= 4.0.0, < 5) - actionview (4.2.3) - activesupport (= 4.2.3) + actionpack-page_caching (1.1.0) + actionpack (>= 4.0.0, < 6) + actionview (4.2.7.1) + activesupport (= 4.2.7.1) builder (~> 3.1) erubis (~> 2.7.0) rails-dom-testing (~> 1.0, >= 1.0.5) rails-html-sanitizer (~> 1.0, >= 1.0.2) - activejob (4.2.3) - activesupport (= 4.2.3) + activejob (4.2.7.1) + activesupport (= 4.2.7.1) globalid (>= 0.3.0) - activemodel (4.2.3) - activesupport (= 4.2.3) + activemodel (4.2.7.1) + activesupport (= 4.2.7.1) builder (~> 3.1) - activerecord (4.2.3) - activemodel (= 4.2.3) - activesupport (= 4.2.3) + activerecord (4.2.7.1) + activemodel (= 4.2.7.1) + activesupport (= 4.2.7.1) arel (~> 6.0) - activesupport (4.2.3) + activesupport (4.2.7.1) i18n (~> 0.7) json (~> 1.7, >= 1.7.7) minitest (~> 5.1) thread_safe (~> 0.3, >= 0.3.4) tzinfo (~> 1.1) - arel (6.0.2) - ast (2.0.0) - astrolabe (1.3.1) - parser (~> 2.2) - autoprefixer-rails (5.2.1.1) + addressable (2.5.0) + public_suffix (~> 2.0, >= 2.0.2) + arel (6.0.4) + ast (2.3.0) + autoprefixer-rails (6.7.2) execjs - json bigdecimal (1.1.0) - builder (3.2.2) - capybara (2.4.4) + builder (3.2.3) + capybara (2.12.0) + addressable mime-types (>= 1.16) nokogiri (>= 1.3.3) rack (>= 1.0.0) rack-test (>= 0.5.4) xpath (~> 2.0) - climate_control (0.0.3) - activesupport (>= 3.0) + climate_control (0.1.0) cliver (0.3.2) - cocaine (0.5.7) + cocaine (0.5.8) climate_control (>= 0.0.3, < 1.0) - coffee-rails (4.1.0) + coffee-rails (4.1.1) coffee-script (>= 2.2.0) - railties (>= 4.0.0, < 5.0) + railties (>= 4.0.0, < 5.1.x) coffee-script (2.4.1) coffee-script-source execjs - coffee-script-source (1.9.1.1) - colorize (0.7.7) - composite_primary_keys (8.1.0) + coffee-script-source (1.12.2) + colorize (0.8.1) + composite_primary_keys (8.1.4) activerecord (~> 4.2.0) - coveralls (0.8.2) - json (~> 1.8) - rest-client (>= 1.6.8, < 2) - simplecov (~> 0.10.0) + concurrent-ruby (1.0.4) + coveralls (0.8.19) + json (>= 1.8, < 3) + simplecov (~> 0.12.0) term-ansicolor (~> 1.3) thor (~> 0.19.1) + tins (~> 1.6) + crack (0.4.3) + safe_yaml (~> 1.0.0) crass (1.0.2) - dalli (2.7.4) + dalli (2.7.6) deadlock_retry (1.2.0) docile (1.1.5) - domain_name (0.5.24) - unf (>= 0.0.5, < 1.0.0) dynamic_form (1.1.4) erubis (2.7.0) - execjs (2.5.2) - faraday (0.9.1) + execjs (2.7.0) + exifr (1.2.5) + factory_girl (4.8.0) + activesupport (>= 3.0.0) + factory_girl_rails (4.8.0) + factory_girl (~> 4.8.0) + railties (>= 3.0.0) + faraday (0.10.1) multipart-post (>= 1.2, < 3) - globalid (0.3.5) + fspath (3.0.1) + geoip (1.6.3) + globalid (0.3.7) activesupport (>= 4.1.0) - hashie (3.4.2) - hike (1.2.3) + hashdiff (0.3.2) + hashie (3.4.6) htmlentities (4.3.4) - http-cookie (1.0.2) - domain_name (~> 0.5) http_accept_language (2.0.5) - httpclient (2.6.0.1) - i18n (0.7.0) - i18n-js (3.0.0.rc11) - i18n (~> 0.6) - jquery-rails (4.0.4) - rails-dom-testing (~> 1.0) + i18n (0.8.0) + i18n-js (3.0.0.rc15) + i18n (~> 0.6, >= 0.6.6) + image_optim (0.24.1) + exifr (~> 1.2, >= 1.2.2) + fspath (~> 3.0) + image_size (~> 1.5) + in_threads (~> 1.3) + progress (~> 3.0, >= 3.0.1) + image_optim_rails (0.2.0) + image_optim (~> 0.24.0) + rails + sprockets + image_size (1.5.0) + in_threads (1.3.1) + jquery-rails (4.2.2) + rails-dom-testing (>= 1, < 3) railties (>= 4.2.0) thor (>= 0.14, < 2.0) - jshint (1.3.1) + jshint (1.5.0) execjs (>= 1.4.0) multi_json (~> 1.0) therubyracer (~> 0.12.1) - json (1.8.3) + json (1.8.6) jsonify (0.3.1) multi_json (~> 1.0) jsonify-rails (0.3.2) actionpack jsonify (< 0.4.0) - jwt (1.5.1) - kgio (2.9.3) - konacha (3.5.1) - actionpack (>= 3.1, < 5) + jwt (1.5.6) + kgio (2.11.0) + konacha (4.0.0) + actionpack (>= 4.1, < 5) capybara colorize - railties (>= 3.1, < 5) + railties (>= 4.1, < 5) sprockets (>= 2, < 4) + sprockets-rails (>= 2, < 4) tilt - libv8 (3.16.14.11) - libxml-ruby (2.8.0) + libv8 (3.16.14.17) + libxml-ruby (2.9.0) logstash-event (1.2.02) - logstasher (0.6.5) + logstasher (1.1.1) + activerecord (>= 4.0) + activesupport (>= 4.0) logstash-event (~> 1.2.0) request_store - loofah (2.0.2) + loofah (2.0.3) nokogiri (>= 1.5.9) - mail (2.6.3) - mime-types (>= 1.16, < 3) - mime-types (2.6.1) + mail (2.6.4) + mime-types (>= 1.16, < 4) + mime-types (3.1) + mime-types-data (~> 3.2015) + mime-types-data (3.2016.0521) mimemagic (0.3.0) - mini_portile (0.6.2) - minitest (5.7.0) - multi_json (1.11.2) - multi_xml (0.5.5) + mini_portile2 (2.1.0) + minitest (5.10.1) + multi_json (1.12.1) + multi_xml (0.6.0) multipart-post (2.0.0) - netrc (0.10.3) - nokogiri (1.6.6.2) - mini_portile (~> 0.6.0) - nokogumbo (1.4.1) + nokogiri (1.7.0.1) + mini_portile2 (~> 2.1.0) + nokogumbo (1.4.10) nokogiri oauth (0.4.7) oauth-plugin (0.5.1) @@ -149,148 +170,155 @@ GEM oauth (~> 0.4.4) oauth2 (>= 0.5.0) rack - oauth2 (1.0.0) - faraday (>= 0.8, < 0.10) + oauth2 (1.3.0) + faraday (>= 0.8, < 0.11) jwt (~> 1.0) multi_json (~> 1.3) multi_xml (~> 0.5) - rack (~> 1.2) - omniauth (1.2.2) + rack (>= 1.2, < 3) + omniauth (1.3.2) hashie (>= 1.2, < 4) - rack (~> 1.0) - omniauth-facebook (2.0.1) + rack (>= 1.0, < 3) + omniauth-facebook (4.0.0) omniauth-oauth2 (~> 1.2) - omniauth-oauth2 (1.3.1) + omniauth-github (1.2.0) + omniauth (~> 1.3.2) + omniauth-oauth2 (>= 1.4.0, < 2.0) + omniauth-google-oauth2 (0.4.1) + jwt (~> 1.5.2) + multi_json (~> 1.3) + omniauth (>= 1.1.1) + omniauth-oauth2 (>= 1.3.1) + omniauth-mediawiki (0.0.3) + jwt (~> 1.0) + omniauth-oauth (~> 1.0) + omniauth-oauth (1.1.0) + oauth + omniauth (~> 1.0) + omniauth-oauth2 (1.4.0) oauth2 (~> 1.0) omniauth (~> 1.2) omniauth-openid (1.0.1) omniauth (~> 1.0) rack-openid (~> 1.3.1) - omniauth-windowslive (0.0.9) + omniauth-windowslive (0.0.11) multi_json (>= 1.0.3) - omniauth-oauth2 (~> 1.0) - openstreetmap-omniauth-google-oauth2 (0.2.6.1) - jwt (~> 1.0) - multi_json (~> 1.3) - omniauth (>= 1.1.1) - omniauth-oauth2 (>= 1.1.1) - paperclip (4.3.0) + omniauth-oauth2 (~> 1.4) + paperclip (4.3.7) activemodel (>= 3.2.0) activesupport (>= 3.2.0) cocaine (~> 0.5.5) mime-types mimemagic (= 0.3.0) - parser (2.2.2.6) - ast (>= 1.1, < 3.0) - pg (0.18.2) - poltergeist (1.6.0) + parser (2.3.3.1) + ast (~> 2.2) + pg (0.19.0) + poltergeist (1.13.0) capybara (~> 2.1) cliver (~> 0.3.1) - multi_json (~> 1.0) websocket-driver (>= 0.2.0) powerpack (0.1.1) - psych (2.0.13) - r2 (0.2.5) - rack (1.6.4) - rack-cors (0.4.0) + progress (3.3.0) + psych (2.2.2) + public_suffix (2.0.5) + r2 (0.2.6) + rack (1.6.5) + rack-cors (0.4.1) rack-openid (1.3.1) rack (>= 1.1.0) ruby-openid (>= 2.1.8) rack-test (0.6.3) rack (>= 1.0) - rails (4.2.3) - actionmailer (= 4.2.3) - actionpack (= 4.2.3) - actionview (= 4.2.3) - activejob (= 4.2.3) - activemodel (= 4.2.3) - activerecord (= 4.2.3) - activesupport (= 4.2.3) + rack-uri_sanitizer (0.0.2) + rails (4.2.7.1) + actionmailer (= 4.2.7.1) + actionpack (= 4.2.7.1) + actionview (= 4.2.7.1) + activejob (= 4.2.7.1) + activemodel (= 4.2.7.1) + activerecord (= 4.2.7.1) + activesupport (= 4.2.7.1) bundler (>= 1.3.0, < 2.0) - railties (= 4.2.3) + railties (= 4.2.7.1) sprockets-rails rails-deprecated_sanitizer (1.0.3) activesupport (>= 4.2.0.alpha) - rails-dom-testing (1.0.6) + rails-dom-testing (1.0.8) activesupport (>= 4.2.0.beta, < 5.0) - nokogiri (~> 1.6.0) + nokogiri (~> 1.6) rails-deprecated_sanitizer (>= 1.0.1) - rails-html-sanitizer (1.0.2) + rails-html-sanitizer (1.0.3) loofah (~> 2.0) - rails-i18n (4.0.4) - i18n (~> 0.6) + rails-i18n (4.0.9) + i18n (~> 0.7) railties (~> 4.0) - railties (4.2.3) - actionpack (= 4.2.3) - activesupport (= 4.2.3) + railties (4.2.7.1) + actionpack (= 4.2.7.1) + activesupport (= 4.2.7.1) rake (>= 0.8.7) thor (>= 0.18.1, < 2.0) - rainbow (2.0.0) - rake (10.4.2) - redcarpet (3.3.2) + rainbow (2.2.1) + rake (12.0.0) + redcarpet (3.4.0) ref (2.0.0) - request_store (1.2.0) - rest-client (1.8.0) - http-cookie (>= 1.0.2, < 2.0) - mime-types (>= 1.16, < 3.0) - netrc (~> 0.7) - rinku (1.7.3) - rubocop (0.32.1) - astrolabe (~> 1.3) - parser (>= 2.2.2.5, < 3.0) + request_store (1.3.2) + rinku (2.0.2) + rotp (3.3.0) + rubocop (0.47.1) + parser (>= 2.3.3.1, < 3.0) powerpack (~> 0.1) rainbow (>= 1.99.1, < 3.0) - ruby-progressbar (~> 1.4) + ruby-progressbar (~> 1.7) + unicode-display_width (~> 1.0, >= 1.0.1) ruby-openid (2.7.0) - ruby-progressbar (1.7.5) - sanitize (4.0.0) + ruby-progressbar (1.8.1) + safe_yaml (1.0.4) + sanitize (4.4.0) crass (~> 1.0.2) nokogiri (>= 1.4.4) - nokogumbo (= 1.4.1) - sass (3.4.16) - sass-rails (5.0.3) - railties (>= 4.0.0, < 5.0) + nokogumbo (~> 1.4.1) + sass (3.4.23) + sass-rails (5.0.6) + railties (>= 4.0.0, < 6) sass (~> 3.1) sprockets (>= 2.8, < 4.0) sprockets-rails (>= 2.0, < 4.0) - tilt (~> 1.1) - simplecov (0.10.0) + tilt (>= 1.1, < 3) + simplecov (0.12.0) docile (~> 1.1.0) - json (~> 1.8) + json (>= 1.8, < 3) simplecov-html (~> 0.10.0) simplecov-html (0.10.0) - soap4r-ruby1.9 (2.0.5) - sprockets (2.12.4) - hike (~> 1.2) - multi_json (~> 1.0) - rack (~> 1.0) - tilt (~> 1.1, != 1.3.0) - sprockets-rails (2.3.2) - actionpack (>= 3.0) - activesupport (>= 3.0) - sprockets (>= 2.8, < 4.0) - term-ansicolor (1.3.2) + sprockets (3.7.1) + concurrent-ruby (~> 1.0) + rack (> 1, < 3) + sprockets-rails (3.2.0) + actionpack (>= 4.0) + activesupport (>= 4.0) + sprockets (>= 3.0.0) + term-ansicolor (1.4.0) tins (~> 1.0) - therubyracer (0.12.2) - libv8 (~> 3.16.14.0) + therubyracer (0.12.3) + libv8 (~> 3.16.14.15) ref - thor (0.19.1) + thor (0.19.4) thread_safe (0.3.5) - tilt (1.4.1) - timecop (0.7.4) - tins (1.5.4) + tilt (2.0.6) + timecop (0.8.1) + tins (1.13.2) tzinfo (1.2.2) thread_safe (~> 0.1) - uglifier (2.7.1) - execjs (>= 0.3.0) - json (>= 1.8.0) - unf (0.1.4) - unf_ext - unf_ext (0.0.7.1) - validates_email_format_of (1.6.2) + uglifier (3.0.4) + execjs (>= 0.3.0, < 3) + unicode-display_width (1.1.3) + validates_email_format_of (1.6.3) i18n vendorer (0.1.16) - websocket-driver (0.6.2) + webmock (2.3.2) + addressable (>= 2.3.6) + crack (>= 0.3.2) + hashdiff + websocket-driver (0.6.5) websocket-extensions (>= 0.1.0) websocket-extensions (0.1.2) xpath (2.0.0) @@ -310,11 +338,13 @@ DEPENDENCIES dalli deadlock_retry (>= 1.2.0) dynamic_form + factory_girl_rails faraday + geoip htmlentities http_accept_language (~> 2.0.0) - httpclient i18n-js (>= 3.0.0.rc10) + image_optim_rails jquery-rails jshint json @@ -327,25 +357,31 @@ DEPENDENCIES oauth-plugin (>= 0.5.1) omniauth omniauth-facebook + omniauth-github + omniauth-google-oauth2 (>= 0.2.7) + omniauth-mediawiki (>= 0.0.3) omniauth-openid omniauth-windowslive - openstreetmap-omniauth-google-oauth2 (>= 0.2.6.1) paperclip (~> 4.0) pg poltergeist psych r2 rack-cors - rails (= 4.2.3) + rack-uri_sanitizer + rails (= 4.2.7.1) rails-i18n (~> 4.0.0) redcarpet rinku (>= 1.2.2) + rotp rubocop sanitize sass-rails (~> 5.0) - soap4r-ruby1.9 - sprockets (~> 2.12.3) timecop uglifier (>= 1.3.0) validates_email_format_of (>= 1.5.1) vendorer + webmock + +BUNDLED WITH + 1.12.5 diff --git a/INSTALL.md b/INSTALL.md index 09e3b12f7..d036673b1 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -8,7 +8,7 @@ You can install the software directly on your machine, which is the traditional These instructions are based on Ubuntu 12.04 LTS, which is the platform used by the OSMF servers. The instructions also work, with only minor amendments, for all other current Ubuntu releases, Fedora and MacOSX -We don't recommend attempting to develop or deploy this software on Windows. If you need to use Windows, then try developing this sofware using Ubuntu in a virtual machine, or use [Vagrant](VAGRANT.md). +We don't recommend attempting to develop or deploy this software on Windows. If you need to use Windows, then try developing this software using Ubuntu in a virtual machine, or use [Vagrant](VAGRANT.md). ## Dependencies @@ -18,26 +18,24 @@ of packages required before you can get the various gems installed. ## Minimum requirements -* Ruby 1.9.3 +* Ruby 2.3 * RubyGems 1.3.1+ -* Postgres 8.3+ +* PostgreSQL 9.1+ * ImageMagick * Bundler * Javascript Runtime -These can be installed on Ubuntu 10.10 or later with: +These can be installed on Ubuntu 16.04 or later with: ``` -sudo apt-get install ruby1.9.1 libruby1.9.1 ruby1.9.1-dev ri1.9.1 \ +sudo apt-get install ruby2.3 libruby2.3 ruby2.3-dev \ libmagickwand-dev libxml2-dev libxslt1-dev nodejs \ - apache2 apache2-threaded-dev build-essential git-core \ + apache2 apache2-dev build-essential git-core \ postgresql postgresql-contrib libpq-dev postgresql-server-dev-all \ - libsasl2-dev -sudo gem1.9.1 install bundler + libsasl2-dev imagemagick +sudo gem2.3 install bundler ``` -Note that the "1.9.1" Ubuntu packages do in fact contain ruby 1.9.3. - ### Alternative platforms #### Fedora @@ -49,17 +47,17 @@ sudo yum install ruby ruby-devel rubygem-rdoc rubygem-bundler rubygems \ libxml2-devel js \ gcc gcc-c++ git \ postgresql postgresql-server postgresql-contrib postgresql-devel \ - perl-podlators + perl-podlators ImageMagick ``` -If you didn't already have Postgres installed then create a Postgres instance and start the server: +If you didn't already have PostgreSQL installed then create a PostgreSQL instance and start the server: ``` sudo postgresql-setup initdb sudo systemctl start postgresql.service ``` -Optionally set Postgres to start on boot: +Optionally set PostgreSQL to start on boot: ``` sudo systemctl enable postgresql.service @@ -69,10 +67,10 @@ sudo systemctl enable postgresql.service For MacOSX, you will need XCode installed from the Mac App Store; OS X 10.7 (Lion) or later; and some familiarity with Unix development via the Terminal. -Installing Postgres: +Installing PostgreSQL: * Install Postgres.app from http://postgresapp.com/ -* Add Postgres to your path, by editing your profile: +* Add PostgreSQL to your path, by editing your profile: `nano ~/.profile` @@ -83,9 +81,9 @@ and adding: Installing other dependencies: * Install Homebrew from http://mxcl.github.io/homebrew/ -* Install the latest version of Ruby: brew install ruby -* Install ImageMagick: brew install imagemagick -* Install Bundler: gem install bundler +* Install the latest version of Ruby: `brew install ruby` +* Install ImageMagick: `brew install imagemagick` +* Install Bundler: `gem install bundler` Note that OS X does not have a /home directory by default, so if you are using the GPX functions, you will need to change the directories specified in config/application.yml. @@ -140,7 +138,7 @@ instructions below as appropriate. ### PostgreSQL account setup -We need to create a PostgreSQL role (i.e. user account) for your current user, and it needs to be a superuser so that we can create more database. +We need to create a PostgreSQL role (i.e. user account) for your current user, and it needs to be a superuser so that we can create more databases. ``` sudo -u postgres -i @@ -158,15 +156,7 @@ bundle exec rake db:create ### PostgreSQL Btree-gist Extension -We need to load the btree-gist extension, which is needed for showing changesets on the history tab. - -For PostgreSQL < 9.1 (change the version number in the path as necessary): - -``` -psql -d openstreetmap < /usr/share/postgresql/9.0/contrib/btree_gist.sql -``` - -For PostgreSQL >= 9.1: +We need to load the `btree-gist` extension, which is needed for showing changesets on the history tab. ``` psql -d openstreetmap -c "CREATE EXTENSION btree_gist" @@ -174,7 +164,7 @@ psql -d openstreetmap -c "CREATE EXTENSION btree_gist" ### PostgreSQL Functions -We need to install special functions into the postgresql databases, and these are provided by a library that needs compiling first. +We need to install special functions into the PostgreSQL databases, and these are provided by a library that needs compiling first. ``` cd db/functions @@ -203,7 +193,7 @@ bundle exec rake db:migrate To ensure that everything is set up properly, you should now run: ``` -bundle exec rake test +bundle exec rake test:db ``` This test will take a few minutes, reporting tests run, assertions, and any errors. If you receive no errors, then your installation is successful. diff --git a/README.md b/README.md index d53bae157..5b909454f 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,5 @@ We're always keen to have more developers! Pull requests are very welcome. * Translation is managed by [Translatewiki](https://translatewiki.net/wiki/Translating:OpenStreetMap) * There is a [rails-dev@openstreetmap.org](http://lists.openstreetmap.org/listinfo/rails-dev) mailing list for development discussion. * IRC - there is the #osm-dev channel on irc.oftc.net. -* There are also weekly meetings of the OpenStreetMap Foundation Engineering Working Group (EWG) on Mondays at 1700 UTC on the #osm-ewg channel. More details on contributing to the code are in the [CONTRIBUTING.md](CONTRIBUTING.md) file. diff --git a/VAGRANT.md b/VAGRANT.md index d71483569..549e06687 100644 --- a/VAGRANT.md +++ b/VAGRANT.md @@ -8,7 +8,7 @@ sudo apt-get install vagrant Other Linux distributions should have similar installation instructions using `yum` or similar. -Installers are available for Mac OS X and Windows, please see the [Vagrant project download page](http://www.vagrantup.com/downloads) for more information. +Installers are available for Mac OS X and Windows, please see the [Vagrant project download page](http://www.vagrantup.com/downloads.html) for more information. # Setting up openstreetmap-website diff --git a/Vagrantfile b/Vagrantfile index 24d62bb7a..f41f9676c 100644 --- a/Vagrantfile +++ b/Vagrantfile @@ -3,9 +3,11 @@ Vagrant.configure("2") do |config| # use official ubuntu image for virtualbox - config.vm.provider "virtualbox" do |_, override| - override.vm.box = "ubuntu/trusty64" + config.vm.provider "virtualbox" do |vb, override| + override.vm.box = "ubuntu/xenial64" override.vm.synced_folder ".", "/srv/openstreetmap-website" + vb.customize ["modifyvm", :id, "--memory", "1024"] + vb.customize ["modifyvm", :id, "--cpus", "2"] end # use third party image and NFS sharing for lxc diff --git a/Vendorfile b/Vendorfile index 6826e8e16..93ad74c7b 100644 --- a/Vendorfile +++ b/Vendorfile @@ -11,13 +11,13 @@ folder 'vendor/assets' do end folder 'leaflet' do - file 'leaflet.js', 'http://cdn.leafletjs.com/leaflet-0.7.3/leaflet-src.js' - file 'leaflet.css', 'http://cdn.leafletjs.com/leaflet-0.7.3/leaflet.css' + file 'leaflet.js', 'https://unpkg.com/leaflet@1.0.3/dist/leaflet-src.js' + file 'leaflet.css', 'https://unpkg.com/leaflet@1.0.3/dist/leaflet.css' [ 'layers.png', 'layers-2x.png', 'marker-icon.png', 'marker-icon-2x.png', 'marker-shadow.png' ].each do |image| - file "images/#{image}", "http://cdn.leafletjs.com/leaflet-0.7.3/images/#{image}" + file "images/#{image}", "https://unpkg.com/leaflet@1.0.3/dist/images/#{image}" end from 'git://github.com/aratcliffe/Leaflet.contextmenu.git' do @@ -31,7 +31,7 @@ folder 'vendor/assets' do folder 'img', 'src/img' end - from 'git://github.com/domoritz/leaflet-locatecontrol.git' do + from 'git://github.com/domoritz/leaflet-locatecontrol.git', :tag => 'v0.54.0' do file 'leaflet.locate.js', 'src/L.Control.Locate.js' end @@ -39,7 +39,7 @@ folder 'vendor/assets' do file 'leaflet.osm.js', 'leaflet-osm.js' end - from 'git://github.com/jieter/Leaflet.encoded.git' do + from 'git://github.com/jieter/Leaflet.encoded.git', :tag => '0.0.8' do file 'leaflet.polyline.js', 'Polyline.encoded.js' end end @@ -54,12 +54,24 @@ folder 'vendor/assets' do from 'git://github.com/openstreetmap/iD', :branch => 'release' do folder 'iD/img', 'dist/img' folder 'iD/locales', 'dist/locales' + folder 'iD/traffico', 'dist/traffico' + folder 'iD/mapillary-js', 'dist/mapillary-js' + file 'iD.css.erb', 'dist/iD.css' do |path| - rewrite(path) { |content| content.gsub(/url\('?(img\/[^')]+)'?\)/, 'url(<%= asset_path("iD/\1") %>)') } + rewrite(path) do |content| + content.gsub(/url\('?(img\/[^')]+)'?\)/, 'url(<%= asset_path("iD/\1") %>)') + end + end + + file 'iD/traffico/stylesheets/traffico.css.erb', 'dist/traffico/stylesheets/traffico.css' do |path| + rewrite(path) do |content| + content.gsub(/url\("?\.\.\/([^#?")]+)([^"]*)"?\)/, 'url(<%= asset_path("iD/traffico/\1") %>\2)') + end end + + File.delete('vendor/assets/iD/iD/traffico/stylesheets/traffico.css') + file 'iD.js', 'dist/iD.js' - file 'presets.js', 'dist/presets.js' - file 'imagery.js', 'dist/imagery.js' end end diff --git a/db/MAKE_MIGRATIONS_AND_TEST_THEM_DONT_PUT_SQL_HERE_ANY_MORE b/app/assets/images/banners/.keep similarity index 100% rename from db/MAKE_MIGRATIONS_AND_TEST_THEM_DONT_PUT_SQL_HERE_ANY_MORE rename to app/assets/images/banners/.keep diff --git a/app/assets/images/banners/donate-2016.jpg b/app/assets/images/banners/donate-2016.jpg new file mode 100644 index 000000000..7e2e6eb93 Binary files /dev/null and b/app/assets/images/banners/donate-2016.jpg differ diff --git a/app/assets/images/banners/sotmasia-2016.jpg b/app/assets/images/banners/sotmasia-2016.jpg new file mode 100644 index 000000000..fa5f1f033 Binary files /dev/null and b/app/assets/images/banners/sotmasia-2016.jpg differ diff --git a/app/assets/images/banners/sotmlatam-2016.jpg b/app/assets/images/banners/sotmlatam-2016.jpg new file mode 100644 index 000000000..97efa75e2 Binary files /dev/null and b/app/assets/images/banners/sotmlatam-2016.jpg differ diff --git a/app/assets/images/browse/motorway.20.png b/app/assets/images/browse/motorway.20.png index 183c79411..4528ad560 100644 Binary files a/app/assets/images/browse/motorway.20.png and b/app/assets/images/browse/motorway.20.png differ diff --git a/app/assets/images/browse/primary.20.png b/app/assets/images/browse/primary.20.png index 7a6efb4c8..91204ac6a 100644 Binary files a/app/assets/images/browse/primary.20.png and b/app/assets/images/browse/primary.20.png differ diff --git a/app/assets/images/browse/secondary.20.png b/app/assets/images/browse/secondary.20.png index dfdfd1bfb..13e0aa6a4 100644 Binary files a/app/assets/images/browse/secondary.20.png and b/app/assets/images/browse/secondary.20.png differ diff --git a/app/assets/images/browse/shop_car_parts.16.png b/app/assets/images/browse/shop_car_parts.16.png new file mode 100644 index 000000000..6c07e4d0e Binary files /dev/null and b/app/assets/images/browse/shop_car_parts.16.png differ diff --git a/app/assets/images/browse/tertiary.20.png b/app/assets/images/browse/tertiary.20.png index 49a51f113..bccaa7e0e 100644 Binary files a/app/assets/images/browse/tertiary.20.png and b/app/assets/images/browse/tertiary.20.png differ diff --git a/app/assets/images/browse/trunk.20.png b/app/assets/images/browse/trunk.20.png index 930de64e7..c753a3189 100644 Binary files a/app/assets/images/browse/trunk.20.png and b/app/assets/images/browse/trunk.20.png differ diff --git a/app/assets/images/github.png b/app/assets/images/github.png new file mode 100644 index 000000000..b797e243a Binary files /dev/null and b/app/assets/images/github.png differ diff --git a/app/assets/images/google.png b/app/assets/images/google.png index 39f6bc208..b273b6b6e 100644 Binary files a/app/assets/images/google.png and b/app/assets/images/google.png differ diff --git a/app/assets/images/key/cyclemap/bicycle_parking.png b/app/assets/images/key/cyclemap/bicycle_parking.png new file mode 100644 index 000000000..c900a4495 Binary files /dev/null and b/app/assets/images/key/cyclemap/bicycle_parking.png differ diff --git a/app/assets/images/key/cyclemap/bicycle_shop.png b/app/assets/images/key/cyclemap/bicycle_shop.png new file mode 100644 index 000000000..5ccf71442 Binary files /dev/null and b/app/assets/images/key/cyclemap/bicycle_shop.png differ diff --git a/app/assets/images/key/cyclemap/common.png b/app/assets/images/key/cyclemap/common.png new file mode 100644 index 000000000..7c108152a Binary files /dev/null and b/app/assets/images/key/cyclemap/common.png differ diff --git a/app/assets/images/key/cyclemap/cycleway.png b/app/assets/images/key/cyclemap/cycleway.png new file mode 100644 index 000000000..13bed4a7d Binary files /dev/null and b/app/assets/images/key/cyclemap/cycleway.png differ diff --git a/app/assets/images/key/cyclemap/cycleway_local.png b/app/assets/images/key/cyclemap/cycleway_local.png new file mode 100644 index 000000000..2a2933169 Binary files /dev/null and b/app/assets/images/key/cyclemap/cycleway_local.png differ diff --git a/app/assets/images/key/cyclemap/cycleway_local13.png b/app/assets/images/key/cyclemap/cycleway_local13.png new file mode 100644 index 000000000..3f2c53587 Binary files /dev/null and b/app/assets/images/key/cyclemap/cycleway_local13.png differ diff --git a/app/assets/images/key/cyclemap/cycleway_national.png b/app/assets/images/key/cyclemap/cycleway_national.png new file mode 100644 index 000000000..0f5455f71 Binary files /dev/null and b/app/assets/images/key/cyclemap/cycleway_national.png differ diff --git a/app/assets/images/key/cyclemap/cycleway_national13.png b/app/assets/images/key/cyclemap/cycleway_national13.png new file mode 100644 index 000000000..252b07a30 Binary files /dev/null and b/app/assets/images/key/cyclemap/cycleway_national13.png differ diff --git a/app/assets/images/key/cyclemap/cycleway_regional.png b/app/assets/images/key/cyclemap/cycleway_regional.png new file mode 100644 index 000000000..7e3306e46 Binary files /dev/null and b/app/assets/images/key/cyclemap/cycleway_regional.png differ diff --git a/app/assets/images/key/cyclemap/cycleway_regional13.png b/app/assets/images/key/cyclemap/cycleway_regional13.png new file mode 100644 index 000000000..9b3409fdf Binary files /dev/null and b/app/assets/images/key/cyclemap/cycleway_regional13.png differ diff --git a/app/assets/images/key/cyclemap/footway.png b/app/assets/images/key/cyclemap/footway.png new file mode 100644 index 000000000..c78756f8c Binary files /dev/null and b/app/assets/images/key/cyclemap/footway.png differ diff --git a/app/assets/images/key/cyclemap/forest.png b/app/assets/images/key/cyclemap/forest.png new file mode 100644 index 000000000..a7ebe8e5d Binary files /dev/null and b/app/assets/images/key/cyclemap/forest.png differ diff --git a/app/assets/images/key/cyclemap/lake.png b/app/assets/images/key/cyclemap/lake.png new file mode 100644 index 000000000..918d496ae Binary files /dev/null and b/app/assets/images/key/cyclemap/lake.png differ diff --git a/app/assets/images/key/cyclemap/motorway.png b/app/assets/images/key/cyclemap/motorway.png new file mode 100644 index 000000000..296f17677 Binary files /dev/null and b/app/assets/images/key/cyclemap/motorway.png differ diff --git a/app/assets/images/key/cyclemap/motorway12.png b/app/assets/images/key/cyclemap/motorway12.png new file mode 100644 index 000000000..749493ad6 Binary files /dev/null and b/app/assets/images/key/cyclemap/motorway12.png differ diff --git a/app/assets/images/key/cyclemap/primary.png b/app/assets/images/key/cyclemap/primary.png new file mode 100644 index 000000000..78ae0e4e5 Binary files /dev/null and b/app/assets/images/key/cyclemap/primary.png differ diff --git a/app/assets/images/key/cyclemap/primary12.png b/app/assets/images/key/cyclemap/primary12.png new file mode 100644 index 000000000..fed37d054 Binary files /dev/null and b/app/assets/images/key/cyclemap/primary12.png differ diff --git a/app/assets/images/key/cyclemap/rail.png b/app/assets/images/key/cyclemap/rail.png new file mode 100644 index 000000000..0abf0c1df Binary files /dev/null and b/app/assets/images/key/cyclemap/rail.png differ diff --git a/app/assets/images/key/cyclemap/rail14.png b/app/assets/images/key/cyclemap/rail14.png new file mode 100644 index 000000000..957f17c85 Binary files /dev/null and b/app/assets/images/key/cyclemap/rail14.png differ diff --git a/app/assets/images/key/cyclemap/secondary.png b/app/assets/images/key/cyclemap/secondary.png new file mode 100644 index 000000000..7928b182b Binary files /dev/null and b/app/assets/images/key/cyclemap/secondary.png differ diff --git a/app/assets/images/key/cyclemap/secondary12.png b/app/assets/images/key/cyclemap/secondary12.png new file mode 100644 index 000000000..cde008523 Binary files /dev/null and b/app/assets/images/key/cyclemap/secondary12.png differ diff --git a/app/assets/images/key/cyclemap/toilets.png b/app/assets/images/key/cyclemap/toilets.png new file mode 100644 index 000000000..d1c7a00a9 Binary files /dev/null and b/app/assets/images/key/cyclemap/toilets.png differ diff --git a/app/assets/images/key/cyclemap/track.png b/app/assets/images/key/cyclemap/track.png new file mode 100644 index 000000000..f294edca0 Binary files /dev/null and b/app/assets/images/key/cyclemap/track.png differ diff --git a/app/assets/images/key/cyclemap/trunk.png b/app/assets/images/key/cyclemap/trunk.png new file mode 100644 index 000000000..d312a65cb Binary files /dev/null and b/app/assets/images/key/cyclemap/trunk.png differ diff --git a/app/assets/images/key/cyclemap/trunk12.png b/app/assets/images/key/cyclemap/trunk12.png new file mode 100644 index 000000000..51230a021 Binary files /dev/null and b/app/assets/images/key/cyclemap/trunk12.png differ diff --git a/app/assets/images/key/mapnik/construction.png b/app/assets/images/key/mapnik/construction.png index bec836d7e..5ce63ded2 100644 Binary files a/app/assets/images/key/mapnik/construction.png and b/app/assets/images/key/mapnik/construction.png differ diff --git a/app/assets/images/key/mapnik/mainroad.png b/app/assets/images/key/mapnik/mainroad.png new file mode 100644 index 000000000..269959b65 Binary files /dev/null and b/app/assets/images/key/mapnik/mainroad.png differ diff --git a/app/assets/images/key/mapnik/mainroad12.png b/app/assets/images/key/mapnik/mainroad12.png new file mode 100644 index 000000000..c289a3f8c Binary files /dev/null and b/app/assets/images/key/mapnik/mainroad12.png differ diff --git a/app/assets/images/key/mapnik/mainroad7.png b/app/assets/images/key/mapnik/mainroad7.png new file mode 100644 index 000000000..05b4dac85 Binary files /dev/null and b/app/assets/images/key/mapnik/mainroad7.png differ diff --git a/app/assets/images/key/mapnik/mainroad9.png b/app/assets/images/key/mapnik/mainroad9.png new file mode 100644 index 000000000..334f8fc0d Binary files /dev/null and b/app/assets/images/key/mapnik/mainroad9.png differ diff --git a/app/assets/images/key/mapnik/motorway.png b/app/assets/images/key/mapnik/motorway.png index 3940c83d2..484fc9daa 100644 Binary files a/app/assets/images/key/mapnik/motorway.png and b/app/assets/images/key/mapnik/motorway.png differ diff --git a/app/assets/images/key/mapnik/primary.png b/app/assets/images/key/mapnik/primary.png deleted file mode 100644 index a51703c4f..000000000 Binary files a/app/assets/images/key/mapnik/primary.png and /dev/null differ diff --git a/app/assets/images/key/mapnik/primary12.png b/app/assets/images/key/mapnik/primary12.png deleted file mode 100644 index 741b13896..000000000 Binary files a/app/assets/images/key/mapnik/primary12.png and /dev/null differ diff --git a/app/assets/images/key/mapnik/secondary.png b/app/assets/images/key/mapnik/secondary.png deleted file mode 100644 index cbd457839..000000000 Binary files a/app/assets/images/key/mapnik/secondary.png and /dev/null differ diff --git a/app/assets/images/key/mapnik/secondary12.png b/app/assets/images/key/mapnik/secondary12.png deleted file mode 100644 index b95b18822..000000000 Binary files a/app/assets/images/key/mapnik/secondary12.png and /dev/null differ diff --git a/app/assets/images/key/mapnik/trunk.png b/app/assets/images/key/mapnik/trunk.png deleted file mode 100644 index 93611efa3..000000000 Binary files a/app/assets/images/key/mapnik/trunk.png and /dev/null differ diff --git a/app/assets/images/key/mapnik/trunk12.png b/app/assets/images/key/mapnik/trunk12.png deleted file mode 100644 index d8becf020..000000000 Binary files a/app/assets/images/key/mapnik/trunk12.png and /dev/null differ diff --git a/app/assets/images/osm_logo_256.png b/app/assets/images/osm_logo_256.png new file mode 100644 index 000000000..5388bc5b7 Binary files /dev/null and b/app/assets/images/osm_logo_256.png differ diff --git a/app/assets/images/osm_logo_30.png b/app/assets/images/osm_logo_30.png new file mode 100644 index 000000000..c963f4f4a Binary files /dev/null and b/app/assets/images/osm_logo_30.png differ diff --git a/app/assets/images/osm_logo_512.png b/app/assets/images/osm_logo_512.png new file mode 100644 index 000000000..c54f416ab Binary files /dev/null and b/app/assets/images/osm_logo_512.png differ diff --git a/app/assets/images/routing-sprite.png b/app/assets/images/routing-sprite.png index 37d94886d..079f4dd7f 100644 Binary files a/app/assets/images/routing-sprite.png and b/app/assets/images/routing-sprite.png differ diff --git a/app/assets/images/routing-sprite.svg b/app/assets/images/routing-sprite.svg new file mode 100644 index 000000000..15aa57b2d --- /dev/null +++ b/app/assets/images/routing-sprite.svg @@ -0,0 +1,573 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 + + + diff --git a/app/assets/images/sprite.png b/app/assets/images/sprite.png index d5577d4b7..c511bd90f 100644 Binary files a/app/assets/images/sprite.png and b/app/assets/images/sprite.png differ diff --git a/app/assets/images/sprite.svg b/app/assets/images/sprite.svg index b50b969e9..df8e3e3d5 100644 --- a/app/assets/images/sprite.svg +++ b/app/assets/images/sprite.svg @@ -13,7 +13,7 @@ height="200" id="svg2" version="1.1" - inkscape:version="0.48.4 r9939" + inkscape:version="0.91 r13725" inkscape:export-filename="/home/tom/rails/app/assets/images/sprite.png" inkscape:export-xdpi="90" inkscape:export-ydpi="90" @@ -167,7 +167,7 @@ sodipodi:nodetypes="cccccccccccccccccc" d="m 129,855.3622 -1.00001,1 0,2 1.00001,1 2.00002,0 1,-1 0,-2 -1.00002,-1 z m 2e-5,6 -1.00001,1 0,6 1.00001,1 1.99998,0 1.00004,-1 -3e-5,-6 -1,-1 z" id="path6912" - style="font-size:16.71258354000000068px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:100%;letter-spacing:0px;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter6591-2);enable-background:accumulate;font-family:Helvetica Neue" + style="font-size:16.71258354000000068px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:100%;letter-spacing:0px;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Helvetica Neue" inkscape:connector-curvature="0" /> + style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> @@ -226,7 +226,7 @@ inkscape:connector-curvature="0" id="path10739" d="m 11.5,855.36218 c 3.0376,0 5.5,2.46243 5.5,5.5 0,3.03757 -2.4624,5.5 -5.5,5.5 -1.0061,0 -1.9387,-0.27827 -2.75,-0.75 l -3.75,3.75 -1,0 -1,-1 0,-1 3.75,-3.75 C 6.2783,862.80084 6,861.86831 6,860.86218 c 0,-3.03757 2.4624,-5.5 5.5,-5.5 z m 0.5,2 -1,0 -2,1 -1,2 0,1 1,2 2,1 1,0 2,-1 1,-2 0,-1 -1,-2 -2,-1 z" - style="color:#000000;fill:#999999;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter6591-2);enable-background:accumulate" /> + style="color:#000000;fill:#999999;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> + style="color:#000000;fill:#70cd8f;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> ? + diff --git a/app/assets/images/tab-icon.svg b/app/assets/images/tab-icon.svg new file mode 100644 index 000000000..5e8bb3119 --- /dev/null +++ b/app/assets/images/tab-icon.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/app/assets/images/wikipedia.png b/app/assets/images/wikipedia.png new file mode 100644 index 000000000..784c18477 Binary files /dev/null and b/app/assets/images/wikipedia.png differ diff --git a/app/assets/images/wordpress.png b/app/assets/images/wordpress.png index 6f63efc2c..dd7147c74 100644 Binary files a/app/assets/images/wordpress.png and b/app/assets/images/wordpress.png differ diff --git a/app/assets/javascripts/embed.js.erb b/app/assets/javascripts/embed.js.erb index ca5594459..15839a2ec 100644 --- a/app/assets/javascripts/embed.js.erb +++ b/app/assets/javascripts/embed.js.erb @@ -1,7 +1,14 @@ //= require leaflet //= require leaflet.osm +//= require i18n/translations window.onload = function () { + if (navigator.languages) { + I18n.locale = navigator.languages[0]; + } else if (navigator.language) { + I18n.locale = navigator.language; + } + var query = (window.location.search || '?').substr(1), args = {}; @@ -11,18 +18,22 @@ window.onload = function () { args[parts[0]] = decodeURIComponent(parts[1] || ''); } + var thunderforestOptions = { +<% if defined?(THUNDERFOREST_KEY) %> + apikey: <%= THUNDERFOREST_KEY.to_json %> +<% end %> + }; + var map = L.map("map"); map.attributionControl.setPrefix(''); map.removeControl(map.attributionControl); - if (!args.layer || args.layer === "mapnik" || args.layer === "osmarender") { + if (!args.layer || args.layer === "mapnik" || args.layer === "osmarender" || args.layer === "mapquest") { new L.OSM.Mapnik().addTo(map); } else if (args.layer === "cyclemap" || args.layer === "cycle map") { - new L.OSM.CycleMap().addTo(map); + new L.OSM.CycleMap(thunderforestOptions).addTo(map); } else if (args.layer === "transportmap") { - new L.OSM.TransportMap().addTo(map); - } else if (args.layer === "mapquest") { - new L.OSM.MapQuestOpen().addTo(map); + new L.OSM.TransportMap(thunderforestOptions).addTo(map); } else if (args.layer === "hot") { new L.OSM.HOT().addTo(map); } @@ -51,7 +62,7 @@ window.onload = function () { L.Control.OSMReportAProblem = L.Control.Attribution.extend({ options: { position: 'bottomright', - prefix: 'Report a problem' + prefix: ''+I18n.t('javascripts.embed.report_problem')+'' }, onAdd: function (map) { diff --git a/app/assets/javascripts/id.js b/app/assets/javascripts/id.js index 86d2df7e4..185717b32 100644 --- a/app/assets/javascripts/id.js +++ b/app/assets/javascripts/id.js @@ -1,3 +1 @@ //= require iD -//= require presets -//= require imagery diff --git a/app/assets/javascripts/index.js b/app/assets/javascripts/index.js index 684685d51..096290806 100644 --- a/app/assets/javascripts/index.js +++ b/app/assets/javascripts/index.js @@ -130,14 +130,25 @@ $(document).ready(function () { L.OSM.zoom({position: position}) .addTo(map); - L.control.locate({ + var locate = L.control.locate({ position: position, + icon: 'icon geolocate', + iconLoading: 'icon geolocate', strings: { title: I18n.t('javascripts.map.locate.title'), popup: I18n.t('javascripts.map.locate.popup') } }).addTo(map); + var locateContainer = locate.getContainer(); + + $(locateContainer) + .removeClass('leaflet-control-locate leaflet-bar') + .addClass('control-locate') + .children("a") + .removeClass('leaflet-bar-part leaflet-bar-part-single') + .addClass('control-button'); + var sidebar = L.OSM.sidebar('#map-ui') .addTo(map); @@ -181,6 +192,10 @@ $(document).ready(function () { if (params.layers.indexOf(map.dataLayer.options.code) >= 0) { map.addLayer(map.dataLayer); } + + if (params.layers.indexOf(map.gpsLayer.options.code) >= 0) { + map.addLayer(map.gpsLayer); + } } var placement = $('html').attr('dir') === 'rtl' ? 'right' : 'left'; @@ -196,17 +211,29 @@ $(document).ready(function () { map.getLayersCode(), map._object); - $.removeCookie("_osm_location"); - $.cookie("_osm_location", OSM.locationCookie(map), { expires: expiry, path: "/" }); + $.removeCookie('_osm_location'); + $.cookie('_osm_location', OSM.locationCookie(map), { expires: expiry, path: '/' }); }); if ($.cookie('_osm_welcome') === 'hide') { $('.welcome').hide(); } - $('.welcome .close').on('click', function() { + $('.welcome .close-wrap').on('click', function() { $('.welcome').hide(); - $.cookie("_osm_welcome", 'hide', { expires: expiry }); + $.cookie('_osm_welcome', 'hide', { expires: expiry, path: '/' }); + }); + + var bannerExpiry = new Date(); + bannerExpiry.setYear(bannerExpiry.getFullYear() + 1); + + $('#banner .close-wrap').on('click', function(e) { + var cookieId = e.target.id; + $('#banner').hide(); + e.preventDefault(); + if (cookieId) { + $.cookie(cookieId, 'hide', { expires: bannerExpiry, path: '/' }); + } }); if (OSM.PIWIK) { @@ -227,10 +254,8 @@ $(document).ready(function () { map.setView([params.lat, params.lon], params.zoom); } - var marker = L.marker([0, 0], {icon: OSM.getUserIcon()}); - if (params.marker) { - marker.setLatLng([params.mlat, params.mlon]).addTo(map); + L.marker([params.mlat, params.mlon]).addTo(map); } $("#homeanchor").on("click", function(e) { @@ -240,7 +265,7 @@ $(document).ready(function () { center = L.latLng(data.lat, data.lon); map.setView(center, data.zoom); - marker.setLatLng(center).addTo(map); + L.marker(center, {icon: OSM.getUserIcon()}).addTo(map); }); function remoteEditHandler(bbox, object) { diff --git a/app/assets/javascripts/index/directions.js b/app/assets/javascripts/index/directions.js index a8615d3eb..2a1e045da 100644 --- a/app/assets/javascripts/index/directions.js +++ b/app/assets/javascripts/index/directions.js @@ -189,7 +189,7 @@ OSM.Directions = function (map) { map.removeLayer(polyline); if (!dragging) { - alert(I18n.t('javascripts.directions.errors.no_route')); + $('#sidebar_content').html('

' + I18n.t('javascripts.directions.errors.no_route') + '

'); } return; @@ -302,10 +302,14 @@ OSM.Directions = function (map) { }); $(".routing_marker").on('dragstart', function (e) { - e.originalEvent.dataTransfer.effectAllowed = 'move'; - e.originalEvent.dataTransfer.setData('type', $(this).data('type')); - var img = $("").attr("src", $(e.originalEvent.target).attr("src")); - e.originalEvent.dataTransfer.setDragImage(img.get(0), 12, 21); + var dt = e.originalEvent.dataTransfer; + dt.effectAllowed = 'move'; + var dragData = { type: $(this).data('type') }; + dt.setData('text', JSON.stringify(dragData)); + if (dt.setDragImage) { + var img = $("").attr("src", $(e.originalEvent.target).attr("src")); + dt.setDragImage(img.get(0), 12, 21); + } }); var page = {}; @@ -321,7 +325,8 @@ OSM.Directions = function (map) { $("#map").on('drop', function (e) { e.preventDefault(); var oe = e.originalEvent; - var type = oe.dataTransfer.getData('type'); + var dragData = JSON.parse(oe.dataTransfer.getData('text')); + var type = dragData.type; var pt = L.DomEvent.getMousePosition(oe, map.getContainer()); // co-ordinates of the mouse pointer at present pt.y += 20; var ll = map.containerPointToLatLng(pt); @@ -336,13 +341,8 @@ OSM.Directions = function (map) { setEngine(params.engine); } - if (params.from) { - endpoints[0].setValue(params.from); - endpoints[1].setValue(""); - } else { - endpoints[0].setValue(""); - endpoints[1].setValue(""); - } + endpoints[0].setValue(params.from || ""); + endpoints[1].setValue(params.to || ""); var o = route[0] && L.latLng(route[0].split(',')), d = route[1] && L.latLng(route[1].split(',')); diff --git a/app/assets/javascripts/index/directions/graphhopper.js b/app/assets/javascripts/index/directions/graphhopper.js index 95cb29ab8..88a9c15c1 100644 --- a/app/assets/javascripts/index/directions/graphhopper.js +++ b/app/assets/javascripts/index/directions/graphhopper.js @@ -1,15 +1,15 @@ -function GraphHopperEngine(id, vehicleParam) { +function GraphHopperEngine(id, vehicleType) { var GH_INSTR_MAP = { - "-3": 6, // sharp left - "-2": 7, // left - "-1": 8, // slight left + "-3": 7, // sharp left + "-2": 6, // left + "-1": 5, // slight left 0: 0, // straight 1: 1, // slight right 2: 2, // right 3: 3, // sharp right - 4: -1, // finish reached - 5: -1, // via reached - 6: 11 // roundabout + 4: 14, // finish reached + 5: 14, // via reached + 6: 10 // roundabout }; return { @@ -20,21 +20,19 @@ function GraphHopperEngine(id, vehicleParam) { getRoute: function (points, callback) { // GraphHopper Directions API documentation // https://github.com/graphhopper/directions-api/blob/master/docs-routing.md - var url = document.location.protocol + "//graphhopper.com/api/1/route?" + - vehicleParam + - "&locale=" + I18n.currentLocale() + - "&key=LijBPDQGfu7Iiq80w3HzwB4RUDJbMbhs6BU0dEnn" + - "&type=jsonp" + - "&elevation=false" + - "&instructions=true"; - - for (var i = 0; i < points.length; i++) { - url += "&point=" + points[i].lat + ',' + points[i].lng; - } - return $.ajax({ - url: url, - dataType: 'jsonp', + url: document.location.protocol + OSM.GRAPHHOPPER_URL, + data: { + vehicle: vehicleType, + locale: I18n.currentLocale(), + key: "LijBPDQGfu7Iiq80w3HzwB4RUDJbMbhs6BU0dEnn", + type: "jsonp", + elevation: false, + instructions: true, + point: points.map(function (p) { return p.lat + "," + p.lng; }) + }, + traditional: true, + dataType: "jsonp", success: function (data) { if (!data.paths || data.paths.length === 0) return callback(true); @@ -46,7 +44,7 @@ function GraphHopperEngine(id, vehicleParam) { var len = path.instructions.length; for (var i = 0; i < len; i++) { var instr = path.instructions[i]; - var instrCode = (i === len - 1) ? 15 : GH_INSTR_MAP[instr.sign]; + var instrCode = (i === len - 1) ? 14 : GH_INSTR_MAP[instr.sign]; var instrText = "" + (i + 1) + ". "; instrText += instr.text; var latLng = line[instr.interval[0]]; @@ -60,17 +58,20 @@ function GraphHopperEngine(id, vehicleParam) { ]); // TODO does graphhopper map instructions onto line indices? } - callback(null, { + callback(false, { line: line, steps: steps, distance: path.distance, time: path.time / 1000 }); + }, + error: function () { + callback(true); } }); } }; } -OSM.Directions.addEngine(new GraphHopperEngine("graphhopper_bicycle", "vehicle=bike"), true); -OSM.Directions.addEngine(new GraphHopperEngine("graphhopper_foot", "vehicle=foot"), true); +OSM.Directions.addEngine(new GraphHopperEngine("graphhopper_bicycle", "bike"), true); +OSM.Directions.addEngine(new GraphHopperEngine("graphhopper_foot", "foot"), true); diff --git a/app/assets/javascripts/index/directions/mapquest.js b/app/assets/javascripts/index/directions/mapquest.js index fbbc55a5f..fcc47f103 100644 --- a/app/assets/javascripts/index/directions/mapquest.js +++ b/app/assets/javascripts/index/directions/mapquest.js @@ -3,27 +3,27 @@ // http://open.mapquestapi.com/directions/ // https://github.com/apmon/openstreetmap-website/blob/21edc353a4558006f0ce23f5ec3930be6a7d4c8b/app/controllers/routing_controller.rb#L153 -function MapQuestEngine(id, vehicleParam) { +function MapQuestEngine(id, routeType) { var MQ_SPRITE_MAP = { - 0: 1, // straight - 1: 2, // slight right - 2: 3, // right - 3: 4, // sharp right - 4: 5, // reverse - 5: 6, // sharp left - 6: 7, // left - 7: 8, // slight left - 8: 5, // right U-turn - 9: 5, // left U-turn - 10: 2, // right merge - 11: 8, // left merge - 12: 2, // right on-ramp - 13: 8, // left on-ramp - 14: 2, // right off-ramp - 15: 8, // left off-ramp - 16: 2, // right fork - 17: 8, // left fork - 18: 1 // straight fork + 0: 0, // straight + 1: 1, // slight right + 2: 2, // right + 3: 3, // sharp right + 4: 4, // reverse + 5: 7, // sharp left + 6: 6, // left + 7: 5, // slight left + 8: 4, // right U-turn + 9: 4, // left U-turn + 10: 21, // right merge + 11: 20, // left merge + 12: 21, // right on-ramp + 13: 20, // left on-ramp + 14: 24, // right off-ramp + 15: 25, // left off-ramp + 16: 18, // right fork + 17: 19, // left fork + 18: 0 // straight fork }; return { @@ -32,18 +32,23 @@ function MapQuestEngine(id, vehicleParam) { draggable: false, getRoute: function (points, callback) { - var url = document.location.protocol + "//open.mapquestapi.com/directions/v2/route?key=Fmjtd%7Cluur290anu%2Crl%3Do5-908a0y"; var from = points[0]; var to = points[points.length - 1]; - url += "&from=" + from.lat + ',' + from.lng; - url += "&to=" + to.lat + ',' + to.lng; - url += "&" + vehicleParam; - //url+="&locale=" + I18n.currentLocale(); //Doesn't actually work. MapQuest requires full locale e.g. "de_DE", but I18n may only provides language, e.g. "de" - url += "&manMaps=false"; - url += "&shapeFormat=raw&generalize=0&unit=k"; return $.ajax({ - url: url, + url: document.location.protocol + OSM.MAPQUEST_DIRECTIONS_URL, + data: { + key: OSM.MAPQUEST_KEY, + from: from.lat + "," + from.lng, + to: to.lat + "," + to.lng, + routeType: routeType, + // locale: I18n.currentLocale(), //Doesn't actually work. MapQuest requires full locale e.g. "de_DE", but I18n may only provides language, e.g. "de" + manMaps: false, + shapeFormat: "raw", + generalize: 0, + unit: "k" + }, + dataType: "jsonp", success: function (data) { if (data.info.statuscode !== 0) return callback(true); @@ -78,18 +83,23 @@ function MapQuestEngine(id, vehicleParam) { steps.push([L.latLng(s.startPoint.lat, s.startPoint.lng), d, s.narrative, s.distance * 1000, lineseg]); } - callback(null, { + callback(false, { line: line, steps: steps, distance: data.route.distance * 1000, time: data.route.time }); + }, + error: function () { + callback(true); } }); } }; } -OSM.Directions.addEngine(new MapQuestEngine("mapquest_bicycle", "routeType=bicycle"), true); -OSM.Directions.addEngine(new MapQuestEngine("mapquest_foot", "routeType=pedestrian"), true); -OSM.Directions.addEngine(new MapQuestEngine("mapquest_car", "routeType=fastest"), true); +if (OSM.MAPQUEST_KEY) { + OSM.Directions.addEngine(new MapQuestEngine("mapquest_bicycle", "bicycle"), true); + OSM.Directions.addEngine(new MapQuestEngine("mapquest_foot", "pedestrian"), true); + OSM.Directions.addEngine(new MapQuestEngine("mapquest_car", "fastest"), true); +} diff --git a/app/assets/javascripts/index/directions/mapzen.js b/app/assets/javascripts/index/directions/mapzen.js new file mode 100644 index 000000000..263938860 --- /dev/null +++ b/app/assets/javascripts/index/directions/mapzen.js @@ -0,0 +1,109 @@ +function MapzenEngine(id, costing) { + var MZ_INSTR_MAP = [ + 0, // kNone = 0; + 8, // kStart = 1; + 8, // kStartRight = 2; + 8, // kStartLeft = 3; + 14, // kDestination = 4; + 14, // kDestinationRight = 5; + 14, // kDestinationLeft = 6; + 0, // kBecomes = 7; + 0, // kContinue = 8; + 1, // kSlightRight = 9; + 2, // kRight = 10; + 3, // kSharpRight = 11; + 4, // kUturnRight = 12; + 4, // kUturnLeft = 13; + 7, // kSharpLeft = 14; + 6, // kLeft = 15; + 5, // kSlightLeft = 16; + 0, // kRampStraight = 17; + 24, // kRampRight = 18; + 25, // kRampLeft = 19; + 24, // kExitRight = 20; + 25, // kExitLeft = 21; + 0, // kStayStraight = 22; + 1, // kStayRight = 23; + 5, // kStayLeft = 24; + 20, // kMerge = 25; + 10, // kRoundaboutEnter = 26; + 11, // kRoundaboutExit = 27; + 17, // kFerryEnter = 28; + 0 // kFerryExit = 29; + ]; + + return { + id: id, + creditline: "Mapzen", + draggable: false, + + getRoute: function (points, callback) { + return $.ajax({ + url: document.location.protocol + OSM.MAPZEN_VALHALLA_URL, + data: { + api_key: OSM.MAPZEN_VALHALLA_KEY, + json: JSON.stringify({ + locations: points.map(function (p) { return { lat: p.lat, lon: p.lng }; }), + costing: costing, + directions_options: { + units: "km", + language: I18n.currentLocale() + } + }) + }, + dataType: "json", + success: function (data) { + var trip = data.trip; + + if (trip.status === 0) { + var line = []; + var steps = []; + var distance = 0; + var time = 0; + + trip.legs.forEach(function (leg) { + var legLine = L.PolylineUtil.decode(leg.shape, { + precision: 6 + }); + + line = line.concat(legLine); + + leg.maneuvers.forEach(function (manoeuvre) { + var point = legLine[manoeuvre.begin_shape_index]; + + steps.push([ + { lat: point[0], lng: point[1] }, + MZ_INSTR_MAP[manoeuvre.type], + manoeuvre.instruction, + manoeuvre.length * 1000, + [] + ]); + }); + + distance = distance + leg.summary.length; + time = time + leg.summary.time; + }); + + callback(false, { + line: line, + steps: steps, + distance: distance * 1000, + time: time + }); + } else { + callback(true); + } + }, + error: function () { + callback(true); + } + }); + } + }; +} + +if (OSM.MAPZEN_VALHALLA_KEY) { + OSM.Directions.addEngine(new MapzenEngine("mapzen_car", "auto"), true); + OSM.Directions.addEngine(new MapzenEngine("mapzen_bicycle", "bicycle"), true); + OSM.Directions.addEngine(new MapzenEngine("mapzen_foot", "pedestrian"), true); +} diff --git a/app/assets/javascripts/index/directions/osrm.js b/app/assets/javascripts/index/directions/osrm.js index b53fecb81..69191e65a 100644 --- a/app/assets/javascripts/index/directions/osrm.js +++ b/app/assets/javascripts/index/directions/osrm.js @@ -2,88 +2,163 @@ // Doesn't yet support hints function OSRMEngine() { - var previousPoints, hintData; + var cachedHints = []; return { id: "osrm_car", creditline: 'OSRM', draggable: true, + _transformSteps: function(input_steps, line) { + var INSTRUCTION_TEMPLATE = { + 'continue': 'javascripts.directions.instructions.continue', + 'merge right': 'javascripts.directions.instructions.merge_right', + 'merge left': 'javascripts.directions.instructions.merge_left', + 'off ramp right': 'javascripts.directions.instructions.offramp_right', + 'off ramp left': 'javascripts.directions.instructions.offramp_left', + 'on ramp right': 'javascripts.directions.instructions.onramp_right', + 'on ramp left': 'javascripts.directions.instructions.onramp_left', + 'fork right': 'javascripts.directions.instructions.fork_right', + 'fork left': 'javascripts.directions.instructions.fork_left', + 'end of road right': 'javascripts.directions.instructions.endofroad_right', + 'end of road left': 'javascripts.directions.instructions.endofroad_left', + 'turn straight': 'javascripts.directions.instructions.continue', + 'turn slight right': 'javascripts.directions.instructions.slight_right', + 'turn right': 'javascripts.directions.instructions.turn_right', + 'turn sharp right': 'javascripts.directions.instructions.sharp_right', + 'turn uturn': 'javascripts.directions.instructions.uturn', + 'turn sharp left': 'javascripts.directions.instructions.sharp_left', + 'turn left': 'javascripts.directions.instructions.turn_left', + 'turn slight left': 'javascripts.directions.instructions.slight_left', + 'roundabout': 'javascripts.directions.instructions.roundabout', + 'rotary': 'javascripts.directions.instructions.roundabout', + 'depart': 'javascripts.directions.instructions.start', + 'arrive': 'javascripts.directions.instructions.destination', + }; + var ICON_MAP = { + 'continue': 0, + 'merge right': 21, + 'merge left': 20, + 'off ramp right': 24, + 'off ramp left': 25, + 'on ramp right': 2, + 'on ramp left': 6, + 'fork right': 18, + 'fork left': 19, + 'end of road right': 22, + 'end of road left': 23, + 'turn straight': 0, + 'turn slight right': 1, + 'turn right': 2, + 'turn sharp right': 3, + 'turn uturn': 4, + 'turn slight left': 5, + 'turn left': 6, + 'turn sharp left': 7, + 'roundabout': 10, + 'rotary': 10, + 'depart': 8, + 'arrive': 14 + }; + var transformed_steps = input_steps.map(function(step, idx) { + var maneuver_id; + + // special case handling + switch (step.maneuver.type) { + case 'on ramp': + case 'off ramp': + case 'merge': + case 'end of road': + case 'fork': + maneuver_id = step.maneuver.type + ' ' + (step.maneuver.modifier.indexOf('left') >= 0 ? 'left' : 'right'); + break; + case 'depart': + case 'arrive': + case 'roundabout': + case 'rotary': + maneuver_id = step.maneuver.type; + break; + case 'roundabout turn': + case 'turn': + maneuver_id = "turn " + step.maneuver.modifier; + break; + // for unknown types the fallback is turn + default: + maneuver_id = "turn " + step.maneuver.modifier; + break; + } + var template = INSTRUCTION_TEMPLATE[maneuver_id]; + + // convert lat,lng pairs to LatLng objects + var step_geometry = L.PolylineUtil.decode(step.geometry, { precision: 5 }).map(function(a) { return L.latLng(a); }) ; + // append step_geometry on line + Array.prototype.push.apply(line, step_geometry); + + var instText = "" + (idx + 1) + ". "; + var name = step.name ? "" + step.name + "" : I18n.t('javascripts.directions.instructions.unnamed'); + if (step.maneuver.type.match(/rotary|roundabout/)) { + instText += I18n.t(template + '_with_exit', { exit: step.maneuver.exit, name: name } ); + } else { + instText += I18n.t(template + '_without_exit', { name: name }); + } + return [[step.maneuver.location[1], step.maneuver.location[0]], ICON_MAP[maneuver_id], instText, step.distance, step_geometry]; + }); + + return transformed_steps; + }, + getRoute: function (points, callback) { - var TURN_INSTRUCTIONS = [ - "", - 'javascripts.directions.instructions.continue', // 1 - 'javascripts.directions.instructions.slight_right', // 2 - 'javascripts.directions.instructions.turn_right', // 3 - 'javascripts.directions.instructions.sharp_right', // 4 - 'javascripts.directions.instructions.uturn', // 5 - 'javascripts.directions.instructions.sharp_left', // 6 - 'javascripts.directions.instructions.turn_left', // 7 - 'javascripts.directions.instructions.slight_left', // 8 - 'javascripts.directions.instructions.via_point', // 9 - 'javascripts.directions.instructions.follow', // 10 - 'javascripts.directions.instructions.roundabout', // 11 - 'javascripts.directions.instructions.leave_roundabout', // 12 - 'javascripts.directions.instructions.stay_roundabout', // 13 - 'javascripts.directions.instructions.start', // 14 - 'javascripts.directions.instructions.destination', // 15 - 'javascripts.directions.instructions.against_oneway', // 16 - 'javascripts.directions.instructions.end_oneway' // 17 + + var params = [ + { name: "overview", value: "false" }, + { name: "geometries", value: "polyline" }, + { name: "steps", value: true } ]; - var url = document.location.protocol + "//router.project-osrm.org/viaroute?z=14&output=json&instructions=true"; - for (var i = 0; i < points.length; i++) { - url += "&loc=" + points[i].lat + ',' + points[i].lng; - if (hintData && previousPoints && previousPoints[i].equals(points[i])) { - url += "&hint=" + hintData.locations[i]; - } + if (cachedHints.length === points.length) { + params.push({name: "hints", value: cachedHints.join(";")}); + } else { + // invalidate cache + cachedHints = []; } - if (hintData && hintData.checksum) { - url += "&checksum=" + hintData.checksum; - } + var encoded_coords = points.map(function(p) { + return p.lng + ',' + p.lat; + }).join(';'); + + var req_url = document.location.protocol + OSM.OSRM_URL + encoded_coords; + + var onResponse = function (data) { + if (data.code !== 'Ok') + return callback(true); + + cachedHints = data.waypoints.map(function(wp) { + return wp.hint; + }); + + var line = []; + var transformLeg = function (leg) { + return this._transformSteps(leg.steps, line); + }; + + var steps = [].concat.apply([], data.routes[0].legs.map(transformLeg.bind(this))); + + callback(false, { + line: line, + steps: steps, + distance: data.routes[0].distance, + time: data.routes[0].duration + }); + }; return $.ajax({ - url: url, - dataType: 'json', - success: function (data) { - if (data.status === 207) - return callback(true); - - previousPoints = points; - hintData = data.hint_data; - - var line = L.PolylineUtil.decode(data.route_geometry, { - precision: 6 - }); - - var steps = []; - for (i = 0; i < data.route_instructions.length; i++) { - var s = data.route_instructions[i]; - var linesegend; - var instCodes = s[0].split('-'); - var instText = "" + (i + 1) + ". "; - var name = s[1] ? "" + s[1] + "" : I18n.t('javascripts.directions.instructions.unnamed'); - if (instCodes[0] === "11" && instCodes[1]) { - instText += I18n.t(TURN_INSTRUCTIONS[instCodes[0]] + '_with_exit', { exit: instCodes[1], name: name } ); - } else { - instText += I18n.t(TURN_INSTRUCTIONS[instCodes[0]] + '_without_exit', { name: name }); - } - if ((i + 1) < data.route_instructions.length) { - linesegend = data.route_instructions[i + 1][3] + 1; - } else { - linesegend = s[3] + 1; - } - steps.push([line[s[3]], s[0].split('-')[0], instText, s[2], line.slice(s[3], linesegend)]); - } - - callback(null, { - line: line, - steps: steps, - distance: data.route_summary.total_distance, - time: data.route_summary.total_time - }); + url: req_url, + data: params, + dataType: "json", + success: onResponse.bind(this), + error: function () { + callback(true); } }); } diff --git a/app/assets/javascripts/index/new_note.js b/app/assets/javascripts/index/new_note.js index 55c5cbc93..397daa637 100644 --- a/app/assets/javascripts/index/new_note.js +++ b/app/assets/javascripts/index/new_note.js @@ -108,13 +108,7 @@ OSM.NewNote = function(map) { var mapSize = map.getSize(); var markerPosition; - if (mapSize.y > 800) { - markerPosition = [mapSize.x / 2, mapSize.y / 2]; - } else if (mapSize.y > 400) { - markerPosition = [mapSize.x / 2, 400]; - } else { - markerPosition = [mapSize.x / 2, mapSize.y]; - } + markerPosition = [mapSize.x / 2, mapSize.y / 2]; newNote = L.marker(map.containerPointToLatLng(markerPosition), { icon: noteIcons["new"], diff --git a/app/assets/javascripts/index/notes.js b/app/assets/javascripts/index/notes.js index d5ffbead1..fd5cd3ae9 100644 --- a/app/assets/javascripts/index/notes.js +++ b/app/assets/javascripts/index/notes.js @@ -45,6 +45,7 @@ OSM.initializeNotes = function (map) { } else { marker = L.marker(feature.geometry.coordinates.reverse(), { icon: noteIcons[feature.properties.status], + title: feature.properties.comments[0].text, opacity: 0.8, clickable: true }); diff --git a/app/assets/javascripts/index/query.js b/app/assets/javascripts/index/query.js index 333fce549..023e2a7f2 100644 --- a/app/assets/javascripts/index/query.js +++ b/app/assets/javascripts/index/query.js @@ -161,7 +161,7 @@ OSM.Query = function(map) { return geometry; } - function runQuery(latlng, radius, query, $section, compare) { + function runQuery(latlng, radius, query, $section, merge, compare) { var $ul = $section.find("ul"); $ul.empty(); @@ -179,19 +179,34 @@ OSM.Query = function(map) { url: url, method: "POST", data: { - data: "[timeout:5][out:json];" + query, + data: "[timeout:10][out:json];" + query, }, success: function(results) { var elements; $section.find(".loader").stopTime("loading").hide(); - if (compare) { - elements = results.elements.sort(compare); + if (merge) { + elements = results.elements.reduce(function (hash, element) { + var key = element.type + element.id; + if ("geometry" in element) { + delete element.bounds; + } + hash[key] = $.extend({}, hash[key], element); + return hash; + }, {}); + + elements = Object.keys(elements).map(function (key) { + return elements[key]; + }); } else { elements = results.elements; } + if (compare) { + elements = elements.sort(compare); + } + for (var i = 0; i < elements.length; i++) { var element = elements[i]; @@ -211,6 +226,12 @@ OSM.Query = function(map) { } } + if (results.remark) { + $("
  • ") + .text(I18n.t("javascripts.query.error", { server: url, error: results.remark })) + .appendTo($ul); + } + if ($ul.find("li").length === 0) { $("
  • ") .text(I18n.t("javascripts.query.nothing_found")) @@ -268,7 +289,7 @@ OSM.Query = function(map) { ways = "way(" + around + ")", relations = "relation(" + around + ")", nearby = "(" + nodes + ";" + ways + ");out tags geom(" + bbox + ");" + relations + ";out geom(" + bbox + ");", - isin = "is_in(" + lat + "," + lng + ")->.a;way(pivot.a);out tags geom(" + bbox + ");relation(pivot.a);out tags bb;"; + isin = "is_in(" + lat + "," + lng + ")->.a;way(pivot.a);out tags bb;out ids geom(" + bbox + ");relation(pivot.a);out tags bb;"; $("#sidebar_content .query-intro") .hide(); @@ -287,8 +308,8 @@ OSM.Query = function(map) { } }, 10); - runQuery(latlng, radius, nearby, $("#query-nearby")); - runQuery(latlng, radius, isin, $("#query-isin"), compareSize); + runQuery(latlng, radius, nearby, $("#query-nearby"), false); + runQuery(latlng, radius, isin, $("#query-isin"), true, compareSize); } function clickHandler(e) { diff --git a/app/assets/javascripts/index/search.js b/app/assets/javascripts/index/search.js index 485920c8e..52af38c54 100644 --- a/app/assets/javascripts/index/search.js +++ b/app/assets/javascripts/index/search.js @@ -95,15 +95,18 @@ OSM.Search = function(map) { $(this).closest("li").removeClass("selected"); } - function clickSearchResult(e) { - var data = $(this).data(), - center = L.latLng(data.lat, data.lon); - + function panToSearchResult(data) { if (data.minLon && data.minLat && data.maxLon && data.maxLat) { map.fitBounds([[data.minLat, data.minLon], [data.maxLat, data.maxLon]]); } else { - map.setView(center, data.zoom); + map.setView([data.lat, data.lon], data.zoom); } + } + + function clickSearchResult(e) { + var data = $(this).data(); + + panToSearchResult(data); // Let clicks to object browser links propagate. if (data.type && data.id) return; @@ -119,11 +122,12 @@ OSM.Search = function(map) { page.pushstate = page.popstate = function(path) { var params = querystring.parse(path.substring(path.indexOf('?') + 1)); $(".search_form input[name=query]").val(params.query); + $(".describe_location").hide(); OSM.loadSidebarContent(path, page.load); }; page.load = function() { - $(".search_results_entry").each(function() { + $(".search_results_entry").each(function(index) { var entry = $(this); $.ajax({ url: entry.data("href"), @@ -137,6 +141,13 @@ OSM.Search = function(map) { }, success: function(html) { entry.html(html); + // go to first result of first geocoder + if (index === 0) { + var firstResult = entry.find('*[data-lat][data-lon]:first').first(); + if (firstResult.length) { + panToSearchResult(firstResult.data()); + } + } } }); }); diff --git a/app/assets/javascripts/leaflet.key.js b/app/assets/javascripts/leaflet.key.js index 68e822e7f..5223b1420 100644 --- a/app/assets/javascripts/leaflet.key.js +++ b/app/assets/javascripts/leaflet.key.js @@ -60,7 +60,7 @@ L.OSM.key = function (options) { } function updateButton() { - var disabled = map.getMapBaseLayerId() !== 'mapnik'; + var disabled = ['mapnik', 'cyclemap'].indexOf(map.getMapBaseLayerId()) === -1; button .toggleClass('disabled', disabled) .attr('data-original-title', diff --git a/app/assets/javascripts/leaflet.layers.js b/app/assets/javascripts/leaflet.layers.js index d2928068d..eedf718d3 100644 --- a/app/assets/javascripts/leaflet.layers.js +++ b/app/assets/javascripts/leaflet.layers.js @@ -50,7 +50,7 @@ L.OSM.layers = function(options) { map.whenReady(function() { var miniMap = L.map(div[0], {attributionControl: false, zoomControl: false}) - .addLayer(new layer.constructor()); + .addLayer(new layer.constructor({ apikey: layer.options.apikey })); miniMap.dragging.disable(); miniMap.touchZoom.disable(); @@ -101,6 +101,8 @@ L.OSM.layers = function(options) { map.fire('baselayerchange', {layer: layer}); }); + item.on('dblclick', toggle); + map.on('layeradd layerremove', function() { item.toggleClass('active', map.hasLayer(layer)); input.prop('checked', map.hasLayer(layer)); @@ -174,6 +176,7 @@ L.OSM.layers = function(options) { addOverlay(map.noteLayer, 'notes', OSM.MAX_NOTE_REQUEST_AREA); addOverlay(map.dataLayer, 'data', OSM.MAX_REQUEST_AREA); + addOverlay(map.gpsLayer, 'gps', Number.POSITIVE_INFINITY); } options.sidebar.addPane($ui); diff --git a/app/assets/javascripts/leaflet.map.js b/app/assets/javascripts/leaflet.map.js index 58360bbec..4b50cc78c 100644 --- a/app/assets/javascripts/leaflet.map.js +++ b/app/assets/javascripts/leaflet.map.js @@ -16,44 +16,51 @@ L.OSM.Map = L.Map.extend({ var copyright = I18n.t('javascripts.map.copyright', {copyright_url: '/copyright'}); var donate = I18n.t('javascripts.map.donate_link_text', {donate_url: 'http://donate.openstreetmap.org'}); - this.baseLayers = [ - new L.OSM.Mapnik({ - attribution: copyright + " ♥ " + donate, - code: "M", - keyid: "mapnik", - name: I18n.t("javascripts.map.base.standard") - }), - new L.OSM.CycleMap({ + this.baseLayers = []; + + this.baseLayers.push(new L.OSM.Mapnik({ + attribution: copyright + " ♥ " + donate, + code: "M", + keyid: "mapnik", + name: I18n.t("javascripts.map.base.standard") + })); + + if (OSM.THUNDERFOREST_KEY) { + this.baseLayers.push(new L.OSM.CycleMap({ attribution: copyright + ". Tiles courtesy of Andy Allan", + apikey: OSM.THUNDERFOREST_KEY, code: "C", keyid: "cyclemap", name: I18n.t("javascripts.map.base.cycle_map") - }), - new L.OSM.TransportMap({ + })); + + this.baseLayers.push(new L.OSM.TransportMap({ attribution: copyright + ". Tiles courtesy of Andy Allan", + apikey: OSM.THUNDERFOREST_KEY, code: "T", keyid: "transportmap", name: I18n.t("javascripts.map.base.transport_map") - }), - new L.OSM.MapQuestOpen({ - attribution: copyright + ". Tiles courtesy of MapQuest ", - code: "Q", - keyid: "mapquest", - name: I18n.t("javascripts.map.base.mapquest") - }), - new L.OSM.HOT({ - attribution: copyright + ". Tiles courtesy of Humanitarian OpenStreetMap Team", - code: "H", - keyid: "hot", - name: I18n.t("javascripts.map.base.hot") - }) - ]; + })); + } + + this.baseLayers.push(new L.OSM.HOT({ + attribution: copyright + ". Tiles courtesy of Humanitarian OpenStreetMap Team", + code: "H", + keyid: "hot", + name: I18n.t("javascripts.map.base.hot") + })); this.noteLayer = new L.FeatureGroup(); this.noteLayer.options = {code: 'N'}; this.dataLayer = new L.OSM.DataLayer(null); this.dataLayer.options.code = 'D'; + + this.gpsLayer = new L.OSM.GPS({ + pane: "overlayPane", + code: "G", + name: I18n.t("javascripts.map.base.gps") + }); }, updateLayers: function(layerParam) { @@ -204,16 +211,15 @@ L.OSM.Map = L.Map.extend({ clickable: false }; - this._object = object; - - if (this._objectLoader) this._objectLoader.abort(); - if (this._objectLayer) this.removeLayer(this._objectLayer); + this.removeObject(); var map = this; this._objectLoader = $.ajax({ url: OSM.apiUrl(object), dataType: "xml", success: function (xml) { + map._object = object; + map._objectLayer = new L.OSM.DataLayer(null, { styles: { node: objectStyle, @@ -276,7 +282,7 @@ L.OSM.Map = L.Map.extend({ } }); -L.Icon.Default.imagePath = "/images"; +L.Icon.Default.imagePath = "/images/"; L.Icon.Default.imageUrls = { "/images/marker-icon.png": OSM.MARKER_ICON, diff --git a/app/assets/javascripts/leaflet.share.js b/app/assets/javascripts/leaflet.share.js index b991210df..7cfd50c8e 100644 --- a/app/assets/javascripts/leaflet.share.js +++ b/app/assets/javascripts/leaflet.share.js @@ -145,7 +145,14 @@ L.OSM.share = function (options) { .text(I18n.t('javascripts.share.image')) .appendTo($imageSection); + $('
    ') + .attr('id', 'export-warning') + .attr('class', 'deemphasize') + .text(I18n.t('javascripts.share.only_standard_layer')) + .appendTo($imageSection); + $form = $('
    ') + .attr('id', 'export-image') .attr('class', 'standard-form') .attr('action', '/export/finish') .attr('method', 'post') @@ -206,6 +213,15 @@ L.OSM.share = function (options) { .attr('type', 'hidden') .appendTo($form); + var csrf_param = $("meta[name=csrf-param]").attr("content"), + csrf_token = $("meta[name=csrf-token]").attr("content"); + + $('') + .attr('name', csrf_param) + .attr('value', csrf_token) + .attr('type', 'hidden') + .appendTo($form); + $('

    ') .attr('class', 'deemphasize') .html(I18n.t('javascripts.share.image_size') + ' x ') @@ -364,6 +380,14 @@ L.OSM.share = function (options) { $("#mapnik_image_width").text(Math.round(size.x / scale / 0.00028)); $("#mapnik_image_height").text(Math.round(size.y / scale / 0.00028)); + + if (map.getMapBaseLayerId() === 'mapnik') { + $('#export-image').show(); + $('#export-warning').hide(); + } else { + $('#export-image').hide(); + $('#export-warning').show(); + } } function select() { diff --git a/app/assets/javascripts/login.js b/app/assets/javascripts/login.js new file mode 100644 index 000000000..b7a540f6e --- /dev/null +++ b/app/assets/javascripts/login.js @@ -0,0 +1,25 @@ +$(document).ready(function() { + // Preserve location hash in referer + if (window.location.hash) { + $("#referer").val($("#referer").val() + window.location.hash); + } + + // Attach referer to authentication buttons + $(".auth_button").each(function () { + var params = querystring.parse(this.search.substring(1)); + params.referer = $("#referer").val(); + this.search = querystring.stringify(params); + }); + + // Add click handler to show OpenID field + $("#openid_open_url").click(function() { + $("#openid_url").val("http://"); + $("#login_auth_buttons").hide(); + $("#login_openid_url").show(); + $("#login_openid_submit").show(); + }); + + // Hide OpenID field for now + $("#login_openid_url").hide(); + $("#login_openid_submit").hide(); +}); diff --git a/app/assets/javascripts/osm.js.erb b/app/assets/javascripts/osm.js.erb index 6afebf8e5..10b7cfdb8 100644 --- a/app/assets/javascripts/osm.js.erb +++ b/app/assets/javascripts/osm.js.erb @@ -1,26 +1,42 @@ +//= depend_on application.yml + OSM = { <% if defined?(PIWIK) %> - PIWIK: <%= PIWIK.to_json %>, + PIWIK: <%= PIWIK.to_json %>, <% end %> - MAX_REQUEST_AREA: <%= MAX_REQUEST_AREA.to_json %>, - SERVER_URL: <%= SERVER_URL.to_json %>, - API_VERSION: <%= API_VERSION.to_json %>, - STATUS: <%= STATUS.to_json %>, - MAX_NOTE_REQUEST_AREA: <%= MAX_NOTE_REQUEST_AREA.to_json %>, - OVERPASS_URL: <%= OVERPASS_URL.to_json %>, - NOMINATIM_URL: <%= NOMINATIM_URL.to_json %>, + MAX_REQUEST_AREA: <%= MAX_REQUEST_AREA.to_json %>, + SERVER_URL: <%= SERVER_URL.to_json %>, + API_VERSION: <%= API_VERSION.to_json %>, + STATUS: <%= STATUS.to_json %>, + MAX_NOTE_REQUEST_AREA: <%= MAX_NOTE_REQUEST_AREA.to_json %>, + OVERPASS_URL: <%= OVERPASS_URL.to_json %>, + NOMINATIM_URL: <%= NOMINATIM_URL.to_json %>, + GRAPHHOPPER_URL: <%= GRAPHHOPPER_URL.to_json %>, + MAPQUEST_DIRECTIONS_URL: <%= MAPQUEST_DIRECTIONS_URL.to_json %>, + MAPZEN_VALHALLA_URL: <%= MAPZEN_VALHALLA_URL.to_json %>, + OSRM_URL: <%= OSRM_URL.to_json %>, + +<% if defined?(MAPQUEST_KEY) %> + MAPQUEST_KEY: <%= MAPQUEST_KEY.to_json %>, +<% end %> +<% if defined?(MAPZEN_VALHALLA_KEY) %> + MAPZEN_VALHALLA_KEY: <%= MAPZEN_VALHALLA_KEY.to_json %>, +<% end %> +<% if defined?(THUNDERFOREST_KEY) %> + THUNDERFOREST_KEY: <%= THUNDERFOREST_KEY.to_json %>, +<% end %> - MARKER_GREEN: <%= image_path("marker-green.png").to_json %>, - MARKER_RED: <%= image_path("marker-red.png").to_json %>, + MARKER_GREEN: <%= image_path("marker-green.png").to_json %>, + MARKER_RED: <%= image_path("marker-red.png").to_json %>, - MARKER_ICON: <%= image_path("images/marker-icon.png").to_json %>, - MARKER_ICON_2X: <%= image_path("images/marker-icon-2x.png").to_json %>, - MARKER_SHADOW: <%= image_path("images/marker-shadow.png").to_json %>, + MARKER_ICON: <%= image_path("images/marker-icon.png").to_json %>, + MARKER_ICON_2X: <%= image_path("images/marker-icon-2x.png").to_json %>, + MARKER_SHADOW: <%= image_path("images/marker-shadow.png").to_json %>, - NEW_NOTE_MARKER: <%= image_path("new_note_marker.png").to_json %>, - OPEN_NOTE_MARKER: <%= image_path("open_note_marker.png").to_json %>, - CLOSED_NOTE_MARKER: <%= image_path("closed_note_marker.png").to_json %>, + NEW_NOTE_MARKER: <%= image_path("new_note_marker.png").to_json %>, + OPEN_NOTE_MARKER: <%= image_path("open_note_marker.png").to_json %>, + CLOSED_NOTE_MARKER: <%= image_path("closed_note_marker.png").to_json %>, apiUrl: function (object) { var url = "/api/" + OSM.API_VERSION + "/" + object.type + "/" + object.id; @@ -44,7 +60,12 @@ OSM = { j = pair.indexOf('='), key = pair.slice(0, j), val = pair.slice(++j); - params[key] = decodeURIComponent(val); + + try { + params[key] = decodeURIComponent(val); + } catch (e) { + // Ignore parse exceptions + } } return params; diff --git a/app/assets/javascripts/user.js b/app/assets/javascripts/user.js index e8ad3324d..7e7e7c803 100644 --- a/app/assets/javascripts/user.js +++ b/app/assets/javascripts/user.js @@ -12,14 +12,25 @@ $(document).ready(function () { L.OSM.zoom({position: position}) .addTo(map); - L.control.locate({ + var locate = L.control.locate({ position: position, + icon: 'icon geolocate', + iconLoading: 'icon geolocate', strings: { title: I18n.t('javascripts.map.locate.title'), popup: I18n.t('javascripts.map.locate.popup') } }).addTo(map); + var locateContainer = locate.getContainer(); + + $(locateContainer) + .removeClass('leaflet-control-locate leaflet-bar') + .addClass('control-locate') + .children("a") + .removeClass('leaflet-bar-part leaflet-bar-part-single') + .addClass('control-button'); + if (OSM.home) { map.setView([OSM.home.lat, OSM.home.lon], 12); } else { diff --git a/app/assets/stylesheets/browse.scss b/app/assets/stylesheets/browse.scss index f2241b4cf..f497a22d8 100644 --- a/app/assets/stylesheets/browse.scss +++ b/app/assets/stylesheets/browse.scss @@ -98,6 +98,7 @@ .shop.books::before { content: image-url('browse/shop_books.16.png'); } .shop.butcher::before { content: image-url('browse/shop_butcher.p.16.png'); } .shop.clothes::before { content: image-url('browse/shop_clothes.16.png'); } + .shop.car_parts::before { content: image-url('browse/shop_car_parts.16.png'); } .shop.car_repair::before { content: image-url('browse/shop_car_repair.16.png'); } .shop.convenience::before { content: image-url('browse/shop_convenience.p.16.png'); } .shop.diy::before { content: image-url('browse/shop_doityourself.16.png'); } diff --git a/app/assets/stylesheets/common.scss b/app/assets/stylesheets/common.scss index 6706aa6ed..bb0e6f0d4 100644 --- a/app/assets/stylesheets/common.scss +++ b/app/assets/stylesheets/common.scss @@ -151,13 +151,14 @@ small, aside { /* Rules for icons */ .icon { - display:inline-block; - vertical-align:top; - width:20px; - height:20px; - background:transparent image-url("sprite.png") no-repeat 0 0; - text-indent:-9999px; - overflow:hidden; + display: inline-block; + vertical-align: top; + width: 20px; + height: 20px; + background: transparent image-url("sprite.png") no-repeat 0 0; + background-image: image-url("sprite.svg"); + text-indent: -9999px; + overflow: hidden; } .icon.search { background-position: 0 0; } @@ -172,9 +173,11 @@ small, aside { .icon.clipboard { background-position: -160px 0; } .icon.link { background-position: -180px 0; } .icon.close { background-position: -200px 0; } +.close-wrap:hover .icon.close, .icon.close:hover { background-position: -200px -20px; } .icon.check { background-position: -220px 0; } .icon.note { background-position: -240px 0; } +.icon.note.grey { background-position: -240px -20px; } .icon.query { background-position: -260px 0; } /* Rules for links */ @@ -488,7 +491,8 @@ body.compact { background-color: black; } - &.disabled { + &.disabled, + &.leaflet-disabled { background-color: #333; background-color: rgba(0,0,0,.5); cursor: default; @@ -544,6 +548,13 @@ body.compact { background: #fff; font-size: 12px; + > div { + position: relative; + float: left; + clear: both; + width: 100%; + } + h2 { padding: $lineheight $lineheight $lineheight/2; } @@ -554,6 +565,22 @@ body.compact { font-size: 13px; } + .close-wrap { + cursor: pointer; + position: absolute; + top: 0; + right: 0; + width: 60px; + height: 60px; + + .icon.close { + pointer-events: none; + position: absolute; + right: 20px; + top: 20px; + } + } + .icon.close { float: right; cursor: pointer; @@ -566,25 +593,26 @@ body.compact { } } - .welcome { - display: none; - } - .overlay-sidebar #sidebar { position: absolute; z-index: 1000; height: auto; - border-bottom-right-radius: 5px; overflow: hidden; + + #banner, .welcome { display: block; } + #sidebar_content { display: none; } } .welcome { + display: none; + padding-bottom: 5px; + p { padding: $lineheight/2 $lineheight $lineheight; font-size: 110%; @@ -605,6 +633,15 @@ body.compact { } } + #banner { + display: none; + + img { + display: block; + width: $sidebarWidth; + } + } + #map { height: 100%; overflow: hidden; @@ -689,7 +726,7 @@ body.compact { font-size: 16px; text-stroke: 2px #fff; background: rgba(255,255,255,.9); - z-index: 2; // For IE9 + z-index: 1000; input[type="radio"] { display: none; } @@ -834,10 +871,15 @@ body.compact { #sidebar { #sidebar_loader, + .search_more { + width: 100%; + margin: $lineheight auto; + } + .loader, .load_more { text-align: center; - margin: $lineheight auto; + margin: auto; width: 40px; display: block; } @@ -1001,8 +1043,8 @@ div.direction { height: 20px; background-repeat: no-repeat; } -@for $i from 1 through 17 { -div.direction.i#{$i} { background-position: #{($i)*-20+20}px 0px; } +@for $i from 0 through 25 { +div.direction.i#{$i} { background-position: #{($i)*-20}px 0px; } } p#routing_summary { @@ -1059,6 +1101,15 @@ tr.turn:hover { color: #000; } } + + .comments { + float: right; + color: #999; + } + + .comments-0 { + opacity: 0.5; + } } /* Rules for the browse sidebar */ @@ -1131,6 +1182,7 @@ tr.turn:hover { width: 50%; padding: 6px 10px; word-wrap: break-word; + white-space: pre-wrap; } .browse-tag-k { @@ -1324,6 +1376,11 @@ tr.turn:hover { .user-terms { .content-body .content-inner { padding: 0; + + .message { + margin-top: 80px; + padding: 20px; + } } } @@ -1577,10 +1634,6 @@ tr.turn:hover { float: left; display: block; } - - ul.secondary-actions { - display: inline-block; - } } .content-heading .hide_unless_logged_in { // hacky selector, better to just add a new class to this div @@ -1629,6 +1682,13 @@ tr.turn:hover { float: left; } + +.diary-subscribe-buttons { + position:relative; + top: -30px; + left: 130px; +} + /* Rules for the log in page */ #login_auth_buttons { @@ -1813,6 +1873,19 @@ tr.turn:hover { display: inline-block; margin-left: $lineheight / 2; vertical-align: middle; + + p { + margin-top: $lineheight * 0.5; + margin-bottom: $lineheight * 0.5; + + &:first-child { + margin-top: 0px; + } + + &:last-child { + margin-bottom: 0px; + } + } } } diff --git a/app/assets/stylesheets/parameters.scss b/app/assets/stylesheets/parameters.scss index eb363459c..1cae5ba2f 100644 --- a/app/assets/stylesheets/parameters.scss +++ b/app/assets/stylesheets/parameters.scss @@ -15,5 +15,5 @@ $headerHeight: 55px; $sidebarWidth: 350px; $keyline: 1px solid $lightgrey; $border-radius: 3px; -$list-highlight: #FFFFE6; +$list-highlight: #FFFFC0; $border: 1px solid $grey; diff --git a/app/assets/stylesheets/small.scss b/app/assets/stylesheets/small.scss index c05c73c9d..984364736 100644 --- a/app/assets/stylesheets/small.scss +++ b/app/assets/stylesheets/small.scss @@ -126,13 +126,13 @@ body.small { } } - #sidebar .welcome { + #sidebar .welcome, + #sidebar #banner { display: none !important; } .leaflet-top.leaflet-right { top: 10px !important; - z-index: 0; } .content_map { diff --git a/app/controllers/amf_controller.rb b/app/controllers/amf_controller.rb index fb50b6aad..47a28fd40 100644 --- a/app/controllers/amf_controller.rb +++ b/app/controllers/amf_controller.rb @@ -86,19 +86,19 @@ class AmfController < ApplicationController orn = renumberednodes.dup result = putway(renumberednodes, *args) result[4] = renumberednodes.reject { |k, _v| orn.key?(k) } - renumberedways[result[2]] = result[3] if result[0] == 0 && result[2] != result[3] + renumberedways[result[2]] = result[3] if result[0].zero? && result[2] != result[3] when "putrelation" then result = putrelation(renumberednodes, renumberedways, *args) when "deleteway" then result = deleteway(*args) when "putpoi" then result = putpoi(*args) - renumberednodes[result[2]] = result[3] if result[0] == 0 && result[2] != result[3] + renumberednodes[result[2]] = result[3] if result[0].zero? && result[2] != result[3] when "startchangeset" then result = startchangeset(*args) end - err = true if result[0] == -3 # If a conflict is detected, don't execute any more writes + err = true if result[0] == -3 # If a conflict is detected, don't execute any more writes end result @@ -151,7 +151,7 @@ class AmfController < ApplicationController cs = Changeset.find(closeid.to_i) cs.set_closed_time_now if cs.user_id != user.id - fail OSM::APIUserChangesetMismatchError.new + raise OSM::APIUserChangesetMismatchError.new elsif closecomment.empty? cs.save! else @@ -163,7 +163,7 @@ class AmfController < ApplicationController end # open a new changeset - if opennew != 0 + if opennew.nonzero? cs = Changeset.new cs.tags = cstags cs.user_id = user.id @@ -189,12 +189,14 @@ class AmfController < ApplicationController def getpresets(usertoken, lang) #:doc: user = getuser(usertoken) - if user && !user.languages.empty? - http_accept_language.user_preferred_languages = user.languages - end + langs = if user && !user.languages.empty? + Locale.list(user.languages) + else + Locale.list(http_accept_language.user_preferred_languages) + end - lang = http_accept_language.compatible_language_from(getlocales) - (real_lang, localised) = getlocalized(lang) + lang = getlocales.preferred(langs) + (real_lang, localised) = getlocalized(lang.to_s) # Tell Potlatch what language it's using localised["__potlatch_locale"] = real_lang @@ -218,14 +220,14 @@ class AmfController < ApplicationController loaded_lang = "en" # Load English defaults - en = YAML.load(File.open("#{Rails.root}/config/potlatch/locales/en.yml"))["en"] + en = YAML.safe_load(File.open(Rails.root.join("config", "potlatch", "locales", "en.yml")))["en"] if lang == "en" return [loaded_lang, en] else # Use English as a fallback begin - other = YAML.load(File.open("#{Rails.root}/config/potlatch/locales/#{lang}.yml"))[lang] + other = YAML.safe_load(File.open(Rails.root.join("config", "potlatch", "locales", "#{lang}.yml")))[lang] loaded_lang = lang rescue other = en @@ -469,11 +471,11 @@ class AmfController < ApplicationController return -1, t("application.setup_user_auth.blocked") if user.blocks.active.exists? query = Trace.visible_to(user) - if searchterm.to_i > 0 - query = query.where(:id => searchterm.to_i) - else - query = query.where("MATCH(name) AGAINST (?)", searchterm).limit(21) - end + query = if searchterm.to_i > 0 + query.where(:id => searchterm.to_i) + else + query.where("MATCH(name) AGAINST (?)", searchterm).limit(21) + end gpxs = query.collect do |gpx| [gpx.id, gpx.name, gpx.description] end @@ -527,7 +529,7 @@ class AmfController < ApplicationController # 3. version. def putrelation(renumberednodes, renumberedways, usertoken, changeset_id, version, relid, tags, members, visible) #:doc: - amf_handle_error("'putrelation' #{relid}", "relation", relid) do + amf_handle_error("'putrelation' #{relid}", "relation", relid) do user = getuser(usertoken) return -1, "You are not logged in, so the relation could not be saved." unless user @@ -538,7 +540,7 @@ class AmfController < ApplicationController tags = strip_non_xml_chars tags relid = relid.to_i - visible = (visible.to_i != 0) + visible = visible.to_i.nonzero? new_relation = nil relation = nil @@ -642,10 +644,10 @@ class AmfController < ApplicationController id = a[2].to_i version = a[3].to_i - return -2, "Server error - node with id 0 found in way #{originalway}." if id == 0 + return -2, "Server error - node with id 0 found in way #{originalway}." if id.zero? return -2, "Server error - node with latitude -90 found in way #{originalway}." if lat == 90 - id = renumberednodes[id] if renumberednodes[id] + id = renumberednodes[id] if renumberednodes[id] node = Node.new node.changeset_id = changeset_id @@ -675,7 +677,7 @@ class AmfController < ApplicationController # -- Save revised way - pointlist.collect! do|a| + pointlist.collect! do |a| renumberednodes[a] ? renumberednodes[a] : a end # renumber nodes new_way = Way.new @@ -866,15 +868,14 @@ class AmfController < ApplicationController def getuser(token) #:doc: if token =~ /^(.+)\:(.+)$/ - user = User.authenticate(:username => $1, :password => $2) + User.authenticate(:username => Regexp.last_match(1), :password => Regexp.last_match(2)) else - user = User.authenticate(:token => token) + User.authenticate(:token => token) end - user end def getlocales - Dir.glob("#{Rails.root}/config/potlatch/locales/*").collect { |f| File.basename(f, ".yml") } + @locales ||= Locale.list(Dir.glob(Rails.root.join("config", "potlatch", "locales", "*")).collect { |f| File.basename(f, ".yml") }) end ## @@ -913,7 +914,7 @@ class AmfController < ApplicationController INNER JOIN current_ways ON current_ways.id =current_way_nodes.id WHERE current_nodes.visible=TRUE AND current_ways.visible=TRUE - AND #{OSM.sql_for_area(bbox, "current_nodes.")} + AND #{OSM.sql_for_area(bbox, 'current_nodes.')} EOF ActiveRecord::Base.connection.select_all(sql).collect { |a| [a["wayid"].to_i, a["version"].to_i] } end @@ -926,7 +927,7 @@ class AmfController < ApplicationController LEFT OUTER JOIN current_way_nodes cwn ON cwn.node_id=current_nodes.id WHERE current_nodes.visible=TRUE AND cwn.id IS NULL - AND #{OSM.sql_for_area(bbox, "current_nodes.")} + AND #{OSM.sql_for_area(bbox, 'current_nodes.')} EOF ActiveRecord::Base.connection.select_all(sql).each do |row| poitags = {} @@ -946,7 +947,7 @@ class AmfController < ApplicationController FROM current_relations cr INNER JOIN current_relation_members crm ON crm.id=cr.id INNER JOIN current_nodes cn ON crm.member_id=cn.id AND crm.member_type='Node' - WHERE #{OSM.sql_for_area(bbox, "cn.")} + WHERE #{OSM.sql_for_area(bbox, 'cn.')} EOF unless way_ids.empty? sql += <<-EOF diff --git a/app/controllers/api_controller.rb b/app/controllers/api_controller.rb index 379bb7e86..eb59a8a8d 100644 --- a/app/controllers/api_controller.rb +++ b/app/controllers/api_controller.rb @@ -136,12 +136,14 @@ class ApiController < ApplicationController doc = OSM::API.new.get_xml_doc # add bounds - doc.root << bbox.add_bounds_to(XML::Node.new "bounds") + doc.root << bbox.add_bounds_to(XML::Node.new("bounds")) # get ways # find which ways are needed ways = [] - if node_ids.length > 0 + if node_ids.empty? + list_of_way_nodes = [] + else way_nodes = WayNode.where(:node_id => node_ids) way_ids = way_nodes.collect { |way_node| way_node.id[0] } ways = Way.preload(:way_nodes, :way_tags).find(way_ids) @@ -150,15 +152,12 @@ class ApiController < ApplicationController way.way_nodes.collect(&:node_id) end list_of_way_nodes.flatten! - - else - list_of_way_nodes = [] end # - [0] in case some thing links to node 0 which doesn't exist. Shouldn't actually ever happen but it does. FIXME: file a ticket for this nodes_to_fetch = (list_of_way_nodes.uniq - node_ids) - [0] - if nodes_to_fetch.length > 0 + unless nodes_to_fetch.empty? nodes += Node.includes(:node_tags).find(nodes_to_fetch) end @@ -258,8 +257,8 @@ class ApiController < ApplicationController api = XML::Node.new "api" version = XML::Node.new "version" - version["minimum"] = "#{API_VERSION}" - version["maximum"] = "#{API_VERSION}" + version["minimum"] = API_VERSION.to_s + version["maximum"] = API_VERSION.to_s api << version area = XML::Node.new "area" area["maximum"] = MAX_REQUEST_AREA.to_s @@ -301,10 +300,9 @@ class ApiController < ApplicationController # * if authenticated via basic auth all permissions are granted, so the list will contain all permissions. # * unauthenticated users have no permissions, so the list will be empty. def permissions - @permissions = case - when current_token.present? + @permissions = if current_token.present? ClientApplication.all_permissions.select { |p| current_token.read_attribute(p) } - when @user + elsif @user ClientApplication.all_permissions else [] diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 618f08a1f..354fcc7c0 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -62,7 +62,7 @@ class ApplicationController < ActionController::Base unless current_token.nil? unless current_token.read_attribute(cap) report_error "OAuth token doesn't have that capability.", :forbidden - return false + false end end end @@ -74,7 +74,7 @@ class ApplicationController < ActionController::Base if params[:cookie_test].nil? session[:cookie_test] = true redirect_to Hash[params].merge(:cookie_test => "true") - return false + false else flash.now[:warning] = t "application.require_cookies.cookies_needed" end @@ -140,13 +140,13 @@ class ApplicationController < ActionController::Base unless Authenticator.new(self, [:token]).allow? username, passwd = get_auth_data # parse from headers # authenticate per-scheme - if username.nil? - @user = nil # no authentication provided - perhaps first connect (client should retry after 401) - elsif username == "token" - @user = User.authenticate(:token => passwd) # preferred - random token for user from db, passed in basic auth - else - @user = User.authenticate(:username => username, :password => passwd) # basic auth - end + @user = if username.nil? + nil # no authentication provided - perhaps first connect (client should retry after 401) + elsif username == "token" + User.authenticate(:token => passwd) # preferred - random token for user from db, passed in basic auth + else + User.authenticate(:username => username, :password => passwd) # basic auth + end end # have we identified the user? @@ -192,7 +192,7 @@ class ApplicationController < ActionController::Base # check user is a moderator unless @user.moderator? render :text => errormessage, :status => :forbidden - return false + false end end @@ -220,14 +220,14 @@ class ApplicationController < ActionController::Base def check_api_readable if api_status == :offline report_error "Database offline for maintenance", :service_unavailable - return false + false end end def check_api_writable unless api_status == :online report_error "Database offline for maintenance", :service_unavailable - return false + false end end @@ -262,7 +262,7 @@ class ApplicationController < ActionController::Base def require_public_data unless @user.data_public? report_error "You must make your edits public to upload new data", :forbidden - return false + false end end @@ -276,7 +276,7 @@ class ApplicationController < ActionController::Base response.headers["Error"] = message if request.headers["X-Error-Format"] && - request.headers["X-Error-Format"].downcase == "xml" + request.headers["X-Error-Format"].casecmp("xml").zero? result = OSM::API.new.get_xml_doc result.root.name = "osmError" result.root << (XML::Node.new("status") << "#{Rack::Utils.status_code(status)} #{Rack::Utils::HTTP_STATUS_CODES[status]}") @@ -288,47 +288,30 @@ class ApplicationController < ActionController::Base end end - def set_locale - response.header["Vary"] = "Accept-Language" - - if @user && !@user.languages.empty? - http_accept_language.user_preferred_languages = @user.languages - response.header["Vary"] = "*" - end + def preferred_languages + @languages ||= if params[:locale] + Locale.list(params[:locale]) + elsif @user + @user.preferred_languages + else + Locale.list(http_accept_language.user_preferred_languages) + end + end - I18n.locale = select_locale + helper_method :preferred_languages + def set_locale if @user && @user.languages.empty? && !http_accept_language.user_preferred_languages.empty? @user.languages = http_accept_language.user_preferred_languages @user.save end - response.headers["Content-Language"] = I18n.locale.to_s - end - - def select_locale(locales = I18n.available_locales) - if params[:locale] - http_accept_language.user_preferred_languages = [params[:locale]] - end - - if http_accept_language.compatible_language_from(locales).nil? - http_accept_language.user_preferred_languages = http_accept_language.user_preferred_languages.collect do |pl| - pls = [pl] - - while pl.match(/^(.*)-[^-]+$/) - pls.push($1) if locales.include?($1) || locales.include?($1.to_sym) - pl = $1 - end - - pls - end.flatten - end + I18n.locale = Locale.available.preferred(preferred_languages) - http_accept_language.compatible_language_from(locales) || I18n.default_locale + response.headers["Vary"] = "Accept-Language" + response.headers["Content-Language"] = I18n.locale.to_s end - helper_method :select_locale - def api_call_handle_error yield rescue ActiveRecord::RecordNotFound => ex @@ -354,13 +337,13 @@ class ApplicationController < ActionController::Base # or raises a suitable error. +method+ should be a symbol, e.g: :put or :get. def assert_method(method) ok = request.send((method.to_s.downcase + "?").to_sym) - fail OSM::APIBadMethodError.new(method) unless ok + raise OSM::APIBadMethodError.new(method) unless ok end ## # wrap an api call in a timeout def api_call_timeout - OSM::Timer.timeout(API_TIMEOUT) do + OSM::Timer.timeout(API_TIMEOUT, Timeout::Error) do yield end rescue Timeout::Error @@ -370,17 +353,13 @@ class ApplicationController < ActionController::Base ## # wrap a web page in a timeout def web_timeout - OSM::Timer.timeout(WEB_TIMEOUT) do + OSM::Timer.timeout(WEB_TIMEOUT, Timeout::Error) do yield end rescue ActionView::Template::Error => ex ex = ex.original_exception if ex.is_a?(ActiveRecord::StatementInvalid) && ex.message =~ /execution expired/ - ex = Timeout::Error.new - end - - if ex.is_a?(Timeout::Error) render :action => "timeout" else raise @@ -392,7 +371,7 @@ class ApplicationController < ActionController::Base ## # ensure that there is a "this_user" instance variable def lookup_this_user - unless @this_user = User.active.find_by_display_name(params[:display_name]) + unless @this_user = User.active.find_by(:display_name => params[:display_name]) render_unknown_user params[:display_name] end end @@ -435,24 +414,30 @@ class ApplicationController < ActionController::Base DEFAULT_EDITOR end - if request.env["HTTP_USER_AGENT"] =~ /MSIE|Trident/ && editor == "id" - editor = "potlatch2" - end - editor end helper_method :preferred_editor + def update_totp + if defined?(TOTP_KEY) + cookies["_osm_totp_token"] = { + :value => ROTP::TOTP.new(TOTP_KEY, :interval => 3600).now, + :domain => "openstreetmap.org", + :expires => 1.hour.from_now + } + end + end + private # extract authorisation credentials from headers, returns user = nil if none def get_auth_data - if request.env.key? "X-HTTP_AUTHORIZATION" # where mod_rewrite might have put it + if request.env.key? "X-HTTP_AUTHORIZATION" # where mod_rewrite might have put it authdata = request.env["X-HTTP_AUTHORIZATION"].to_s.split - elsif request.env.key? "REDIRECT_X_HTTP_AUTHORIZATION" # mod_fcgi + elsif request.env.key? "REDIRECT_X_HTTP_AUTHORIZATION" # mod_fcgi authdata = request.env["REDIRECT_X_HTTP_AUTHORIZATION"].to_s.split - elsif request.env.key? "HTTP_AUTHORIZATION" # regular location + elsif request.env.key? "HTTP_AUTHORIZATION" # regular location authdata = request.env["HTTP_AUTHORIZATION"].to_s.split end # only basic authentication supported @@ -473,6 +458,5 @@ class ApplicationController < ActionController::Base end # override to stop oauth plugin sending errors - def invalid_oauth_response - end + def invalid_oauth_response; end end diff --git a/app/controllers/browse_controller.rb b/app/controllers/browse_controller.rb index c7f8b0e81..7d2f80eb9 100644 --- a/app/controllers/browse_controller.rb +++ b/app/controllers/browse_controller.rb @@ -58,11 +58,11 @@ class BrowseController < ApplicationController def changeset @type = "changeset" @changeset = Changeset.find(params[:id]) - if @user && @user.moderator? - @comments = @changeset.comments.unscope(:where => :visible).includes(:author) - else - @comments = @changeset.comments.includes(:author) - end + @comments = if @user && @user.moderator? + @changeset.comments.unscope(:where => :visible).includes(:author) + else + @changeset.comments.includes(:author) + end @node_pages, @nodes = paginate(:old_nodes, :conditions => { :changeset_id => @changeset.id }, :per_page => 20, :parameter => "node_page") @way_pages, @ways = paginate(:old_ways, :conditions => { :changeset_id => @changeset.id }, :per_page => 20, :parameter => "way_page") @relation_pages, @relations = paginate(:old_relations, :conditions => { :changeset_id => @changeset.id }, :per_page => 20, :parameter => "relation_page") @@ -76,7 +76,14 @@ class BrowseController < ApplicationController def note @type = "note" - @note = Note.find(params[:id]) + + if @user && @user.moderator? + @note = Note.find(params[:id]) + @note_comments = @note.comments.unscope(:where => :visible) + else + @note = Note.visible.find(params[:id]) + @note_comments = @note.comments + end rescue ActiveRecord::RecordNotFound render :action => "not_found", :status => :not_found end diff --git a/app/controllers/changeset_controller.rb b/app/controllers/changeset_controller.rb index 8a72d941d..da066a73a 100644 --- a/app/controllers/changeset_controller.rb +++ b/app/controllers/changeset_controller.rb @@ -15,6 +15,7 @@ class ChangesetController < ApplicationController before_action :check_api_readable, :except => [:create, :update, :delete, :upload, :download, :query, :list, :feed, :comment, :subscribe, :unsubscribe, :comments_feed] before_action(:only => [:list, :feed, :comments_feed]) { |c| c.check_database_readable(true) } around_action :api_call_handle_error, :except => [:list, :feed, :comments_feed] + around_action :api_call_timeout, :except => [:list, :feed, :comments_feed, :upload] around_action :web_timeout, :only => [:list, :feed, :comments_feed] # Helper methods for checking consistency @@ -82,7 +83,7 @@ class ChangesetController < ApplicationController # the request is in pseudo-osm format... this is kind-of an # abuse, maybe should change to some other format? - doc = XML::Parser.string(request.raw_post).parse + doc = XML::Parser.string(request.raw_post, :options => XML::Parser::Options::NOERROR).parse doc.find("//osm/node").each do |n| lon << n["lon"].to_f * GeoRecord::SCALE lat << n["lat"].to_f * GeoRecord::SCALE @@ -161,7 +162,7 @@ class ChangesetController < ApplicationController # global (SVN-style) versioning were used - then that would be # unambiguous. elements.sort! do |a, b| - if (a.timestamp == b.timestamp) + if a.timestamp == b.timestamp a.version <=> b.version else a.timestamp <=> b.timestamp @@ -181,20 +182,18 @@ class ChangesetController < ApplicationController # check these assertions. elements.each do |elt| result.root << - if (elt.version == 1) + if elt.version == 1 # first version, so it must be newly-created. created = XML::Node.new "create" created << elt.to_xml_node(changeset_cache, user_display_name_cache) + elsif elt.visible + # must be a modify + modified = XML::Node.new "modify" + modified << elt.to_xml_node(changeset_cache, user_display_name_cache) else - if elt.visible - # must be a modify - modified = XML::Node.new "modify" - modified << elt.to_xml_node(changeset_cache, user_display_name_cache) - else - # if the element isn't visible then it must have been deleted - deleted = XML::Node.new "delete" - deleted << elt.to_xml_node(changeset_cache, user_display_name_cache) - end + # if the element isn't visible then it must have been deleted + deleted = XML::Node.new "delete" + deleted << elt.to_xml_node(changeset_cache, user_display_name_cache) end end @@ -257,7 +256,7 @@ class ChangesetController < ApplicationController end if params[:display_name] - user = User.find_by_display_name(params[:display_name]) + user = User.find_by(:display_name => params[:display_name]) if !user || !user.active? render_unknown_user params[:display_name] return @@ -276,11 +275,11 @@ class ChangesetController < ApplicationController changesets = conditions_nonempty(Changeset.all) if params[:display_name] - if user.data_public? || user == @user - changesets = changesets.where(:user_id => user.id) - else - changesets = changesets.where("false") - end + changesets = if user.data_public? || user == @user + changesets.where(:user_id => user.id) + else + changesets.where("false") + end elsif params[:bbox] changesets = conditions_bbox(changesets, BoundingBox.from_bbox_params(params)) elsif params[:friends] && @user @@ -293,7 +292,7 @@ class ChangesetController < ApplicationController changesets = changesets.where("changesets.id <= ?", params[:max_id]) end - @edits = changesets.order("changesets.id DESC").limit(20).preload(:user, :changeset_tags) + @edits = changesets.order("changesets.id DESC").limit(20).preload(:user, :changeset_tags, :comments) render :action => :list, :layout => false end @@ -309,8 +308,8 @@ class ChangesetController < ApplicationController # Add a comment to a changeset def comment # Check the arguments are sane - fail OSM::APIBadUserInput.new("No id was given") unless params[:id] - fail OSM::APIBadUserInput.new("No text was given") if params[:text].blank? + raise OSM::APIBadUserInput.new("No id was given") unless params[:id] + raise OSM::APIBadUserInput.new("No text was given") if params[:text].blank? # Extract the arguments id = params[:id].to_i @@ -318,7 +317,7 @@ class ChangesetController < ApplicationController # Find the changeset and check it is valid changeset = Changeset.find(id) - fail OSM::APIChangesetNotYetClosedError.new(changeset) if changeset.is_open? + raise OSM::APIChangesetNotYetClosedError.new(changeset) if changeset.is_open? # Add a comment to the changeset comment = changeset.comments.create(:changeset => changeset, @@ -326,7 +325,7 @@ class ChangesetController < ApplicationController :author => @user) # Notify current subscribers of the new comment - changeset.subscribers.each do |user| + changeset.subscribers.visible.each do |user| if @user != user Notifier.changeset_comment_notification(comment, user).deliver_now end @@ -343,15 +342,15 @@ class ChangesetController < ApplicationController # Adds a subscriber to the changeset def subscribe # Check the arguments are sane - fail OSM::APIBadUserInput.new("No id was given") unless params[:id] + raise OSM::APIBadUserInput.new("No id was given") unless params[:id] # Extract the arguments id = params[:id].to_i # Find the changeset and check it is valid changeset = Changeset.find(id) - fail OSM::APIChangesetNotYetClosedError.new(changeset) if changeset.is_open? - fail OSM::APIChangesetAlreadySubscribedError.new(changeset) if changeset.subscribers.exists?(@user.id) + raise OSM::APIChangesetNotYetClosedError.new(changeset) if changeset.is_open? + raise OSM::APIChangesetAlreadySubscribedError.new(changeset) if changeset.subscribers.exists?(@user.id) # Add the subscriber changeset.subscribers << @user @@ -364,15 +363,15 @@ class ChangesetController < ApplicationController # Removes a subscriber from the changeset def unsubscribe # Check the arguments are sane - fail OSM::APIBadUserInput.new("No id was given") unless params[:id] + raise OSM::APIBadUserInput.new("No id was given") unless params[:id] # Extract the arguments id = params[:id].to_i # Find the changeset and check it is valid changeset = Changeset.find(id) - fail OSM::APIChangesetNotYetClosedError.new(changeset) if changeset.is_open? - fail OSM::APIChangesetNotSubscribedError.new(changeset) unless changeset.subscribers.exists?(@user.id) + raise OSM::APIChangesetNotYetClosedError.new(changeset) if changeset.is_open? + raise OSM::APIChangesetNotSubscribedError.new(changeset) unless changeset.subscribers.exists?(@user.id) # Remove the subscriber changeset.subscribers.delete(@user) @@ -385,7 +384,7 @@ class ChangesetController < ApplicationController # Sets visible flag on comment to false def hide_comment # Check the arguments are sane - fail OSM::APIBadUserInput.new("No id was given") unless params[:id] + raise OSM::APIBadUserInput.new("No id was given") unless params[:id] # Extract the arguments id = params[:id].to_i @@ -404,7 +403,7 @@ class ChangesetController < ApplicationController # Sets visible flag on comment to true def unhide_comment # Check the arguments are sane - fail OSM::APIBadUserInput.new("No id was given") unless params[:id] + raise OSM::APIBadUserInput.new("No id was given") unless params[:id] # Extract the arguments id = params[:id].to_i @@ -455,14 +454,15 @@ class ChangesetController < ApplicationController # restrict changesets to those enclosed by a bounding box # we need to return both the changesets and the bounding box def conditions_bbox(changesets, bbox) - if bbox + if bbox bbox.check_boundaries bbox = bbox.to_scaled - return changesets.where("min_lon < ? and max_lon > ? and min_lat < ? and max_lat > ?", - bbox.max_lon.to_i, bbox.min_lon.to_i, - bbox.max_lat.to_i, bbox.min_lat.to_i) + + changesets.where("min_lon < ? and max_lon > ? and min_lat < ? and max_lat > ?", + bbox.max_lon.to_i, bbox.min_lon.to_i, + bbox.max_lat.to_i, bbox.min_lat.to_i) else - return changesets + changesets end end @@ -470,22 +470,22 @@ class ChangesetController < ApplicationController # restrict changesets to those by a particular user def conditions_user(changesets, user, name) if user.nil? && name.nil? - return changesets + changesets else # shouldn't provide both name and UID - fail OSM::APIBadUserInput.new("provide either the user ID or display name, but not both") if user && name + raise OSM::APIBadUserInput.new("provide either the user ID or display name, but not both") if user && name # use either the name or the UID to find the user which we're selecting on. u = if name.nil? # user input checking, we don't have any UIDs < 1 - fail OSM::APIBadUserInput.new("invalid user ID") if user.to_i < 1 + raise OSM::APIBadUserInput.new("invalid user ID") if user.to_i < 1 u = User.find(user.to_i) else - u = User.find_by_display_name(name) + u = User.find_by(:display_name => name) end # make sure we found a user - fail OSM::APINotFoundError.new if u.nil? + raise OSM::APINotFoundError.new if u.nil? # should be able to get changesets of public users only, or # our own changesets regardless of public-ness. @@ -494,9 +494,10 @@ class ChangesetController < ApplicationController # changesets if they're non-public setup_user_auth - fail OSM::APINotFoundError if @user.nil? || @user.id != u.id + raise OSM::APINotFoundError if @user.nil? || @user.id != u.id end - return changesets.where(:user_id => u.id) + + changesets.where(:user_id => u.id) end end @@ -505,20 +506,19 @@ class ChangesetController < ApplicationController def conditions_time(changesets, time) if time.nil? return changesets - else + elsif time.count(",") == 1 # if there is a range, i.e: comma separated, then the first is # low, second is high - same as with bounding boxes. - if time.count(",") == 1 - # check that we actually have 2 elements in the array - times = time.split(/,/) - fail OSM::APIBadUserInput.new("bad time range") if times.size != 2 - from, to = times.collect { |t| DateTime.parse(t) } - return changesets.where("closed_at >= ? and created_at <= ?", from, to) - else - # if there is no comma, assume its a lower limit on time - return changesets.where("closed_at >= ?", DateTime.parse(time)) - end + # check that we actually have 2 elements in the array + times = time.split(/,/) + raise OSM::APIBadUserInput.new("bad time range") if times.size != 2 + + from, to = times.collect { |t| DateTime.parse(t) } + return changesets.where("closed_at >= ? and created_at <= ?", from, to) + else + # if there is no comma, assume its a lower limit on time + return changesets.where("closed_at >= ?", DateTime.parse(time)) end # stupid DateTime seems to throw both of these for bad parsing, so # we have to catch both and ensure the correct code path is taken. @@ -535,10 +535,10 @@ class ChangesetController < ApplicationController # if parameter 'open' is nill then open and closed changesets are returned def conditions_open(changesets, open) if open.nil? - return changesets + changesets else - return changesets.where("closed_at >= ? and num_changes <= ?", - Time.now.getutc, Changeset::MAX_ELEMENTS) + changesets.where("closed_at >= ? and num_changes <= ?", + Time.now.getutc, Changeset::MAX_ELEMENTS) end end @@ -547,10 +547,10 @@ class ChangesetController < ApplicationController # ('closed at' time has passed or changes limit is hit) def conditions_closed(changesets, closed) if closed.nil? - return changesets + changesets else - return changesets.where("closed_at < ? or num_changes > ?", - Time.now.getutc, Changeset::MAX_ELEMENTS) + changesets.where("closed_at < ? or num_changes > ?", + Time.now.getutc, Changeset::MAX_ELEMENTS) end end @@ -559,12 +559,12 @@ class ChangesetController < ApplicationController # (either specified as array or comma-separated string) def conditions_ids(changesets, ids) if ids.nil? - return changesets + changesets elsif ids.empty? - fail OSM::APIBadUserInput.new("No changesets were given to search for") + raise OSM::APIBadUserInput.new("No changesets were given to search for") else ids = ids.split(",").collect(&:to_i) - return changesets.where(:id => ids) + changesets.where(:id => ids) end end @@ -582,7 +582,7 @@ class ChangesetController < ApplicationController if params[:limit].to_i > 0 && params[:limit].to_i <= 10000 params[:limit].to_i else - fail OSM::APIBadUserInput.new("Comments limit must be between 1 and 10000") + raise OSM::APIBadUserInput.new("Comments limit must be between 1 and 10000") end else 100 diff --git a/app/controllers/diary_entry_controller.rb b/app/controllers/diary_entry_controller.rb index c0b6ece38..6fb255a36 100644 --- a/app/controllers/diary_entry_controller.rb +++ b/app/controllers/diary_entry_controller.rb @@ -3,16 +3,16 @@ class DiaryEntryController < ApplicationController before_action :authorize_web before_action :set_locale - before_action :require_user, :only => [:new, :edit, :comment, :hide, :hidecomment] + before_action :require_user, :only => [:new, :edit, :comment, :hide, :hidecomment, :subscribe, :unsubscribe] before_action :lookup_this_user, :only => [:view, :comments] before_action :check_database_readable - before_action :check_database_writable, :only => [:new, :edit] + before_action :check_database_writable, :only => [:new, :edit, :comment, :hide, :hidecomment, :subscribe, :unsubscribe] before_action :require_administrator, :only => [:hide, :hidecomment] def new @title = t "diary_entry.new.title" - if params[:diary_entry] + if request.post? @diary_entry = DiaryEntry.new(entry_params) @diary_entry.user = @user @@ -24,14 +24,18 @@ class DiaryEntryController < ApplicationController else @user.preferences.create(:k => "diary.default_language", :v => @diary_entry.language_code) end - redirect_to :controller => "diary_entry", :action => "list", :display_name => @user.display_name + + # Subscribe user to diary comments + @diary_entry.subscriptions.create(:user => @user) + + redirect_to :action => "list", :display_name => @user.display_name else render :action => "edit" end else default_lang = @user.preferences.where(:k => "diary.default_language").first lang_code = default_lang ? default_lang.v : @user.preferred_language - @diary_entry = DiaryEntry.new(:language_code => lang_code) + @diary_entry = DiaryEntry.new(entry_params.merge(:language_code => lang_code)) set_map_location render :action => "edit" end @@ -42,9 +46,9 @@ class DiaryEntryController < ApplicationController @diary_entry = DiaryEntry.find(params[:id]) if @user != @diary_entry.user - redirect_to :controller => "diary_entry", :action => "view", :id => params[:id] + redirect_to :action => "view", :id => params[:id] elsif params[:diary_entry] && @diary_entry.update_attributes(entry_params) - redirect_to :controller => "diary_entry", :action => "view", :id => params[:id] + redirect_to :action => "view", :id => params[:id] end set_map_location @@ -57,11 +61,18 @@ class DiaryEntryController < ApplicationController @diary_comment = @entry.comments.build(comment_params) @diary_comment.user = @user if @diary_comment.save - if @diary_comment.user != @entry.user - Notifier.diary_comment_notification(@diary_comment).deliver_now + + # Notify current subscribers of the new comment + @entry.subscribers.visible.each do |user| + if @user != user + Notifier.diary_comment_notification(@diary_comment, user).deliver_now + end end - redirect_to :controller => "diary_entry", :action => "view", :display_name => @entry.user.display_name, :id => @entry.id + # Add the commenter to the subscribers if necessary + @entry.subscriptions.create(:user => @user) unless @entry.subscribers.exists?(@user.id) + + redirect_to :action => "view", :display_name => @entry.user.display_name, :id => @entry.id else render :action => "view" end @@ -69,9 +80,29 @@ class DiaryEntryController < ApplicationController render :action => "no_such_entry", :status => :not_found end + def subscribe + diary_entry = DiaryEntry.find(params[:id]) + + diary_entry.subscriptions.create(:user => @user) unless diary_entry.subscribers.exists?(@user.id) + + redirect_to :action => "view", :display_name => diary_entry.user.display_name, :id => diary_entry.id + rescue ActiveRecord::RecordNotFound + render :action => "no_such_entry", :status => :not_found + end + + def unsubscribe + diary_entry = DiaryEntry.find(params[:id]) + + diary_entry.subscriptions.where(:user => @user).delete_all if diary_entry.subscribers.exists?(@user.id) + + redirect_to :action => "view", :display_name => diary_entry.user.display_name, :id => diary_entry.id + rescue ActiveRecord::RecordNotFound + render :action => "no_such_entry", :status => :not_found + end + def list if params[:display_name] - @this_user = User.active.find_by_display_name(params[:display_name]) + @this_user = User.active.find_by(:display_name => params[:display_name]) if @this_user @title = t "diary_entry.list.user_title", :user => @this_user.display_name @@ -119,7 +150,7 @@ class DiaryEntryController < ApplicationController def rss if params[:display_name] - user = User.active.find_by_display_name(params[:display_name]) + user = User.active.find_by(:display_name => params[:display_name]) if user @entries = user.diary_entries @@ -187,6 +218,8 @@ class DiaryEntryController < ApplicationController # return permitted diary entry parameters def entry_params params.require(:diary_entry).permit(:title, :body, :language_code, :latitude, :longitude) + rescue ActionController::ParameterMissing + ActionController::Parameters.new.permit(:title, :body, :language_code, :latitude, :longitude) end ## @@ -201,7 +234,7 @@ class DiaryEntryController < ApplicationController def require_administrator unless @user.administrator? flash[:error] = t("user.filter.not_an_administrator") - redirect_to :controller => "diary_entry", :action => "view" + redirect_to :action => "view" end end diff --git a/app/controllers/export_controller.rb b/app/controllers/export_controller.rb index bd020f29b..6e5016ddc 100644 --- a/app/controllers/export_controller.rb +++ b/app/controllers/export_controller.rb @@ -1,6 +1,7 @@ class ExportController < ApplicationController before_action :authorize_web before_action :set_locale + before_action :update_totp, :only => [:finish] caches_page :embed @@ -22,6 +23,5 @@ class ExportController < ApplicationController end end - def embed - end + def embed; end end diff --git a/app/controllers/geocoder_controller.rb b/app/controllers/geocoder_controller.rb index 20e4d7d1d..57f86ec9f 100644 --- a/app/controllers/geocoder_controller.rb +++ b/app/controllers/geocoder_controller.rb @@ -19,13 +19,13 @@ class GeocoderController < ApplicationController @sources.push "osm_nominatim_reverse" @sources.push "geonames_reverse" if defined?(GEONAMES_USERNAME) elsif params[:query] - if params[:query].match(/^\d{5}(-\d{4})?$/) + if params[:query] =~ /^\d{5}(-\d{4})?$/ @sources.push "us_postcode" @sources.push "osm_nominatim" - elsif params[:query].match(/^(GIR 0AA|[A-PR-UWYZ]([0-9]{1,2}|([A-HK-Y][0-9]|[A-HK-Y][0-9]([0-9]|[ABEHMNPRV-Y]))|[0-9][A-HJKS-UW])\s*[0-9][ABD-HJLNP-UW-Z]{2})$/i) + elsif params[:query] =~ /^(GIR 0AA|[A-PR-UWYZ]([0-9]{1,2}|([A-HK-Y][0-9]|[A-HK-Y][0-9]([0-9]|[ABEHMNPRV-Y]))|[0-9][A-HJKS-UW])\s*[0-9][ABD-HJLNP-UW-Z]{2})$/i @sources.push "uk_postcode" @sources.push "osm_nominatim" - elsif params[:query].match(/^[A-Z]\d[A-Z]\s*\d[A-Z]\d$/i) + elsif params[:query] =~ /^[A-Z]\d[A-Z]\s*\d[A-Z]\d$/i @sources.push "ca_postcode" @sources.push "osm_nominatim" else @@ -70,7 +70,7 @@ class GeocoderController < ApplicationController response = fetch_text("http://rpc.geocoder.us/service/csv?zip=#{escape_query(query)}") # parse the response - unless response.match(/couldn't find this zip/) + unless response =~ /couldn't find this zip/ data = response.split(/\s*,\s+/) # lat,long,town,state,zip @results.push(:lat => data[0], :lon => data[1], :zoom => POSTCODE_ZOOM, @@ -95,10 +95,10 @@ class GeocoderController < ApplicationController response = fetch_text("http://www.npemap.org.uk/cgi/geocoder.fcgi?format=text&postcode=#{escape_query(query)}") # parse the response - unless response.match(/Error/) + unless response =~ /Error/ dataline = response.split(/\n/)[1] data = dataline.split(/,/) # easting,northing,postcode,lat,long - postcode = data[2].gsub(/'/, "") + postcode = data[2].delete("'") zoom = POSTCODE_ZOOM - postcode.count("#") @results.push(:lat => data[3], :lon => data[4], :zoom => zoom, :name => postcode) @@ -149,7 +149,7 @@ class GeocoderController < ApplicationController exclude = "&exclude_place_ids=#{params[:exclude]}" if params[:exclude] # ask nominatim - response = fetch_xml("http:#{NOMINATIM_URL}search?format=xml&q=#{escape_query(query)}#{viewbox}#{exclude}&accept-language=#{http_accept_language.user_preferred_languages.join(',')}") + response = fetch_xml("http:#{NOMINATIM_URL}search?format=xml&extratags=1&q=#{escape_query(query)}#{viewbox}#{exclude}&accept-language=#{http_accept_language.user_preferred_languages.join(',')}") # extract the results from the response results = response.elements["searchresults"] @@ -171,14 +171,19 @@ class GeocoderController < ApplicationController type = place.attributes["type"].to_s name = place.attributes["display_name"].to_s min_lat, max_lat, min_lon, max_lon = place.attributes["boundingbox"].to_s.split(",") - if type.empty? - prefix_name = "" - else - prefix_name = t "geocoder.search_osm_nominatim.prefix.#{klass}.#{type}", :default => type.gsub("_", " ").capitalize - end + prefix_name = if type.empty? + "" + else + t "geocoder.search_osm_nominatim.prefix.#{klass}.#{type}", :default => type.tr("_", " ").capitalize + end if klass == "boundary" && type == "administrative" rank = (place.attributes["place_rank"].to_i + 1) / 2 prefix_name = t "geocoder.search_osm_nominatim.admin_levels.level#{rank}", :default => prefix_name + place.elements["extratags"].elements.each("tag") do |extratag| + if extratag.attributes["key"] == "place" + prefix_name = t "geocoder.search_osm_nominatim.prefix.place.#{extratag.attributes['value']}", :default => prefix_name + end + end end prefix = t "geocoder.search_osm_nominatim.prefix_format", :name => prefix_name object_type = place.attributes["osm_type"] @@ -298,7 +303,7 @@ class GeocoderController < ApplicationController if response.success? response.body else - fail response.status.to_s + raise response.status.to_s end end @@ -339,11 +344,11 @@ class GeocoderController < ApplicationController def nsew_to_decdeg(captures) begin Float(captures[0]) - captures[2].downcase != "s" ? lat = captures[0].to_f : lat = -(captures[0].to_f) - captures[5].downcase != "w" ? lon = captures[3].to_f : lon = -(captures[3].to_f) + lat = !captures[2].casecmp("s").zero? ? captures[0].to_f : -captures[0].to_f + lon = !captures[5].casecmp("w").zero? ? captures[3].to_f : -captures[3].to_f rescue - captures[0].downcase != "s" ? lat = captures[1].to_f : lat = -(captures[1].to_f) - captures[3].downcase != "w" ? lon = captures[4].to_f : lon = -(captures[4].to_f) + lat = !captures[0].casecmp("s").zero? ? captures[1].to_f : -captures[1].to_f + lon = !captures[3].casecmp("w").zero? ? captures[4].to_f : -captures[4].to_f end { :lat => lat, :lon => lon } end @@ -351,11 +356,11 @@ class GeocoderController < ApplicationController def ddm_to_decdeg(captures) begin Float(captures[0]) - captures[3].downcase != "s" ? lat = captures[0].to_f + captures[1].to_f / 60 : lat = -(captures[0].to_f + captures[1].to_f / 60) - captures[7].downcase != "w" ? lon = captures[4].to_f + captures[5].to_f / 60 : lon = -(captures[4].to_f + captures[5].to_f / 60) + lat = !captures[3].casecmp("s").zero? ? captures[0].to_f + captures[1].to_f / 60 : -(captures[0].to_f + captures[1].to_f / 60) + lon = !captures[7].casecmp("w").zero? ? captures[4].to_f + captures[5].to_f / 60 : -(captures[4].to_f + captures[5].to_f / 60) rescue - captures[0].downcase != "s" ? lat = captures[1].to_f + captures[2].to_f / 60 : lat = -(captures[1].to_f + captures[2].to_f / 60) - captures[4].downcase != "w" ? lon = captures[5].to_f + captures[6].to_f / 60 : lon = -(captures[5].to_f + captures[6].to_f / 60) + lat = !captures[0].casecmp("s").zero? ? captures[1].to_f + captures[2].to_f / 60 : -(captures[1].to_f + captures[2].to_f / 60) + lon = !captures[4].casecmp("w").zero? ? captures[5].to_f + captures[6].to_f / 60 : -(captures[5].to_f + captures[6].to_f / 60) end { :lat => lat, :lon => lon } end @@ -363,11 +368,11 @@ class GeocoderController < ApplicationController def dms_to_decdeg(captures) begin Float(captures[0]) - captures[4].downcase != "s" ? lat = captures[0].to_f + (captures[1].to_f + captures[2].to_f / 60) / 60 : lat = -(captures[0].to_f + (captures[1].to_f + captures[2].to_f / 60) / 60) - captures[9].downcase != "w" ? lon = captures[5].to_f + (captures[6].to_f + captures[7].to_f / 60) / 60 : lon = -(captures[5].to_f + (captures[6].to_f + captures[7].to_f / 60) / 60) + lat = !captures[4].casecmp("s").zero? ? captures[0].to_f + (captures[1].to_f + captures[2].to_f / 60) / 60 : -(captures[0].to_f + (captures[1].to_f + captures[2].to_f / 60) / 60) + lon = !captures[9].casecmp("w").zero? ? captures[5].to_f + (captures[6].to_f + captures[7].to_f / 60) / 60 : -(captures[5].to_f + (captures[6].to_f + captures[7].to_f / 60) / 60) rescue - captures[0].downcase != "s" ? lat = captures[1].to_f + (captures[2].to_f + captures[3].to_f / 60) / 60 : lat = -(captures[1].to_f + (captures[2].to_f + captures[3].to_f / 60) / 60) - captures[5].downcase != "w" ? lon = captures[6].to_f + (captures[7].to_f + captures[8].to_f / 60) / 60 : lon = -(captures[6].to_f + (captures[7].to_f + captures[8].to_f / 60) / 60) + lat = !captures[0].casecmp("s").zero? ? captures[1].to_f + (captures[2].to_f + captures[3].to_f / 60) / 60 : -(captures[1].to_f + (captures[2].to_f + captures[3].to_f / 60) / 60) + lon = !captures[5].casecmp("w").zero? ? captures[6].to_f + (captures[7].to_f + captures[8].to_f / 60) / 60 : -(captures[6].to_f + (captures[7].to_f + captures[8].to_f / 60) / 60) end { :lat => lat, :lon => lon } end diff --git a/app/controllers/message_controller.rb b/app/controllers/message_controller.rb index a22802e63..450313e62 100644 --- a/app/controllers/message_controller.rb +++ b/app/controllers/message_controller.rb @@ -13,7 +13,7 @@ class MessageController < ApplicationController # clicks send. # The display_name param is the display name of the user that the message is being sent to. def new - if params[:message] + if request.post? if @user.sent_messages.where("sent_on >= ?", Time.now.getutc - 1.hour).count >= MAX_MESSAGES_PER_HOUR flash[:error] = t "message.new.limit_exceeded" else @@ -25,12 +25,12 @@ class MessageController < ApplicationController if @message.save flash[:notice] = t "message.new.message_sent" Notifier.message_notification(@message).deliver_now - redirect_to :controller => "message", :action => "inbox", :display_name => @user.display_name + redirect_to :action => "inbox", :display_name => @user.display_name end end end - @message ||= Message.new(:recipient => @this_user) + @message ||= Message.new(message_params.merge(:recipient => @this_user)) @title = t "message.new.title" end @@ -39,7 +39,7 @@ class MessageController < ApplicationController message = Message.find(params[:message_id]) if message.to_user_id == @user.id - message.update_attribute(:message_read, true) + message.update(:message_read => true) @message = Message.new( :recipient => message.sender, @@ -81,7 +81,7 @@ class MessageController < ApplicationController @title = t "message.inbox.title" if @user && params[:display_name] == @user.display_name else - redirect_to :controller => "message", :action => "inbox", :display_name => @user.display_name + redirect_to :action => "inbox", :display_name => @user.display_name end end @@ -90,7 +90,7 @@ class MessageController < ApplicationController @title = t "message.outbox.title" if @user && params[:display_name] == @user.display_name else - redirect_to :controller => "message", :action => "outbox", :display_name => @user.display_name + redirect_to :action => "outbox", :display_name => @user.display_name end end @@ -107,7 +107,7 @@ class MessageController < ApplicationController @message.message_read = message_read if @message.save && !request.xhr? flash[:notice] = notice - redirect_to :controller => "message", :action => "inbox", :display_name => @user.display_name + redirect_to :action => "inbox", :display_name => @user.display_name end rescue ActiveRecord::RecordNotFound @title = t "message.no_such_message.title" @@ -125,7 +125,7 @@ class MessageController < ApplicationController if params[:referer] redirect_to params[:referer] else - redirect_to :controller => "message", :action => "inbox", :display_name => @user.display_name + redirect_to :action => "inbox", :display_name => @user.display_name end end rescue ActiveRecord::RecordNotFound @@ -139,5 +139,7 @@ class MessageController < ApplicationController # return permitted message parameters def message_params params.require(:message).permit(:title, :body) + rescue ActionController::ParameterMissing + ActionController::Parameters.new.permit(:title, :body) end end diff --git a/app/controllers/node_controller.rb b/app/controllers/node_controller.rb index a077916ea..8d29fd072 100644 --- a/app/controllers/node_controller.rb +++ b/app/controllers/node_controller.rb @@ -41,7 +41,7 @@ class NodeController < ApplicationController new_node = Node.from_xml(request.raw_post) unless new_node && new_node.id == node.id - fail OSM::APIBadUserInput.new("The id in the url (#{node.id}) is not the same as provided in the xml (#{new_node.id})") + raise OSM::APIBadUserInput.new("The id in the url (#{node.id}) is not the same as provided in the xml (#{new_node.id})") end node.update_from(new_node, @user) @@ -56,7 +56,7 @@ class NodeController < ApplicationController new_node = Node.from_xml(request.raw_post) unless new_node && new_node.id == node.id - fail OSM::APIBadUserInput.new("The id in the url (#{node.id}) is not the same as provided in the xml (#{new_node.id})") + raise OSM::APIBadUserInput.new("The id in the url (#{node.id}) is not the same as provided in the xml (#{new_node.id})") end node.delete_with_history!(new_node, @user) render :text => node.version.to_s, :content_type => "text/plain" @@ -65,13 +65,13 @@ class NodeController < ApplicationController # Dump the details on many nodes whose ids are given in the "nodes" parameter. def nodes unless params["nodes"] - fail OSM::APIBadUserInput.new("The parameter nodes is required, and must be of the form nodes=id[,id[,id...]]") + raise OSM::APIBadUserInput.new("The parameter nodes is required, and must be of the form nodes=id[,id[,id...]]") end ids = params["nodes"].split(",").collect(&:to_i) - if ids.length == 0 - fail OSM::APIBadUserInput.new("No nodes were given to search for") + if ids.empty? + raise OSM::APIBadUserInput.new("No nodes were given to search for") end doc = OSM::API.new.get_xml_doc diff --git a/app/controllers/notes_controller.rb b/app/controllers/notes_controller.rb index ea32441f2..fde27e8b2 100644 --- a/app/controllers/notes_controller.rb +++ b/app/controllers/notes_controller.rb @@ -19,10 +19,10 @@ class NotesController < ApplicationController if params[:bbox] bbox = BoundingBox.from_bbox_params(params) else - fail OSM::APIBadUserInput.new("No l was given") unless params[:l] - fail OSM::APIBadUserInput.new("No r was given") unless params[:r] - fail OSM::APIBadUserInput.new("No b was given") unless params[:b] - fail OSM::APIBadUserInput.new("No t was given") unless params[:t] + raise OSM::APIBadUserInput.new("No l was given") unless params[:l] + raise OSM::APIBadUserInput.new("No r was given") unless params[:r] + raise OSM::APIBadUserInput.new("No b was given") unless params[:b] + raise OSM::APIBadUserInput.new("No t was given") unless params[:t] bbox = BoundingBox.from_lrbt_params(params) end @@ -52,12 +52,12 @@ class NotesController < ApplicationController # Create a new note def create # Check the ACLs - fail OSM::APIAccessDenied if Acl.no_note_comment(request.remote_ip) + raise OSM::APIAccessDenied if Acl.no_note_comment(request.remote_ip) # Check the arguments are sane - fail OSM::APIBadUserInput.new("No lat was given") unless params[:lat] - fail OSM::APIBadUserInput.new("No lon was given") unless params[:lon] - fail OSM::APIBadUserInput.new("No text was given") if params[:text].blank? + raise OSM::APIBadUserInput.new("No lat was given") unless params[:lat] + raise OSM::APIBadUserInput.new("No lon was given") unless params[:lon] + raise OSM::APIBadUserInput.new("No text was given") if params[:text].blank? # Extract the arguments lon = OSM.parse_float(params[:lon], OSM::APIBadUserInput, "lon was not a number") @@ -68,7 +68,7 @@ class NotesController < ApplicationController Note.transaction do # Create the note @note = Note.create(:lat => lat, :lon => lon) - fail OSM::APIBadUserInput.new("The note is outside this world") unless @note.in_world? + raise OSM::APIBadUserInput.new("The note is outside this world") unless @note.in_world? # Save the note @note.save! @@ -88,11 +88,11 @@ class NotesController < ApplicationController # Add a comment to an existing note def comment # Check the ACLs - fail OSM::APIAccessDenied if Acl.no_note_comment(request.remote_ip) + raise OSM::APIAccessDenied if Acl.no_note_comment(request.remote_ip) # Check the arguments are sane - fail OSM::APIBadUserInput.new("No id was given") unless params[:id] - fail OSM::APIBadUserInput.new("No text was given") if params[:text].blank? + raise OSM::APIBadUserInput.new("No id was given") unless params[:id] + raise OSM::APIBadUserInput.new("No text was given") if params[:text].blank? # Extract the arguments id = params[:id].to_i @@ -100,9 +100,9 @@ class NotesController < ApplicationController # Find the note and check it is valid @note = Note.find(id) - fail OSM::APINotFoundError unless @note - fail OSM::APIAlreadyDeletedError.new("note", @note.id) unless @note.visible? - fail OSM::APINoteAlreadyClosedError.new(@note) if @note.closed? + raise OSM::APINotFoundError unless @note + raise OSM::APIAlreadyDeletedError.new("note", @note.id) unless @note.visible? + raise OSM::APINoteAlreadyClosedError.new(@note) if @note.closed? # Add a comment to the note Note.transaction do @@ -120,17 +120,17 @@ class NotesController < ApplicationController # Close a note def close # Check the arguments are sane - fail OSM::APIBadUserInput.new("No id was given") unless params[:id] + raise OSM::APIBadUserInput.new("No id was given") unless params[:id] # Extract the arguments id = params[:id].to_i comment = params[:text] # Find the note and check it is valid - @note = Note.find_by_id(id) - fail OSM::APINotFoundError unless @note - fail OSM::APIAlreadyDeletedError.new("note", @note.id) unless @note.visible? - fail OSM::APINoteAlreadyClosedError.new(@note) if @note.closed? + @note = Note.find_by(:id => id) + raise OSM::APINotFoundError unless @note + raise OSM::APIAlreadyDeletedError.new("note", @note.id) unless @note.visible? + raise OSM::APINoteAlreadyClosedError.new(@note) if @note.closed? # Close the note and add a comment Note.transaction do @@ -150,17 +150,17 @@ class NotesController < ApplicationController # Reopen a note def reopen # Check the arguments are sane - fail OSM::APIBadUserInput.new("No id was given") unless params[:id] + raise OSM::APIBadUserInput.new("No id was given") unless params[:id] # Extract the arguments id = params[:id].to_i comment = params[:text] # Find the note and check it is valid - @note = Note.find_by_id(id) - fail OSM::APINotFoundError unless @note - fail OSM::APIAlreadyDeletedError.new("note", @note.id) unless @note.visible? || @user.moderator? - fail OSM::APINoteAlreadyOpenError.new(@note) unless @note.closed? || !@note.visible? + @note = Note.find_by(:id => id) + raise OSM::APINotFoundError unless @note + raise OSM::APIAlreadyDeletedError.new("note", @note.id) unless @note.visible? || @user.moderator? + raise OSM::APINoteAlreadyOpenError.new(@note) unless @note.closed? || !@note.visible? # Reopen the note and add a comment Note.transaction do @@ -205,12 +205,12 @@ class NotesController < ApplicationController # Read a note def show # Check the arguments are sane - fail OSM::APIBadUserInput.new("No id was given") unless params[:id] + raise OSM::APIBadUserInput.new("No id was given") unless params[:id] # Find the note and check it is valid @note = Note.find(params[:id]) - fail OSM::APINotFoundError unless @note - fail OSM::APIAlreadyDeletedError.new("note", @note.id) unless @note.visible? + raise OSM::APINotFoundError unless @note + raise OSM::APIAlreadyDeletedError.new("note", @note.id) unless @note.visible? # Render the result respond_to do |format| @@ -225,7 +225,7 @@ class NotesController < ApplicationController # Delete (hide) a note def destroy # Check the arguments are sane - fail OSM::APIBadUserInput.new("No id was given") unless params[:id] + raise OSM::APIBadUserInput.new("No id was given") unless params[:id] # Extract the arguments id = params[:id].to_i @@ -233,8 +233,8 @@ class NotesController < ApplicationController # Find the note and check it is valid @note = Note.find(id) - fail OSM::APINotFoundError unless @note - fail OSM::APIAlreadyDeletedError.new("note", @note.id) unless @note.visible? + raise OSM::APINotFoundError unless @note + raise OSM::APIAlreadyDeletedError.new("note", @note.id) unless @note.visible? # Mark the note as hidden Note.transaction do @@ -255,7 +255,7 @@ class NotesController < ApplicationController # Return a list of notes matching a given string def search # Check the arguments are sane - fail OSM::APIBadUserInput.new("No query string was given") unless params[:q] + raise OSM::APIBadUserInput.new("No query string was given") unless params[:q] # Get any conditions that need to be applied @notes = closed_condition(Note.all) @@ -277,13 +277,15 @@ class NotesController < ApplicationController # Display a list of notes by a specified user def mine if params[:display_name] - if @this_user = User.active.find_by_display_name(params[:display_name]) - @title = t "note.mine.title", :user => @this_user.display_name - @heading = t "note.mine.heading", :user => @this_user.display_name + if @this_user = User.active.find_by(:display_name => params[:display_name]) + @title = t "note.mine.title", :user => @this_user.display_name + @heading = t "note.mine.heading", :user => @this_user.display_name @description = t "note.mine.subheading", :user => render_to_string(:partial => "user", :object => @this_user) @page = (params[:page] || 1).to_i @page_size = 10 - @notes = @this_user.notes.order("updated_at DESC, id").uniq.offset((@page - 1) * @page_size).limit(@page_size).preload(:comments => :author).to_a + @notes = @this_user.notes + @notes = @notes.visible unless @user && @user.moderator? + @notes = @notes.order("updated_at DESC, id").uniq.offset((@page - 1) * @page_size).limit(@page_size).preload(:comments => :author).to_a else @title = t "user.no_such_user.title" @not_found_user = params[:display_name] @@ -306,7 +308,7 @@ class NotesController < ApplicationController if params[:limit].to_i > 0 && params[:limit].to_i <= 10000 params[:limit].to_i else - fail OSM::APIBadUserInput.new("Note limit must be between 1 and 10000") + raise OSM::APIBadUserInput.new("Note limit must be between 1 and 10000") end else 100 @@ -314,24 +316,22 @@ class NotesController < ApplicationController end ## - # Generate a condition to choose which bugs we want based + # Generate a condition to choose which notes we want based # on their status and the user's request parameters def closed_condition(notes) - if params[:closed] - closed_since = params[:closed].to_i - else - closed_since = 7 - end + closed_since = if params[:closed] + params[:closed].to_i + else + 7 + end if closed_since < 0 - notes = notes.where("status != 'hidden'") + notes.where("status != 'hidden'") elsif closed_since > 0 - notes = notes.where("(status = 'open' OR (status = 'closed' AND closed_at > '#{Time.now - closed_since.days}'))") + notes.where("(status = 'open' OR (status = 'closed' AND closed_at > '#{Time.now - closed_since.days}'))") else - notes = notes.where("status = 'open'") + notes.where("status = 'open'") end - - notes end ## @@ -348,7 +348,7 @@ class NotesController < ApplicationController comment = note.comments.create(attributes) note.comments.map(&:author).uniq.each do |user| - if notify && user && user != @user + if notify && user && user != @user && user.visible? Notifier.note_comment_notification(comment, user).deliver_now end end diff --git a/app/controllers/oauth_controller.rb b/app/controllers/oauth_controller.rb index 8ce53739f..2e847fcd5 100644 --- a/app/controllers/oauth_controller.rb +++ b/app/controllers/oauth_controller.rb @@ -27,7 +27,7 @@ class OauthController < ApplicationController end def revoke - @token = current_user.oauth_tokens.find_by_token params[:token] + @token = current_user.oauth_tokens.find_by :token => params[:token] if @token @token.invalidate! flash[:notice] = t("oauth.revoke.flash", :application => @token.client_application.name) @@ -41,38 +41,36 @@ class OauthController < ApplicationController if @token.invalidated? @message = t "oauth.oauthorize_failure.invalid" render :action => "authorize_failure" - else - if request.post? - if user_authorizes_token? - @token.authorize!(current_user) - if @token.oauth10? - callback_url = params[:oauth_callback] || @token.client_application.callback_url - else - callback_url = @token.oob? ? @token.client_application.callback_url : @token.callback_url - end - @redirect_url = URI.parse(callback_url) unless callback_url.blank? - - if @redirect_url.to_s.blank? - render :action => "authorize_success" - else - @redirect_url.query = if @redirect_url.query.blank? - "oauth_token=#{@token.token}" - else - @redirect_url.query + - "&oauth_token=#{@token.token}" - end + elsif request.post? + if user_authorizes_token? + @token.authorize!(current_user) + callback_url = if @token.oauth10? + params[:oauth_callback] || @token.client_application.callback_url + else + @token.oob? ? @token.client_application.callback_url : @token.callback_url + end + @redirect_url = URI.parse(callback_url) unless callback_url.blank? - unless @token.oauth10? - @redirect_url.query += "&oauth_verifier=#{@token.verifier}" - end + if @redirect_url.to_s.blank? + render :action => "authorize_success" + else + @redirect_url.query = if @redirect_url.query.blank? + "oauth_token=#{@token.token}" + else + @redirect_url.query + + "&oauth_token=#{@token.token}" + end - redirect_to @redirect_url.to_s + unless @token.oauth10? + @redirect_url.query += "&oauth_verifier=#{@token.verifier}" end - else - @token.invalidate! - @message = t("oauth.oauthorize_failure.denied", :app_name => @token.client_application.name) - render :action => "authorize_failure" + + redirect_to @redirect_url.to_s end + else + @token.invalidate! + @message = t("oauth.oauthorize_failure.denied", :app_name => @token.client_application.name) + render :action => "authorize_failure" end end end diff --git a/app/controllers/old_controller.rb b/app/controllers/old_controller.rb index 9e1137f8d..4869ae3e1 100644 --- a/app/controllers/old_controller.rb +++ b/app/controllers/old_controller.rb @@ -19,7 +19,7 @@ class OldController < ApplicationController # the .where() method used in the lookup_old_element_versions # call won't throw an error if no records are found, so we have # to do that ourselves. - fail OSM::APINotFoundError.new if @elements.empty? + raise OSM::APINotFoundError.new if @elements.empty? doc = OSM::API.new.get_xml_doc diff --git a/app/controllers/redactions_controller.rb b/app/controllers/redactions_controller.rb index 31dd7273f..129318191 100644 --- a/app/controllers/redactions_controller.rb +++ b/app/controllers/redactions_controller.rb @@ -32,11 +32,9 @@ class RedactionsController < ApplicationController end end - def show - end + def show; end - def edit - end + def edit; end def update # note - don't update the user ID diff --git a/app/controllers/relation_controller.rb b/app/controllers/relation_controller.rb index 2f8a477d9..587cfce82 100644 --- a/app/controllers/relation_controller.rb +++ b/app/controllers/relation_controller.rb @@ -36,7 +36,7 @@ class RelationController < ApplicationController new_relation = Relation.from_xml(request.raw_post) unless new_relation && new_relation.id == relation.id - fail OSM::APIBadUserInput.new("The id in the url (#{relation.id}) is not the same as provided in the xml (#{new_relation.id})") + raise OSM::APIBadUserInput.new("The id in the url (#{relation.id}) is not the same as provided in the xml (#{new_relation.id})") end relation.update_from new_relation, @user @@ -128,13 +128,13 @@ class RelationController < ApplicationController def relations unless params["relations"] - fail OSM::APIBadUserInput.new("The parameter relations is required, and must be of the form relations=id[,id[,id...]]") + raise OSM::APIBadUserInput.new("The parameter relations is required, and must be of the form relations=id[,id[,id...]]") end ids = params["relations"].split(",").collect(&:to_i) - if ids.length == 0 - fail OSM::APIBadUserInput.new("No relations were given to search for") + if ids.empty? + raise OSM::APIBadUserInput.new("No relations were given to search for") end doc = OSM::API.new.get_xml_doc diff --git a/app/controllers/site_controller.rb b/app/controllers/site_controller.rb index 5131629ac..aa284ecdc 100644 --- a/app/controllers/site_controller.rb +++ b/app/controllers/site_controller.rb @@ -8,6 +8,7 @@ class SiteController < ApplicationController before_action :redirect_map_params, :only => [:index, :edit, :export] before_action :require_user, :only => [:welcome] before_action :require_oauth, :only => [:index] + before_action :update_totp, :only => [:index] def index unless STATUS == :database_readonly || STATUS == :database_offline @@ -83,7 +84,7 @@ class SiteController < ApplicationController @lat = note.lat @lon = note.lon @zoom = 17 - elsif params[:gpx] + elsif params[:gpx] && @user trace = Trace.visible_to(@user).find(params[:gpx]) @lat = trace.latitude @lon = trace.longitude @@ -95,20 +96,15 @@ class SiteController < ApplicationController @locale = params[:copyright_locale] || I18n.locale end - def welcome - end + def welcome; end - def help - end + def help; end - def about - end + def about; end - def export - end + def export; end - def offline - end + def offline; end def preview render :text => RichText.new(params[:format], params[:text]).to_html diff --git a/app/controllers/swf_controller.rb b/app/controllers/swf_controller.rb index a683e2177..282f61613 100644 --- a/app/controllers/swf_controller.rb +++ b/app/controllers/swf_controller.rb @@ -31,7 +31,7 @@ class SwfController < ApplicationController bounds_top = 240 * 20 m = "" - m += swf_record(9, 255.chr + 155.chr + 155.chr) # Background + m += swf_record(9, 255.chr + 155.chr + 155.chr) # Background absx = 0 absy = 0 xl = yb = 9999999 @@ -47,7 +47,7 @@ class SwfController < ApplicationController user = User.authenticate(:token => params[:token]) sql = "SELECT gps_points.latitude*0.0000001 AS lat,gps_points.longitude*0.0000001 AS lon,gpx_files.id AS fileid," + " EXTRACT(EPOCH FROM gps_points.timestamp) AS ts, gps_points.trackid AS trackid " + " FROM gpx_files,gps_points " + "WHERE gpx_files.id=gpx_id " + " AND gpx_files.user_id=#{user.id} " + " AND " + OSM.sql_for_area(bbox, "gps_points.") + " AND (gps_points.timestamp IS NOT NULL) " + "ORDER BY fileid DESC,ts " + "LIMIT 10000 OFFSET #{start}" else - sql = "SELECT latitude*0.0000001 AS lat,longitude*0.0000001 AS lon,gpx_id AS fileid," + " EXTRACT(EPOCH FROM timestamp) AS ts, gps_points.trackid AS trackid " + " FROM gps_points " + "WHERE " + OSM.sql_for_area(bbox, "gps_points.") + " AND (gps_points.timestamp IS NOT NULL) " + "ORDER BY fileid DESC,ts " + "LIMIT 10000 OFFSET #{start}" + sql = "SELECT latitude*0.0000001 AS lat,longitude*0.0000001 AS lon,gpx_id AS fileid," + " EXTRACT(EPOCH FROM timestamp) AS ts, gps_points.trackid AS trackid " + " FROM gps_points " + "WHERE " + OSM.sql_for_area(bbox, "gps_points.") + " AND (gps_points.timestamp IS NOT NULL) " + "ORDER BY fileid DESC,ts " + "LIMIT 10000 OFFSET #{start}" end gpslist = ActiveRecord::Base.connection.select_all sql @@ -104,11 +104,11 @@ class SwfController < ApplicationController # Line-drawing def start_shape - s = 0.chr # No fill styles - s += 2.chr # Two line styles - s += pack_u16(0) + 0.chr + 255.chr + 255.chr # Width 5, RGB #00FFFF - s += pack_u16(0) + 255.chr + 0.chr + 255.chr # Width 5, RGB #FF00FF - s += 34.chr # 2 fill, 2 line index bits + s = 0.chr # No fill styles + s += 2.chr # Two line styles + s += pack_u16(0) + 0.chr + 255.chr + 255.chr # Width 5, RGB #00FFFF + s += pack_u16(0) + 255.chr + 0.chr + 255.chr # Width 5, RGB #FF00FF + s += 34.chr # 2 fill, 2 line index bits s end @@ -117,10 +117,10 @@ class SwfController < ApplicationController end def start_and_move(x, y, col) - d = "001001" # Line style change, moveTo + d = "001001" # Line style change, moveTo l = [length_sb(x), length_sb(y)].max d += format("%05b%0*b%0*b", l, l, x, l, y) - d += col # Select line style + d += col # Select line style d end @@ -161,10 +161,10 @@ class SwfController < ApplicationController def swf_record(id, r) if r.length > 62 # Long header: tag id, 0x3F, length - return pack_u16((id << 6) + 0x3F) + pack_u32(r.length) + r + pack_u16((id << 6) + 0x3F) + pack_u32(r.length) + r else # Short header: tag id, length - return pack_u16((id << 6) + r.length) + r + pack_u16((id << 6) + r.length) + r end end @@ -195,7 +195,7 @@ class SwfController < ApplicationController # Find number of bits required to store arbitrary-length binary def length_sb(n) - Math.frexp(n + (n == 0 ? 1 : 0))[1] + 1 + Math.frexp(n + (n.zero? ? 1 : 0))[1] + 1 end # ==================================================================== diff --git a/app/controllers/trace_controller.rb b/app/controllers/trace_controller.rb index 07a6fe210..e41bd01f3 100644 --- a/app/controllers/trace_controller.rb +++ b/app/controllers/trace_controller.rb @@ -1,5 +1,5 @@ class TraceController < ApplicationController - layout "site" + layout "site", :except => :georss skip_before_action :verify_authenticity_token, :only => [:api_create, :api_read, :api_update, :api_delete, :api_data] before_action :authorize_web @@ -30,13 +30,13 @@ class TraceController < ApplicationController end # set title - if target_user.nil? - @title = t "trace.list.public_traces" - elsif @user && @user == target_user - @title = t "trace.list.your_traces" - else - @title = t "trace.list.public_traces_from", :user => target_user.display_name - end + @title = if target_user.nil? + t "trace.list.public_traces" + elsif @user && @user == target_user + t "trace.list.your_traces" + else + t "trace.list.public_traces_from", :user => target_user.display_name + end @title += t "trace.list.tagged_with", :tags => params[:tag] if params[:tag] @@ -45,19 +45,17 @@ class TraceController < ApplicationController # 2 - all traces, not logged in = all public traces # 3 - user's traces, logged in as same user = all user's traces # 4 - user's traces, not logged in as that user = all user's public traces - if target_user.nil? # all traces - if @user - @traces = Trace.visible_to(@user) # 1 - else - @traces = Trace.visible_to_all # 2 - end - else - if @user && @user == target_user - @traces = @user.traces # 3 (check vs user id, so no join + can't pick up non-public traces by changing name) - else - @traces = target_user.traces.visible_to_all # 4 - end - end + @traces = if target_user.nil? # all traces + if @user + Trace.visible_to(@user) # 1 + else + Trace.visible_to_all # 2 + end + elsif @user && @user == target_user + @user.traces # 3 (check vs user id, so no join + can't pick up non-public traces by changing name) + else + target_user.traces.visible_to_all # 4 + end @traces = @traces.tagged(params[:tag]) if params[:tag] @@ -65,7 +63,7 @@ class TraceController < ApplicationController @page_size = 20 @traces = @traces.visible - @traces = @traces.order("timestamp DESC") + @traces = @traces.order(:id => :desc) @traces = @traces.offset((@page - 1) * @page_size) @traces = @traces.limit(@page_size) @traces = @traces.includes(:user, :tags) @@ -97,15 +95,15 @@ class TraceController < ApplicationController @title = t "trace.view.title", :name => @trace.name else flash[:error] = t "trace.view.trace_not_found" - redirect_to :controller => "trace", :action => "list" + redirect_to :action => "list" end rescue ActiveRecord::RecordNotFound flash[:error] = t "trace.view.trace_not_found" - redirect_to :controller => "trace", :action => "list" + redirect_to :action => "list" end def create - if params[:trace] + if request.post? logger.info(params[:trace][:gpx_file].class.name) if params[:trace][:gpx_file].respond_to?(:read) @@ -172,7 +170,7 @@ class TraceController < ApplicationController else @title = t "trace.edit.title", :name => @trace.name - if params[:trace] + if request.post? @trace.description = params[:trace][:description] @trace.tagstring = params[:trace][:tagstring] @trace.visibility = params[:trace][:visibility] @@ -235,7 +233,7 @@ class TraceController < ApplicationController def icon trace = Trace.find(params[:id]) - if trace.visible? && trace.inserted? + if trace.visible? && trace.inserted? if trace.public? || (@user && @user == trace.user) expires_in 7.days, :private => !trace.public?, :public => trace.public? send_file(trace.icon_picture_name, :filename => "#{trace.id}_icon.gif", :type => "image/gif", :disposition => "inline") @@ -266,7 +264,7 @@ class TraceController < ApplicationController new_trace = Trace.from_xml(request.raw_post) unless new_trace && new_trace.id == trace.id - fail OSM::APIBadUserInput.new("The id in the url (#{trace.id}) is not the same as provided in the xml (#{new_trace.id})") + raise OSM::APIBadUserInput.new("The id in the url (#{trace.id}) is not the same as provided in the xml (#{new_trace.id})") end trace.description = new_trace.description @@ -315,11 +313,11 @@ class TraceController < ApplicationController visibility = params[:visibility] if visibility.nil? - if params[:public] && params[:public].to_i.nonzero? - visibility = "public" - else - visibility = "private" - end + visibility = if params[:public] && params[:public].to_i.nonzero? + "public" + else + "private" + end end if params[:file].respond_to?(:read) diff --git a/app/controllers/user_controller.rb b/app/controllers/user_controller.rb index 0c2514927..197b28914 100644 --- a/app/controllers/user_controller.rb +++ b/app/controllers/user_controller.rb @@ -45,7 +45,7 @@ class UserController < ApplicationController @user.terms_seen = true if @user.save - flash[:notice] = t "user.new.terms declined", :url => t("user.new.terms declined url") + flash[:notice] = t("user.new.terms declined", :url => t("user.new.terms declined url")).html_safe end if params[:referer] @@ -131,6 +131,10 @@ class UserController < ApplicationController session[:new_user_settings] = params redirect_to auth_url(params[:user][:auth_provider], params[:user][:auth_uid]) end + elsif errors = session.delete(:user_errors) + errors.each do |attribute, error| + @user.errors.add(attribute, error) + end end end @@ -138,14 +142,14 @@ class UserController < ApplicationController @user.data_public = true @user.save flash[:notice] = t "user.go_public.flash success" - redirect_to :controller => "user", :action => "account", :display_name => @user.display_name + redirect_to :action => "account", :display_name => @user.display_name end def lost_password @title = t "user.lost_password.title" if params[:user] && params[:user][:email] - user = User.visible.find_by_email(params[:user][:email]) + user = User.visible.find_by(:email => params[:user][:email]) if user.nil? users = User.visible.where("LOWER(email) = LOWER(?)", params[:user][:email]) @@ -168,7 +172,7 @@ class UserController < ApplicationController @title = t "user.reset_password.title" if params[:token] - token = UserToken.find_by_token(params[:token]) + token = UserToken.find_by(:token => params[:token]) if token @user = token.user @@ -182,7 +186,7 @@ class UserController < ApplicationController if @user.save token.destroy flash[:notice] = t "user.reset_password.flash changed" - redirect_to :action => "login" + successful_login(@user) end end else @@ -213,7 +217,7 @@ class UserController < ApplicationController :auth_provider => params[:auth_provider], :auth_uid => params[:auth_uid]) - flash.now[:notice] = t "user.new.auth association" + flash.now[:notice] = render_to_string :partial => "auth_association" else check_signup_allowed end @@ -257,7 +261,7 @@ class UserController < ApplicationController password_authentication(params[:username], params[:password]) elsif params[:openid_url].present? session[:remember_me] ||= params[:remember_me_openid] - redirect_to auth_url("openid", params[:openid_url]) + redirect_to auth_url("openid", params[:openid_url], params[:referer]) end end @@ -266,7 +270,7 @@ class UserController < ApplicationController if params[:session] == request.session_options[:id] if session[:token] - token = UserToken.find_by_token(session[:token]) + token = UserToken.find_by(:token => session[:token]) token.destroy if token session.delete(:token) end @@ -282,7 +286,7 @@ class UserController < ApplicationController def confirm if request.post? - token = UserToken.find_by_token(params[:confirm_string]) + token = UserToken.find_by(:token => params[:confirm_string]) if token && token.user.active? flash[:error] = t("user.confirm.already active") redirect_to :action => "login" @@ -293,12 +297,13 @@ class UserController < ApplicationController user = token.user user.status = "active" user.email_valid = true + flash[:notice] = gravatar_status_message(user) if gravatar_enable(user) user.save! referer = token.referer token.destroy if session[:token] - token = UserToken.find_by_token(session[:token]) + token = UserToken.find_by(:token => session[:token]) session.delete(:token) else token = nil @@ -316,21 +321,21 @@ class UserController < ApplicationController end end else - user = User.find_by_display_name(params[:display_name]) + user = User.find_by(:display_name => params[:display_name]) redirect_to root_path if user.nil? || user.active? end end def confirm_resend - user = User.find_by_display_name(params[:display_name]) - token = UserToken.find_by_token(session[:token]) + user = User.find_by(:display_name => params[:display_name]) + token = UserToken.find_by(:token => session[:token]) if user.nil? || token.nil? || token.user != user flash[:error] = t "user.confirm_resend.failure", :name => params[:display_name] else Notifier.signup_confirm(user, user.tokens.create).deliver_now - flash[:notice] = t "user.confirm_resend.success", :email => user.email + flash[:notice] = t("user.confirm_resend.success", :email => user.email, :sender => SUPPORT_EMAIL).html_safe end redirect_to :action => "login" @@ -338,14 +343,19 @@ class UserController < ApplicationController def confirm_email if request.post? - token = UserToken.find_by_token(params[:confirm_string]) + token = UserToken.find_by(:token => params[:confirm_string]) if token && token.user.new_email? @user = token.user @user.email = @user.new_email @user.new_email = nil @user.email_valid = true + gravatar_enabled = gravatar_enable(@user) if @user.save - flash[:notice] = t "user.confirm_email.success" + flash[:notice] = if gravatar_enabled + t("user.confirm_email.success") + " " + gravatar_status_message(@user) + else + t("user.confirm_email.success") + end else flash[:errors] = @user.errors end @@ -383,7 +393,7 @@ class UserController < ApplicationController end def view - @this_user = User.find_by_display_name(params[:display_name]) + @this_user = User.find_by(:display_name => params[:display_name]) if @this_user && (@this_user.visible? || (@user && @user.administrator?)) @@ -394,7 +404,7 @@ class UserController < ApplicationController end def make_friend - @new_friend = User.find_by_display_name(params[:display_name]) + @new_friend = User.find_by(:display_name => params[:display_name]) if @new_friend if request.post? @@ -403,19 +413,17 @@ class UserController < ApplicationController friend.friend_user_id = @new_friend.id if @user.is_friends_with?(@new_friend) flash[:warning] = t "user.make_friend.already_a_friend", :name => @new_friend.display_name + elsif friend.save + flash[:notice] = t "user.make_friend.success", :name => @new_friend.display_name + Notifier.friend_notification(friend).deliver_now else - if friend.save - flash[:notice] = t "user.make_friend.success", :name => @new_friend.display_name - Notifier.friend_notification(friend).deliver_now - else - friend.add_error(t("user.make_friend.failed", :name => @new_friend.display_name)) - end + friend.add_error(t("user.make_friend.failed", :name => @new_friend.display_name)) end if params[:referer] redirect_to params[:referer] else - redirect_to :controller => "user", :action => "view" + redirect_to :action => "view" end end else @@ -424,7 +432,7 @@ class UserController < ApplicationController end def remove_friend - @friend = User.find_by_display_name(params[:display_name]) + @friend = User.find_by(:display_name => params[:display_name]) if @friend if request.post? @@ -438,7 +446,7 @@ class UserController < ApplicationController if params[:referer] redirect_to params[:referer] else - redirect_to :controller => "user", :action => "view" + redirect_to :action => "view" end end else @@ -451,14 +459,14 @@ class UserController < ApplicationController def set_status @this_user.status = params[:status] @this_user.save - redirect_to :controller => "user", :action => "view", :display_name => params[:display_name] + redirect_to :action => "view", :display_name => params[:display_name] end ## # delete a user, marking them as deleted and removing personal data def delete @this_user.delete - redirect_to :controller => "user", :action => "view", :display_name => params[:display_name] + redirect_to :action => "view", :display_name => params[:display_name] end ## @@ -497,37 +505,20 @@ class UserController < ApplicationController when "openid" email_verified = uid.match(%r{https://www.google.com/accounts/o8/id?(.*)}) || uid.match(%r{https://me.yahoo.com/(.*)}) - when "google" + when "google", "facebook" email_verified = true else email_verified = false end - user = User.find_by_auth_provider_and_auth_uid(provider, uid) - - if user.nil? && provider == "google" - openid_url = auth_info[:extra][:id_info]["openid_id"] - user = User.find_by_auth_provider_and_auth_uid("openid", openid_url) if openid_url - user.update(:auth_provider => provider, :auth_uid => uid) if user - end - - if user - case user.status - when "pending" then - unconfirmed_login(user) - when "active", "confirmed" then - successful_login(user) - when "suspended" then - failed_login t("user.login.account is suspended", :webmaster => "mailto:webmaster@openstreetmap.org") - else - failed_login t("user.login.auth failure") - end - elsif settings = session.delete(:new_user_settings) + if settings = session.delete(:new_user_settings) @user.auth_provider = provider @user.auth_uid = uid update_user(@user, settings) + session[:user_errors] = @user.errors.as_json + redirect_to :action => "account", :display_name => @user.display_name elsif session[:new_user] session[:new_user].auth_provider = provider @@ -539,8 +530,29 @@ class UserController < ApplicationController redirect_to :action => "terms" else - redirect_to :action => "new", :nickname => name, :email => email, - :auth_provider => provider, :auth_uid => uid + user = User.find_by(:auth_provider => provider, :auth_uid => uid) + + if user.nil? && provider == "google" + openid_url = auth_info[:extra][:id_info]["openid_id"] + user = User.find_by(:auth_provider => "openid", :auth_uid => openid_url) if openid_url + user.update(:auth_provider => provider, :auth_uid => uid) if user + end + + if user + case user.status + when "pending" then + unconfirmed_login(user) + when "active", "confirmed" then + successful_login(user, env["omniauth.params"]["referer"]) + when "suspended" then + failed_login t("user.login.account is suspended", :webmaster => "mailto:#{SUPPORT_EMAIL}") + else + failed_login t("user.login.auth failure") + end + else + redirect_to :action => "new", :nickname => name, :email => email, + :auth_provider => provider, :auth_uid => uid + end end end @@ -561,20 +573,27 @@ class UserController < ApplicationController elsif user = User.authenticate(:username => username, :password => password, :pending => true) unconfirmed_login(user) elsif User.authenticate(:username => username, :password => password, :suspended => true) - failed_login t("user.login.account is suspended", :webmaster => "mailto:webmaster@openstreetmap.org") + failed_login t("user.login.account is suspended", :webmaster => "mailto:#{SUPPORT_EMAIL}"), username else - failed_login t("user.login.auth failure") + failed_login t("user.login.auth failure"), username end end ## # return the URL to use for authentication - def auth_url(provider, uid) - if provider == "openid" - auth_path(:provider => "openid", :openid_url => openid_expand_url(uid), :origin => request.path) + def auth_url(provider, uid, referer = nil) + params = { :provider => provider } + + params[:openid_url] = openid_expand_url(uid) if provider == "openid" + + if referer.nil? + params[:origin] = request.path else - auth_path(:provider => provider, :origin => request.path) + params[:origin] = request.path + "?referer=" + CGI.escape(referer) + params[:referer] = referer end + + auth_path(params) end ## @@ -582,25 +601,25 @@ class UserController < ApplicationController # try and come up with the correct URL based on what the user entered def openid_expand_url(openid_url) if openid_url.nil? - return nil + nil elsif openid_url.match(%r{(.*)gmail.com(/?)$}) || openid_url.match(%r{(.*)googlemail.com(/?)$}) # Special case gmail.com as it is potentially a popular OpenID # provider and, unlike yahoo.com, where it works automatically, Google # have hidden their OpenID endpoint somewhere obscure this making it # somewhat less user friendly. - return "https://www.google.com/accounts/o8/id" + "https://www.google.com/accounts/o8/id" else - return openid_url + openid_url end end ## # process a successful login - def successful_login(user) + def successful_login(user, referer = nil) session[:user] = user.id session_expires_after 28.days if session[:remember_me] - target = session[:referer] || url_for(:controller => :site, :action => :index) + target = referer || session[:referer] || url_for(:controller => :site, :action => :index) # The user is logged in, so decide where to send them: # @@ -609,7 +628,7 @@ class UserController < ApplicationController # - If they were referred to the login, send them back there. # - Otherwise, send them to the home page. if REQUIRE_TERMS_SEEN && !user.terms_seen - redirect_to :controller => :user, :action => :terms, :referer => target + redirect_to :action => :terms, :referer => target elsif user.blocked_on_view redirect_to user.blocked_on_view, :referer => target else @@ -622,10 +641,11 @@ class UserController < ApplicationController ## # process a failed login - def failed_login(message) + def failed_login(message, username = nil) flash[:error] = message - redirect_to :action => "login", :referer => session[:referer] + redirect_to :action => "login", :referer => session[:referer], + :username => username, :remember_me => session[:remember_me] session.delete(:remember_me) session.delete(:referer) @@ -648,7 +668,7 @@ class UserController < ApplicationController user.display_name = params[:user][:display_name] user.new_email = params[:user][:new_email] - if params[:user][:pass_crypt].length > 0 || params[:user][:pass_crypt_confirmation].length > 0 + unless params[:user][:pass_crypt].empty? && params[:user][:pass_crypt_confirmation].empty? user.pass_crypt = params[:user][:pass_crypt] user.pass_crypt_confirmation = params[:user][:pass_crypt_confirmation] end @@ -675,11 +695,11 @@ class UserController < ApplicationController user.home_lat = params[:user][:home_lat] user.home_lon = params[:user][:home_lon] - if params[:user][:preferred_editor] == "default" - user.preferred_editor = nil - else - user.preferred_editor = params[:user][:preferred_editor] - end + user.preferred_editor = if params[:user][:preferred_editor] == "default" + nil + else + params[:user][:preferred_editor] + end if params[:user][:auth_provider].nil? || params[:user][:auth_provider].blank? user.auth_provider = nil @@ -720,12 +740,12 @@ class UserController < ApplicationController flash[:error] = t("user.filter.not_an_administrator") if params[:display_name] - redirect_to :controller => "user", :action => "view", :display_name => params[:display_name] + redirect_to :action => "view", :display_name => params[:display_name] else - redirect_to :controller => "user", :action => "login", :referer => request.fullpath + redirect_to :action => "login", :referer => request.fullpath end elsif !@user - redirect_to :controller => "user", :action => "login", :referer => request.fullpath + redirect_to :action => "login", :referer => request.fullpath end end @@ -746,9 +766,9 @@ class UserController < ApplicationController ## # ensure that there is a "this_user" instance variable def lookup_user_by_name - @this_user = User.find_by_display_name(params[:display_name]) + @this_user = User.find_by(:display_name => params[:display_name]) rescue ActiveRecord::RecordNotFound - redirect_to :controller => "user", :action => "view", :display_name => params[:display_name] unless @this_user + redirect_to :action => "view", :display_name => params[:display_name] unless @this_user end ## @@ -771,11 +791,11 @@ class UserController < ApplicationController ## # check signup acls def check_signup_allowed(email = nil) - if email.nil? - domain = nil - else - domain = email.split("@").last - end + domain = if email.nil? + nil + else + email.split("@").last + end if blocked = Acl.no_account_creation(request.remote_ip, domain) logger.info "Blocked signup from #{request.remote_ip} for #{email}" @@ -785,4 +805,27 @@ class UserController < ApplicationController !blocked end + + ## + # check if this user has a gravatar and set the user pref is true + def gravatar_enable(user) + # code from example https://en.gravatar.com/site/implement/images/ruby/ + return false if user.image.present? + hash = Digest::MD5.hexdigest(user.email.downcase) + url = "https://www.gravatar.com/avatar/#{hash}?d=404" # without d=404 we will always get an image back + response = OSM.http_client.get(URI.parse(url)) + oldsetting = user.image_use_gravatar + user.image_use_gravatar = response.success? + oldsetting != user.image_use_gravatar + end + + ## + # display a message about th current status of the gravatar setting + def gravatar_status_message(user) + if user.image_use_gravatar + t "user.account.gravatar.enabled" + else + t "user.account.gravatar.disabled" + end + end end diff --git a/app/controllers/user_preference_controller.rb b/app/controllers/user_preference_controller.rb index 2b6df65e6..bf9bab213 100644 --- a/app/controllers/user_preference_controller.rb +++ b/app/controllers/user_preference_controller.rb @@ -39,13 +39,13 @@ class UserPreferenceController < ApplicationController new_preferences = {} - doc = XML::Parser.string(request.raw_post).parse + doc = XML::Parser.string(request.raw_post, :options => XML::Parser::Options::NOERROR).parse doc.find("//preferences/preference").each do |pt| if preference = old_preferences.delete(pt["k"]) preference.v = pt["v"] elsif new_preferences.include?(pt["k"]) - fail OSM::APIDuplicatePreferenceError.new(pt["k"]) + raise OSM::APIDuplicatePreferenceError.new(pt["k"]) else preference = @user.preferences.build(:k => pt["k"], :v => pt["v"]) end diff --git a/app/controllers/way_controller.rb b/app/controllers/way_controller.rb index e7a968a09..c988545c7 100644 --- a/app/controllers/way_controller.rb +++ b/app/controllers/way_controller.rb @@ -36,7 +36,7 @@ class WayController < ApplicationController new_way = Way.from_xml(request.raw_post) unless new_way && new_way.id == way.id - fail OSM::APIBadUserInput.new("The id in the url (#{way.id}) is not the same as provided in the xml (#{new_way.id})") + raise OSM::APIBadUserInput.new("The id in the url (#{way.id}) is not the same as provided in the xml (#{new_way.id})") end way.update_from(new_way, @user) @@ -81,13 +81,13 @@ class WayController < ApplicationController def ways unless params["ways"] - fail OSM::APIBadUserInput.new("The parameter ways is required, and must be of the form ways=id[,id[,id...]]") + raise OSM::APIBadUserInput.new("The parameter ways is required, and must be of the form ways=id[,id[,id...]]") end ids = params["ways"].split(",").collect(&:to_i) - if ids.length == 0 - fail OSM::APIBadUserInput.new("No ways were given to search for") + if ids.empty? + raise OSM::APIBadUserInput.new("No ways were given to search for") end doc = OSM::API.new.get_xml_doc diff --git a/app/helpers/asset_helper.rb b/app/helpers/asset_helper.rb index 5b0740735..40782fbcf 100644 --- a/app/helpers/asset_helper.rb +++ b/app/helpers/asset_helper.rb @@ -1,11 +1,7 @@ module AssetHelper def assets(directory) - assets = {} - - Rails.application.assets.index.each_logical_path("#{directory}/*") do |path| - assets[path.sub(%r{^#{directory}/}, "")] = asset_path(path) + Rails.application.assets_manifest.assets.keys.each_with_object({}) do |asset, assets| + assets[asset] = asset_path(asset) if asset.start_with?("#{directory}/") end - - assets end end diff --git a/app/helpers/banner_helper.rb b/app/helpers/banner_helper.rb new file mode 100644 index 000000000..4e888173b --- /dev/null +++ b/app/helpers/banner_helper.rb @@ -0,0 +1,53 @@ +module BannerHelper + def active_banners + BANNERS.reject do |_k, v| + enddate = v[:enddate] + begin + parsed = enddate && Date.parse(enddate) + rescue + parsed = nil + end + !parsed.is_a?(Date) || (parsed.is_a?(Date) && parsed.past?) + end + end + + # returns the least recently seen banner that is not hidden + def next_banner + banners = active_banners + banner_key = nil + cookie_key = nil + min_index = 9999 + min_date = Date.new(9999, 1, 1) + + banners.each do |k, v| + ckey = banner_cookie(v[:id]).to_sym + cval = cookies[ckey] || 0 + next if cval == "hide" + + # rotate all banner queue positions + index = cval.to_i + cookies[ckey] = index - 1 if index > 0 + + # pick banner with mininum queue position + next if index > min_index + + # or if equal queue position, pick banner with soonest end date (i.e. next expiring) + end_date = Date.parse(v[:enddate]) + next if index == min_index && end_date > min_date + + banner_key = k + cookie_key = ckey + min_index = index + min_date = end_date + end + + unless banner_key.nil? + cookies[cookie_key] = banners.length # bump to end of queue + banners[banner_key] + end + end + + def banner_cookie(key) + "_osm_banner_#{key}" + end +end diff --git a/app/helpers/browse_helper.rb b/app/helpers/browse_helper.rb index 5d0a18fd9..ef7b3f554 100644 --- a/app/helpers/browse_helper.rb +++ b/app/helpers/browse_helper.rb @@ -2,11 +2,11 @@ require "uri" module BrowseHelper def printable_name(object, version = false) - if object.id.is_a?(Array) - id = object.id[0] - else - id = object.id - end + id = if object.id.is_a?(Array) + object.id[0] + else + object.id + end name = t "printable_name.with_id", :id => id.to_s if version name = t "printable_name.with_version", :id => name, :version => object.version.to_s @@ -25,6 +25,8 @@ module BrowseHelper name = t "printable_name.with_name_html", :name => content_tag(:bdi, object.tags["name:#{locale}"].to_s), :id => content_tag(:bdi, name) elsif object.tags.include? "name" name = t "printable_name.with_name_html", :name => content_tag(:bdi, object.tags["name"].to_s), :id => content_tag(:bdi, name) + elsif object.tags.include? "ref" + name = t "printable_name.with_name_html", :name => content_tag(:bdi, object.tags["ref"].to_s), :id => content_tag(:bdi, name) end end @@ -52,6 +54,10 @@ module BrowseHelper end end + def link_follow(object) + "nofollow" if object.tags.empty? + end + def format_key(key) if url = wiki_link("key", key) link_to h(key), url, :title => t("browse.tag_details.wiki_link.key", :key => key) @@ -63,8 +69,13 @@ module BrowseHelper def format_value(key, value) if wp = wikipedia_link(key, value) link_to h(wp[:title]), wp[:url], :title => t("browse.tag_details.wikipedia_link", :page => wp[:title]) - elsif wdt = wikidata_link(key, value) - link_to h(wdt[:title]), wdt[:url], :title => t("browse.tag_details.wikidata_link", :page => wdt[:title]) + elsif wdt = wikidata_links(key, value) + # IMPORTANT: Note that wikidata_links() returns an array of hashes, unlike for example wikipedia_link(), + # which just returns one such hash. + wdt = wdt.map do |w| + link_to(w[:title], w[:url], :title => t("browse.tag_details.wikidata_link", :page => w[:title].strip)) + end + safe_join(wdt, ";") elsif url = wiki_link("tag", "#{key}=#{value}") link_to h(value), url, :title => t("browse.tag_details.wiki_link.tag", :key => key, :value => value) elsif url = telephone_link(key, value) @@ -88,7 +99,7 @@ module BrowseHelper private - ICON_TAGS = %w(aeroway amenity barrier building highway historic landuse leisure man_made natural railway shop tourism waterway) + ICON_TAGS = %w(aeroway amenity barrier building highway historic landuse leisure man_made natural railway shop tourism waterway).freeze def icon_tags(object) object.tags.find_all { |k, _v| ICON_TAGS.include? k }.sort @@ -119,17 +130,17 @@ module BrowseHelper if key == "wikipedia" # This regex should match Wikipedia language codes, everything # from de to zh-classical - if value =~ /^([a-z-]{2,12}):(.+)$/i - # Value is : so split it up - # Note that value is always left as-is, see: https://trac.openstreetmap.org/ticket/4315 - lang = $1 - else - # Value is <title> so default to English Wikipedia - lang = "en" - end + lang = if value =~ /^([a-z-]{2,12}):(.+)$/i + # Value is <lang>:<title> so split it up + # Note that value is always left as-is, see: https://trac.openstreetmap.org/ticket/4315 + Regexp.last_match(1) + else + # Value is <title> so default to English Wikipedia + "en" + end elsif key =~ /^wikipedia:(\S+)$/ # Language is in the key, so assume value is the title - lang = $1 + lang = Regexp.last_match(1) else # Not a wikipedia key! return nil @@ -138,9 +149,9 @@ module BrowseHelper if value =~ /^([^#]*)#(.*)/ # Contains a reference to a section of the wikipedia article # Must break it up to correctly build the url - value = $1 - section = "#" + $2 - encoded_section = "#" + URI.encode($2.gsub(/ +/, "_"), /[^A-Za-z0-9:_]/).gsub("%", ".") + value = Regexp.last_match(1) + section = "#" + Regexp.last_match(2) + encoded_section = "#" + URI.encode(Regexp.last_match(2).gsub(/ +/, "_"), /[^A-Za-z0-9:_]/).tr("%", ".") else section = "" encoded_section = "" @@ -152,12 +163,21 @@ module BrowseHelper } end - def wikidata_link(key, value) + def wikidata_links(key, value) + # The simple wikidata-tag (this is limited to only one value) if key == "wikidata" && value =~ /^[Qq][1-9][0-9]*$/ - return { + return [{ :url => "//www.wikidata.org/wiki/#{value}?uselang=#{I18n.locale}", :title => value - } + }] + # Key has to be one of the accepted wikidata-tags + elsif key =~ /(architect|artist|brand|operator|subject):wikidata/ && + # Value has to be a semicolon-separated list of wikidata-IDs (whitespaces allowed before and after semicolons) + value =~ /^[Qq][1-9][0-9]*(\s*;\s*[Qq][1-9][0-9]*)*$/ + # Splitting at every semicolon to get a separate hash for each wikidata-ID + return value.split(";").map do |id| + { :title => id, :url => "//www.wikidata.org/wiki/#{id.strip}?uselang=#{I18n.locale}" } + end end nil end diff --git a/app/helpers/changeset_helper.rb b/app/helpers/changeset_helper.rb index c3141297c..cc008aab7 100644 --- a/app/helpers/changeset_helper.rb +++ b/app/helpers/changeset_helper.rb @@ -1,6 +1,8 @@ module ChangesetHelper def changeset_user_link(changeset) - if changeset.user.data_public? + if changeset.user.status == "deleted" + t("user.no_such_user.deleted") + elsif changeset.user.data_public? link_to(changeset.user.display_name, user_path(changeset.user.display_name)) else t("browse.anonymous") @@ -29,4 +31,16 @@ module ChangesetHelper :user => changeset_user_link(changeset) end end + + def changeset_list_title(params, user) + if params[:friends] && user + t "changeset.list.title_friend" + elsif params[:nearby] && user + t "changeset.list.title_nearby" + elsif params[:display_name] + t "changeset.list.title_user", :user => params[:display_name] + else + t "changeset.list.title" + end + end end diff --git a/app/helpers/geocoder_helper.rb b/app/helpers/geocoder_helper.rb index e135917a9..161bb2d6d 100644 --- a/app/helpers/geocoder_helper.rb +++ b/app/helpers/geocoder_helper.rb @@ -2,13 +2,13 @@ module GeocoderHelper def result_to_html(result) html_options = { :class => "set_position", :data => {} } - if result[:type] && result[:id] - url = url_for(:controller => :browse, :action => result[:type], :id => result[:id]) - elsif result[:min_lon] && result[:min_lat] && result[:max_lon] && result[:max_lat] - url = "/?bbox=#{result[:min_lon]},#{result[:min_lat]},#{result[:max_lon]},#{result[:max_lat]}" - else - url = "/#map=#{result[:zoom]}/#{result[:lat]}/#{result[:lon]}" - end + url = if result[:type] && result[:id] + url_for(:controller => :browse, :action => result[:type], :id => result[:id]) + elsif result[:min_lon] && result[:min_lat] && result[:max_lon] && result[:max_lat] + "/?bbox=#{result[:min_lon]},#{result[:min_lat]},#{result[:max_lon]},#{result[:max_lat]}" + else + "/#map=#{result[:zoom]}/#{result[:lat]}/#{result[:lon]}" + end result.each do |key, value| html_options[:data][key.to_s.tr("_", "-")] = value diff --git a/app/helpers/note_helper.rb b/app/helpers/note_helper.rb index 87bd86f42..6ebd18345 100644 --- a/app/helpers/note_helper.rb +++ b/app/helpers/note_helper.rb @@ -3,20 +3,20 @@ module NoteHelper if by.nil? I18n.t("browse.note." + event + "_by_anonymous", :when => friendly_date(at), - :exact_time => l(at) - ).html_safe + :exact_time => l(at)).html_safe else I18n.t("browse.note." + event + "_by", :when => friendly_date(at), :exact_time => l(at), - :user => note_author(by) - ).html_safe + :user => note_author(by)).html_safe end end def note_author(author, link_options = {}) if author.nil? "" + elsif author.status == "deleted" + t("user.no_such_user.deleted") else link_to h(author.display_name), link_options.merge(:controller => "user", :action => "view", :display_name => author.display_name) end diff --git a/app/helpers/notifier_helper.rb b/app/helpers/notifier_helper.rb index 4b2cd2a06..3e53e2543 100644 --- a/app/helpers/notifier_helper.rb +++ b/app/helpers/notifier_helper.rb @@ -2,4 +2,24 @@ module NotifierHelper def fp(text) format_paragraph(text, 72, 0) end + + def link_to_user(display_name) + link_to( + display_name, + user_url(display_name, :host => SERVER_URL), + :target => "_blank", + :style => "text-decoration: none; color: #222; font-weight: bold" + ) + end + + def message_body(&block) + render( + :partial => "message_body", + :locals => { :body => capture(&block) } + ) + end + + def style_message(html) + html.gsub /<p>/, '<p style="color: black; margin: 0.75em 0">' + end end diff --git a/app/helpers/open_graph_helper.rb b/app/helpers/open_graph_helper.rb new file mode 100644 index 000000000..ab7e230cb --- /dev/null +++ b/app/helpers/open_graph_helper.rb @@ -0,0 +1,17 @@ +module OpenGraphHelper + def opengraph_tags(title = nil) + tags = { + "og:site_name" => t("layouts.project_name.title"), + "og:title" => [t("layouts.project_name.title"), title].compact.join(" | "), + "og:type" => "website", + "og:image" => image_url("osm_logo_256.png", :protocol => "http"), + "og:image:secure_url" => image_url("osm_logo_256.png", :protocol => "https"), + "og:url" => url_for(:only_path => false), + "og:description" => t("layouts.intro_text") + } + + tags.map do |property, content| + tag(:meta, :property => property, :content => content) + end.join("").html_safe + end +end diff --git a/app/helpers/title_helper.rb b/app/helpers/title_helper.rb index eb1724d93..8b1eb53b6 100644 --- a/app/helpers/title_helper.rb +++ b/app/helpers/title_helper.rb @@ -5,7 +5,7 @@ module TitleHelper @coder ||= HTMLEntities.new end - def set_title(title = false) + def set_title(title = nil) if title @title = TitleHelper.coder.decode(title.gsub("<bdi>", "\u202a").gsub("</bdi>", "\u202c")) response.headers["X-Page-Title"] = URI.escape(t("layouts.project_name.title") + " | " + @title) diff --git a/app/helpers/trace_helper.rb b/app/helpers/trace_helper.rb index 3922ce2b3..15bc32313 100644 --- a/app/helpers/trace_helper.rb +++ b/app/helpers/trace_helper.rb @@ -1,9 +1,9 @@ module TraceHelper def link_to_tag(tag) if @action == "mine" - return link_to(tag, :tag => tag, :page => nil) + link_to(tag, :tag => tag, :page => nil) else - return link_to(tag, :tag => tag, :display_name => @display_name, :page => nil) + link_to(tag, :tag => tag, :display_name => @display_name, :page => nil) end end end diff --git a/app/helpers/user_roles_helper.rb b/app/helpers/user_roles_helper.rb index 690cccdca..7093a96b2 100644 --- a/app/helpers/user_roles_helper.rb +++ b/app/helpers/user_roles_helper.rb @@ -1,31 +1,35 @@ module UserRolesHelper def role_icons(user) - UserRole::ALL_ROLES.reduce("".html_safe) { |a, e| a + " " + role_icon(user, e) } + UserRole::ALL_ROLES.reduce("".html_safe) do |acc, elem| + acc + " " + role_icon(user, elem) + end end def role_icon(user, role) if @user && @user.administrator? if user.has_role?(role) - image = "roles/#{role}.png" + image = "roles/#{role}" alt = t("user.view.role.revoke.#{role}") title = t("user.view.role.revoke.#{role}") url = revoke_role_path(:display_name => user.display_name, :role => role) confirm = t("user_role.revoke.are_you_sure", :name => user.display_name, :role => role) else - image = "roles/blank_#{role}.png" + image = "roles/blank_#{role}" alt = t("user.view.role.grant.#{role}") title = t("user.view.role.grant.#{role}") url = grant_role_path(:display_name => user.display_name, :role => role) confirm = t("user_role.grant.are_you_sure", :name => user.display_name, :role => role) end elsif user.has_role?(role) - image = "roles/#{role}.png" + image = "roles/#{role}" alt = t("user.view.role.#{role}") title = t("user.view.role.#{role}") end if image - icon = image_tag(image, :size => "20x20", :border => 0, :alt => alt, :title => title) + svg_icon = tag("source", :srcset => image_path("#{image}.svg"), :type => "image/svg+xml") + png_icon = image_tag("#{image}.png", :srcset => image_path("#{image}.svg"), :size => "20x20", :border => 0, :alt => alt, :title => title) + icon = content_tag("picture", svg_icon + png_icon) icon = link_to(icon, url, :method => :post, :confirm => confirm) if url end diff --git a/app/models/acl.rb b/app/models/acl.rb index 8bb4ae4b9..529ccbe3b 100644 --- a/app/models/acl.rb +++ b/app/models/acl.rb @@ -1,4 +1,6 @@ class Acl < ActiveRecord::Base + validates :k, :presence => true + def self.match(address, domain = nil) if domain Acl.where("address >>= ? OR domain = ?", address, domain) diff --git a/app/models/changeset.rb b/app/models/changeset.rb index bf939e425..549600df6 100644 --- a/app/models/changeset.rb +++ b/app/models/changeset.rb @@ -32,7 +32,7 @@ class Changeset < ActiveRecord::Base EXPAND = 0.1 # maximum number of elements allowed in a changeset - MAX_ELEMENTS = 50000 + MAX_ELEMENTS = 10000 # maximum time a changeset is allowed to be open for. MAX_TIME_OPEN = 1.day @@ -63,7 +63,7 @@ class Changeset < ActiveRecord::Base doc.find("//osm/changeset").each do |pt| return Changeset.from_xml_node(pt, create) end - fail OSM::APIBadXMLError.new("changeset", xml, "XML doesn't contain an osm/changeset element.") + raise OSM::APIBadXMLError.new("changeset", xml, "XML doesn't contain an osm/changeset element.") rescue LibXML::XML::Error, ArgumentError => ex raise OSM::APIBadXMLError.new("changeset", xml, ex.message) end @@ -80,8 +80,8 @@ class Changeset < ActiveRecord::Base end pt.find("tag").each do |tag| - fail OSM::APIBadXMLError.new("changeset", pt, "tag is missing key") if tag["k"].nil? - fail OSM::APIBadXMLError.new("changeset", pt, "tag is missing value") if tag["v"].nil? + raise OSM::APIBadXMLError.new("changeset", pt, "tag is missing key") if tag["k"].nil? + raise OSM::APIBadXMLError.new("changeset", pt, "tag is missing value") if tag["v"].nil? cs.add_tag_keyval(tag["k"], tag["v"]) end @@ -137,7 +137,7 @@ class Changeset < ActiveRecord::Base # duplicate tags are now forbidden, so we can't allow values # in the hash to be overwritten. - fail OSM::APIDuplicateTagsError.new("changeset", id, k) if @tags.include? k + raise OSM::APIDuplicateTagsError.new("changeset", id, k) if @tags.include? k @tags[k] = v end @@ -146,7 +146,7 @@ class Changeset < ActiveRecord::Base # do the changeset update and the changeset tags update in the # same transaction to ensure consistency. Changeset.transaction do - self.save! + save! tags = self.tags ChangesetTag.delete_all(:changeset_id => id) @@ -166,12 +166,12 @@ class Changeset < ActiveRecord::Base # that would make it more than 24h long, in which case clip to # 24h, as this has been decided is a reasonable time limit. def update_closed_at - if self.is_open? - if (closed_at - created_at) > (MAX_TIME_OPEN - IDLE_TIMEOUT) - self.closed_at = created_at + MAX_TIME_OPEN - else - self.closed_at = Time.now.getutc + IDLE_TIMEOUT - end + if is_open? + self.closed_at = if (closed_at - created_at) > (MAX_TIME_OPEN - IDLE_TIMEOUT) + created_at + MAX_TIME_OPEN + else + Time.now.getutc + IDLE_TIMEOUT + end end end @@ -241,10 +241,10 @@ class Changeset < ActiveRecord::Base # bounding box, only the tags of the changeset. def update_from(other, user) # ensure that only the user who opened the changeset may modify it. - fail OSM::APIUserChangesetMismatchError.new unless user.id == user_id + raise OSM::APIUserChangesetMismatchError.new unless user.id == user_id # can't change a closed changeset - fail OSM::APIChangesetAlreadyClosedError.new(self) unless is_open? + raise OSM::APIChangesetAlreadyClosedError.new(self) unless is_open? # copy the other's tags self.tags = other.tags diff --git a/app/models/changeset_comment.rb b/app/models/changeset_comment.rb index ec563d6c7..2fedadff0 100644 --- a/app/models/changeset_comment.rb +++ b/app/models/changeset_comment.rb @@ -7,6 +7,7 @@ class ChangesetComment < ActiveRecord::Base validates :changeset, :presence => true, :associated => true validates :author, :presence => true, :associated => true validates :visible, :inclusion => [true, false] + validates :body, :format => /\A[^\x00-\x08\x0b-\x0c\x0e-\x1f\x7f\ufffe\uffff]*\z/ # Return the comment text def body diff --git a/app/models/client_application.rb b/app/models/client_application.rb index aa7cb1c34..152b3912d 100644 --- a/app/models/client_application.rb +++ b/app/models/client_application.rb @@ -18,7 +18,7 @@ class ClientApplication < ActiveRecord::Base attr_accessor :token_callback_url def self.find_token(token_key) - token = OauthToken.find_by_token(token_key, :include => :client_application) + token = OauthToken.includes(:client_application).find_by(:token => token_key) token if token && token.authorized? end @@ -77,7 +77,7 @@ class ClientApplication < ActiveRecord::Base # can agree or not agree to each of them. PERMISSIONS = [:allow_read_prefs, :allow_write_prefs, :allow_write_diary, :allow_write_api, :allow_read_gpx, :allow_write_gpx, - :allow_write_notes] + :allow_write_notes].freeze def generate_keys self.key = OAuth::Helper.generate_key(40)[0, 40] diff --git a/app/models/diary_entry.rb b/app/models/diary_entry.rb index 368ee3aca..e756432fd 100644 --- a/app/models/diary_entry.rb +++ b/app/models/diary_entry.rb @@ -4,6 +4,8 @@ class DiaryEntry < ActiveRecord::Base has_many :comments, -> { order(:id).preload(:user) }, :class_name => "DiaryComment" has_many :visible_comments, -> { joins(:user).where(:visible => true, :users => { :status => %w(active confirmed) }).order(:id) }, :class_name => "DiaryComment" + has_many :subscriptions, :class_name => "DiaryEntrySubscription" + has_many :subscribers, :through => :subscriptions, :source => :user scope :visible, -> { where(:visible => true) } diff --git a/app/models/diary_entry_subscription.rb b/app/models/diary_entry_subscription.rb new file mode 100644 index 000000000..b0a563ea8 --- /dev/null +++ b/app/models/diary_entry_subscription.rb @@ -0,0 +1,4 @@ +class DiaryEntrySubscription < ActiveRecord::Base + belongs_to :user + belongs_to :diary_entry +end diff --git a/app/models/language.rb b/app/models/language.rb index bb31c82ee..776182e63 100644 --- a/app/models/language.rb +++ b/app/models/language.rb @@ -5,7 +5,7 @@ class Language < ActiveRecord::Base def self.load(file) Language.transaction do - YAML.load(File.read(file)).each do |k, v| + YAML.safe_load(File.read(file)).each do |k, v| begin Language.update(k, :english_name => v["english"], :native_name => v["native"]) rescue ActiveRecord::RecordNotFound diff --git a/app/models/node.rb b/app/models/node.rb index f1a89e0e2..f8559dca7 100644 --- a/app/models/node.rb +++ b/app/models/node.rb @@ -49,13 +49,13 @@ class Node < ActiveRecord::Base # Read in xml as text and return it's Node object representation def self.from_xml(xml, create = false) - p = XML::Parser.string(xml) + p = XML::Parser.string(xml, :options => XML::Parser::Options::NOERROR) doc = p.parse doc.find("//osm/node").each do |pt| return Node.from_xml_node(pt, create) end - fail OSM::APIBadXMLError.new("node", xml, "XML doesn't contain an osm/node element.") + raise OSM::APIBadXMLError.new("node", xml, "XML doesn't contain an osm/node element.") rescue LibXML::XML::Error, ArgumentError => ex raise OSM::APIBadXMLError.new("node", xml, ex.message) end @@ -63,25 +63,25 @@ class Node < ActiveRecord::Base def self.from_xml_node(pt, create = false) node = Node.new - fail OSM::APIBadXMLError.new("node", pt, "lat missing") if pt["lat"].nil? - fail OSM::APIBadXMLError.new("node", pt, "lon missing") if pt["lon"].nil? + raise OSM::APIBadXMLError.new("node", pt, "lat missing") if pt["lat"].nil? + raise OSM::APIBadXMLError.new("node", pt, "lon missing") if pt["lon"].nil? node.lat = OSM.parse_float(pt["lat"], OSM::APIBadXMLError, "node", pt, "lat not a number") node.lon = OSM.parse_float(pt["lon"], OSM::APIBadXMLError, "node", pt, "lon not a number") - fail OSM::APIBadXMLError.new("node", pt, "Changeset id is missing") if pt["changeset"].nil? + raise OSM::APIBadXMLError.new("node", pt, "Changeset id is missing") if pt["changeset"].nil? node.changeset_id = pt["changeset"].to_i - fail OSM::APIBadUserInput.new("The node is outside this world") unless node.in_world? + raise OSM::APIBadUserInput.new("The node is outside this world") unless node.in_world? # version must be present unless creating - fail OSM::APIBadXMLError.new("node", pt, "Version is required when updating") unless create || !pt["version"].nil? + raise OSM::APIBadXMLError.new("node", pt, "Version is required when updating") unless create || !pt["version"].nil? node.version = create ? 0 : pt["version"].to_i unless create - fail OSM::APIBadXMLError.new("node", pt, "ID is required when updating.") if pt["id"].nil? + raise OSM::APIBadXMLError.new("node", pt, "ID is required when updating.") if pt["id"].nil? node.id = pt["id"].to_i # .to_i will return 0 if there is no number that can be parsed. # We want to make sure that there is no id with zero anyway - fail OSM::APIBadUserInput.new("ID of node cannot be zero when updating.") if node.id == 0 + raise OSM::APIBadUserInput.new("ID of node cannot be zero when updating.") if node.id.zero? end # We don't care about the time, as it is explicitly set on create/update/delete @@ -94,8 +94,8 @@ class Node < ActiveRecord::Base # Add in any tags from the XML pt.find("tag").each do |tag| - fail OSM::APIBadXMLError.new("node", pt, "tag is missing key") if tag["k"].nil? - fail OSM::APIBadXMLError.new("node", pt, "tag is missing value") if tag["v"].nil? + raise OSM::APIBadXMLError.new("node", pt, "tag is missing key") if tag["k"].nil? + raise OSM::APIBadXMLError.new("node", pt, "tag is missing value") if tag["v"].nil? node.add_tag_key_val(tag["k"], tag["v"]) end @@ -111,19 +111,19 @@ class Node < ActiveRecord::Base # Should probably be renamed delete_from to come in line with update def delete_with_history!(new_node, user) - fail OSM::APIAlreadyDeletedError.new("node", new_node.id) unless visible + raise OSM::APIAlreadyDeletedError.new("node", new_node.id) unless visible # need to start the transaction here, so that the database can # provide repeatable reads for the used-by checks. this means it # shouldn't be possible to get race conditions. Node.transaction do - self.lock! + lock! check_consistency(self, new_node, user) ways = Way.joins(:way_nodes).where(:visible => true, :current_way_nodes => { :node_id => id }).order(:id) - fail OSM::APIPreconditionFailedError.new("Node #{id} is still used by ways #{ways.collect(&:id).join(",")}.") unless ways.empty? + raise OSM::APIPreconditionFailedError.new("Node #{id} is still used by ways #{ways.collect(&:id).join(',')}.") unless ways.empty? rels = Relation.joins(:relation_members).where(:visible => true, :current_relation_members => { :member_type => "Node", :member_id => id }).order(:id) - fail OSM::APIPreconditionFailedError.new("Node #{id} is still used by relations #{rels.collect(&:id).join(",")}.") unless rels.empty? + raise OSM::APIPreconditionFailedError.new("Node #{id} is still used by relations #{rels.collect(&:id).join(',')}.") unless rels.empty? self.changeset_id = new_node.changeset_id self.tags = {} @@ -138,7 +138,7 @@ class Node < ActiveRecord::Base def update_from(new_node, user) Node.transaction do - self.lock! + lock! check_consistency(self, new_node, user) # update changeset first @@ -184,7 +184,7 @@ class Node < ActiveRecord::Base add_metadata_to_xml_node(el, self, changeset_cache, user_display_name_cache) - if self.visible? + if visible? el["lat"] = lat.to_s el["lon"] = lon.to_s end @@ -209,7 +209,7 @@ class Node < ActiveRecord::Base # duplicate tags are now forbidden, so we can't allow values # in the hash to be overwritten. - fail OSM::APIDuplicateTagsError.new("node", id, k) if @tags.include? k + raise OSM::APIDuplicateTagsError.new("node", id, k) if @tags.include? k @tags[k] = v end @@ -232,10 +232,14 @@ class Node < ActiveRecord::Base def save_with_history! t = Time.now.getutc + + self.version += 1 + self.timestamp = t + Node.transaction do - self.version += 1 - self.timestamp = t - self.save! + # clone the object before saving it so that the original is + # still marked as dirty if we retry the transaction + clone.save! # Create a NodeTag tags = self.tags diff --git a/app/models/note.rb b/app/models/note.rb index 31056be49..73207af0f 100644 --- a/app/models/note.rb +++ b/app/models/note.rb @@ -59,6 +59,6 @@ class Note < ActiveRecord::Base # Fill in default values for new notes def set_defaults - self.status = "open" unless self.attribute_present?(:status) + self.status = "open" unless attribute_present?(:status) end end diff --git a/app/models/notifier.rb b/app/models/notifier.rb index ff3349e28..1eb39e678 100644 --- a/app/models/notifier.rb +++ b/app/models/notifier.rb @@ -3,6 +3,8 @@ class Notifier < ActionMailer::Base :return_path => EMAIL_RETURN_PATH, :auto_submitted => "auto-generated" helper :application + before_action :set_shared_template_vars + before_action :attach_project_logo def signup_confirm(user, token) with_recipient_locale user do @@ -76,6 +78,9 @@ class Notifier < ActionMailer::Base @replyurl = url_for(:host => SERVER_URL, :controller => "message", :action => "reply", :message_id => message.id) + @author = @from_user + + attach_user_avatar(message.sender) mail :from => from_address(message.sender.display_name, "m", message.id, message.digest), :to => message.recipient.email, @@ -83,9 +88,9 @@ class Notifier < ActionMailer::Base end end - def diary_comment_notification(comment) - with_recipient_locale comment.diary_entry.user do - @to_user = comment.diary_entry.user.display_name + def diary_comment_notification(comment, recipient) + with_recipient_locale recipient do + @to_user = recipient.display_name @from_user = comment.user.display_name @text = comment.body @title = comment.diary_entry.title @@ -106,9 +111,12 @@ class Notifier < ActionMailer::Base :action => "new", :display_name => comment.user.display_name, :title => "Re: #{comment.diary_entry.title}") + @author = @from_user + + attach_user_avatar(comment.user) - mail :from => from_address(comment.user.display_name, "c", comment.id, comment.digest), - :to => comment.diary_entry.user.email, + mail :from => from_address(comment.user.display_name, "c", comment.id, comment.digest, recipient.id), + :to => recipient.email, :subject => I18n.t("notifier.diary_comment_notification.subject", :user => comment.user.display_name) end end @@ -122,7 +130,9 @@ class Notifier < ActionMailer::Base @friendurl = url_for(:host => SERVER_URL, :controller => "user", :action => "make_friend", :display_name => @friend.befriender.display_name) + @author = @friend.befriender.display_name + attach_user_avatar(@friend.befriender) mail :to => friend.befriendee.email, :subject => I18n.t("notifier.friend_notification.subject", :user => friend.befriender.display_name) end @@ -136,17 +146,20 @@ class Notifier < ActionMailer::Base @owner = recipient == comment.note.author @event = comment.event - if comment.author - @commenter = comment.author.display_name - else - @commenter = I18n.t("notifier.note_comment_notification.anonymous") - end + @commenter = if comment.author + comment.author.display_name + else + I18n.t("notifier.note_comment_notification.anonymous") + end - if @owner - subject = I18n.t("notifier.note_comment_notification.#{@event}.subject_own", :commenter => @commenter) - else - subject = I18n.t("notifier.note_comment_notification.#{@event}.subject_other", :commenter => @commenter) - end + @author = @commenter + attach_user_avatar(comment.author) + + subject = if @owner + I18n.t("notifier.note_comment_notification.#{@event}.subject_own", :commenter => @commenter) + else + I18n.t("notifier.note_comment_notification.#{@event}.subject_other", :commenter => @commenter) + end mail :to => recipient.email, :subject => subject end @@ -161,12 +174,15 @@ class Notifier < ActionMailer::Base @changeset_comment = comment.changeset.tags["comment"].presence @time = comment.created_at @changeset_author = comment.changeset.user.display_name + @author = @commenter - if @owner - subject = I18n.t("notifier.changeset_comment_notification.commented.subject_own", :commenter => @commenter) - else - subject = I18n.t("notifier.changeset_comment_notification.commented.subject_other", :commenter => @commenter) - end + subject = if @owner + I18n.t("notifier.changeset_comment_notification.commented.subject_own", :commenter => @commenter) + else + I18n.t("notifier.changeset_comment_notification.commented.subject_other", :commenter => @commenter) + end + + attach_user_avatar(comment.author) mail :to => recipient.email, :subject => subject end @@ -174,21 +190,40 @@ class Notifier < ActionMailer::Base private - def with_recipient_locale(recipient) - old_locale = I18n.locale + def set_shared_template_vars + @root_url = root_url(:host => SERVER_URL) + end + + def attach_project_logo + attachments.inline["logo.png"] = File.read(Rails.root.join("app", "assets", "images", "osm_logo_30.png")) + end - begin - I18n.locale = recipient.preferred_language_from(I18n.available_locales) + def attach_user_avatar(user) + attachments.inline["avatar.png"] = File.read(user_avatar_file_path(user)) + end + def user_avatar_file_path(user) + image = user && user.image + if image && image.file? + return image.path(:small) + else + return Rails.root.join("app", "assets", "images", "users", "images", "small.png") + end + end + + def with_recipient_locale(recipient) + I18n.with_locale Locale.available.preferred(recipient.preferred_languages) do yield - ensure - I18n.locale = old_locale end end - def from_address(name, type, id, digest) + def from_address(name, type, id, digest, user_id = nil) if Object.const_defined?(:MESSAGES_DOMAIN) && domain = MESSAGES_DOMAIN - "#{name} <#{type}-#{id}-#{digest[0, 6]}@#{domain}>" + if user_id + "#{name} <#{type}-#{id}-#{user_id}-#{digest[0, 6]}@#{domain}>" + else + "#{name} <#{type}-#{id}-#{digest[0, 6]}@#{domain}>" + end else EMAIL_FROM end diff --git a/app/models/oauth_nonce.rb b/app/models/oauth_nonce.rb index 4d615dd5d..e0510dcbf 100644 --- a/app/models/oauth_nonce.rb +++ b/app/models/oauth_nonce.rb @@ -6,7 +6,8 @@ class OauthNonce < ActiveRecord::Base # Remembers a nonce and it's associated timestamp. It returns false if it has already been used def self.remember(nonce, timestamp) - oauth_nonce = OauthNonce.create(:nonce => nonce, :timestamp => timestamp) + return false if Time.now.to_i - timestamp.to_i > 86400 + oauth_nonce = OauthNonce.create(:nonce => nonce, :timestamp => timestamp.to_i) return false if oauth_nonce.new_record? oauth_nonce end diff --git a/app/models/old_node.rb b/app/models/old_node.rb index 84899d7fb..b103e5c73 100644 --- a/app/models/old_node.rb +++ b/app/models/old_node.rb @@ -55,7 +55,7 @@ class OldNode < ActiveRecord::Base add_metadata_to_xml_node(el, self, changeset_cache, user_display_name_cache) - if self.visible? + if visible? el["lat"] = lat.to_s el["lon"] = lon.to_s end diff --git a/app/models/relation.rb b/app/models/relation.rb index cb9621822..b78c95ce4 100644 --- a/app/models/relation.rb +++ b/app/models/relation.rb @@ -33,16 +33,16 @@ class Relation < ActiveRecord::Base scope :ways, ->(*ids) { joins(:relation_members).where(:current_relation_members => { :member_type => "Way", :member_id => ids.flatten }) } scope :relations, ->(*ids) { joins(:relation_members).where(:current_relation_members => { :member_type => "Relation", :member_id => ids.flatten }) } - TYPES = %w(node way relation) + TYPES = %w(node way relation).freeze def self.from_xml(xml, create = false) - p = XML::Parser.string(xml) + p = XML::Parser.string(xml, :options => XML::Parser::Options::NOERROR) doc = p.parse doc.find("//osm/relation").each do |pt| return Relation.from_xml_node(pt, create) end - fail OSM::APIBadXMLError.new("node", xml, "XML doesn't contain an osm/relation element.") + raise OSM::APIBadXMLError.new("node", xml, "XML doesn't contain an osm/relation element.") rescue LibXML::XML::Error, ArgumentError => ex raise OSM::APIBadXMLError.new("relation", xml, ex.message) end @@ -50,17 +50,17 @@ class Relation < ActiveRecord::Base def self.from_xml_node(pt, create = false) relation = Relation.new - fail OSM::APIBadXMLError.new("relation", pt, "Version is required when updating") unless create || !pt["version"].nil? + raise OSM::APIBadXMLError.new("relation", pt, "Version is required when updating") unless create || !pt["version"].nil? relation.version = pt["version"] - fail OSM::APIBadXMLError.new("relation", pt, "Changeset id is missing") if pt["changeset"].nil? + raise OSM::APIBadXMLError.new("relation", pt, "Changeset id is missing") if pt["changeset"].nil? relation.changeset_id = pt["changeset"] unless create - fail OSM::APIBadXMLError.new("relation", pt, "ID is required when updating") if pt["id"].nil? + raise OSM::APIBadXMLError.new("relation", pt, "ID is required when updating") if pt["id"].nil? relation.id = pt["id"].to_i # .to_i will return 0 if there is no number that can be parsed. # We want to make sure that there is no id with zero anyway - fail OSM::APIBadUserInput.new("ID of relation cannot be zero when updating.") if relation.id == 0 + raise OSM::APIBadUserInput.new("ID of relation cannot be zero when updating.") if relation.id.zero? end # We don't care about the timestamp nor the visibility as these are either @@ -73,8 +73,8 @@ class Relation < ActiveRecord::Base # Add in any tags from the XML pt.find("tag").each do |tag| - fail OSM::APIBadXMLError.new("relation", pt, "tag is missing key") if tag["k"].nil? - fail OSM::APIBadXMLError.new("relation", pt, "tag is missing value") if tag["v"].nil? + raise OSM::APIBadXMLError.new("relation", pt, "tag is missing key") if tag["k"].nil? + raise OSM::APIBadXMLError.new("relation", pt, "tag is missing value") if tag["v"].nil? relation.add_tag_keyval(tag["k"], tag["v"]) end @@ -86,13 +86,13 @@ class Relation < ActiveRecord::Base pt.find("member").each do |member| # member_type = - fail OSM::APIBadXMLError.new("relation", pt, "The #{member['type']} is not allowed only, #{TYPES.inspect} allowed") unless TYPES.include? member["type"] + raise OSM::APIBadXMLError.new("relation", pt, "The #{member['type']} is not allowed only, #{TYPES.inspect} allowed") unless TYPES.include? member["type"] # member_ref = member['ref'] # member_role member["role"] ||= "" # Allow the upload to not include this, in which case we default to an empty string. relation.add_member(member["type"].classify, member["ref"], member["role"]) end - fail OSM::APIBadUserInput.new("Some bad xml in relation") if relation.nil? + raise OSM::APIBadUserInput.new("Some bad xml in relation") if relation.nil? relation end @@ -159,7 +159,7 @@ class Relation < ActiveRecord::Base # duplicate tags are now forbidden, so we can't allow values # in the hash to be overwritten. - fail OSM::APIDuplicateTagsError.new("relation", id, k) if @tags.include? k + raise OSM::APIDuplicateTagsError.new("relation", id, k) if @tags.include? k @tags[k] = v end @@ -176,18 +176,18 @@ class Relation < ActiveRecord::Base def delete_with_history!(new_relation, user) unless visible - fail OSM::APIAlreadyDeletedError.new("relation", new_relation.id) + raise OSM::APIAlreadyDeletedError.new("relation", new_relation.id) end # need to start the transaction here, so that the database can # provide repeatable reads for the used-by checks. this means it # shouldn't be possible to get race conditions. Relation.transaction do - self.lock! + lock! check_consistency(self, new_relation, user) # This will check to see if this relation is used by another relation rel = RelationMember.joins(:relation).find_by("visible = ? AND member_type = 'Relation' and member_id = ? ", true, id) - fail OSM::APIPreconditionFailedError.new("The relation #{new_relation.id} is used in relation #{rel.relation.id}.") unless rel.nil? + raise OSM::APIPreconditionFailedError.new("The relation #{new_relation.id} is used in relation #{rel.relation.id}.") unless rel.nil? self.changeset_id = new_relation.changeset_id self.tags = {} @@ -199,10 +199,10 @@ class Relation < ActiveRecord::Base def update_from(new_relation, user) Relation.transaction do - self.lock! + lock! check_consistency(self, new_relation, user) unless new_relation.preconditions_ok?(members) - fail OSM::APIPreconditionFailedError.new("Cannot update relation #{id}: data or member data is invalid.") + raise OSM::APIPreconditionFailedError.new("Cannot update relation #{id}: data or member data is invalid.") end self.changeset_id = new_relation.changeset_id self.changeset = new_relation.changeset @@ -215,8 +215,8 @@ class Relation < ActiveRecord::Base def create_with_history(user) check_create_consistency(self, user) - unless self.preconditions_ok? - fail OSM::APIPreconditionFailedError.new("Cannot create relation: data or member data is invalid.") + unless preconditions_ok? + raise OSM::APIPreconditionFailedError.new("Cannot create relation: data or member data is invalid.") end self.version = 0 self.visible = true @@ -253,7 +253,7 @@ class Relation < ActiveRecord::Base # and check that it is OK to use. unless element && element.visible? && element.preconditions_ok? - fail OSM::APIPreconditionFailedError.new("Relation with id #{id} cannot be saved due to #{m[0]} with id #{m[1]}") + raise OSM::APIPreconditionFailedError.new("Relation with id #{id} cannot be saved due to #{m[0]} with id #{m[1]}") end hash[m[1]] = true end @@ -270,7 +270,7 @@ class Relation < ActiveRecord::Base old_id = id.to_i if old_id < 0 new_id = id_map[type.downcase.to_sym][old_id] - fail OSM::APIBadUserInput.new("Placeholder #{type} not found for reference #{old_id} in relation #{self.id.nil? ? placeholder_id : self.id}.") if new_id.nil? + raise OSM::APIBadUserInput.new("Placeholder #{type} not found for reference #{old_id} in relation #{self.id.nil? ? placeholder_id : self.id}.") if new_id.nil? [type, new_id, role] else [type, id, role] @@ -281,15 +281,19 @@ class Relation < ActiveRecord::Base private def save_with_history! + t = Time.now.getutc + + self.version += 1 + self.timestamp = t + Relation.transaction do # have to be a little bit clever here - to detect if any tags # changed then we have to monitor their before and after state. tags_changed = false - t = Time.now.getutc - self.version += 1 - self.timestamp = t - self.save! + # clone the object before saving it so that the original is + # still marked as dirty if we retry the transaction + clone.save! tags = self.tags.clone relation_tags.each do |old_tag| @@ -312,7 +316,7 @@ class Relation < ActiveRecord::Base end # if there are left-over tags then they are new and will have to # be added. - tags_changed |= (!tags.empty?) + tags_changed |= !tags.empty? RelationTag.delete_all(:relation_id => id) self.tags.each do |k, v| tag = RelationTag.new @@ -370,7 +374,7 @@ class Relation < ActiveRecord::Base # materially change the rest of the relation. any_relations = changed_members.collect { |_id, type| type == "relation" } - .inject(false) { |a, e| a || e } + .inject(false) { |acc, elem| acc || elem } update_members = if tags_changed || any_relations # add all non-relation bounding boxes to the changeset diff --git a/app/models/request_token.rb b/app/models/request_token.rb index a1b30abb3..c0f019486 100644 --- a/app/models/request_token.rb +++ b/app/models/request_token.rb @@ -35,7 +35,7 @@ class RequestToken < OauthToken end def oob? - callback_url.nil? || callback_url.downcase == "oob" + callback_url.nil? || callback_url.casecmp("oob").zero? end def oauth10? diff --git a/app/models/trace.rb b/app/models/trace.rb index b13ce84d2..2d055fd28 100644 --- a/app/models/trace.rb +++ b/app/models/trace.rb @@ -28,20 +28,20 @@ class Trace < ActiveRecord::Base end def tagstring=(s) - if s.include? "," - self.tags = s.split(/\s*,\s*/).select { |tag| tag !~ /^\s*$/ }.collect {|tag| - tt = Tracetag.new - tt.tag = tag - tt - } - else - # do as before for backwards compatibility: - self.tags = s.split.collect {|tag| - tt = Tracetag.new - tt.tag = tag - tt - } - end + self.tags = if s.include? "," + s.split(/\s*,\s*/).select { |tag| tag !~ /^\s*$/ }.collect do |tag| + tt = Tracetag.new + tt.tag = tag + tt + end + else + # do as before for backwards compatibility: + s.split.collect do |tag| + tt = Tracetag.new + tt.tag = tag + tt + end + end end def public? @@ -95,49 +95,49 @@ class Trace < ActiveRecord::Base end def mime_type - filetype = `/usr/bin/file -bz #{trace_name}`.chomp + filetype = `/usr/bin/file -Lbz #{trace_name}`.chomp gzipped = filetype =~ /gzip compressed/ bzipped = filetype =~ /bzip2 compressed/ zipped = filetype =~ /Zip archive/ tarred = filetype =~ /tar archive/ - if gzipped - mimetype = "application/x-gzip" - elsif bzipped - mimetype = "application/x-bzip2" - elsif zipped - mimetype = "application/x-zip" - elsif tarred - mimetype = "application/x-tar" - else - mimetype = "application/gpx+xml" - end + mimetype = if gzipped + "application/x-gzip" + elsif bzipped + "application/x-bzip2" + elsif zipped + "application/x-zip" + elsif tarred + "application/x-tar" + else + "application/gpx+xml" + end mimetype end def extension_name - filetype = `/usr/bin/file -bz #{trace_name}`.chomp + filetype = `/usr/bin/file -Lbz #{trace_name}`.chomp gzipped = filetype =~ /gzip compressed/ bzipped = filetype =~ /bzip2 compressed/ zipped = filetype =~ /Zip archive/ tarred = filetype =~ /tar archive/ - if tarred && gzipped - extension = ".tar.gz" - elsif tarred && bzipped - extension = ".tar.bz2" - elsif tarred - extension = ".tar" - elsif gzipped - extension = ".gpx.gz" - elsif bzipped - extension = ".gpx.bz2" - elsif zipped - extension = ".zip" - else - extension = ".gpx" - end + extension = if tarred && gzipped + ".tar.gz" + elsif tarred && bzipped + ".tar.bz2" + elsif tarred + ".tar" + elsif gzipped + ".gpx.gz" + elsif bzipped + ".gpx.bz2" + elsif zipped + ".zip" + else + ".gpx" + end extension end @@ -156,7 +156,7 @@ class Trace < ActiveRecord::Base el1["lon"] = longitude.to_s if inserted el1["user"] = user.display_name el1["visibility"] = visibility - el1["pending"] = (!inserted).to_s + el1["pending"] = inserted ? "false" : "true" el1["timestamp"] = timestamp.xmlschema el2 = XML::Node.new "description" @@ -174,14 +174,14 @@ class Trace < ActiveRecord::Base # Read in xml as text and return it's Node object representation def self.from_xml(xml, create = false) - p = XML::Parser.string(xml) + p = XML::Parser.string(xml, :options => XML::Parser::Options::NOERROR) doc = p.parse doc.find("//osm/gpx_file").each do |pt| return Trace.from_xml_node(pt, create) end - fail OSM::APIBadXMLError.new("trace", xml, "XML doesn't contain an osm/gpx_file element.") + raise OSM::APIBadXMLError.new("trace", xml, "XML doesn't contain an osm/gpx_file element.") rescue LibXML::XML::Error, ArgumentError => ex raise OSM::APIBadXMLError.new("trace", xml, ex.message) end @@ -189,15 +189,15 @@ class Trace < ActiveRecord::Base def self.from_xml_node(pt, create = false) trace = Trace.new - fail OSM::APIBadXMLError.new("trace", pt, "visibility missing") if pt["visibility"].nil? + raise OSM::APIBadXMLError.new("trace", pt, "visibility missing") if pt["visibility"].nil? trace.visibility = pt["visibility"] unless create - fail OSM::APIBadXMLError.new("trace", pt, "ID is required when updating.") if pt["id"].nil? + raise OSM::APIBadXMLError.new("trace", pt, "ID is required when updating.") if pt["id"].nil? trace.id = pt["id"].to_i # .to_i will return 0 if there is no number that can be parsed. # We want to make sure that there is no id with zero anyway - fail OSM::APIBadUserInput.new("ID of trace cannot be zero when updating.") if trace.id == 0 + raise OSM::APIBadUserInput.new("ID of trace cannot be zero when updating.") if trace.id.zero? end # We don't care about the time, as it is explicitly set on create/update/delete @@ -206,7 +206,7 @@ class Trace < ActiveRecord::Base trace.visible = true description = pt.find("description").first - fail OSM::APIBadXMLError.new("trace", pt, "description missing") if description.nil? + raise OSM::APIBadXMLError.new("trace", pt, "description missing") if description.nil? trace.description = description.content pt.find("tag").each do |tag| @@ -218,7 +218,7 @@ class Trace < ActiveRecord::Base def xml_file # TODO: *nix specific, could do to work on windows... would be functionally inferior though - check for '.gz' - filetype = `/usr/bin/file -bz #{trace_name}`.chomp + filetype = `/usr/bin/file -Lbz #{trace_name}`.chomp gzipped = filetype =~ /gzip compressed/ bzipped = filetype =~ /bzip2 compressed/ zipped = filetype =~ /Zip archive/ @@ -297,7 +297,7 @@ class Trace < ActiveRecord::Base self.icon_picture = gpx.icon(min_lat, min_lon, max_lat, max_lon) self.size = gpx.actual_points self.inserted = true - self.save! + save! end logger.info "done trace #{id}" diff --git a/app/models/user.rb b/app/models/user.rb index a95724c96..3d5e71ea2 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -4,6 +4,8 @@ class User < ActiveRecord::Base has_many :traces, -> { where(:visible => true) } has_many :diary_entries, -> { order(:created_at => :desc) } has_many :diary_comments, -> { order(:created_at => :desc) } + has_many :diary_entry_subscriptions, :class_name => "DiaryEntrySubscription" + has_many :diary_subscriptions, :through => :diary_entry_subscriptions, :source => :diary_entry has_many :messages, -> { where(:to_user_visible => true).order(:sent_on => :desc).preload(:sender, :recipient) }, :foreign_key => :to_user_id has_many :new_messages, -> { where(:to_user_visible => true, :message_read => false).order(:sent_on => :desc) }, :class_name => "Message", :foreign_key => :to_user_id has_many :sent_messages, -> { where(:from_user_visible => true).order(:sent_on => :desc).preload(:sender, :recipient) }, :class_name => "Message", :foreign_key => :from_user_id @@ -12,7 +14,7 @@ class User < ActiveRecord::Base has_many :tokens, :class_name => "UserToken" has_many :preferences, :class_name => "UserPreference" has_many :changesets, -> { order(:created_at => :desc) } - has_many :changeset_comments, :foreign_key => :author_id + has_many :changeset_comments, :foreign_key => :author_id has_and_belongs_to_many :changeset_subscriptions, :class_name => "Changeset", :join_table => "changesets_subscribers", :foreign_key => "subscriber_id" has_many :note_comments, :foreign_key => :author_id has_many :notes, :through => :note_comments @@ -52,6 +54,8 @@ class User < ActiveRecord::Base validates :home_zoom, :allow_nil => true, :numericality => { :only_integer => true } validates :preferred_editor, :inclusion => Editors::ALL_EDITORS, :allow_nil => true validates :image, :attachment_content_type => { :content_type => %r{\Aimage/.*\Z} } + validates :auth_uid, :unless => proc { |u| u.auth_provider.nil? }, + :uniqueness => { :scope => :auth_provider } validates_email_format_of :email, :if => proc { |u| u.email_changed? } validates_email_format_of :new_email, :allow_blank => true, :if => proc { |u| u.new_email_changed? } @@ -79,7 +83,7 @@ class User < ActiveRecord::Base user = nil end elsif options[:token] - token = UserToken.find_by_token(options[:token]) + token = UserToken.find_by(:token => options[:token]) user = token.user if token end @@ -90,7 +94,7 @@ class User < ActiveRecord::Base user = nil end - token.update_column(:expiry, 1.week.from_now) if token && user + token.update(:expiry => 1.week.from_now) if token && user user end @@ -131,8 +135,8 @@ class User < ActiveRecord::Base languages.find { |l| Language.exists?(:code => l) } end - def preferred_language_from(array) - (languages & array.collect(&:to_s)).first + def preferred_languages + @locales ||= Locale.list(languages) end def nearby(radius = NEARBY_RADIUS, num = NEARBY_USERS) @@ -212,13 +216,13 @@ class User < ActiveRecord::Base def spam_score changeset_score = changesets.size * 50 trace_score = traces.size * 50 - diary_entry_score = diary_entries.inject(0) { |a, e| a + e.body.spam_score } - diary_comment_score = diary_comments.inject(0) { |a, e| a + e.body.spam_score } + diary_entry_score = diary_entries.inject(0) { |acc, elem| acc + elem.body.spam_score } + diary_comment_score = diary_comments.inject(0) { |acc, elem| acc + elem.body.spam_score } score = description.spam_score / 4.0 score += diary_entries.where("created_at > ?", 1.day.ago).count * 10 - score += diary_entry_score / diary_entries.length if diary_entries.length > 0 - score += diary_comment_score / diary_comments.length if diary_comments.length > 0 + score += diary_entry_score / diary_entries.length unless diary_entries.empty? + score += diary_comment_score / diary_comments.length unless diary_comments.empty? score -= changeset_score score -= trace_score @@ -229,20 +233,20 @@ class User < ActiveRecord::Base # perform a spam check on a user def spam_check if status == "active" && spam_score > SPAM_THRESHOLD - update_column(:status, "suspended") + update(:status => "suspended") end end ## # return an oauth access token for a specified application def access_token(application_key) - ClientApplication.find_by_key(application_key).access_token_for_user(self) + ClientApplication.find_by(:key => application_key).access_token_for_user(self) end private def set_defaults - self.creation_time = Time.now.getutc unless self.attribute_present?(:creation_time) + self.creation_time = Time.now.getutc unless attribute_present?(:creation_time) end def encrypt_password diff --git a/app/models/user_role.rb b/app/models/user_role.rb index 9686f7250..4f80f1952 100644 --- a/app/models/user_role.rb +++ b/app/models/user_role.rb @@ -1,7 +1,8 @@ class UserRole < ActiveRecord::Base belongs_to :user + belongs_to :granter, :class_name => "User" - ALL_ROLES = %w(administrator moderator) + ALL_ROLES = %w(administrator moderator).freeze validates :role, :inclusion => ALL_ROLES, :uniqueness => { :scope => :user_id } end diff --git a/app/models/way.rb b/app/models/way.rb index 6d49735f1..9877b8bb8 100644 --- a/app/models/way.rb +++ b/app/models/way.rb @@ -34,13 +34,13 @@ class Way < ActiveRecord::Base # Read in xml as text and return it's Way object representation def self.from_xml(xml, create = false) - p = XML::Parser.string(xml) + p = XML::Parser.string(xml, :options => XML::Parser::Options::NOERROR) doc = p.parse doc.find("//osm/way").each do |pt| return Way.from_xml_node(pt, create) end - fail OSM::APIBadXMLError.new("node", xml, "XML doesn't contain an osm/way element.") + raise OSM::APIBadXMLError.new("node", xml, "XML doesn't contain an osm/way element.") rescue LibXML::XML::Error, ArgumentError => ex raise OSM::APIBadXMLError.new("way", xml, ex.message) end @@ -48,17 +48,17 @@ class Way < ActiveRecord::Base def self.from_xml_node(pt, create = false) way = Way.new - fail OSM::APIBadXMLError.new("way", pt, "Version is required when updating") unless create || !pt["version"].nil? + raise OSM::APIBadXMLError.new("way", pt, "Version is required when updating") unless create || !pt["version"].nil? way.version = pt["version"] - fail OSM::APIBadXMLError.new("way", pt, "Changeset id is missing") if pt["changeset"].nil? + raise OSM::APIBadXMLError.new("way", pt, "Changeset id is missing") if pt["changeset"].nil? way.changeset_id = pt["changeset"] unless create - fail OSM::APIBadXMLError.new("way", pt, "ID is required when updating") if pt["id"].nil? + raise OSM::APIBadXMLError.new("way", pt, "ID is required when updating") if pt["id"].nil? way.id = pt["id"].to_i # .to_i will return 0 if there is no number that can be parsed. # We want to make sure that there is no id with zero anyway - fail OSM::APIBadUserInput.new("ID of way cannot be zero when updating.") if way.id == 0 + raise OSM::APIBadUserInput.new("ID of way cannot be zero when updating.") if way.id.zero? end # We don't care about the timestamp nor the visibility as these are either @@ -71,8 +71,8 @@ class Way < ActiveRecord::Base # Add in any tags from the XML pt.find("tag").each do |tag| - fail OSM::APIBadXMLError.new("way", pt, "tag is missing key") if tag["k"].nil? - fail OSM::APIBadXMLError.new("way", pt, "tag is missing value") if tag["v"].nil? + raise OSM::APIBadXMLError.new("way", pt, "tag is missing key") if tag["k"].nil? + raise OSM::APIBadXMLError.new("way", pt, "tag is missing value") if tag["v"].nil? way.add_tag_keyval(tag["k"], tag["v"]) end @@ -147,7 +147,7 @@ class Way < ActiveRecord::Base # duplicate tags are now forbidden, so we can't allow values # in the hash to be overwritten. - fail OSM::APIDuplicateTagsError.new("way", id, k) if @tags.include? k + raise OSM::APIDuplicateTagsError.new("way", id, k) if @tags.include? k @tags[k] = v end @@ -163,10 +163,10 @@ class Way < ActiveRecord::Base def update_from(new_way, user) Way.transaction do - self.lock! + lock! check_consistency(self, new_way, user) unless new_way.preconditions_ok?(nds) - fail OSM::APIPreconditionFailedError.new("Cannot update way #{id}: data is invalid.") + raise OSM::APIPreconditionFailedError.new("Cannot update way #{id}: data is invalid.") end self.changeset_id = new_way.changeset_id @@ -180,8 +180,8 @@ class Way < ActiveRecord::Base def create_with_history(user) check_create_consistency(self, user) - unless self.preconditions_ok? - fail OSM::APIPreconditionFailedError.new("Cannot create way: data is invalid.") + unless preconditions_ok? + raise OSM::APIPreconditionFailedError.new("Cannot create way: data is invalid.") end self.version = 0 self.visible = true @@ -191,7 +191,7 @@ class Way < ActiveRecord::Base def preconditions_ok?(old_nodes = []) return false if nds.empty? if nds.length > MAX_NUMBER_OF_WAY_NODES - fail OSM::APITooManyWayNodesError.new(id, nds.length, MAX_NUMBER_OF_WAY_NODES) + raise OSM::APITooManyWayNodesError.new(id, nds.length, MAX_NUMBER_OF_WAY_NODES) end # check only the new nodes, for efficiency - old nodes having been checked last time and can't @@ -205,7 +205,7 @@ class Way < ActiveRecord::Base if db_nds.length < new_nds.length missing = new_nds - db_nds.collect(&:id) - fail OSM::APIPreconditionFailedError.new("Way #{id} requires the nodes with id in (#{missing.join(',')}), which either do not exist, or are not visible.") + raise OSM::APIPreconditionFailedError.new("Way #{id} requires the nodes with id in (#{missing.join(',')}), which either do not exist, or are not visible.") end end @@ -213,16 +213,16 @@ class Way < ActiveRecord::Base end def delete_with_history!(new_way, user) - fail OSM::APIAlreadyDeletedError.new("way", new_way.id) unless visible + raise OSM::APIAlreadyDeletedError.new("way", new_way.id) unless visible # need to start the transaction here, so that the database can # provide repeatable reads for the used-by checks. this means it # shouldn't be possible to get race conditions. Way.transaction do - self.lock! + lock! check_consistency(self, new_way, user) rels = Relation.joins(:relation_members).where(:visible => true, :current_relation_members => { :member_type => "Way", :member_id => id }).order(:id) - fail OSM::APIPreconditionFailedError.new("Way #{id} is still used by relations #{rels.collect(&:id).join(",")}.") unless rels.empty? + raise OSM::APIPreconditionFailedError.new("Way #{id} is still used by relations #{rels.collect(&:id).join(',')}.") unless rels.empty? self.changeset_id = new_way.changeset_id self.changeset = new_way.changeset @@ -242,7 +242,7 @@ class Way < ActiveRecord::Base nds.map! do |node_id| if node_id < 0 new_id = id_map[:node][node_id] - fail OSM::APIBadUserInput.new("Placeholder node not found for reference #{node_id} in way #{id.nil? ? placeholder_id : id}") if new_id.nil? + raise OSM::APIBadUserInput.new("Placeholder node not found for reference #{node_id} in way #{id.nil? ? placeholder_id : id}") if new_id.nil? new_id else node_id @@ -255,6 +255,9 @@ class Way < ActiveRecord::Base def save_with_history! t = Time.now.getutc + self.version += 1 + self.timestamp = t + # update the bounding box, note that this has to be done both before # and after the save, so that nodes from both versions are included in the # bbox. we use a copy of the changeset so that it isn't reloaded @@ -263,9 +266,9 @@ class Way < ActiveRecord::Base cs.update_bbox!(bbox) unless nodes.empty? Way.transaction do - self.version += 1 - self.timestamp = t - self.save! + # clone the object before saving it so that the original is + # still marked as dirty if we retry the transaction + clone.save! tags = self.tags WayTag.delete_all(:way_id => id) diff --git a/app/views/api/permissions.builder b/app/views/api/permissions.builder index 066f56788..6d26a9e53 100644 --- a/app/views/api/permissions.builder +++ b/app/views/api/permissions.builder @@ -1,6 +1,6 @@ # create list of permissions -xml.instruct! :xml, :version=>"1.0" -xml.osm("version" => "#{API_VERSION}", "generator" => "OpenStreetMap Server") do +xml.instruct! :xml, :version => "1.0" +xml.osm("version" => API_VERSION.to_s, "generator" => "OpenStreetMap Server") do xml.permissions do @permissions.each do |permission| xml.permission :name => permission diff --git a/app/views/browse/_relation_member.html.erb b/app/views/browse/_relation_member.html.erb index 0d17de349..87b7e301b 100644 --- a/app/views/browse/_relation_member.html.erb +++ b/app/views/browse/_relation_member.html.erb @@ -1,6 +1,6 @@ <% member_class = link_class(relation_member.member_type.downcase, relation_member.member) - linked_name = link_to printable_name(relation_member.member), { :action => relation_member.member_type.downcase, :id => relation_member.member_id.to_s }, :title => link_title(relation_member.member) + linked_name = link_to printable_name(relation_member.member), { :action => relation_member.member_type.downcase, :id => relation_member.member_id.to_s }, :title => link_title(relation_member.member), :rel => link_follow(relation_member.member) type_str = t'browse.relation_member.type.' + relation_member.member_type.downcase %> <li class="<%= member_class %>"><%= diff --git a/app/views/browse/_way.html.erb b/app/views/browse/_way.html.erb index b1dffb9ef..489b9cf07 100644 --- a/app/views/browse/_way.html.erb +++ b/app/views/browse/_way.html.erb @@ -15,7 +15,7 @@ <ul> <% way.way_nodes.each do |wn| %> <li> - <%= link_to printable_name(wn.node), { :action => "node", :id => wn.node_id.to_s }, :class => link_class('node', wn.node), :title => link_title(wn.node) %> + <%= link_to printable_name(wn.node), { :action => "node", :id => wn.node_id.to_s }, :class => link_class('node', wn.node), :title => link_title(wn.node), :rel => link_follow(wn.node) %> <% related_ways = wn.node.ways.reject { |w| w.id == wn.way_id } %> <% if related_ways.size > 0 then %> (<%= raw t 'browse.way.also_part_of', :count => related_ways.size, :related_ways => related_ways.map { |w| link_to(printable_name(w), { :action => "way", :id => w.id.to_s }, :class => link_class('way', w), :title => link_title(w) ) }.to_sentence %>) diff --git a/app/views/browse/changeset.html.erb b/app/views/browse/changeset.html.erb index efb7bb7f9..a33214a70 100644 --- a/app/views/browse/changeset.html.erb +++ b/app/views/browse/changeset.html.erb @@ -105,7 +105,7 @@ </h4> <ul> <% @nodes.each do |node| %> - <li><%= link_to printable_name(node, true), { :action => "node", :id => node.node_id.to_s }, :class => link_class('node', node), :title => link_title(node) %></li> + <li><%= link_to printable_name(node, true), { :action => "node", :id => node.node_id.to_s }, :class => link_class('node', node), :title => link_title(node), :rel => link_follow(node) %></li> <% end %> </ul> <% end %> @@ -119,7 +119,7 @@ <% end %> <%= user = (@prev_by_user || @next_by_user).user.display_name - link_to user, :controller => "changeset", :action => "list", :display_name => user + link_to content_tag(:bdi, user), :controller => "changeset", :action => "list", :display_name => user %> <% if @next_by_user %> · diff --git a/app/views/browse/note.html.erb b/app/views/browse/note.html.erb index fa6f75ff9..1bacd27d6 100644 --- a/app/views/browse/note.html.erb +++ b/app/views/browse/note.html.erb @@ -8,25 +8,25 @@ <div class="browse-section"> <h4><%= t('browse.note.description') %></h4> <div class="note-description"> - <%= h(@note.comments.first.body.to_html) %> + <%= h(@note_comments.first.body.to_html) %> </div> <div class="details" data-coordinates="<%= @note.lat %>,<%= @note.lon %>" data-status="<%= @note.status %>"> <%= note_event('open', @note.created_at, @note.author) %> <% if @note.status == "closed" %> <br/> - <%= note_event(@note.status, @note.closed_at, @note.comments.last.author) %> + <%= note_event(@note.status, @note.closed_at, @note_comments.last.author) %> <% end %> </div> - <% if @note.comments.find { |comment| comment.author.nil? } -%> + <% if @note_comments.find { |comment| comment.author.nil? } -%> <p class='warning'><%= t "javascripts.notes.show.anonymous_warning" %></p> <% end -%> - <% if @note.comments.length > 1 %> + <% if @note_comments.length > 1 %> <div class='note-comments'> <ul> - <% @note.comments[1..-1].each do |comment| %> + <% @note_comments[1..-1].each do |comment| %> <li id="c<%= comment.id %>"> <small class='deemphasize'><%= note_event(comment.event, comment.created_at, comment.author) %></small> <%= comment.body.to_html %> diff --git a/app/views/browse/timeout.html.erb b/app/views/browse/timeout.html.erb index 8b5076902..a624bf0a6 100644 --- a/app/views/browse/timeout.html.erb +++ b/app/views/browse/timeout.html.erb @@ -6,4 +6,7 @@ 'changeset' => I18n.t('browse.timeout.type.changeset'), }; %> -<p><%= t'browse.timeout.sorry', :type=> browse_timeout_type[@type] , :id => params[:id] %></p> +<div class="browse-section"> + <a class="geolink" href="<%= root_path %>"><span class="icon close"></span></a> + <%= t'browse.timeout.sorry', :type=> browse_timeout_type[@type] , :id => params[:id] %> +</div> diff --git a/app/views/changeset/_changeset.html.erb b/app/views/changeset/_changeset.html.erb index cbc60695b..f27b0bc91 100644 --- a/app/views/changeset/_changeset.html.erb +++ b/app/views/changeset/_changeset.html.erb @@ -18,6 +18,10 @@ <%= changeset.tags['comment'].to_s.presence || t('browse.no_comment') %> </a> </h4> + <div class="comments comments-<%= changeset.comments.length %>"> + <%= changeset.comments.length %> + <span class="icon note grey"></span> + </div> <div class="details"> <%= changeset_details(changeset) %> · diff --git a/app/views/changeset/_comments.rss.builder b/app/views/changeset/_comments.rss.builder index 8ad5cbaa7..5c683c86d 100644 --- a/app/views/changeset/_comments.rss.builder +++ b/app/views/changeset/_comments.rss.builder @@ -1,17 +1,15 @@ comments.each do |comment| xml.item do xml.title t("changeset.rss.comment", :author => comment.author.display_name, :changeset_id => comment.changeset.id.to_s) - + xml.link url_for(:controller => "browse", :action => "changeset", :id => comment.changeset.id, :anchor => "c#{comment.id}", :only_path => false) xml.guid url_for(:controller => "browse", :action => "changeset", :id => comment.changeset.id, :anchor => "c#{comment.id}", :only_path => false) xml.description do - xml.cdata! render(:partial => "comment", :object => comment, :formats => [ :html ]) + xml.cdata! render(:partial => "comment", :object => comment, :formats => [:html]) end - if comment.author - xml.dc :creator, comment.author.display_name - end + xml.dc :creator, comment.author.display_name if comment.author xml.pubDate comment.created_at.to_s(:rfc822) end diff --git a/app/views/changeset/comments_feed.rss.builder b/app/views/changeset/comments_feed.rss.builder index 60a229a30..f6d304a4c 100644 --- a/app/views/changeset/comments_feed.rss.builder +++ b/app/views/changeset/comments_feed.rss.builder @@ -1,14 +1,13 @@ -xml.rss("version" => "2.0", +xml.rss("version" => "2.0", "xmlns:dc" => "http://purl.org/dc/elements/1.1/") do xml.channel do if @changeset - xml.title t('changeset.rss.title_particular', :changeset_id => @changeset.id) + xml.title t("changeset.rss.title_particular", :changeset_id => @changeset.id) else - xml.title t('changeset.rss.title_all') + xml.title t("changeset.rss.title_all") end xml.link url_for(:controller => "site", :action => "index", :only_path => false) xml << render(:partial => "comments", :object => @comments) end end - diff --git a/app/views/changeset/history.html.erb b/app/views/changeset/history.html.erb index 77118b4b4..7f08a40b3 100644 --- a/app/views/changeset/history.html.erb +++ b/app/views/changeset/history.html.erb @@ -5,18 +5,11 @@ <% end -%> <% - if params[:friends] and @user - set_title(t 'changeset.list.title_friend') - @heading = t 'changeset.list.title_friend' - elsif params[:nearby] and @user - set_title(t 'changeset.list.title_nearby') - @heading = t 'changeset.list.title_nearby' - elsif params[:display_name] - set_title(t 'changeset.list.title_user', :user => params[:display_name]) + set_title(changeset_list_title(params, @user)) + if params[:display_name] @heading = t('changeset.list.title_user', :user => link_to(params[:display_name], :controller => "user", :action => "view", :display_name => params[:display_name])).html_safe else - set_title(t 'changeset.list.title') - @heading = t 'changeset.list.title' + @heading = @title end %> diff --git a/app/views/changeset/list.atom.builder b/app/views/changeset/list.atom.builder index 619dc4a08..68b4a1985 100644 --- a/app/views/changeset/list.atom.builder +++ b/app/views/changeset/list.atom.builder @@ -1,20 +1,20 @@ atom_feed(:language => I18n.locale, :schema_date => 2009, - :id => url_for(params.merge({ :only_path => false })), - :root_url => url_for(params.merge({ :action => :list, :format => nil, :only_path => false })), + :id => url_for(params.merge(:only_path => false)), + :root_url => url_for(params.merge(:action => :list, :format => nil, :only_path => false)), "xmlns:georss" => "http://www.georss.org/georss") do |feed| - feed.title @title + feed.title changeset_list_title(params, @user) - feed.updated @edits.map {|e| [e.created_at, e.closed_at].max }.max - feed.icon "http://#{SERVER_URL}/favicon.ico" - feed.logo "http://#{SERVER_URL}/images/mag_map-rss2.0.png" + feed.updated @edits.map { |e| [e.created_at, e.closed_at].max }.max + feed.icon image_url("favicon.ico") + feed.logo image_url("mag_map-rss2.0.png") - feed.rights :type => 'xhtml' do |xhtml| + feed.rights :type => "xhtml" do |xhtml| xhtml.a :href => "http://creativecommons.org/licenses/by-sa/2.0/" do |a| - a.img :src => "http://#{SERVER_URL}/images/cc_button.png", :alt => "CC by-sa 2.0" + a.img :src => image_url("cc_button.png"), :alt => "CC by-sa 2.0" end end - for changeset in @edits + @edits.each do |changeset| feed.entry(changeset, :updated => changeset.closed_at, :id => changeset_url(changeset.id, :only_path => false)) do |entry| entry.link :rel => "alternate", :href => changeset_read_url(changeset, :only_path => false), @@ -23,20 +23,20 @@ atom_feed(:language => I18n.locale, :schema_date => 2009, :href => changeset_download_url(changeset, :only_path => false), :type => "application/osmChange+xml" - if !changeset.tags.empty? and changeset.tags.has_key? "comment" - entry.title t('browse.changeset.feed.title_comment', :id => h(changeset.id), :comment => h(changeset.tags['comment'])), :type => "html" + if !changeset.tags.empty? && changeset.tags.key?("comment") + entry.title t("browse.changeset.feed.title_comment", :id => h(changeset.id), :comment => h(changeset.tags["comment"])), :type => "html" else - entry.title t('browse.changeset.feed.title', :id => h(changeset.id)) + entry.title t("browse.changeset.feed.title", :id => h(changeset.id)) end if changeset.user.data_public? entry.author do |author| author.name changeset.user.display_name - author.uri url_for(:controller => 'user', :action => 'view', :display_name => changeset.user.display_name, :only_path => false) + author.uri url_for(:controller => "user", :action => "view", :display_name => changeset.user.display_name, :only_path => false) end end - feed.content :type => 'xhtml' do |xhtml| + feed.content :type => "xhtml" do |xhtml| xhtml.style "th { text-align: left } tr { vertical-align: top }" xhtml.table do |table| table.tr do |tr| diff --git a/app/views/changeset/timeout.atom.builder b/app/views/changeset/timeout.atom.builder index a4faeb34b..c878905e6 100644 --- a/app/views/changeset/timeout.atom.builder +++ b/app/views/changeset/timeout.atom.builder @@ -1,12 +1,12 @@ atom_feed(:language => I18n.locale, :schema_date => 2009, - :id => url_for(params.merge({ :only_path => false })), - :root_url => url_for(params.merge({ :only_path => false, :format => nil })), + :id => url_for(params.merge(:only_path => false)), + :root_url => url_for(params.merge(:only_path => false, :format => nil)), "xmlns:georss" => "http://www.georss.org/georss") do |feed| feed.title @title - feed.subtitle :type => 'xhtml' do |xhtml| + feed.subtitle :type => "xhtml" do |xhtml| xhtml.p do |p| - p << t('changeset.timeout.sorry') + p << t("changeset.timeout.sorry") end end end diff --git a/app/views/diary_entry/edit.html.erb b/app/views/diary_entry/edit.html.erb index 4021eaa4d..f29dc30ff 100644 --- a/app/views/diary_entry/edit.html.erb +++ b/app/views/diary_entry/edit.html.erb @@ -42,7 +42,10 @@ </div> </fieldset> - <%= submit_tag t('diary_entry.edit.save_button') %> - <%# TODO: button should say 'publish' or 'save changes' depending on new/edit state %> + <% if action_name == 'new' %> + <%= submit_tag t('diary_entry.new.publish_button') %> + <% else %> + <%= submit_tag t('diary_entry.edit.save_button') %> + <% end %> </div> <% end %> diff --git a/app/views/diary_entry/rss.rss.builder b/app/views/diary_entry/rss.rss.builder index 35f05028d..6ff2ed9f3 100644 --- a/app/views/diary_entry/rss.rss.builder +++ b/app/views/diary_entry/rss.rss.builder @@ -1,34 +1,35 @@ xml.instruct! -xml.rss("version" => "2.0", +xml.rss("version" => "2.0", + "xmlns:dc" => "http://purl.org/dc/elements/1.1/", "xmlns:geo" => "http://www.w3.org/2003/01/geo/wgs84_pos#", "xmlns:georss" => "http://www.georss.org/georss") do xml.channel do xml.title @title xml.description @description - xml.link url_for(:action => "list", :host => SERVER_URL) + xml.link url_for(:action => "list", :only_path => false) xml.image do - xml.url "http://www.openstreetmap.org/images/mag_map-rss2.0.png" - xml.title "OpenStreetMap" + xml.url image_url("mag_map-rss2.0.png") + xml.title @title xml.width "100" xml.height "100" - xml.link url_for(:action => "list", :host=> SERVER_URL) + xml.link url_for(:action => "list", :only_path => false) end - for entry in @entries + @entries.each do |entry| xml.item do - xml.title h(entry.title) - xml.link url_for(:action => "view", :id => entry.id, :display_name => entry.user.display_name, :host => SERVER_URL) - xml.guid url_for(:action => "view", :id => entry.id, :display_name => entry.user.display_name, :host => SERVER_URL) + xml.title entry.title + xml.link url_for(:action => "view", :id => entry.id, :display_name => entry.user.display_name, :only_path => false) + xml.guid url_for(:action => "view", :id => entry.id, :display_name => entry.user.display_name, :only_path => false) xml.description entry.body.to_html - xml.author entry.user.display_name + xml.dc :creator, entry.user.display_name xml.pubDate entry.created_at.to_s(:rfc822) - xml.comments url_for(:action => "view", :id => entry.id, :display_name => entry.user.display_name, :anchor => "comments", :host => SERVER_URL) - - if entry.latitude and entry.longitude + xml.comments url_for(:action => "view", :id => entry.id, :display_name => entry.user.display_name, :anchor => "comments", :only_path => false) + + if entry.latitude && entry.longitude xml.geo :lat, entry.latitude.to_s xml.geo :long, entry.longitude.to_s - xml.georss :point, "#{entry.latitude.to_s} #{entry.longitude.to_s}" + xml.georss :point, "#{entry.latitude} #{entry.longitude}" end end end diff --git a/app/views/diary_entry/view.html.erb b/app/views/diary_entry/view.html.erb index d12942a7b..6a2a21abc 100644 --- a/app/views/diary_entry/view.html.erb +++ b/app/views/diary_entry/view.html.erb @@ -21,6 +21,11 @@ <%= richtext_area :diary_comment, :body, :cols => 80, :rows => 15 %> <%= submit_tag t('diary_entry.view.save_button') %> <% end %> + <% if @user and @entry.subscribers.exists?(@user.id) %> + <div class="diary-subscribe-buttons"><%= link_to t('javascripts.changesets.show.unsubscribe'), diary_entry_unsubscribe_path(:display_name => @entry.user.display_name, :id => @entry.id), :method => :post, :class => :button %></div> + <% elsif @user %> + <div class="diary-subscribe-buttons"><%= link_to t('javascripts.changesets.show.subscribe'), diary_entry_subscribe_path(:display_name => @entry.user.display_name, :id => @entry.id), :method => :post, :class => :button %></div> + <% end %> <% end %> <%= if_not_logged_in(:div) do %> diff --git a/app/views/layouts/_banner.html.erb b/app/views/layouts/_banner.html.erb new file mode 100644 index 000000000..bd0c90227 --- /dev/null +++ b/app/views/layouts/_banner.html.erb @@ -0,0 +1,4 @@ +<% unless (banner = next_banner()).nil? %> +<%= link_to (image_tag banner[:img], :alt => banner[:alt], :title => banner[:alt]), banner[:link] %> +<div class="close-wrap" id="<%= banner_cookie(banner[:id]) %>"><span class="icon close"></span></div> +<% end %> diff --git a/app/views/layouts/_flash.html.erb b/app/views/layouts/_flash.html.erb index 5a4288c4d..8b04dac91 100644 --- a/app/views/layouts/_flash.html.erb +++ b/app/views/layouts/_flash.html.erb @@ -1,20 +1,29 @@ <% if flash[:error] %> <div class="flash error"> - <%= image_tag("notice.png", :class => "small_icon", :border => 0) %> - <div class="message"><%= raw flash[:error] %></div> + <picture> + <source srcset="<%= image_path "notice.svg" %>" type="image/svg+xml"></source> + <%= image_tag("notice.png", :srcset => image_path("notice.svg"), :class => "small_icon", :border => 0) %> + </picture> + <div class="message"><%= flash[:error] %></div> </div> <% end %> <% if flash[:warning] %> <div class="flash warning"> - <%= image_tag("notice.png", :class => "small_icon", :border => 0) %> - <div class="message"><%= raw flash[:warning] %></div> + <picture> + <source srcset="<%= image_path "notice.svg" %>" type="image/svg+xml"></source> + <%= image_tag("notice.png", :srcset => image_path("notice.svg"), :class => "small_icon", :border => 0) %> + </picture> + <div class="message"><%= flash[:warning] %></div> </div> <% end %> <% if flash[:notice] %> <div class="flash notice"> - <%= image_tag("notice.png", :class => "small_icon", :border => 0) %> - <div class="message"><%= raw flash[:notice] %></div> + <picture> + <source srcset="<%= image_path "notice.svg" %>" type="image/svg+xml"></source> + <%= image_tag("notice.png", :srcset => image_path("notice.svg"), :class => "small_icon", :border => 0) %> + </picture> + <div class="message"><%= flash[:notice] %></div> </div> <% end %> diff --git a/app/views/layouts/_head.html.erb b/app/views/layouts/_head.html.erb index ee23358ce..8830a8692 100644 --- a/app/views/layouts/_head.html.erb +++ b/app/views/layouts/_head.html.erb @@ -18,6 +18,7 @@ <%= favicon_link_tag "favicon-96x96.png", :rel => "icon", :sizes => "96x96", :type => "image/png" %> <%= favicon_link_tag "android-chrome-192x192.png", :rel => "icon", :sizes => "192x192", :type => "image/png" %> <%= favicon_link_tag "favicon-16x16.png", :rel => "icon", :sizes => "16x16", :type => "image/png" %> + <%= tag("link", { :rel => "mask-icon", :href => asset_path("tag-icon.svg"), :color => "#7ebc6f" }) %> <%= tag("link", { :rel => "manifest", :href => asset_path("manifest.json") }) %> <%= tag("meta", { :name => "msapplication-config", :content => asset_path("browserconfig.xml") }) %> <%= tag("meta", { :name => "msapplication-TileColor", :content => "#00a300" }) %> @@ -26,7 +27,7 @@ <%= tag("link", { :rel => "publisher", :href => "https://plus.google.com/111953119785824514010" }) %> <%= tag("link", { :rel => "search", :type => "application/opensearchdescription+xml", :title => "OpenStreetMap Search", :href => asset_path("osm.xml") }) %> <%= tag("meta", { :name => "description", :content => "OpenStreetMap is the free wiki world map." }) %> - <%= tag("meta", :property => "og:image", :content => image_path("osm_logo.png")) %> + <%= opengraph_tags(@title) %> <% if flash[:piwik_goal] -%> <%= tag("meta", :name => "piwik-goal", :content => flash[:piwik_goal]) %> <% end -%> diff --git a/app/views/layouts/_header.html.erb b/app/views/layouts/_header.html.erb index 09a75d891..a8811c6c9 100644 --- a/app/views/layouts/_header.html.erb +++ b/app/views/layouts/_header.html.erb @@ -1,7 +1,10 @@ <header class="closed"> <h1> <a href="<%= root_path %>" class="geolink"> - <%= image_tag "osm_logo.png", :alt => t('layouts.logo.alt_text'), :class => 'logo' %> + <picture> + <source srcset="<%= image_path "osm_logo.svg" %>" type="image/svg+xml"></source> + <%= image_tag "osm_logo.png", :srcset => image_path("osm_logo.svg"), :alt => t('layouts.logo.alt_text'), :class => 'logo' %> + </picture> <%= t 'layouts.project_name.h1' %> </a> </h1> @@ -45,9 +48,9 @@ <ul class="dropdown-menu"> <li class="<%= current_page_class(traces_path) %>"><%= link_to t('layouts.gps_traces'), traces_path %></li> <li class="<%= current_page_class(diary_path) %>"><%= link_to t('layouts.user_diaries'), diary_path %></li> + <li class="<%= current_page_class(copyright_path) %>"><%= link_to t('layouts.copyright'), copyright_path %></li> <li class="<%= current_page_class(help_path) %>"><%= link_to t('layouts.help'), help_path %></li> <li class="<%= current_page_class(about_path) %>"><%= link_to t('layouts.about'), about_path %></li> - <li class="<%= current_page_class(copyright_path) %>"><%= link_to t('layouts.copyright'), copyright_path %></li> </ul> </li> </ul> diff --git a/app/views/layouts/map.html.erb b/app/views/layouts/map.html.erb index cb2fd0e07..6607bf7a5 100644 --- a/app/views/layouts/map.html.erb +++ b/app/views/layouts/map.html.erb @@ -46,12 +46,17 @@ <% unless @user %> <div class="welcome"> - <h2><a><span class="icon close"></span></a><%= t 'layouts.intro_header' %></h2> + <h2><%= t 'layouts.intro_header' %></h2> + <div class="close-wrap"><span class="icon close"></span></div> <p><%= t 'layouts.intro_text' %></p> <a class="button learn-more" href="<%= about_path %>"><%= t('layouts.learn_more') %></a> <a class="button sign-up" href="<%= user_new_path %>"><%= t('layouts.start_mapping') %></a> </div> <% end %> + + <div id="banner"> + <%= render :partial => "layouts/banner" %> + </div> </div> <noscript> diff --git a/app/views/layouts/notifier.html.erb b/app/views/layouts/notifier.html.erb new file mode 100644 index 000000000..dd041cca5 --- /dev/null +++ b/app/views/layouts/notifier.html.erb @@ -0,0 +1,46 @@ +<html> + <head> + <meta charset="UTF-8"></meta> + </head> + <body style="padding: 0; margin: 0; font-size: 14px; font-family: 'Helvetica Neue', Arial, sans-serif; color: #222"> + <table style="background-color: #eee; width: 100%"> + <tr> + <td style="text-align: center"> + <table style="width: 600px; color: #222; margin-left: auto; margin-right: auto"> + <tr> + <td style="width: 30px; padding: 10px 10px 10px 0px"> + <a href="<%= @root_url %>" target="_blank"> + <%= image_tag attachments["logo.png"].url, alt: "OpenStreetMap logo", title: "OpenStreetMap", height: "30", width: "30", border: "0" %> + </a> + </td> + <td style="padding: 10px 0px"> + <a href="<%= @root_url %>" target="_blank" style="text-decoration: none; color: #000"> + <h1 style="font-size: 18px; font-weight: 600; margin: 0; text-align: left">OpenStreetMap</h1> + </a> + </td> + </tr> + <tr> + <td colspan="2"> + <table style="background-color: #fff; color: #222; border: solid 1px #ccc; border-collapse: separate"> + <tr> + <td style="text-align: left; padding: 0px 15px 5px 15px"> + <%= raw style_message(yield) %> + </td> + </tr> + </table> + </td> + </tr> + </table> + </td> + </tr> + <tr> + <td style="text-align: center; font-size: 11px"> + <%= yield :footer %> + <p style="margin-bottom: 10px"> + <a href="<%= @root_url %>" target="_blank" style="color: #222">OpenStreetMap</a> + </p> + </td> + </tr> + </table> + </body> +</html> diff --git a/app/views/layouts/site.rss.builder b/app/views/layouts/site.rss.builder deleted file mode 100644 index 90198e8f4..000000000 --- a/app/views/layouts/site.rss.builder +++ /dev/null @@ -1,2 +0,0 @@ -xml.instruct! -xml << yield diff --git a/app/views/notes/_note.gpx.builder b/app/views/notes/_note.gpx.builder index a55ed88f6..f6bb39d27 100644 --- a/app/views/notes/_note.gpx.builder +++ b/app/views/notes/_note.gpx.builder @@ -1,9 +1,14 @@ xml.wpt("lon" => note.lon, "lat" => note.lat) do + xml.time note.created_at.to_s(:iso8601) + xml.name t("browse.note.title", :id => note.id) + xml.desc do - xml.cdata! render(:partial => "description", :object => note, :formats => [ :html ]) + xml.cdata! render(:partial => "description", :object => note, :formats => [:html]) end - xml.extension do + xml.link("href" => browse_note_url(note, :only_path => false)) + + xml.extensions do xml.id note.id xml.url note_url(note, :format => params[:format]) @@ -17,8 +22,6 @@ xml.wpt("lon" => note.lon, "lat" => note.lat) do xml.date_created note.created_at xml.status note.status - if note.closed? - xml.date_closed note.closed_at - end + xml.date_closed note.closed_at if note.closed? end end diff --git a/app/views/notes/_note.json.jsonify b/app/views/notes/_note.json.jsonify index 74ff5ccec..5e3ac518e 100644 --- a/app/views/notes/_note.json.jsonify +++ b/app/views/notes/_note.json.jsonify @@ -26,7 +26,7 @@ json.properties do if comment.author json.uid comment.author.id json.user comment.author.display_name - json.user_url user_url(:display_name => comment.author.display_name, :host => SERVER_URL) + json.user_url user_url(:display_name => comment.author.display_name, :only_path => false) end json.action comment.event diff --git a/app/views/notes/_note.rss.builder b/app/views/notes/_note.rss.builder index a095b636d..038ca564b 100644 --- a/app/views/notes/_note.rss.builder +++ b/app/views/notes/_note.rss.builder @@ -2,20 +2,18 @@ xml.item do location = describe_location(note.lat, note.lon, 14, locale) if note.closed? - xml.title t('note.rss.closed', :place => location) + xml.title t("note.rss.closed", :place => location) elsif note.comments.length > 1 - xml.title t('note.rss.commented', :place => location) + xml.title t("note.rss.commented", :place => location) else - xml.title t('note.rss.opened', :place => location) + xml.title t("note.rss.opened", :place => location) end xml.link browse_note_url(note) xml.guid note_url(note) - xml.description render(:partial => "description", :object => note, :formats => [ :html ]) + xml.description render(:partial => "description", :object => note, :formats => [:html]) - if note.author - xml.author note.author.display_name - end + xml.dc :creator, note.author.display_name if note.author xml.pubDate note.updated_at.to_s(:rfc822) xml.geo :lat, note.lat diff --git a/app/views/notes/_note.xml.builder b/app/views/notes/_note.xml.builder index ee9570205..adb4e6a52 100644 --- a/app/views/notes/_note.xml.builder +++ b/app/views/notes/_note.xml.builder @@ -12,9 +12,7 @@ xml.note("lon" => note.lon, "lat" => note.lat) do xml.date_created note.created_at xml.status note.status - if note.closed? - xml.date_closed note.closed_at - end + xml.date_closed note.closed_at if note.closed? xml.comments do note.comments.each do |comment| @@ -24,7 +22,7 @@ xml.note("lon" => note.lon, "lat" => note.lat) do if comment.author xml.uid comment.author.id xml.user comment.author.display_name - xml.user_url user_url(:display_name => comment.author.display_name, :host => SERVER_URL) + xml.user_url user_url(:display_name => comment.author.display_name, :only_path => false) end xml.action comment.event diff --git a/app/views/notes/feed.rss.builder b/app/views/notes/feed.rss.builder index e663d94a6..708192e5f 100644 --- a/app/views/notes/feed.rss.builder +++ b/app/views/notes/feed.rss.builder @@ -1,12 +1,12 @@ xml.instruct! -xml.rss("version" => "2.0", +xml.rss("version" => "2.0", "xmlns:dc" => "http://purl.org/dc/elements/1.1/", "xmlns:geo" => "http://www.w3.org/2003/01/geo/wgs84_pos#", "xmlns:georss" => "http://www.georss.org/georss") do xml.channel do - xml.title t('note.rss.title') - xml.description t('note.rss.description_area', :min_lat => @min_lat, :min_lon => @min_lon, :max_lat => @max_lat, :max_lon => @max_lon ) + xml.title t("note.rss.title") + xml.description t("note.rss.description_area", :min_lat => @min_lat, :min_lon => @min_lon, :max_lat => @max_lat, :max_lon => @max_lon) xml.link url_for(:controller => "site", :action => "index", :only_path => false) @comments.each do |comment| @@ -14,17 +14,15 @@ xml.rss("version" => "2.0", xml.item do xml.title t("note.rss.#{comment.event}", :place => location) - + xml.link url_for(:controller => "browse", :action => "note", :id => comment.note.id, :anchor => "c#{comment.id}", :only_path => false) xml.guid url_for(:controller => "browse", :action => "note", :id => comment.note.id, :anchor => "c#{comment.id}", :only_path => false) xml.description do - xml.cdata! render(:partial => "entry", :object => comment, :formats => [ :html ]) + xml.cdata! render(:partial => "entry", :object => comment, :formats => [:html]) end - if comment.author - xml.dc :creator, comment.author.display_name - end + xml.dc :creator, comment.author.display_name if comment.author xml.pubDate comment.created_at.to_s(:rfc822) xml.geo :lat, comment.note.lat diff --git a/app/views/notes/index.gpx.builder b/app/views/notes/index.gpx.builder index 5a7f34dbd..58da357da 100644 --- a/app/views/notes/index.gpx.builder +++ b/app/views/notes/index.gpx.builder @@ -1,6 +1,8 @@ xml.instruct! -xml.gpx("version" => "1.1", +xml.gpx("version" => "1.1", + "creator" => "OpenStreetMap.org", + "xmlns" => "http://www.topografix.com/GPX/1/1", "xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance", "xsi:schemaLocation" => "http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd") do xml << (render(:partial => "note", :collection => @notes) || "") diff --git a/app/views/notes/index.rss.builder b/app/views/notes/index.rss.builder index 53806f502..e912b9921 100644 --- a/app/views/notes/index.rss.builder +++ b/app/views/notes/index.rss.builder @@ -1,11 +1,12 @@ xml.instruct! -xml.rss("version" => "2.0", +xml.rss("version" => "2.0", + "xmlns:dc" => "http://purl.org/dc/elements/1.1/", "xmlns:geo" => "http://www.w3.org/2003/01/geo/wgs84_pos#", "xmlns:georss" => "http://www.georss.org/georss") do xml.channel do - xml.title t('note.rss.title') - xml.description t('note.rss.description_area', :min_lat => @min_lat, :min_lon => @min_lon, :max_lat => @max_lat, :max_lon => @max_lon ) + xml.title t("note.rss.title") + xml.description t("note.rss.description_area", :min_lat => @min_lat, :min_lon => @min_lon, :max_lat => @max_lat, :max_lon => @max_lon) xml.link url_for(:controller => "site", :action => "index", :only_path => false) xml << (render(:partial => "note", :collection => @notes) || "") diff --git a/app/views/notes/show.gpx.builder b/app/views/notes/show.gpx.builder index e54d77246..f87ff4dd9 100644 --- a/app/views/notes/show.gpx.builder +++ b/app/views/notes/show.gpx.builder @@ -1,6 +1,8 @@ xml.instruct! -xml.gpx("version" => "1.1", +xml.gpx("version" => "1.1", + "creator" => "OpenStreetMap.org", + "xmlns" => "http://www.topografix.com/GPX/1/1", "xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance", "xsi:schemaLocation" => "http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd") do xml << render(:partial => "note", :object => @note) diff --git a/app/views/notes/show.rss.builder b/app/views/notes/show.rss.builder index e566ff02e..62ccbe8a9 100644 --- a/app/views/notes/show.rss.builder +++ b/app/views/notes/show.rss.builder @@ -1,11 +1,11 @@ xml.instruct! -xml.rss("version" => "2.0", +xml.rss("version" => "2.0", "xmlns:geo" => "http://www.w3.org/2003/01/geo/wgs84_pos#", "xmlns:georss" => "http://www.georss.org/georss") do xml.channel do - xml.title t('note.rss.title') - xml.description t('note.rss.description_item', :id => @note.id) + xml.title t("note.rss.title") + xml.description t("note.rss.description_item", :id => @note.id) xml.link url_for(:controller => "site", :action => "index", :only_path => false) xml << render(:partial => "note", :object => @note) diff --git a/app/views/notifier/_gpx_description.html.erb b/app/views/notifier/_gpx_description.html.erb index 282579919..8d44336c9 100644 --- a/app/views/notifier/_gpx_description.html.erb +++ b/app/views/notifier/_gpx_description.html.erb @@ -1,14 +1,12 @@ -<%= t'notifier.gpx_notification.greeting' %> - <%= t'notifier.gpx_notification.your_gpx_file' %> - - <%= @trace_name %> - +<strong><%= @trace_name %></strong> <%= t'notifier.gpx_notification.with_description' %> - - <%= @trace_description %> +<em><%= @trace_description %></em> <% if @trace_tags.length>0 %> -<%= t'notifier.gpx_notification.and_the_tags' %> -<% @trace_tags.each do |tag| %> - <%= tag.tag.rstrip %><% end %><% else %> -<%= t'notifier.gpx_notification.and_no_tags' %><% end %> + <%= t'notifier.gpx_notification.and_the_tags' %> + <em><% @trace_tags.each do |tag| %> + <%= tag.tag.rstrip %> + <% end %></em> +<% else %> + <%= t'notifier.gpx_notification.and_no_tags' %> +<% end %> diff --git a/app/views/notifier/_message_body.html.erb b/app/views/notifier/_message_body.html.erb new file mode 100644 index 000000000..d86d44133 --- /dev/null +++ b/app/views/notifier/_message_body.html.erb @@ -0,0 +1,21 @@ +<table style="font-size: 15px; font-style: italic; margin: 15px 0px; background-color: #eee; width: 520px"> + <tr> + <td style="width: 50px; vertical-align: top; padding: 15px"> + <%= link_to( + image_tag( + attachments["avatar.png"].url, + alt: @author, + title: @author, + width: 50, + height: 50, + border: 0 + ), + user_url(@author, :host => SERVER_URL), + :target => "_blank" + ) %> + </td> + <td style="text-align: left; vertical-align: top; padding-right: 10px"> + <%= body %> + </td> + </tr> +</table> diff --git a/app/views/notifier/changeset_comment_notification.html.erb b/app/views/notifier/changeset_comment_notification.html.erb index b7646a886..c2b552ed5 100644 --- a/app/views/notifier/changeset_comment_notification.html.erb +++ b/app/views/notifier/changeset_comment_notification.html.erb @@ -1,20 +1,26 @@ -<p><%= t 'notifier.changeset_comment_notification.greeting' %></p> - <p> <% if @owner %> - <%= t "notifier.changeset_comment_notification.commented.your_changeset", :commenter => @commenter, :time => @time %> + <%= raw t "notifier.changeset_comment_notification.commented.your_changeset", :commenter => link_to_user(@commenter), :time => @time %> <% else %> - <%= t "notifier.changeset_comment_notification.commented.commented_changeset", :commenter => @commenter, :time => @time, :changeset_author => @changeset_author %> + <%= raw t "notifier.changeset_comment_notification.commented.commented_changeset", :commenter => link_to_user(@commenter), :time => @time, :changeset_author => @changeset_author %> <% end %> <% if @changeset_comment %> - <%= t "notifier.changeset_comment_notification.commented.partial_changeset_with_comment", :changeset_comment => @changeset_comment %> + <%= raw t "notifier.changeset_comment_notification.commented.partial_changeset_with_comment", :changeset_comment => content_tag("em", @changeset_comment) %> <% else %> <%= t "notifier.changeset_comment_notification.commented.partial_changeset_without_comment" %> <% end %> </p> -== -<%= @comment.to_html %> -== +<%= message_body do %> + <%= @comment.to_html %> +<% end %> + +<p> + <%= raw t 'notifier.changeset_comment_notification.details', :url => link_to(@changeset_url, @changeset_url, :style => "white-space: nowrap") %> +</p> -<p><%= raw t 'notifier.changeset_comment_notification.details', :url => link_to(@changeset_url, @changeset_url) %></p> +<% content_for :footer do %> + <p> + <%= raw t 'notifier.changeset_comment_notification.unsubscribe', :url => link_to(@changeset_url, @changeset_url, :style => "color: #222; white-space: nowrap") %> + </p> +<% end %> diff --git a/app/views/notifier/changeset_comment_notification.text.erb b/app/views/notifier/changeset_comment_notification.text.erb index 44a3c1216..5da6feddc 100644 --- a/app/views/notifier/changeset_comment_notification.text.erb +++ b/app/views/notifier/changeset_comment_notification.text.erb @@ -16,3 +16,5 @@ == <%= t 'notifier.changeset_comment_notification.details', :url => @changeset_url %> + +<%= t 'notifier.changeset_comment_notification.unsubscribe', :url => @changeset_url %> diff --git a/app/views/notifier/diary_comment_notification.html.erb b/app/views/notifier/diary_comment_notification.html.erb index b47900a63..73bfe9a33 100644 --- a/app/views/notifier/diary_comment_notification.html.erb +++ b/app/views/notifier/diary_comment_notification.html.erb @@ -1,9 +1,18 @@ -<p><%= t'notifier.diary_comment_notification.hi', :to_user => @to_user %></p> +<p> + <%= t'notifier.diary_comment_notification.hi', :to_user => @to_user %> +</p> +<p> + <%= raw t'notifier.diary_comment_notification.header', :from_user => link_to_user(@from_user), :subject => content_tag("em", @title) %> +</p> -<p><%= raw t'notifier.diary_comment_notification.header', :from_user => link_to(@from_user, :host => SERVER_URL, :controller => :user, :action => :view, :display_name => @from_user), :subject => @title %></p> +<%= message_body do %> + <%= @text.to_html %> +<% end %> -== -<%= @text.to_html %> -== - -<p><%= raw t'notifier.diary_comment_notification.footer', :readurl => link_to(@readurl, @readurl), :commenturl => link_to(@commenturl, @commenturl), :replyurl => link_to(@replyurl, @replyurl) %></p> +<% content_for :footer do %> + <p><%= raw t'notifier.diary_comment_notification.footer', + :readurl => link_to(@readurl, @readurl) + tag(:br), + :commenturl => link_to(@commenturl, @commenturl) + tag(:br), + :replyurl => link_to(@replyurl, @replyurl) + %></p> +<% end %> diff --git a/app/views/notifier/email_confirm.html.erb b/app/views/notifier/email_confirm.html.erb index 5b7c74d7f..5d8f49d3d 100644 --- a/app/views/notifier/email_confirm.html.erb +++ b/app/views/notifier/email_confirm.html.erb @@ -4,4 +4,4 @@ <p><%= t 'notifier.email_confirm_html.click_the_link' %></p> -<p><a href="<%= @url %>"><%= @url %></a></p> +<p><a href="<%= @url %>" style="white-space: nowrap"><%= @url %></a></p> diff --git a/app/views/notifier/friend_notification.html.erb b/app/views/notifier/friend_notification.html.erb index 181b2b825..cfea97195 100644 --- a/app/views/notifier/friend_notification.html.erb +++ b/app/views/notifier/friend_notification.html.erb @@ -1,7 +1,9 @@ <p><%= t 'notifier.friend_notification.had_added_you', :user => @friend.befriender.display_name %></p> -<p><%= raw t 'notifier.friend_notification.see_their_profile', :userurl => link_to(@viewurl, @viewurl) %></p> +<%= message_body do %> + <p><%= raw t 'notifier.friend_notification.see_their_profile', :userurl => link_to(@viewurl, @viewurl) %></p> -<% unless @friend.befriendee.is_friends_with?(@friend.befriender) -%> -<p><%= raw t 'notifier.friend_notification.befriend_them', :befriendurl => link_to(@friendurl, @friendurl) %></p> -<% end -%> + <% unless @friend.befriendee.is_friends_with?(@friend.befriender) -%> + <p><%= raw t 'notifier.friend_notification.befriend_them', :befriendurl => link_to(@friendurl, @friendurl) %></p> + <% end -%> +<% end %> diff --git a/app/views/notifier/gpx_failure.html.erb b/app/views/notifier/gpx_failure.html.erb index f59aa3dbb..dace18522 100644 --- a/app/views/notifier/gpx_failure.html.erb +++ b/app/views/notifier/gpx_failure.html.erb @@ -1,9 +1,16 @@ -<%= render :partial => "gpx_description" %> -<%= t'notifier.gpx_notification.failure.failed_to_import' %> +<p><%= t'notifier.gpx_notification.greeting' %></p> - <%= @error %> +<p> + <%= render :partial => "gpx_description" %> + <%= t'notifier.gpx_notification.failure.failed_to_import' %> +</p> -<%= t'notifier.gpx_notification.failure.more_info_1' %> -<%= t'notifier.gpx_notification.failure.more_info_2' %> +<blockquote> + <%= @error %> +</blockquote> +<p> + <%= t'notifier.gpx_notification.failure.more_info_1' %> + <%= t'notifier.gpx_notification.failure.more_info_2' %> <%= t'notifier.gpx_notification.failure.import_failures_url' %> +</p> diff --git a/app/views/notifier/gpx_success.html.erb b/app/views/notifier/gpx_success.html.erb index 1983fe71c..d298bd70a 100644 --- a/app/views/notifier/gpx_success.html.erb +++ b/app/views/notifier/gpx_success.html.erb @@ -1,2 +1,6 @@ -<%= render :partial => "gpx_description" %> -<%= t'notifier.gpx_notification.success.loaded_successfully', :trace_points => @trace_points, :possible_points => @possible_points %> +<p><%= t'notifier.gpx_notification.greeting' %></p> + +<p> + <%= render :partial => "gpx_description" %> + <%= t'notifier.gpx_notification.success.loaded_successfully', :trace_points => @trace_points, :possible_points => @possible_points %> +</p> diff --git a/app/views/notifier/message_notification.html.erb b/app/views/notifier/message_notification.html.erb index 19704251d..97a352a49 100644 --- a/app/views/notifier/message_notification.html.erb +++ b/app/views/notifier/message_notification.html.erb @@ -1,9 +1,22 @@ -<p><%= t'notifier.message_notification.hi', :to_user => @to_user %></p> +<p> + <%= t'notifier.message_notification.hi', :to_user => @to_user %> +</p> +<p> + <%= raw t'notifier.message_notification.header', + :from_user => link_to_user(@from_user), + :subject => content_tag("em", @title) + %> +</p> -<p><%= raw t'notifier.message_notification.header', :from_user => link_to(@from_user, :host => SERVER_URL, :controller => :user, :action => :view, :display_name => @from_user), :subject => @title %></p> +<%= message_body do %> + <%= @text.to_html %> +<% end %> -== -<%= @text.to_html %> -== - -<p><%= t'notifier.message_notification.footer_html', :readurl => link_to(@readurl, @readurl), :replyurl => link_to(@replyurl, @replyurl) %></p> +<% content_for :footer do %> + <p> + <%= t'notifier.message_notification.footer_html', + :readurl => link_to(@readurl, @readurl) + tag(:br), + :replyurl => link_to(@replyurl, @replyurl) + %> + </p> +<% end %> diff --git a/app/views/notifier/note_comment_notification.html.erb b/app/views/notifier/note_comment_notification.html.erb index d82723bbb..909bffaa6 100644 --- a/app/views/notifier/note_comment_notification.html.erb +++ b/app/views/notifier/note_comment_notification.html.erb @@ -1,13 +1,15 @@ <p><%= t 'notifier.note_comment_notification.greeting' %></p> <% if @owner %> -<p><%= t "notifier.note_comment_notification.#{@event}.your_note", :commenter => @commenter, :place => @place %></p> + <p><%= raw t "notifier.note_comment_notification.#{@event}.your_note", :commenter => link_to_user(@commenter), :place => @place %></p> <% else %> -<p><%= t "notifier.note_comment_notification.#{@event}.commented_note", :commenter => @commenter, :place => @place %></p> + <p><%= raw t "notifier.note_comment_notification.#{@event}.commented_note", :commenter => link_to_user(@commenter), :place => @place %></p> <% end %> -== -<%= @comment.to_html %> -== +<% unless @comment.empty? %> + <%= message_body do %> + <%= @comment.to_html %> + <% end %> +<% end %> <p><%= raw t 'notifier.note_comment_notification.details', :url => link_to(@noteurl, @noteurl) %></p> diff --git a/app/views/notifier/note_comment_notification.text.erb b/app/views/notifier/note_comment_notification.text.erb index c8a967450..5924c8a9d 100644 --- a/app/views/notifier/note_comment_notification.text.erb +++ b/app/views/notifier/note_comment_notification.text.erb @@ -6,8 +6,10 @@ <%= t "notifier.note_comment_notification.#{@event}.commented_note", :commenter => @commenter, :place => @place %> <% end %> +<% unless @comment.empty? %> == <%= @comment.to_text %> == +<% end %> <%= t 'notifier.note_comment_notification.details', :url => @noteurl %> diff --git a/app/views/notifier/signup_confirm.html.erb b/app/views/notifier/signup_confirm.html.erb index 814deee91..41b2ceb49 100644 --- a/app/views/notifier/signup_confirm.html.erb +++ b/app/views/notifier/signup_confirm.html.erb @@ -4,6 +4,6 @@ <p><%= t("notifier.signup_confirm.confirm") %></p> -<p><%= link_to @url, @url %></p> +<p><%= link_to @url, @url, :style => "white-space: nowrap" %></p> <p><%= t("notifier.signup_confirm.welcome") %></p> diff --git a/app/views/oauth/authorize.html.erb b/app/views/oauth/authorize.html.erb index d8feeed26..565d13808 100644 --- a/app/views/oauth/authorize.html.erb +++ b/app/views/oauth/authorize.html.erb @@ -15,5 +15,5 @@ <li><%= check_box_tag perm.to_s, "yes", @token.read_attribute(perm) %><%= t "oauth.oauthorize.#{perm}" %></li> <% end %> </ul> - <p><%= submit_tag %></p> + <p><%= submit_tag t("oauth.oauthorize.grant_access") %></p> <% end %> diff --git a/app/views/site/_id.html.erb b/app/views/site/_id.html.erb index a6f42e43c..d93ee091e 100644 --- a/app/views/site/_id.html.erb +++ b/app/views/site/_id.html.erb @@ -1,6 +1,6 @@ <% if defined? ID_KEY %> <div id="map"> - <iframe frameBorder="0" id="id-embed" class="id-embed"></iframe> + <iframe frameBorder="0" id="id-embed" class="id-embed" allowfullscreen></iframe> </div> <script> var params = {}; @@ -10,13 +10,13 @@ params.id = mapParams.object.type[0] + mapParams.object.id; mapParams = OSM.parseHash(location.hash); if (mapParams.center) { - params.map = mapParams.zoom + '/' + mapParams.center.lng + '/' + mapParams.center.lat; + params.map = mapParams.zoom + '/' + mapParams.center.lat + '/' + mapParams.center.lng; } } else { <% if @lat && @lon -%> - params.map = '16/<%= @lon %>/<%= @lat %>'; + params.map = '16/<%= @lat %>/<%= @lon %>'; <% else -%> - params.map = (mapParams.zoom || 17) + '/' + mapParams.lon + '/' + mapParams.lat; + params.map = (mapParams.zoom || 17) + '/' + mapParams.lat + '/' + mapParams.lon; <% end -%> } @@ -25,10 +25,12 @@ if (hashParams.background) { params.background = hashParams.background; } - if (hashParams.comment) { params.comment = hashParams.comment; } + if (hashParams.offset) { + params.offset = hashParams.offset; + } <% if params[:gpx] -%> params.gpx = '<%= trace_data_url(params[:gpx], :format => :xml) %>'; diff --git a/app/views/site/_potlatch2.html.erb b/app/views/site/_potlatch2.html.erb index 3aeafa9cf..1c203b2fb 100644 --- a/app/views/site/_potlatch2.html.erb +++ b/app/views/site/_potlatch2.html.erb @@ -10,7 +10,7 @@ <script type="text/javascript">alert("<%= t 'site.edit.potlatch2_not_configured' %>")</script> <% end %> -<% locale = select_locale(Potlatch2::LOCALES.keys).to_s %> +<% locale = Locale.list(Potlatch2::LOCALES.keys).preferred(preferred_languages).to_s %> <script type="text/javascript" defer="defer"> var changesaved=true; diff --git a/app/views/site/export.html.erb b/app/views/site/export.html.erb index 6bf336535..9ac03e70d 100644 --- a/app/views/site/export.html.erb +++ b/app/views/site/export.html.erb @@ -47,7 +47,7 @@ <dt><a href="http://download.geofabrik.de/"><%= t'export.start.too_large.geofabrik.title' %></a></dt> <dd><%= t'export.start.too_large.geofabrik.description' %></dd> - <dt><a href="https://mapzen.com/metro-extracts/"><%= t'export.start.too_large.metro.title' %></a></dt> + <dt><a href="https://mapzen.com/data/metro-extracts/"><%= t'export.start.too_large.metro.title' %></a></dt> <dd><%= t'export.start.too_large.metro.description' %></dd> <dt><a href="http://wiki.openstreetmap.org/wiki/Download"><%= t'export.start.too_large.other.title' %></a></dt> diff --git a/app/views/site/id.html.erb b/app/views/site/id.html.erb index 075e70b74..d1ac6b02f 100644 --- a/app/views/site/id.html.erb +++ b/app/views/site/id.html.erb @@ -10,25 +10,22 @@ <body> <div id='id-container'></div> <script> - if (typeof iD == 'undefined') { + if (typeof iD == 'undefined' || !iD.Detect().support) { document.getElementById('id-container').innerHTML = 'This editor is supported ' + - 'in Firefox, Chrome, Safari, Opera, and Internet Explorer 9 and above. ' + + 'in Firefox, Chrome, Safari, Opera, Edge, and Internet Explorer 11. ' + 'Please upgrade your browser or use Potlatch 2 to edit the map.'; document.getElementById('id-container').className = 'unsupported'; } else { - <% locale = select_locale(ID::LOCALES).to_s %> + <% locale = ID::LOCALES.preferred(preferred_languages).to_s %> - var id = iD() - .presets(iD.data.presets) - .imagery(iD.data.imagery) - .taginfo(iD.taginfo()) + var id = iD.Context() .embed(true) - .assetPath("/iD/") <%# Cant use asset_path('iD/') in production. %> + .assetPath("iD/") .assetMap(<%= assets("iD").to_json.html_safe %>) .locale("<%= locale %>", "<%= asset_path("iD/locales/#{locale}.json") %>") .preauth({ <% token = @user.access_token(ID_KEY) %> - url: "<%= request.protocol + request.host_with_port %>", + urlroot: "<%= request.protocol + request.host_with_port %>", oauth_consumer_key: "<%= token.client_application.key %>", oauth_secret: "<%= token.client_application.secret %>", oauth_token: "<%= token.token %>", @@ -36,6 +33,7 @@ }); id.map().on('move.embed', parent.$.throttle(250, function() { + if (id.inIntro()) return; var zoom = ~~id.map().zoom(), center = id.map().center(), llz = { lon: center[0], lat: center[1], zoom: zoom }; @@ -63,8 +61,7 @@ }, 0); }); - d3.select('#id-container') - .call(id.ui()); + id.ui()(document.getElementById("id-container")); } </script> </body> diff --git a/app/views/site/key.html.erb b/app/views/site/key.html.erb index d401b4c34..039c9a51c 100644 --- a/app/views/site/key.html.erb +++ b/app/views/site/key.html.erb @@ -1,6 +1,6 @@ <div id="mapkey"> <table class="mapkey-table"> - <% YAML.load_file("#{Rails.root}/config/key.yml").each do |name,data| %> + <% YAML.load_file(Rails.root.join("config", "key.yml")).each do |name,data| %> <% data.each do |entry| %> <tr class="mapkey-table-entry" data-layer="<%= name %>" data-zoom-min="<%= entry['min_zoom'] %>" data-zoom-max="<%= entry['max_zoom'] %>"> <td class="mapkey-table-key"> diff --git a/app/views/trace/georss.rss.builder b/app/views/trace/georss.rss.builder index 0b2e26d11..8470e85cb 100644 --- a/app/views/trace/georss.rss.builder +++ b/app/views/trace/georss.rss.builder @@ -1,6 +1,6 @@ xml.instruct! -xml.rss("version" => "2.0", +xml.rss("version" => "2.0", "xmlns:dc" => "http://purl.org/dc/elements/1.1/", "xmlns:geo" => "http://www.w3.org/2003/01/geo/wgs84_pos#", "xmlns:georss" => "http://www.georss.org/georss") do @@ -10,7 +10,7 @@ xml.rss("version" => "2.0", xml.link url_for(:controller => :trace, :action => :list, :only_path => false) xml.image do - xml.url image_path("mag_map-rss2.0.png") + xml.url image_url("mag_map-rss2.0.png") xml.title t("trace.georss.title") xml.width 100 xml.height 100 @@ -25,14 +25,14 @@ xml.rss("version" => "2.0", xml.guid url_for(:controller => :trace, :action => :view, :id => trace.id, :display_name => trace.user.display_name, :only_path => false) xml.description do - xml.cdata! render(:partial => "description", :object => trace, :formats => [ :html ]) + xml.cdata! render(:partial => "description", :object => trace, :formats => [:html]) end xml.dc :creator, trace.user.display_name xml.pubDate trace.timestamp.to_s(:rfc822) - if trace.latitude and trace.longitude + if trace.latitude && trace.longitude xml.geo :lat, trace.latitude xml.geo :long, trace.longitude xml.georss :point, "#{trace.latitude} #{trace.longitude}" diff --git a/app/views/user/_auth_association.html.erb b/app/views/user/_auth_association.html.erb new file mode 100644 index 000000000..abddf19d3 --- /dev/null +++ b/app/views/user/_auth_association.html.erb @@ -0,0 +1,3 @@ +<p><%= t "user.auth_association.heading" %></p> +<p><%= t "user.auth_association.option_1" %></p> +<p><%= t "user.auth_association.option_2" %></p> diff --git a/app/views/user/api_read.builder b/app/views/user/api_read.builder index e97695420..7136b9f58 100644 --- a/app/views/user/api_read.builder +++ b/app/views/user/api_read.builder @@ -3,16 +3,14 @@ xml.osm("version" => API_VERSION, "generator" => GENERATOR) do xml.tag! "user", :id => @this_user.id, :display_name => @this_user.display_name, :account_created => @this_user.creation_time.xmlschema do - if @this_user.description - xml.tag! "description", @this_user.description - end + xml.tag! "description", @this_user.description if @this_user.description if @user && @user == @this_user - xml.tag! "contributor-terms", :agreed => !!@this_user.terms_agreed, - :pd => !!@this_user.consider_pd + xml.tag! "contributor-terms", :agreed => @this_user.terms_agreed.present?, + :pd => @this_user.consider_pd else - xml.tag! "contributor-terms", :agreed => !!@this_user.terms_agreed + xml.tag! "contributor-terms", :agreed => @this_user.terms_agreed.present? end - if @this_user.image.file? or @this_user.image_use_gravatar + if @this_user.image.file? || @this_user.image_use_gravatar xml.tag! "img", :href => user_image_url(@this_user, :size => 256) end xml.tag! "roles" do @@ -31,7 +29,7 @@ xml.osm("version" => API_VERSION, "generator" => GENERATOR) do end end if @user && @user == @this_user - if @this_user.home_lat and @this_user.home_lon + if @this_user.home_lat && @this_user.home_lon xml.tag! "home", :lat => @this_user.home_lat, :lon => @this_user.home_lon, :zoom => @this_user.home_zoom diff --git a/app/views/user/blocked.html.erb b/app/views/user/blocked.html.erb index f175fe18a..93b4972d5 100644 --- a/app/views/user/blocked.html.erb +++ b/app/views/user/blocked.html.erb @@ -1,7 +1,10 @@ <% content_for :heading do %> - <h1><%= t 'user.new.heading' %></h1> + <h1><%= t 'user.new.title' %></h1> + <div class='header-illustration new-user-main'></div> + <div class='header-illustration new-user-arm'></div> <% end %> -<p><%= t 'user.new.no_auto_account_create' %></p> - -<p><%= raw t 'user.new.contact_webmaster' %></p> +<div class="message"> + <h1><%= t 'user.new.no_auto_account_create' %></h1> + <h2><%= raw t 'user.new.contact_webmaster', :webmaster => "mailto:#{SUPPORT_EMAIL}" %></h2> +</div> diff --git a/app/views/user/login.html.erb b/app/views/user/login.html.erb index ded03318f..26bb80895 100644 --- a/app/views/user/login.html.erb +++ b/app/views/user/login.html.erb @@ -1,8 +1,12 @@ -<div id="login_login"> +<% content_for :head do %> + <%= javascript_include_tag "login" %> +<% end %> + <% content_for :heading do %> <h1><%= t 'user.login.heading' %></h1> <% end %> +<div id="login_login"> <%= form_tag({ :action => "login" }, { :id => "login_form" }) do %> <%= hidden_field_tag('referer', h(params[:referer])) %> @@ -29,7 +33,7 @@ </fieldset> <fieldset> - <%= check_box_tag "remember_me", "yes", false, :tabindex => 3 %> + <%= check_box_tag "remember_me", "yes", params[:remember_me] == "yes", :tabindex => 3 %> <label for="remember_me" class="standard-label"> <%= t 'user.login.remember' %> </label> @@ -51,6 +55,12 @@ <% if defined?(WINDOWSLIVE_AUTH_ID) -%> <li><%= auth_button "windowslive", "windowslive" %></li> <% end -%> + <% if defined?(GITHUB_AUTH_ID) -%> + <li><%= auth_button "github", "github" %></li> + <% end -%> + <% if defined?(WIKIPEDIA_AUTH_ID) -%> + <li><%= auth_button "wikipedia", "wikipedia" %></li> + <% end -%> <li><%= auth_button "yahoo", "openid", :openid_url => "yahoo.com" %></li> <li><%= auth_button "wordpress", "openid", :openid_url => "wordpress.com" %></li> <li><%= auth_button "aol", "openid", :openid_url => "aol.com" %></li> @@ -76,22 +86,3 @@ <% end %> </div> - -<script type="text/javascript"> -$(document).ready(function() { - // Preserve location hash in referer - if (window.location.hash) { - $('#referer').val($('#referer').val() + window.location.hash); - } - - $("#openid_open_url").click(function() { - $("#openid_url").val("http://"); - $("#login_auth_buttons").hide(); - $("#login_openid_url").show(); - $("#login_openid_submit").show(); - }); - - $("#login_openid_url").hide(); - $("#login_openid_submit").hide(); -}); -</script> diff --git a/app/views/user/suspended.html.erb b/app/views/user/suspended.html.erb index 674f8bcbb..22d85e166 100644 --- a/app/views/user/suspended.html.erb +++ b/app/views/user/suspended.html.erb @@ -4,4 +4,4 @@ <h1><%= t "user.suspended.heading" %></h1> <% end %> -<%= raw t "user.suspended.body", :webmaster => link_to(t("user.suspended.webmaster"), "mailto:webmaster@openstreetmap.org") %> +<%= raw t "user.suspended.body", :webmaster => link_to(t("user.suspended.webmaster"), "mailto:#{SUPPORT_EMAIL}") %> diff --git a/config/application.rb b/config/application.rb index 142e436c5..5ff166beb 100644 --- a/config/application.rb +++ b/config/application.rb @@ -56,5 +56,8 @@ module OpenStreetMap config.logstasher.logger_path = LOGSTASH_PATH config.logstasher.log_controller_parameters = true end + + # Configure image optimisation + config.assets.image_optim = YAML.load_file(Rails.root.join("config", "image_optim.yml")) end end diff --git a/config/banners.yml b/config/banners.yml new file mode 100644 index 000000000..3b151afba --- /dev/null +++ b/config/banners.yml @@ -0,0 +1,20 @@ +sotmasia2016: + id: sotmasia2016 + alt: State of the Map Asia 2016 + link: http://stateofthemap.asia/ + img: banners/sotmasia-2016.jpg + enddate: 2016-oct-01 + +donate2016: + id: donate2016 + alt: OpenStreetMap Funding Drive 2016 + link: https://donate.openstreetmap.org/ + img: banners/donate-2016.jpg + enddate: 2016-oct-31 + +sotmlatam2016: + id: sotmlatam2016 + alt: State of the Map Latam 2016 + link: http://state.osmlatam.org/ + img: banners/sotmlatam-2016.jpg + enddate: 2016-nov-25 diff --git a/config/example.application.yml b/config/example.application.yml index 7435fea89..6319be709 100644 --- a/config/example.application.yml +++ b/config/example.application.yml @@ -6,8 +6,10 @@ defaults: &defaults copyright_owner: "OpenStreetMap and contributors" attribution_url: "http://www.openstreetmap.org/copyright" license_url: "http://opendatacommons.org/licenses/odbl/1-0/" + # Support email address + support_email: support@openstreetmap.org # Sender addresses for emails - email_from: "OpenStreetMap <webmaster@openstreetmap.org>" + email_from: "OpenStreetMap <support@openstreetmap.org>" email_return_path: "bounces@openstreetmap.org" # API version api_version: "0.6" @@ -85,11 +87,16 @@ defaults: &defaults require_terms_agreed: false # Imagery to return in capabilities as blacklisted imagery_blacklist: - - ".*\\.googleapis\\.com/.*" - - ".*\\.google\\.com/.*" - - ".*\\.google\\.ru/.*" + # Current Google imagery URLs have google or googleapis in the domain + # with a vt or kh endpoint, and x, y and z query parameters + - ".*\\.google(apis)?\\..*/(vt|kh)[\\?/].*([xyz]=.*){3}.*" # URL of Overpass instance to use for feature queries overpass_url: "//overpass-api.de/api/interpreter" + # Routing endpoints + graphhopper_url: "//graphhopper.com/api/1/route" + mapquest_directions_url: "//open.mapquestapi.com/directions/v2/route" + mapzen_valhalla_url: "//valhalla.mapzen.com/route" + osrm_url: "//router.project-osrm.org/route/v1/driving/" # External authentication credentials #google_auth_id: "" #google_auth_secret: "" @@ -98,6 +105,18 @@ defaults: &defaults #facebook_auth_secret: "" #windowslive_auth_id: "" #windowslive_auth_secret: "" + #github_auth_id: "" + #github_auth_secret: "" + #wikipedia_auth_id: "" + #wikipedia_auth_secret: "" + # MapQuest authentication details + #mapquest_key: "" + # Mapzen authentication details + #mapzen_valhalla_key: "" + # Thunderforest authentication details + #thunderforest_key: "" + # Key for generating TOTP tokens + #totp_key: "" development: <<: *defaults @@ -117,3 +136,7 @@ test: facebook_auth_secret: "dummy" windowslive_auth_id: "dummy" windowslive_auth_secret: "dummy" + github_auth_id: "dummy" + github_auth_secret: "dummy" + wikipedia_auth_id: "dummy" + wikipedia_auth_secret: "dummy" diff --git a/config/image_optim.yml b/config/image_optim.yml new file mode 100644 index 000000000..094e4083b --- /dev/null +++ b/config/image_optim.yml @@ -0,0 +1,12 @@ +skip_missing_workers: true +pngout: false +pngcrush: false +advpng: false +optipng: false +pngquant: false +jhead: false +jpegoptim: false +gifsicle: false +jpegtran: false +svgo: + disable_plugins: ["cleanupIDs"] diff --git a/config/initializers/abstract_adapter.rb b/config/initializers/abstract_adapter.rb index 5613e0d00..6bb5d10c0 100644 --- a/config/initializers/abstract_adapter.rb +++ b/config/initializers/abstract_adapter.rb @@ -4,25 +4,17 @@ if defined?(ActiveRecord::ConnectionAdaptors::AbstractAdapter) class AbstractAdapter protected - alias_method :old_log, :log + alias old_log log - def log(sql, name) - if block_given? - old_log(sql, name) do - yield - end + def translate_exception_class_with_timeout(e, sql) + if e.is_a?(Timeout::Error) || e.is_a?(OSM::APITimeoutError) + e else - old_log(sql, name) - end - rescue ActiveRecord::StatementInvalid => ex - if ex.message =~ /^OSM::APITimeoutError: / - raise OSM::APITimeoutError.new - elsif ex.message =~ /^Timeout::Error: / - raise Timeout::Error.new("time's up!") - else - raise + translate_exception_class_without_timeout(e, sql) end end + + alias_method_chain :translate_exception_class, :timeout end end end diff --git a/config/initializers/assets.rb b/config/initializers/assets.rb index bb647b6a7..5e07cc098 100644 --- a/config/initializers/assets.rb +++ b/config/initializers/assets.rb @@ -4,28 +4,31 @@ Rails.application.config.assets.version = "1.0" # Location of manifest file. -Rails.application.config.assets.manifest = Rails.root.join("tmp/manifest.json") +Rails.application.config.assets.manifest = Rails.root.join("tmp", "manifest.json") # Add additional assets to the asset load path -# Rails.application.config.assets.paths << Emoji.images_path +Rails.application.config.assets.paths << Rails.root.join("config") # Precompile additional assets. # application.js, application.css, and all non-JS/CSS in app/assets folder are already added. -Rails.application.config.assets.precompile += %w( index.js browse.js welcome.js fixthemap.js ) -Rails.application.config.assets.precompile += %w( user.js diary_entry.js ) -Rails.application.config.assets.precompile += %w( screen-ltr.css print-ltr.css ) -Rails.application.config.assets.precompile += %w( screen-rtl.css print-rtl.css ) -Rails.application.config.assets.precompile += %w( leaflet-all.css leaflet.ie.css ) -Rails.application.config.assets.precompile += %w( id.js id.css ) -Rails.application.config.assets.precompile += %w( embed.js embed.css ) -Rails.application.config.assets.precompile += %w( html5shiv.js ) -Rails.application.config.assets.precompile += %w( images/marker-*.png img/*-handle.png ) -Rails.application.config.assets.precompile += %w( swfobject.js expressInstall.swf ) -Rails.application.config.assets.precompile += %w( potlatch2.swf ) -Rails.application.config.assets.precompile += %w( potlatch2/assets.zip ) -Rails.application.config.assets.precompile += %w( potlatch2/FontLibrary.swf ) -Rails.application.config.assets.precompile += %w( potlatch2/locales/*.swf ) -Rails.application.config.assets.precompile += %w( help/introduction.* ) -Rails.application.config.assets.precompile += %w( iD/img/*.svg iD/img/*.png iD/img/*.gif ) -Rails.application.config.assets.precompile += %w( iD/img/pattern/*.png ) -Rails.application.config.assets.precompile += %w( iD/locales/*.json ) +Rails.application.config.assets.precompile += %w(index.js browse.js welcome.js fixthemap.js) +Rails.application.config.assets.precompile += %w(user.js login.js diary_entry.js) +Rails.application.config.assets.precompile += %w(screen-ltr.css print-ltr.css) +Rails.application.config.assets.precompile += %w(screen-rtl.css print-rtl.css) +Rails.application.config.assets.precompile += %w(leaflet-all.css leaflet.ie.css) +Rails.application.config.assets.precompile += %w(id.js id.css) +Rails.application.config.assets.precompile += %w(embed.js embed.css) +Rails.application.config.assets.precompile += %w(html5shiv.js) +Rails.application.config.assets.precompile += %w(images/marker-*.png img/*-handle.png) +Rails.application.config.assets.precompile += %w(swfobject.js expressInstall.swf) +Rails.application.config.assets.precompile += %w(potlatch2.swf) +Rails.application.config.assets.precompile += %w(potlatch2/assets.zip) +Rails.application.config.assets.precompile += %w(potlatch2/FontLibrary.swf) +Rails.application.config.assets.precompile += %w(potlatch2/locales/*.swf) +Rails.application.config.assets.precompile += %w(help/introduction.*) +Rails.application.config.assets.precompile += %w(iD/img/*.svg iD/img/*.png iD/img/*.gif) +Rails.application.config.assets.precompile += %w(iD/img/pattern/*.png) +Rails.application.config.assets.precompile += %w(iD/locales/*.json) +Rails.application.config.assets.precompile += %w(iD/traffico/stylesheets/traffico.css) +Rails.application.config.assets.precompile += %w(iD/traffico/fonts/traffico_*) +Rails.application.config.assets.precompile += %w(iD/traffico/string-maps/*.json) diff --git a/config/initializers/banners.rb b/config/initializers/banners.rb new file mode 100644 index 000000000..5c83c045d --- /dev/null +++ b/config/initializers/banners.rb @@ -0,0 +1,5 @@ +begin + BANNERS = YAML.load_file(Rails.root.join("config", "banners.yml")).deep_symbolize_keys +rescue + BANNERS = {}.freeze +end diff --git a/config/initializers/http_accept_language.rb b/config/initializers/http_accept_language.rb deleted file mode 100644 index 2e5c92df1..000000000 --- a/config/initializers/http_accept_language.rb +++ /dev/null @@ -1,14 +0,0 @@ -# -# Monkey patch HttpAcceptLanguage pending integration of -# https://github.com/iain/http_accept_language/pull/6 -# -module HttpAcceptLanguage - class Parser - def compatible_language_from(available_languages) - user_preferred_languages.find do |x| - available_languages.find { |y| y.to_s == x.to_s } || - available_languages.find { |y| y.to_s =~ /^#{Regexp.escape(x.to_s)}-/ } - end - end - end -end diff --git a/config/initializers/i18n.rb b/config/initializers/i18n.rb index 91efa2557..a94618c7e 100644 --- a/config/initializers/i18n.rb +++ b/config/initializers/i18n.rb @@ -8,6 +8,16 @@ module I18n ex.entry[:other] end end + + class Simple + def store_translations_with_normalisation(locale, data, options = {}) + locale = I18n::Locale::Tag::Rfc4646.tag(locale).to_s + + store_translations_without_normalisation(locale, data, options) + end + + alias_method_chain :store_translations, :normalisation + end end module JS diff --git a/config/initializers/konacha.rb b/config/initializers/konacha.rb index f97b19aaf..f0145f5e0 100644 --- a/config/initializers/konacha.rb +++ b/config/initializers/konacha.rb @@ -1,5 +1,7 @@ -Konacha.configure do |config| - require "capybara/poltergeist" - config.spec_dir = "test/javascripts" - config.driver = :poltergeist -end if defined?(Konacha) +if defined?(Konacha) + Konacha.configure do |config| + require "capybara/poltergeist" + config.spec_dir = "test/javascripts" + config.driver = :poltergeist + end +end diff --git a/config/initializers/libxml.rb b/config/initializers/libxml.rb index e0e659f12..07f79660f 100644 --- a/config/initializers/libxml.rb +++ b/config/initializers/libxml.rb @@ -1,5 +1,5 @@ # This is required otherwise libxml writes out memory errors to # the standard output and exits uncleanly LibXML::XML::Error.set_handler do |message| - fail message + raise message end diff --git a/config/initializers/omniauth.rb b/config/initializers/omniauth.rb index a654f2aa2..d117707be 100644 --- a/config/initializers/omniauth.rb +++ b/config/initializers/omniauth.rb @@ -1,7 +1,7 @@ require "openid/fetchers" require "openid/util" -CA_BUNDLES = ["/etc/ssl/certs/ca-certificates.crt", "/etc/pki/tls/cert.pem"] +CA_BUNDLES = ["/etc/ssl/certs/ca-certificates.crt", "/etc/pki/tls/cert.pem"].freeze OpenID.fetcher.ca_file = CA_BUNDLES.find { |f| File.exist?(f) } OpenID::Util.logger = Rails.logger @@ -16,13 +16,15 @@ if defined?(MEMCACHE_SERVERS) else require "openid/store/filesystem" - openid_store = OpenID::Store::Filesystem.new(Rails.root.join("tmp/openids")) + openid_store = OpenID::Store::Filesystem.new(Rails.root.join("tmp", "openids")) end openid_options = { :name => "openid", :store => openid_store } google_options = { :name => "google", :scope => "email", :access_type => "online" } facebook_options = { :name => "facebook", :scope => "email" } windowslive_options = { :name => "windowslive", :scope => "wl.signin,wl.emails" } +github_options = { :name => "github", :scope => "user:email" } +wikipedia_options = { :name => "wikipedia", :client_options => { :site => "https://meta.wikimedia.org" } } if defined?(GOOGLE_OPENID_REALM) google_options[:openid_realm] = GOOGLE_OPENID_REALM @@ -33,6 +35,8 @@ Rails.application.config.middleware.use OmniAuth::Builder do provider :google_oauth2, GOOGLE_AUTH_ID, GOOGLE_AUTH_SECRET, google_options if defined?(GOOGLE_AUTH_ID) provider :facebook, FACEBOOK_AUTH_ID, FACEBOOK_AUTH_SECRET, facebook_options if defined?(FACEBOOK_AUTH_ID) provider :windowslive, WINDOWSLIVE_AUTH_ID, WINDOWSLIVE_AUTH_SECRET, windowslive_options if defined?(WINDOWSLIVE_AUTH_ID) + provider :github, GITHUB_AUTH_ID, GITHUB_AUTH_SECRET, github_options if defined?(GITHUB_AUTH_ID) + provider :mediawiki, WIKIPEDIA_AUTH_ID, WIKIPEDIA_AUTH_SECRET, wikipedia_options if defined?(WIKIPEDIA_AUTH_ID) end # Pending fix for: https://github.com/intridea/omniauth/pull/795 diff --git a/config/initializers/paperclip.rb b/config/initializers/paperclip.rb index e27c46ea7..4db3166ae 100644 --- a/config/initializers/paperclip.rb +++ b/config/initializers/paperclip.rb @@ -6,7 +6,7 @@ module Paperclip url = super(style_name, options) if url =~ %r{^/assets/(.*)$} - asset_path($1) + asset_path(Regexp.last_match(1)) else url end diff --git a/config/initializers/r2.rb b/config/initializers/r2.rb index bad88e1ba..7fbb5c115 100644 --- a/config/initializers/r2.rb +++ b/config/initializers/r2.rb @@ -1,21 +1,16 @@ -class R2Template < Tilt::Template - self.default_mime_type = "text/css" +require "r2" - def self.engine_initialized? - defined? ::R2 - end - - def initialize_engine - require_template_library "r2" - end - - def prepare - @output = R2.r2(data) - end - - def evaluate(_scope, _locals, &_block) - @output +class R2ScssProcessor < Sprockets::ScssProcessor + def self.call(input) + output = super(input) + data = R2.r2(output[:data]) + output.delete(:map) + output.merge(:data => data) end end -Rails.application.assets.register_engine ".r2", R2Template +Rails.application.config.assets.configure do |env| + env.register_mime_type "text/r2+scss", :extensions => [".r2.scss"] + env.register_transformer "text/r2+scss", "text/css", R2ScssProcessor + env.register_preprocessor "text/r2+scss", Sprockets::DirectiveProcessor.new(:comments => ["//", ["/*", "*/"]]) +end diff --git a/config/initializers/streaming.rb b/config/initializers/streaming.rb index 3db2a55f9..0c27ba2e7 100644 --- a/config/initializers/streaming.rb +++ b/config/initializers/streaming.rb @@ -1,7 +1,7 @@ # Hack ActionController::DataStreaming to allow streaming from a file handle module ActionController module DataStreaming - alias_method :old_send_file, :send_file + alias old_send_file send_file def send_file(file, options = {}) if file.is_a?(File) || file.is_a?(Tempfile) diff --git a/config/initializers/uri_sanitizer.rb b/config/initializers/uri_sanitizer.rb new file mode 100644 index 000000000..7f3f3d06a --- /dev/null +++ b/config/initializers/uri_sanitizer.rb @@ -0,0 +1,2 @@ +# Add URI sanitizer to rack middleware +Rails.configuration.middleware.insert_before Rack::Runtime, Rack::URISanitizer diff --git a/config/initializers/wiki_pages.rb b/config/initializers/wiki_pages.rb index 0b6f7be2a..c679cd4e2 100644 --- a/config/initializers/wiki_pages.rb +++ b/config/initializers/wiki_pages.rb @@ -1 +1 @@ -WIKI_PAGES = YAML.load_file("#{Rails.root}/config/wiki_pages.yml") +WIKI_PAGES = YAML.load_file(Rails.root.join("config", "wiki_pages.yml")) diff --git a/config/key.yml b/config/key.yml index 8d632a177..4446fbe6e 100644 --- a/config/key.yml +++ b/config/key.yml @@ -1,11 +1,9 @@ mapnik: - { min_zoom: 0, max_zoom: 19, name: motorway, image: motorway.png } - - { min_zoom: 0, max_zoom: 11, name: trunk, image: trunk.png } - - { min_zoom: 12, max_zoom: 19, name: trunk, image: trunk12.png } - - { min_zoom: 7, max_zoom: 11, name: primary, image: primary.png } - - { min_zoom: 12, max_zoom: 19, name: primary, image: primary12.png } - - { min_zoom: 9, max_zoom: 11, name: secondary, image: secondary.png } - - { min_zoom: 12, max_zoom: 19, name: secondary, image: secondary12.png } + - { min_zoom: 0, max_zoom: 6, name: main_road, image: mainroad.png } + - { min_zoom: 7, max_zoom: 8, name: main_road, image: mainroad7.png } + - { min_zoom: 9, max_zoom: 11, name: main_road, image: mainroad9.png } + - { min_zoom: 12, max_zoom: 19, name: main_road, image: mainroad12.png } - { min_zoom: 13, max_zoom: 19, name: track, image: track.png } - { min_zoom: 13, max_zoom: 19, name: bridleway, image: bridleway.png } - { min_zoom: 13, max_zoom: 19, name: cycleway, image: cycleway.png } @@ -46,3 +44,29 @@ mapnik: - { min_zoom: 15, max_zoom: 19, name: private, image: private.png } - { min_zoom: 15, max_zoom: 19, name: destination, image: destination.png } - { min_zoom: 12, max_zoom: 19, name: construction, image: construction.png } +cyclemap: + - { min_zoom: 0, max_zoom: 11, name: motorway, image: motorway.png } + - { min_zoom: 12, max_zoom: 19, name: motorway, image: motorway12.png } + - { min_zoom: 0, max_zoom: 11, name: trunk, image: trunk.png } + - { min_zoom: 12, max_zoom: 19, name: trunk, image: trunk12.png } + - { min_zoom: 7, max_zoom: 11, name: primary, image: primary.png } + - { min_zoom: 12, max_zoom: 19, name: primary, image: primary12.png } + - { min_zoom: 9, max_zoom: 11, name: secondary, image: secondary.png } + - { min_zoom: 12, max_zoom: 19, name: secondary, image: secondary12.png } + - { min_zoom: 13, max_zoom: 19, name: track, image: track.png } + - { min_zoom: 8, max_zoom: 19, name: cycleway, image: cycleway.png } + - { min_zoom: 5, max_zoom: 12, name: cycleway_national, image: cycleway_national.png } + - { min_zoom: 13, max_zoom: 19, name: cycleway_national, image: cycleway_national13.png } + - { min_zoom: 5, max_zoom: 12, name: cycleway_regional, image: cycleway_regional.png } + - { min_zoom: 13, max_zoom: 19, name: cycleway_regional, image: cycleway_regional13.png } + - { min_zoom: 8, max_zoom: 12, name: cycleway_local, image: cycleway_local.png } + - { min_zoom: 13, max_zoom: 19, name: cycleway_local, image: cycleway_local13.png } + - { min_zoom: 13, max_zoom: 19, name: footway, image: footway.png } + - { min_zoom: 7, max_zoom: 13, name: rail, image: rail.png } + - { min_zoom: 14, max_zoom: 19, name: rail, image: rail14.png } + - { min_zoom: 9, max_zoom: 19, name: forest, image: forest.png } + - { min_zoom: 10, max_zoom: 19, name: common, image: common.png } + - { min_zoom: 7, max_zoom: 19, name: lake, image: lake.png } + - { min_zoom: 14, max_zoom: 19, name: bicycle_shop, image: bicycle_shop.png } + - { min_zoom: 14, max_zoom: 19, name: bicycle_parking, image: bicycle_parking.png } + - { min_zoom: 16, max_zoom: 19, name: toilets, image: toilets.png } diff --git a/config/lighttpd-host-blocks.sh b/config/lighttpd-host-blocks.sh deleted file mode 100644 index 3022e74db..000000000 --- a/config/lighttpd-host-blocks.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/sh - -if [ -d /etc/firewall ] -then - for ip in $(ls /etc/firewall) - do - echo "\$HTTP[\"remoteip\"] == \"$ip\" { url.access-deny = (\"\") }" - done -fi diff --git a/config/lighttpd.conf b/config/lighttpd.conf deleted file mode 100644 index e728c6716..000000000 --- a/config/lighttpd.conf +++ /dev/null @@ -1,281 +0,0 @@ -# -# Load the modules that we need -# -server.modules = ( - "mod_access", - "mod_accesslog", - "mod_cgi", - "mod_compress", - "mod_evasive", - "mod_expire", - "mod_fastcgi", - "mod_redirect", - "mod_status" -) - -# -# Basic server configuration -# -server.username = "www-data" -server.groupname = "www-data" -server.pid-file = "/var/run/lighttpd.pid" -server.max-fds = 8192 -server.reject-expect-100-with-417 = "disable" - -# -# Setup logging -# -accesslog.filename = "/var/log/lighttpd/access.log" -accesslog.format = "%h %V %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" \"%{Accept-Language}i\"" -server.errorlog = "/var/log/lighttpd/error.log" - -# -# Allow munin to monitor the server's status -# -$HTTP["remoteip"] == "128.40.168.98" { - status.config-url = "/server-config" - status.status-url = "/server-status" - status.statistics-url = "/server-statistics" -} - -# -# Pull in host blocks -# -include_shell "lighttpd-host-blocks.sh" - -# -# Block some troublesome robots -# -#$HTTP["useragent"] =~ "msnbot" { url.access-deny = ("") } -$HTTP["useragent"] =~ "Twiceler" { url.access-deny = ("") } -$HTTP["useragent"] =~ "Baiduspider" { url.access-deny = ("") } -$HTTP["useragent"] =~ "Sosospider+" { url.access-deny = ("") } -#$HTTP["useragent"] =~ "Yahoo! Slurp" { url.access-deny = ("") } -$HTTP["useragent"] =~ "Yeti" { url.access-deny = ("") } -#$HTTP["useragent"] =~ "Googlebot" { url.access-deny = ("") } -$HTTP["useragent"] =~ "The Hare and the Hedgeho" { url.access-deny = ("") } - -# -# Block tilesAtHome -# -$HTTP["useragent"] =~ "tilesAtHome" { url.access-deny = ("") } - -# -# Block JOSM revisions 1722-1727 as they have a serious bug that causes -# lat/lon to be swapped (http://josm.openstreetmap.de/ticket/2804) -# -$HTTP["useragent"] =~ "^JOSM/[0-9]+\.[0-9]+ \(172[234567] " { - url.access-deny = ("") -} - -# -# Setup MIME type mapping -# -mimetype.assign = ( - ".css" => "text/css", - ".gif" => "image/gif", - ".html" => "text/html; charset=utf-8", - ".jpg" => "image/jpeg", - ".js" => "application/x-javascript", - ".png" => "image/png", - ".swf" => "application/x-shockwave-flash", - ".txt" => "text/plain", - ".xml" => "text/xml" -) - -# -# Force special MIME type for crossdomain.xml files -# -$HTTP["url"] =~ "/crossdomain\.xml$" { - mimetype.assign = ( ".xml" => "text/x-cross-domain-policy" ) -} - -# -# Enable compression of appropriate static content -# -compress.filetype = ( - "application/x-javascript", - "application/x-shockwave-flash", - "text/css", - "text/html", - "text/plain" -) - -# -# Set expiry for static content -# -expire.url = ( - "/export/embed.html" => "access 7 days", - "/images/" => "access 10 years", - "/javascripts/" => "access 10 years", - "/openlayers/" => "access 7 days", - "/stylesheets/" => "access 10 years" -) - -# -# Cache compressed content -# -compress.cache-dir = "/var/cache/lighttpd" - -# -# Redirect trac and wiki requests to the right places -# -url.redirect = ( - "^/trac/(.*)$" => "http://trac.openstreetmap.org/$1", - "^/wiki/(.*)$" => "http://wiki.openstreetmap.org/$1" -) - -# -# Redirect everything except www.openstreetmap.org and -# api.openstreetmap.org to www.openstreetmap.org -# -$HTTP["host"] =~ "^api\." { - $HTTP["host"] != "api.openstreetmap.org" { - url.redirect = ( "^(.*)$" => "http://api.openstreetmap.org$1" ) - } -} -else $HTTP["host"] != "www.openstreetmap.org" { - url.redirect = ( "^(.*)$" => "http://www.openstreetmap.org$1" ) -} - -# -# Run anything with a .pl iextension as a CGI script -# -cgi.assign = ( ".pl" => "/usr/bin/perl" ) - -# -# Serve static content from the rails public area ourselves -# -server.document-root = "/home/rails/public" - -# -# Send everything else to the appropriate FastCGI server -# -$HTTP["url"] =~ "^/trace/[0-9]+/data$" { - server.error-handler-404 = "/dispatch.bulkapi" -} -else $HTTP["url"] =~ "^/api/0\.6/map$" { - server.error-handler-404 = "/dispatch.map" -} -else $HTTP["url"] =~ "^/api/0\.6/(trackpoints|amf|amf/read|swf/trackpoints|changeset/[0-9]+/(upload|download))$" { - server.error-handler-404 = "/dispatch.bulkapi" -} -else $HTTP["url"] =~ "^/api/0\.6/.*/(full|history|search|ways)$" { - server.error-handler-404 = "/dispatch.bulkapi" -} -else $HTTP["url"] =~ "^/api/0\.6/" { - server.error-handler-404 = "/dispatch.api" -} -else $HTTP["url"] =~ "^/api/0\.[0-9]+/" { - url.access-deny = ("") -} -else $HTTP["url"] =~ "^/geocoder/(search|description)_geonames$" { - server.error-handler-404 = "/dispatch.geonames" -} -else $HTTP["url"] =~ "^/" { - server.error-handler-404 = "/dispatch.web" -} - -# -# Configure the FastCGI servers -# -fastcgi.server = ( - ".web" => ( - ( "host" => "127.0.0.1", "port" => 8000, "check-local" => "disable" ), - ( "host" => "127.0.0.1", "port" => 8001, "check-local" => "disable" ), - ( "host" => "127.0.0.1", "port" => 8002, "check-local" => "disable" ), - ( "host" => "127.0.0.1", "port" => 8003, "check-local" => "disable" ), - ( "host" => "127.0.0.1", "port" => 8004, "check-local" => "disable" ), - ( "host" => "127.0.0.1", "port" => 8005, "check-local" => "disable" ), - ( "host" => "127.0.0.1", "port" => 8006, "check-local" => "disable" ), - ( "host" => "127.0.0.1", "port" => 8007, "check-local" => "disable" ), - ( "host" => "127.0.0.1", "port" => 8008, "check-local" => "disable" ), - ( "host" => "127.0.0.1", "port" => 8009, "check-local" => "disable" ), - ( "host" => "127.0.0.1", "port" => 8010, "check-local" => "disable" ), - ( "host" => "127.0.0.1", "port" => 8011, "check-local" => "disable" ), - ( "host" => "127.0.0.1", "port" => 8012, "check-local" => "disable" ), - ( "host" => "127.0.0.1", "port" => 8013, "check-local" => "disable" ), - ( "host" => "127.0.0.1", "port" => 8014, "check-local" => "disable" ), - ( "host" => "127.0.0.1", "port" => 8015, "check-local" => "disable" ), - ( "host" => "127.0.0.1", "port" => 8016, "check-local" => "disable" ), - ( "host" => "127.0.0.1", "port" => 8017, "check-local" => "disable" ), - ( "host" => "127.0.0.1", "port" => 8018, "check-local" => "disable" ), - ( "host" => "127.0.0.1", "port" => 8019, "check-local" => "disable" ), - ( "host" => "127.0.0.1", "port" => 8020, "check-local" => "disable" ), - ( "host" => "127.0.0.1", "port" => 8021, "check-local" => "disable" ), - ( "host" => "127.0.0.1", "port" => 8022, "check-local" => "disable" ), - ( "host" => "127.0.0.1", "port" => 8023, "check-local" => "disable" ), - ( "host" => "127.0.0.1", "port" => 8024, "check-local" => "disable" ), - ( "host" => "127.0.0.1", "port" => 8025, "check-local" => "disable" ), - ( "host" => "127.0.0.1", "port" => 8026, "check-local" => "disable" ), - ( "host" => "127.0.0.1", "port" => 8027, "check-local" => "disable" ), - ( "host" => "127.0.0.1", "port" => 8028, "check-local" => "disable" ), - ( "host" => "127.0.0.1", "port" => 8029, "check-local" => "disable" ) - ), - ".geonames" => ( - ( "host" => "127.0.0.1", "port" => 8030, "check-local" => "disable" ), - ( "host" => "127.0.0.1", "port" => 8031, "check-local" => "disable" ), - ( "host" => "127.0.0.1", "port" => 8032, "check-local" => "disable" ), - ( "host" => "127.0.0.1", "port" => 8033, "check-local" => "disable" ) - ), - ".api" => ( - ( "host" => "127.0.0.1", "port" => 8034, "check-local" => "disable" ), - ( "host" => "127.0.0.1", "port" => 8035, "check-local" => "disable" ), - ( "host" => "127.0.0.1", "port" => 8036, "check-local" => "disable" ), - ( "host" => "127.0.0.1", "port" => 8037, "check-local" => "disable" ), - ( "host" => "127.0.0.1", "port" => 8038, "check-local" => "disable" ), - ( "host" => "127.0.0.1", "port" => 8039, "check-local" => "disable" ), - ( "host" => "127.0.0.1", "port" => 8040, "check-local" => "disable" ), - ( "host" => "127.0.0.1", "port" => 8041, "check-local" => "disable" ), - ( "host" => "127.0.0.1", "port" => 8042, "check-local" => "disable" ), - ( "host" => "127.0.0.1", "port" => 8043, "check-local" => "disable" ), - ( "host" => "127.0.0.1", "port" => 8044, "check-local" => "disable" ), - ( "host" => "127.0.0.1", "port" => 8045, "check-local" => "disable" ), - ( "host" => "127.0.0.1", "port" => 8046, "check-local" => "disable" ), - ( "host" => "127.0.0.1", "port" => 8047, "check-local" => "disable" ), - ( "host" => "127.0.0.1", "port" => 8048, "check-local" => "disable" ) - ), - ".bulkapi" => ( - ( "host" => "10.0.0.10", "port" => 8000, "check-local" => "disable" ), - ( "host" => "10.0.0.11", "port" => 8000, "check-local" => "disable" ), - ( "host" => "10.0.0.12", "port" => 8000, "check-local" => "disable" ), - ( "host" => "10.0.0.10", "port" => 8001, "check-local" => "disable" ), - ( "host" => "10.0.0.11", "port" => 8001, "check-local" => "disable" ), - ( "host" => "10.0.0.12", "port" => 8001, "check-local" => "disable" ), - ( "host" => "10.0.0.10", "port" => 8002, "check-local" => "disable" ), - ( "host" => "10.0.0.11", "port" => 8002, "check-local" => "disable" ), - ( "host" => "10.0.0.12", "port" => 8002, "check-local" => "disable" ), - ( "host" => "10.0.0.10", "port" => 8003, "check-local" => "disable" ), - ( "host" => "10.0.0.11", "port" => 8003, "check-local" => "disable" ), - ( "host" => "10.0.0.12", "port" => 8003, "check-local" => "disable" ), - ( "host" => "10.0.0.10", "port" => 8004, "check-local" => "disable" ), - ( "host" => "10.0.0.11", "port" => 8004, "check-local" => "disable" ), - ( "host" => "10.0.0.12", "port" => 8004, "check-local" => "disable" ), - ( "host" => "10.0.0.10", "port" => 8005, "check-local" => "disable" ), - ( "host" => "10.0.0.11", "port" => 8005, "check-local" => "disable" ), - ( "host" => "10.0.0.12", "port" => 8005, "check-local" => "disable" ), - ( "host" => "10.0.0.10", "port" => 8006, "check-local" => "disable" ), - ( "host" => "10.0.0.11", "port" => 8006, "check-local" => "disable" ), - ( "host" => "10.0.0.12", "port" => 8006, "check-local" => "disable" ), - ( "host" => "10.0.0.10", "port" => 8007, "check-local" => "disable" ), - ( "host" => "10.0.0.11", "port" => 8007, "check-local" => "disable" ), - ( "host" => "10.0.0.12", "port" => 8007, "check-local" => "disable" ), - ( "host" => "10.0.0.10", "port" => 8008, "check-local" => "disable" ), - ( "host" => "10.0.0.11", "port" => 8008, "check-local" => "disable" ), - ( "host" => "10.0.0.12", "port" => 8008, "check-local" => "disable" ), - ( "host" => "10.0.0.10", "port" => 8009, "check-local" => "disable" ), - ( "host" => "10.0.0.11", "port" => 8009, "check-local" => "disable" ), - ( "host" => "10.0.0.12", "port" => 8009, "check-local" => "disable" ), - ( "host" => "10.0.0.10", "port" => 8010, "check-local" => "disable" ), - ( "host" => "10.0.0.11", "port" => 8010, "check-local" => "disable" ), - ( "host" => "10.0.0.12", "port" => 8010, "check-local" => "disable" ), - ( "host" => "10.0.0.10", "port" => 8011, "check-local" => "disable" ), - ( "host" => "10.0.0.11", "port" => 8011, "check-local" => "disable" ), - ( "host" => "10.0.0.12", "port" => 8011, "check-local" => "disable" ) - ), - ".map" => ( - ( "host" => "10.0.0.10", "port" => 9000, "check-local" => "disable" ), - ( "host" => "10.0.0.11", "port" => 9000, "check-local" => "disable" ), - ( "host" => "10.0.0.12", "port" => 9000, "check-local" => "disable" ) - ) -) diff --git a/config/locales/af.yml b/config/locales/af.yml index 0e817943d..e66a0cdf8 100644 --- a/config/locales/af.yml +++ b/config/locales/af.yml @@ -13,8 +13,8 @@ af: friendly: '%e %B %Y om %H:%M' activerecord: models: - acl: Toegangsbeheer - changeset: Stel wysigings + acl: Toegangsbeheerlys + changeset: Wysigingstel country: Land diary_comment: Dagboekopmerking diary_entry: Dagboekinskrywing @@ -22,7 +22,7 @@ af: language: Taal message: Boodskap node: Node - notifier: Melding + notifier: Kennisgewer old_node: Ou Node session: Sessie trace: Spoor @@ -62,7 +62,11 @@ af: description: Beskrywing languages: Tale pass_crypt: Wagwoord + editor: + id: + name: iD browse: + version: Weergawe download_xml: Laai XML af view_history: Sien geskiedenis view_details: Sien detail @@ -74,17 +78,17 @@ af: type: node: Node way: Weg - relation: Relasie + relation: Verwantskap containing_relation: - entry: Relasie %{relation_name} - entry_role: Relasie %{relation_name} (as %{relation_role}) + entry: Verwantskap %{relation_name} + entry_role: Verwantskap %{relation_name} (as %{relation_role}) not_found: sorry: 'Jammer, %{type} #%{id} kan nie gevind word nie.' type: node: node way: weg - relation: relasie - changeset: Veranderingstel + relation: verwantskap + changeset: veranderingstel timeout: sorry: Jammer, dit het te lank geneem om data vir die %{type} met die id %{id} op te soek. @@ -99,7 +103,7 @@ af: changeset_paging_nav: showing_page: Bladsy %{page} next: Volgende » - previous: » Vorige + previous: « Vorige changeset: anonymous: Anoniem no_edits: (geen wysigings) @@ -136,7 +140,7 @@ af: view: title: '%{user} se dagboek | %{title}' user_title: Dagboek van %{user} - leave_a_comment: Los opmerking agter + leave_a_comment: Los 'n opmerking login_to_leave_a_comment: U moet eers %{login_link} alvorens u kommentaar kan lewer login: Meld aan @@ -148,7 +152,7 @@ af: nie. Kontroleer u spelling, of miskien is die skakel waarop u gekliek het verkeerd. diary_entry: - posted_by: Gepos deur %{link_user} op %{created} in die %{language_link} + posted_by: Gepos deur %{link_user} op %{created} in %{language_link} comment_link: Lewer kommentaar op hierdie bydrae reply_link: Antwoord op hierdie bydrae comment_count: @@ -188,9 +192,9 @@ af: export_details: OpenStreetMap se data is gelisensieer onder die <a href="http://creativecommons.org/licenses/by-sa/2.0/deed.af">Creative Commons Erkenning-Insgelyks Deel 2.0 lisensie</a>. options: Voorkeure - format: 'Formaat:' + format: Formaat scale: Skaal - max: max + max: maksimum image_size: 'Prentgrootte:' zoom: Zoom add_marker: Plaas 'n merker op die kaart @@ -315,7 +319,7 @@ af: cycleway: Fietspad emergency_access_point: Noodtoeganspunt footway: Voetpad - ford: Fort + ford: Drif motorway: Snelweg motorway_junction: Snelwegknooppunt path: Pad @@ -336,21 +340,21 @@ af: tertiary: Tersiêre pad track: Spoor trail: Wandelpad - trunk: Trokpad - trunk_link: Trokpad + trunk: Hoofroete + trunk_link: Hoofroete unclassified: Ongeklassifiseerde pad unsurfaced: Grondpad "yes": Straat historic: - archaeological_site: Argeologiese vindplaas + archaeological_site: Argeologiese werf battlefield: Slagveld - building: Gebou + building: Historiese gebou castle: Kasteel church: Kerk house: Huis icon: Ikoon manor: Landgoed - memorial: Herdenkingsmonument + memorial: Gedenkteken mine: Myn monument: Monument ruins: Ruïnes @@ -373,7 +377,7 @@ af: military: Militêre gebied mine: Myn quarry: Steengroewe - railway: Spoor + railway: Spoorweg reservoir: Reservoir residential: Woongebied retail: Kleinhandel @@ -433,7 +437,7 @@ af: country: Land county: Distrik farm: Plaas - hamlet: Gehug + hamlet: Dorpie house: Huis houses: Huise island: Eiland @@ -444,10 +448,10 @@ af: region: Streek sea: See state: Staat - subdivision: Deelgebied + subdivision: Onderverdeling suburb: Voorstad town: Dorp - unincorporated_area: Geïnkorporeerde Ruimte + unincorporated_area: Uitgesluite Ruimte village: Dorp railway: construction: Spoor in aanbou @@ -456,16 +460,16 @@ af: halt: Treinhalte historic_station: Historiese spoorwegstasie junction: Spoorwegkruising - level_crossing: Gelykvloerse kruising - monorail: Monorail - narrow_gauge: Smalspoor + level_crossing: Spooroorgang + monorail: Monospoor + narrow_gauge: Smalspoorweg platform: Spoorweg-platform - preserved: Historiese spoor + preserved: Historiese spoorweg station: Spoorwegstasie subway: Metrostasie - subway_entrance: Metroingang + subway_entrance: Ondergrondse spoorwegingang switch: Spoogwegpunte - tram_stop: Tramhalte + tram_stop: Tremhalte shop: art: Kunswinkel bakery: Bakkery @@ -502,7 +506,7 @@ af: grocery: Kruideniersware-winkel hairdresser: Haarkapper hardware: Hardwarewinkel - hifi: Hi-fi + hifi: Hi-Fi insurance: Versekering jewelry: Juwelierswinkel kiosk: Kioskwinkel @@ -516,7 +520,7 @@ af: optician: Oogkundige organic: Organiese koswinkel outdoor: Buitelug-winkel - pet: Dierewinkel + pet: Troeteldierwinkel photo: Fotowinkel salon: Skoonheidssalon shoes: Skoenwinkel @@ -537,7 +541,7 @@ af: caravan_site: Karavaanpark chalet: Chalet guest_house: Gastehuis - hostel: Hotel + hostel: Jeugherberg hotel: Hotel information: Inligting motel: Motel @@ -591,7 +595,7 @@ af: tag_line: Die vrye wiki-wêreldkaart intro_header: Welkom by OpenStreetMap! intro_text: OpenStreetMap is 'n kaart van die wêreld, geskep deur gewone mense. - Dis gratis onder 'n oop lisensie. + Dis gratis om te gebruik onder 'n oop lisensie. intro_2_create_account: Skep gebruikerrekening osm_read_only: Die OpenStreetMap-databasis kan op die oomblik slegs gelees word aangesien noodsaaklik onderhoud tans uitgevoer word. @@ -602,7 +606,7 @@ af: community: Gemeenskap foundation_title: Die OpenStreetMap-stigting make_a_donation: - title: Ondersteun OpenStreetMap met'n geldelike donasie + title: Ondersteun OpenStreetMap met 'n geldelike donasie text: Maak 'n donasie learn_more: Meer inligting more: Meer @@ -631,7 +635,7 @@ af: failure: more_info_2: 'hulle kan gevind word by:' signup_confirm: - subject: '[OpenStreetMap] Bevestig u e-posadres' + subject: '[OpenStreetMap] Welkom by OpenStreetMap' email_confirm: subject: '[OpenStreetMap] Bevestig u e-posadres' email_confirm_plain: @@ -643,7 +647,7 @@ af: click_the_link: As dit u is, kliek op die onderstaande skakel om die verandering te bevestig. lost_password: - subject: '[OpenStreetMap] Versoek nuwe wagwoord' + subject: '[OpenStreetMap] Versoek herstel van wagwoord' lost_password_plain: greeting: Hallo, click_the_link: As dit u is, kliek op die onderstaande skakel om die wagwoord @@ -654,7 +658,7 @@ af: inbox: title: Inboks my_inbox: My inboks - outbox: outboks + outbox: uitboks from: Vanaf subject: Onderwerp date: Datum @@ -678,7 +682,7 @@ af: title: Die boodskap bestaan nie heading: Die boodskap bestaan nie outbox: - title: Gestuur + title: Uitboks my_inbox: My %{inbox_link} inbox: inboks outbox: uitboks @@ -717,25 +721,24 @@ af: search: Soek get_directions_title: Kry aanwysings tussen twee punte where_am_i: Waar is ek? - submit_text: OK + submit_text: Soek key: table: entry: motorway: Snelweg - trunk: Trokpad + trunk: Hoofroete primary: Primêre pad secondary: Sekondêre pad unclassified: Ongeklassifiseerde pad - unsurfaced: Grondpad track: Spoor bridleway: Ruiterpad cycleway: Fietspad footway: Voetpad rail: Spoorweg - subway: Metro + subway: Ondergrondse spoorweg tram: - Ligte spoor - - tram + - trem cable: - Kabelkar - stoelhyser @@ -746,15 +749,14 @@ af: - Lughaweplatform - terminaal admin: Administratiewe grens - forest: Bos + forest: Woud wood: Bos golf: Gholfbaan park: Park resident: Woongebied - tourist: Toerisme-trekpleister common: - - weide - - weide + - Gemeen + - weiland retail: Winkelgebied industrial: Industriële gebied commercial: Kommersiële gebied @@ -763,7 +765,7 @@ af: - Meer - reservoir farm: Plaas - brownfield: Braakliggende terrein + brownfield: Braakveld terrein cemetery: Begraafplaas allotments: Volkstuine pitch: Sportveld @@ -778,10 +780,9 @@ af: summit: - Piek - piek - tunnel: Tonnel - bridge: Brug + tunnel: Strepieomhulsel = tonnel + bridge: Swartomhulsel = brug private: Privaat toegang - permissive: Beperkte toegang destination: Bestemmingsverkeer construction: Paaie onder konstruksie trace: @@ -805,11 +806,11 @@ af: visibility: 'Sigbaarheid:' visibility_help: wat beteken dit? trace_form: - upload_gpx: Laai GPX-lêer op - description: Beskrywing - tags: Etikette + upload_gpx: 'Laai GPX-lêer op:' + description: 'Beskrywing:' + tags: 'Etikette:' tags_help: met kommas geskei - visibility: Sigbaarheid + visibility: 'Sigbaarheid:' visibility_help: wat beteken dit? upload_button: Laai op help: Hulp @@ -819,7 +820,7 @@ af: trace_optionals: tags: Etikette view: - title: Besigting spoor %{name} + title: Besigtig spoor %{name} heading: Besigtig spoor %{name} pending: BESIG filename: 'Lêernaam:' @@ -847,7 +848,7 @@ af: trace_details: Wys spoor besonderhede view_map: Wys kaart edit: wysig - edit_map: Kaart bewysig + edit_map: Wysig kaart public: OPENBAAR identifiable: IDENTIFISEERBAAR private: PRIVAAT @@ -865,19 +866,19 @@ af: made_public: Spoor is openbaar gemaak oauth: oauthorize: - allow_read_prefs: u gebruikersvoorkeure te lees. + allow_read_prefs: lees u gebruikersvoorkeure. allow_write_prefs: verander jou gebruikersvoorkeure. - allow_write_api: die kaart te wysig. - allow_write_gpx: Laai GPS-spore op. + allow_write_api: die kaart wysig. + allow_write_gpx: laai GPS-spore op. oauth_clients: new: - title: Registreer 'n nuwe applikasie + title: Registreer 'n nuwe toepassing submit: Registreer edit: - title: Wysig u applikasie + title: Wysig u toepassing submit: Wysig show: - authorize_url: 'URL vir magtiging:' + authorize_url: 'Magtig URL:' edit: Wysig details allow_read_prefs: lees hulle gebruikersvoorkeure. allow_write_diary: skep dagboekinskrywings, lewer kommentaar en maak vriende. @@ -885,15 +886,15 @@ af: allow_write_gpx: laai GPS-spore op. index: title: My OAuth-details - application: Applikasienaam + application: Toepassingnaam issued_at: Uitgereik op revoke: Herroep! - my_apps: My kliënt-applikasies - register_new: Registreer u applikasie + my_apps: My kliënt-toepassing + register_new: Registreer u toepassing form: name: Naam required: Verplig - url: Applikasie-URL + url: Toepassing-URL support_url: Ondersteunings-URL allow_read_prefs: lees hulle gebruikersvoorkeure. allow_write_prefs: verander hulle gebruikersvoorkeure. @@ -906,7 +907,7 @@ af: heading: Meld aan email or username: 'E-posadres of gebruikersnaam:' password: 'Wagwoord:' - remember: 'Onthou my:' + remember: Onthou my lost password link: Wagwoord vergeet? login_button: Meld aan auth failure: Jammer, kon nie met hierdie inligting aanmeld nie. @@ -925,7 +926,7 @@ af: heading: Herstel wagwoord vir %{user} password: 'Wagwoord:' confirm password: 'Bevestig wagwoord:' - reset: Kry nuwe wagwoord + reset: Herstel wagwoord flash changed: U wagwoord is verander. new: title: Skep rekening @@ -936,7 +937,7 @@ af: email address: 'E-posadres:' confirm email address: 'Bevestig E-posadres:' not displayed publicly: Word nie publiek vertoon nie (sien <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" - title="wiki-geheimhoudingbeleid insluitend afdeling oor e-posadresse">geheimhoudingbeleid</a>) + title="wiki privacy policy including section on email addresses">geheimhoudingbeleid</a>) display name: 'Vertoon naam:' password: 'Wagwoord:' confirm password: 'Bevestig wagwoord:' @@ -944,7 +945,7 @@ af: terms accepted: Dankie dat u die nuwe bydraerooreenkoms aanvaar het! terms: title: Bydraerooreenkoms - heading: Voorwaardes vir bydraes + heading: Voorwaardes vir bydraers agree: Aanvaar decline: Weier legale_names: @@ -957,21 +958,21 @@ af: body: Daar is geen gebruiker met die naam %{user} nie. Kontroleer u spelling, of die skakel waarop u gekliek het is verkeerd. view: - my diary: my dagboek + my diary: My dagboek new diary entry: nuwe dagboekinskrywing - my edits: my wysigings - my traces: my spore - my settings: my voorkeure + my edits: My wysigings + my traces: My spore + my settings: My voorkeure oauth settings: Oauth-instellings blocks on me: blokkades op my blocks by me: blokkades deur my - send message: stuur boodskap - diary: dagboek - edits: wysigings - traces: spore - remove as friend: verwyder as vriend - add as friend: voeg by as vriend - mapper since: 'Karteer sedert:' + send message: Stuur boodskap + diary: Dagboek + edits: Wysigings + traces: Spore + remove as friend: Verwyder as vriend + add as friend: Voeg by as vriend + mapper since: 'Karteerder sedert:' ago: (%{time_in_words_ago} gelede) email address: 'E-posadres:' created from: 'Geskep vanaf:' @@ -987,13 +988,13 @@ af: km away: '%{count}km vêr' m away: '%{count}m vêr' nearby users: Ander nabygeleë gebruikers - no nearby users: Daar is nog geen gebruikers wat herken dat hulle nabygeleë - karterinswerk doen nie. + no nearby users: Daar is nog geen gebruikers wat erken dat hulle nabygeleë karterinswerk + doen nie. role: administrator: Hierdie gebruiker is 'n administrateur moderator: Hierdie gebruiker is 'n moderator grant: - administrator: Trek adminregte terug + administrator: Ken adminregte toe moderator: Ken moderatorregte toe revoke: administrator: Trek adminregte terug @@ -1041,17 +1042,17 @@ af: return to profile: Terug na profiel flash update success: U gebruikersinligting is verander. confirm: - heading: Bevestig 'n gebruiker se rekening + heading: Kontroleer u e-pos! press confirm button: Kliek op "Bevestig" hieronder om u rekening aktiveer. button: Bevestig confirm_email: heading: Bevestig verandering van e-posadres button: Bevestig - success: U e-posadres is bevestig, dankie dat u geregistreer het! + success: U e-posadres verandering is bevestig! set_home: - flash success: U tuisligging is suksesvol gebêre + flash success: U tuisligging is suksesvol gestoor make_friend: - success: '%{name} is nou u vriend.' + success: '%{name} is nou u vriend!' failed: Jammer, kon nie %{name} as 'n vriend byvoeg nie. already_a_friend: U is reeds met %{name} bevriend. remove_friend: @@ -1103,29 +1104,29 @@ af: heading: Lys van gebruikersblokkades empty: Daar is nog geen blokkades ingestel nie. revoke: - confirm: Is u seker u wil hierdie blokkade terugtrek? - revoke: Terugtrek - flash: Hierdie blokkade is teruggetrek. + confirm: Is u seker u wil hierdie blokkade herroep? + revoke: Herroep! + flash: Hierdie blokkade is herroep. period: one: 1 uur other: '%{count} ure' partial: show: Wys edit: Wysig - revoke: Terugtrek + revoke: Herroep! confirm: Is u seker? display_name: Geblokkeerde gebruiker creator_name: Skepper reason: Rede vir blokkade status: Status - revoker_name: Teruggetrek deur + revoker_name: Herroep deur not_revoked: (nie herroep nie) helper: time_future: Verval oor %{time}. until_login: Aktief totdat die gebruiker aanmeld. time_past: Het %{time} gelede verval. blocks_on: - title: Blokkades vir %{name} + title: Blokkades op %{name} heading: Lys van blokkades teen %{name} empty: '%{name} is nog nooit geblokkeer nie.' blocks_by: @@ -1140,11 +1141,11 @@ af: status: Status show: Wys edit: Wysig - revoke: Terugtrek + revoke: Herroep! confirm: Is u seker? reason: 'Rede vir blokkade:' back: Wys alle blokkades - revoker: 'Teruggetrek deur:' + revoker: 'Herroep deur:' needs_view: Die gebruiker moet aanmeld alvorens hierdie blokkade verwyder sal word. javascripts: @@ -1152,15 +1153,15 @@ af: title: Deel map: zoom: - in: Zoem in + in: Zoom in locate: title: Wys my ligging base: cycle_map: Fietskaart site: - edit_disabled_tooltip: Zoem in om die kaart te redigeer - createnote_disabled_tooltip: Zoem in om 'n nota by die kaart te voeg - map_data_zoom_in_tooltip: Zoem in om kaartdata te sien + edit_disabled_tooltip: Zoom in om die kaart te wysig + createnote_disabled_tooltip: Zoom in om 'n nota by die kaart te voeg + map_data_zoom_in_tooltip: Zoom in om kaartdata te sien directions: engines: graphhopper_bicycle: Fiets (GraphHopper) diff --git a/config/locales/aln.yml b/config/locales/aln.yml index b7d7dfd24..7d3a63378 100644 --- a/config/locales/aln.yml +++ b/config/locales/aln.yml @@ -7,6 +7,8 @@ # Author: Fitim # Author: Gent # Author: Heroid +# Author: Kosovastar +# Author: Macofe # Author: Mdupont # Author: MicroBoy # Author: Nemo bis @@ -852,8 +854,8 @@ aln: deleted: Mesazhi u fshi site: index: - js_1: Ju jeni tuj e përdor naj shfletues që nuk e përkrah JavaScript, ose ju - e keni ndalu JavaScript. + js_1: Ju jeni duke përdorur ndonjë shfletues që nuk e përkrah JavaScript, ose + i keni çativizuar JavaScript. js_2: OpenStreetMap përdor Java skriptet për planet e saj të rrëshqitshëm. permalink: Permalink shortlink: Shortlink @@ -887,9 +889,7 @@ aln: primary: Udhë kryesore secondary: rrugë e mesme unclassified: Udhë e paklasifikume - unsurfaced: rrugë Unsurfaced track: Udhë - byway: I parrahur bridleway: Bridleway cycleway: Cycleway footway: Këmbësore @@ -913,7 +913,6 @@ aln: golf: fushë e golfit park: Park resident: Zonë Rezidenciale - tourist: tërheqje Turistike common: - I përbashkët - livadh @@ -943,7 +942,6 @@ aln: tunnel: tunel zorrë thye = bridge: Shtresë e jashtme e Zi = urë private: qasje privat - permissive: qasje tolerant destination: qasje Destinacioni construction: Rrugët në ndërtim e sipër trace: @@ -1160,7 +1158,7 @@ aln: new: title: Krijo akount no_auto_account_create: Për momentin spo mujm me ju kriju akount automatikisht. - contact_webmaster: Ju lutna kontaktoni <a href="mailto:webmaster@openstreetmap.org">webmasterin</a> + contact_webmaster: Ju lutna kontaktoni <a href="%{webmaster}">webmaster</a> per më caktu ni akount që të ju krijohet - na do të merremi me kërkesën sa ma shpejt që tjet e mundshme. license_agreement: Kur e konfirmoni llogarinë tuaj ju duhet ti pranoni <a href="http://www.osmfoundation.org/wiki/License/Contributor_Terms">kushtet @@ -1251,7 +1249,7 @@ aln: my settings: Preferencat e mia current email address: 'Email adresa e tanishme:' new email address: 'Email adresa e re:' - email never displayed publicly: (asniher su kan publike) + email never displayed publicly: (asnjëherë nuk është publikuar) public editing: heading: 'Ndryshime publike:' enabled: E pranishme. Jo anonime dhe muni me i ndryshue t'dhanat. diff --git a/config/locales/ar.yml b/config/locales/ar.yml index 5f1fa6b53..c774111ff 100644 --- a/config/locales/ar.yml +++ b/config/locales/ar.yml @@ -3,8 +3,10 @@ # Export driver: phpyaml # Author: Ali1 # Author: Aude +# Author: Ayatun # Author: Bassem JARKAS # Author: Fahad +# Author: Faris knight # Author: Grille chompa # Author: Houcinee1 # Author: Kuwaity26 @@ -17,7 +19,10 @@ # Author: TTMTT # Author: Yahya Sakhnini # Author: Zaher kadour +# Author: Zpizza +# Author: بدارين # Author: ترجمان05 +# Author: ديفيد # Author: عباد ديرانية # Author: عبد الرحمان أيمن # Author: محمد أحمد عبد الفتاح @@ -141,6 +146,7 @@ ar: مضت</abbr> commented_by: تعليق من %{user} <abbr title='%{exact_time}'>%{when} مضت</abbr> changesetxml: حزمة التغييرات إكس إم أل + osmchangexml: osmChange XML feed: title: حزمة التغييرات %{id} title_comment: حزمة التغييرات %{id} - %{comment} @@ -176,6 +182,7 @@ ar: way: طريق relation: علاقة changeset: حزمة التغييرات + note: ملحوظة timeout: sorry: عذرًا، بيانات %{type} بالمعرّف %{id} استغرقت وقتًا طويلا للاسترداد. type: @@ -183,6 +190,7 @@ ar: way: الطريق relation: العلاقة changeset: حزمة التغييرات + note: ملحوظة redacted: redaction: التنقيح %{id} message_html: لا يمكن إظهار الإصدارة %{version} من هذا %{type} لأن صياغتها @@ -258,10 +266,13 @@ ar: timeout: sorry: عذراً، لقد إستمرت لائحة حزم التغييرات اللتي طلبتها وقتاً طويلاً للسحب. rss: + commented_at_html: تم التحديث قبل %{when} + commented_at_by_html: تم التحديث قبل %{when} بواسطة %{user} full: كامل النقاش diary_entry: new: title: مدخلة يومية جديدة + publish_button: نشر list: title: يوميات المستخدمين title_friends: يوميات الأصدقاء @@ -302,10 +313,8 @@ ar: comment_link: علّق على هذه المدخلة reply_link: رد برسالة comment_count: - few: '%{count} تعليقات' - one: تعليق واحد - two: تعليقان zero: لا تعليق + one: '%{count} تعليق' other: '%{count} تعليق' edit_link: عدّل هذه المدخلة hide_link: اخفِ هذه المدخلة @@ -362,10 +371,16 @@ ar: OpenStreetMap overpass: title: تجاوز API + description: تحميل مربع الإحاطة من مرآة قاعدة بيانات خريطة الشارع المفتوحة geofabrik: title: تنزيلات موقع جيوفابريك + description: مقتطفات محدثة بانتظام من القارات والبلدان والمدن المختارة + metro: + title: مقتطفات لمترو الأنفاق + description: خلاصات لمدن العالم الكبرى والمناطق المحيطة بها other: title: مصادر أخرى + description: مصادر إضافية مدرجة في الويكي خريطة الشارع المفتوحة options: خيارات format: الهيئة scale: القياس @@ -389,9 +404,14 @@ ar: osm_nominatim: نتائج من <a href="http://nominatim.openstreetmap.org/">OpenStreetMap Nominatim</a> geonames: نتائج من <a href="http://www.geonames.org/">GeoNames</a> + osm_nominatim_reverse: نتائج من <a href="http://nominatim.openstreetmap.org/">OpenStreetMap + Nominatim</a> + geonames_reverse: نتائج من Results from <a href="http://www.geonames.org/">GeoNames</a> search_osm_nominatim: prefix: aerialway: + cable_car: عربة قطار هوائي + gondola: تلفريك station: محطة قطار هوائي aeroway: aerodrome: المطار @@ -402,6 +422,7 @@ ar: taxiway: مدرج المناورات terminal: صالة مطار amenity: + animal_shelter: مأوى للحيوانات arts_centre: مركز فني/ثقافي atm: صراف آلي bank: مصرف @@ -411,6 +432,7 @@ ar: bicycle_parking: موقف دراجات bicycle_rental: تأجير دراجة biergarten: حديقة البيرة + boat_rental: تأجير قوارب brothel: بيت دعارة bureau_de_change: مكتب صرافة bus_station: محطة حافلات @@ -420,6 +442,7 @@ ar: car_wash: غسيل سيارات casino: نادي قمار charging_station: محطة تعبئة + childcare: رعاية الأطفال cinema: سينما clinic: عيادة clock: الساعة @@ -441,6 +464,7 @@ ar: food_court: مطعم وجبات سريعة fountain: نافورة fuel: وقود + gambling: مقامرة grave_yard: مقبرة gym: مركز للرشاقة/الرياضة health_centre: مركز صحي @@ -451,11 +475,14 @@ ar: library: مكتبة market: سوق marketplace: سوق + monastery: دير + motorcycle_parking: مرآب دراجات نارية nightclub: نادي ليلي nursery: رعاية تمريضية nursing_home: دار رعاية مسنين/معاقين office: مكتب parking: موقف سيارات + parking_entrance: مدخل مرآب pharmacy: صيدلية place_of_worship: معبد police: شرطة @@ -489,6 +516,7 @@ ar: veterinary: جراحة بيطرية village_hall: مبنى/دار القرية waste_basket: سلة نفايات + waste_disposal: التخلص من النفايات youth_centre: مركز نشاطات للشباب boundary: administrative: حدود إدارية @@ -504,6 +532,7 @@ ar: building: "yes": مبنى craft: + brewery: مصنع الجعة carpenter: نجار electrician: اختصاصي كهرباء gardener: بستاني @@ -512,6 +541,7 @@ ar: plumber: سمكري shoemaker: صانع أحذية tailor: خياط + "yes": محل بيع الحرفيات emergency: ambulance_station: محطة إسعاف defibrillator: رجفان @@ -611,6 +641,7 @@ ar: railway: سكة حديدية recreation_ground: ميدان ألعاب reservoir: خزان + reservoir_watershed: خزان مستجمعات المياه residential: منطقة سكنية retail: بيع بالمفرق road: منطقة الطريق @@ -645,11 +676,13 @@ ar: swimming_pool: بركة سباحة track: مضمار سباق water_park: منتزه ألعاب مائية + "yes": وقت الفراغ man_made: lighthouse: منارة pipeline: خط أنابيب tower: برج works: مصنع + "yes": من صنع الإنسان military: airfield: منطقة عسكرية barracks: ثكنات @@ -694,7 +727,7 @@ ar: volcano: بركان water: ماء wetland: أرض رطبة - wood: حرج + wood: غابة office: accountant: محاسب administrative: إدارة @@ -710,6 +743,7 @@ ar: travel_agent: وكيل سفريات "yes": مكتب place: + allotments: المخصصات block: حظر airport: مطار city: مدينة @@ -756,7 +790,7 @@ ar: spur: خط تفرع سكة حديدية station: محطة قطار stop: محطة سكك حديدية - subway: محطة مترو الأنفاق + subway: مترو الأنفاق subway_entrance: مدخل مترو switch: مبدل السكة الحديدية tram: سكة ترام @@ -878,6 +912,7 @@ ar: wadi: وادي waterfall: شلال weir: هدار (سدّ منخفض) + "yes": معبر مائي admin_levels: level2: حدود قطرية level4: حدود الدولة @@ -905,7 +940,7 @@ ar: logout: سجل خروج log_in: لِج log_in_tooltip: سجّل الدخول مع حساب موجود - sign_up: إنشئ حساباً + sign_up: أنشئ حسابًا sign_up_tooltip: أنشئ حسابًا كي تستطيع المساهمة edit: تعديل history: تاريخ @@ -923,7 +958,9 @@ ar: برخصة مفتوحة. intro_2_create_account: أنشئ حساب مستخدم partners_html: الضيافة مدعومة من %{ucl}, %{ic} و %{bytemark}, و %{partners} آخرون. + partners_ucl: مركز UCL VR partners_ic: كلية امبراطورية لندن + partners_bytemark: استضافة Bytemark partners_partners: الشركاء osm_offline: حاليًا قاعدة بيانات خريطة الشارع المفتوحة مغلقة بينما يتم الانتهاء من أعمال الصيانة الأساسية لقاعدة البيانات. @@ -952,46 +989,112 @@ ar: native: title: حول هذه الصفحة native_link: النسخة العربية - mapping_link: إبدأ التخطيط + mapping_link: ابدأ التخطيط legal_babble: title_html: حقوق النشر والترخيص + intro_2_html: أنت حر في نسخ وتوزيع ونقل وتكييف بياناتنا، طالما كنت تأئتمن خريطة + الشارع المفتوحة والمساهمين فيها. إذا عدلت أو بنيت على البيانات المتوفرة لدينا، + فلا يحق لك توزيع النتيجة إلا تحت نفس الترخيص.<a href="http://opendatacommons.org/licenses/odbl/1.0/"> + الكود القانوني الكامل</A> يشرح حقوقك ومسؤولياتك. + credit_1_html: |- + نطلب منك استخدام الائتمان “© OpenStreetMap + contributors”. + credit_3_html: 'للحصول على الخريطة الإلكترونية للتصفح، يجب أن يظهر الائتمان + في زاوية من الخريطة، مثلا:' + attribution_example: + title: مثال الإسناد more_title_html: معرفة المزيد contributors_title_html: المساهمين + infringement_title_html: انتهاك حقوق الملكية + trademarks_title_html: <span id="trademarks"></span>علامات تجارية welcome_page: title: أهلاً بك. + whats_on_the_map: + title: ما على الخريطة + basic_terms: + title: شروط أساسية لرسم الخرائط + paragraph_1_html: خريطة الشارع المفتوحة لديها بعض اللغات الخاصة بها، وفيما يلي + بعض الكلمات الرئيسية التي سوف تأتي في متناول اليدين. + editor_html: <strong>محرر</strong> هو برنامج أو موقع يمكنك استخدامه لتعديل الخريطة. + node_html: A <strong>عقدة</strong> هي نقطة على الخريطة، مثل مطعم واحد أو شجرة + واحدة. + way_html: A <strong>طريق</strong> هو خط أو منطقة، مثل طريق أو تيار أو بحيرة + أو بناء. + tag_html: A <strong>وسم</strong> هو قليل من البيانات حول عقدة أو طريقة، مثل + اسم أحد المطاعم أو الحد الأقصى للسرعة على الطريق. + rules: + title: قواعد! questions: title: هل هناك أسئلة ؟ + add_a_note: + title: لا وقت للتعديل؟ أضف ملاحظة! + paragraph_1_html: إذا كنت تريد إصلاح مجرد شيء صغير وليس لديك الوقت للتسجيل ومعرفة + كيفية التحرير، فإنه من السهل أن تضيف ملاحظة. fixthemap: + title: الإبلاغ عن مشكلة / إصلاح الخريطة how_to_help: title: كيف نساعدك ؟ join_the_community: title: انضم لهذا المجتمع + explanation_html: إذا كنت قد لاحظت وجود مشكلة في بيانات الخرائط لدينا، على + سبيل المثال طريق مفقود أو عنوانك، فإن أفضل طريقة للمضي قدما هو الانضمام + إلى مجتمع خريطة الشارع المفتوحة وإضافة أو إصلاح البيانات بنفسك. + other_concerns: + title: اهتمامات أخرى help_page: + title: الحصول على مساعدة welcome: + url: أهلا بك. title: مرحبا بك في خرائط الشوارع " المفتوحة المصدر" + description: ابدأ مع هذا الدليل السريع تغطية أساسيات خريطة الشارع المفتوحة. beginners_guide: url: http://wiki.openstreetmap.org/wiki/Ar:Beginners%27_guide title: دليل المبتدئين + help: + url: https://help.openstreetmap.org/ + title: help.openstreetmap.org + description: طرح سؤال أو البحث عن إجابات في موقع خريطة الشارع المفتوحة لطرح + الأسئلة والإجابة. mailing_lists: title: القوائم البريدية + description: طرح سؤال أو مناقشة المسائل المثيرة للاهتمام بشأن مجموعة واسعة من + القوائم البريدية الموضعية أو الإقليمية. forums: title: المنتديات + irc: + title: آي آر سي + description: دردشة تفاعلية بالعديد من اللغات المختلفة، وحول العديد من المواضيع. + switch2osm: + title: switch2osm + description: مساعدة للشركات والمؤسسات في التحول إلى خرائط خريطة الشارع المفتوحة + الموجودة وغيرها من الخدمات. + wiki: + url: http://wiki.openstreetmap.org/ + title: wiki.openstreetmap.org about_page: next: التالي + copyright_html: <span>©</span>OpenStreetMap<br>contributors + lede_text: تم بناء خريطة الشارع المفتوحة من قبل مجتمع من مصممي الخرائط، وتساهم + وتحافظ على البيانات حول الطرق والممرات والمقاهي ومحطات السكك الحديدية، وأكثر + من ذلك بكثير، في جميع أنحاء العالم. + local_knowledge_title: المعرفة المحلية + community_driven_title: نابعة من المجتمع المحلي open_data_title: البيانات المفتوحة + legal_title: قانوني partners_title: الشركاء notifier: diary_comment_notification: - subject: '[خريطة الشارع المفتوحة] %{user} أضاف تعليقًا على مدخلتك في اليومية' + subject: '[خريطة الشارع المفتوحة] %{user} علق على مدخلتك في اليومية' hi: مرحبًا %{to_user}، - header: '%{from_user} علّق على مدخلتك اليومية الحديثة في خريطة الشارع المفتوحة - بالعنوان %{subject}:' + header: '%{from_user} علق على مدخلتك في اليومية في خريطة الشارع المفتوحة بالعنوان + %{subject}:' footer: يمكنك أيضًا قراءة التعليق على %{readurl} ويمكنك التعليق على %{commenturl} أو الرد على %{replyurl} message_notification: hi: مرحبًا %{to_user}، header: '%{from_user} قام بإرسال رسالة لك عبر خريطة الشارع المفتوحة بالعنوان %{subject}:' + footer_html: يمكنك أيضا قراءة الرسالة في %{readurl} ويمكنك الرد في %{replyurl} friend_notification: subject: '[خريطة الشارع المفتوحة] %{user} أضافك كصديق.' had_added_you: '%{user} قام بإضافتك كصديق على خريطة الشارع المفتوحة.' @@ -1014,10 +1117,17 @@ ar: نقطة ممكنة. signup_confirm: subject: '[خرائط اوبن ستريت] مرحباً بك في خرائط اوبن ستريت' + greeting: مرحبا هناك! + created: شخص ما (نأمل أن تكون أنت) أنشأ حسابا في %{site_url}. + confirm: 'قبل أن تفعل أي شيء آخر، ونحن بحاجة للتأكد من أن هذا الطلب جاء منك، + لذلك إذا كان كذلك، الرجاء الضغط على الرابط أدناه لتأكيد حسابك:' + welcome: بعد تأكيد حسابك، سوف نقدم لك بعض المعلومات الإضافية للبدء. email_confirm: subject: '[خريطة الشارع المفتوحة] أكّد عنوان بريدك الإلكتروني' email_confirm_plain: greeting: تحياتي، + hopefully_you: شخص ما (نأمل أن تكون أنت) يرغب في تغيير عنوان بريده الإلكتروني + في %{server_url} إلى %{new_address}. click_the_link: إذا كان هذا هو أنت، يرجى الضغط على الرابط أدناه لتأكيد التغيير. email_confirm_html: greeting: مرحبًا، @@ -1028,6 +1138,8 @@ ar: subject: '[خريطة الشارع المفتوحة] طلب إعادة تعيين كلمة المرور' lost_password_plain: greeting: تحياتي، + hopefully_you: شخص ما (ربما أنت) طلب إعادة تعيين كلمة المرور لحساب openstreetmap.org + على عنوان البريد الإلكتروني هذا. click_the_link: إذا كان هذا هو أنت، يرجى الضغط على الرابط أدناه لإعادة تعيين كلمة المرور. lost_password_html: @@ -1038,14 +1150,42 @@ ar: كلمة المرور. note_comment_notification: greeting: أهلا, + commented: + subject_own: '[OpenStreetMap] علق %{commenter} على واحدة من ملاحظاتك' + subject_other: '[OpenStreetMap] علق %{commenter} على ملاحظة تههتم بها' + your_note: علق %{commenter} على واحدة من ملاحظات خريطتك بالقرب من %{place}. + commented_note: علق %{commenter} على ملاحظة الخريطة التي علقت عليها. كانت + الملاحظة بالقرب من %{place}. + closed: + subject_own: '[OpenStreetMap] حل %{commenter} إحدى ملاحظاتك' + subject_other: '[OpenStreetMap] حل %{commenter} ملاحظة تهتم بها' + your_note: حل %{commenter} إحدى ملاحظات الخريطة بالقرب من %{place}. + commented_note: حل %{commenter} ملاحظة الخريطة التي علقت عليها.كانت الملاحظة + بالقرب من %{place}. + reopened: + subject_own: نشط [OpenStreetMap] %{commenter} إحدى ملاحظاتك + subject_other: نشط [OpenStreetMap] %{commenter} ملاحظة كنت مهتما بها + your_note: نشط %{commenter} إحدى ملاحظات الخريطة بالقرب من %{place}. + commented_note: نشط %{commenter} ملاحظة الخريطة التي علقت عليها.كانت الملاحظة + بالقرب من %{place}. + details: يمكن العثور على مزيد من التفاصيل حول هذه الملاحظة في %{url}. changeset_comment_notification: greeting: مرحبا ، + commented: + partial_changeset_with_comment: مع تعليق '%{changeset_comment}' + partial_changeset_without_comment: بدون تعليق message: inbox: title: الوارد my_inbox: الوارد outbox: الصادر messages: لديك %{new_messages} و %{old_messages} + new_messages: + one: '%{count} رسالة جديدة' + other: '%{count} رسائل جديدة' + old_messages: + one: '%{count} رسالة قديمة' + other: '%{count} رسائل قديمة' from: من subject: الموضوع date: التاريخ @@ -1109,6 +1249,10 @@ ar: permalink: وصلة دائمة shortlink: وصلة قصيرة createnote: أضف ملاحظة + license: + copyright: حقوق طبع ونشر ومساهمو خريطة الشارع المفتوحة، تحت رخصة مفتوحة + remote_failed: فشل التعديل - تأكد من تحميل JOSM أو Merkaartor وتمكين خيار التحكم + عن بعد edit: not_public: لم تقم بتعيين تعديلاتك لتظهر بشكل علني. not_public_description: أنت لم تعد قادر على تعديل الخريطة إلا إذا قمت بذلك. @@ -1122,11 +1266,20 @@ ar: potlatch_unsaved_changes: لديك تغييرات غير محفوظة. (للحفظ في Potlatch، يجب إلغاء الطريق أو النقطة الحاليين إن كان التعديل في الوضع المباشر، أو انقر فوق حفظ إن كان لديك زر الحفظ.) + potlatch2_not_configured: لم يتم تكوين Potlatch 2 - يُرجَى الاطلاع على http://wiki.openstreetmap.org/wiki/The_Rails_Port#Potlatch_2 + for more information + potlatch2_unsaved_changes: لديك تغييرات غير محفوظة. (للحفظ في Potlatch 2; يجب + النقر فوق حفظ.) + id_not_configured: لم يتم تكوين المعرف + no_iframe_support: متصفحك لا يدعم الإطارات المضمنة HTML، والتي هي ضرورية لهذه + الميزة. sidebar: search_results: نتائج البحث close: أغلق search: search: بحث + get_directions: احصل على الاتجاهات + get_directions_title: البحث عن الاتجاهات بين نقطتين from: من to: إلى where_am_i: أين أنا؟ @@ -1136,15 +1289,17 @@ ar: table: entry: motorway: طريق سريع + main_road: الطريق الرئيسي trunk: طريق رئيسي primary: طريق رئيسي secondary: طريق ثانوي unclassified: طريق غير مصنّف - unsurfaced: طريق غير معبد track: مسار - byway: طريق فرعي bridleway: مسلك خيول cycleway: طريق دراجات + cycleway_national: طريق الدراجات الوطني + cycleway_regional: طريق الدراجات الإقليمي + cycleway_local: طريق الدراجات المحلي footway: طريق مشاة rail: سكة حديدية subway: قطار الأنفاق @@ -1166,7 +1321,6 @@ ar: golf: ملعب غولف park: منتزه resident: منطقة سكنية - tourist: مزار سياحي common: - شائع - مرج @@ -1196,15 +1350,17 @@ ar: tunnel: غطاء متقطع = نفق bridge: غطاء أسود = جسر private: استخدام خصوصي - permissive: استخدام متسامح destination: استخدام إلى الوجهة construction: الطرق تحت الإنشاء + bicycle_shop: متجر دراجات + bicycle_parking: مرآب دراجات richtext_area: edit: حرّر preview: شاهد markdown_help: headings: عناوين heading: عنوان + subheading: عنوان فرعي unordered: لائحة غير مرتبة ordered: لائحة مرتبة first: البند الأول @@ -1300,6 +1456,7 @@ ar: public_traces: آثار جي بي إس عمومية your_traces: آثار جي بي إس الخاصة بك public_traces_from: آثار جي بي إس عمومية من %{user} + description: تصفح أحدث مسارات GPS المرفوعة tagged_with: بالوسم %{tags} delete: scheduled_for_deletion: تم جدولة الأثر للحذف @@ -1310,6 +1467,11 @@ ar: offline: heading: مخزن جي بي إكس غير متصل message: مخزن ونظام رفع ملفات جي بي إكس غير متاح حاليًا. + georss: + title: GPS آثار من خريطة الشارع المفتوحة + description: + description_with_count: ملف GPX ب%{count} نقطة من %{user} + description_without_count: ملف GPX من %{user} application: require_cookies: cookies_needed: يبدو أن الكوكيز عندك معطلة - يرجى تفعيل الكوكيز في متصفحك قبل @@ -1319,8 +1481,11 @@ ar: setup_user_auth: blocked: لقد تم عرقلة وصولك إلى الـ API. يرجى تسجيل الدخول من صفحة الموقع لمعرفة المزيد. + need_to_see_terms: تم تعليق دخولك إلى API مؤقتا. الرجاء تسجيل الدخول في واجهة + الويب لعرض شروط المساهمة. أنت لا تحتاج إلى موافق،ة لكن يجب عرضها. oauth: oauthorize: + title: السماح بالوصول إلى حسابك request_access: التطبيق %{app_name} يطلب الوصول إلى حسابك %{user}. يرجى التحقق ما إذا كنت تريد أن يكون للتطبيق هذه القدرات. يمكن أن تختار ما تشاء. allow_to: 'اسمح للتطبيق بأن:' @@ -1330,6 +1495,14 @@ ar: allow_write_api: يعدّل الخريطة. allow_read_gpx: قراءة آثار جي بي أس الخاصة بك. allow_write_gpx: ارفع آثار جي بي أس. + allow_write_notes: تعديل الملاحظات. + grant_access: منح حق الوصول + oauthorize_success: + verification: رمز التحقق هو %{code}. + oauthorize_failure: + title: فشل طلب الترخيص + denied: لقد رفضت وصول التطبيق %{app_name} إلى حسابك. + invalid: رمز المصادقة غير صالح. revoke: flash: لقد أبطلت نموذج التطبيق %{application} oauth_clients: @@ -1346,7 +1519,7 @@ ar: url: 'رابط طلب النموذج:' access_url: 'رابط وصول النموذج:' authorize_url: 'رابط التصريح:' - support_notice: نحن ندعم HMAC-SHA1 (مستحسن) وكذلك النص العادي في وضع ssl. + support_notice: نحن ندعم HMAC-SHA1 (موصى به) وتوقيعات RSA-SHA1 signatures. edit: عدّل التفاصيل delete: أمحي الزبون confirm: هل أنت متأكد؟ @@ -1357,6 +1530,7 @@ ar: allow_write_api: تعديل الخريطة. allow_read_gpx: قراءة آثاره للجي بي إس الخصوصية. allow_write_gpx: ارفع آثار جي بي إس. + allow_write_notes: تعديل الملاحظات. index: title: تفاصيل OAuth الخاص بي my_tokens: تطبيقاتي المصرحة @@ -1383,6 +1557,7 @@ ar: allow_write_api: تعديل الخريطة. allow_read_gpx: قراءة آثاره للجي بي إس الخصوصية. allow_write_gpx: رفع آثار جي بي إس. + allow_write_notes: تعديل الملاحظات. not_found: sorry: عذرًا، لم يتم العثور على تلك %{type}. create: @@ -1401,13 +1576,45 @@ ar: lost password link: أنسيت كلمة المرور؟ login_button: تسجيل الدخول register now: تسجل الآن + with username: 'هل لديك بالفعل حساب خريطة الشارع المفتوحة؟ الرجاء الدخول باسم + المستخدم وكلمة المرور الخاصين بك:' + with external: 'بدلا من ذلك، استخدم طرفا آخر للدخول:' new to osm: جديد لخريطة الشارع المفتوحة ؟ + to make changes: لإجراء تغييرات على بيانات خريطة الشارع المفتوحة; يجب أن يكون + لديك حساب. create account minute: أنشئ حساباّ. تحتاج فقط إلى دقيقة. no account: ليس لديك حسابا ؟ account not active: عذراً، حسابك غير نشط حتى الآن.<br />يُرجى إستخدام الرابط الذي اُرسِلَ إليك فى رسالة تأكيد البريد الإلكتروني، كما <a href="%{reconfirm}">يُمكنك طلب رسالة تأكيد جديدة فى حالة عدم إستلام الاولى</a>. + account is suspended: عذرا، تم تعليق حسابك بسبب نشاط مشبوه.<br />يُرجَى الاتصال + ب<a href="%{webmaster}">webmaster</a> إذا كنت ترغب في مناقشة هذا. auth failure: آسف، لا يمكن الدخول بتلك التفاصيل. + auth_providers: + openid: + title: تسجيل الدخول بOpenID + alt: تسجيل الدخول باستخدام OpenID URL + google: + title: قم بتسجيل الدخول عن طريق جوجل + alt: تسجيل الدخول ب Google OpenID + facebook: + title: قم بتسجيل الدخول باستخدام الفيس بوك + alt: تسجيل الدخول بحساب فيسبوك + windowslive: + title: تسجيل الدخول عبر ويندوز لايف + alt: تسجيل الدخول بحساب ويندوز لايف + github: + title: تسجيل الدخول بجيثب + alt: تسجيل الدخول باستخدام حساب جيثب + yahoo: + title: تسجيل الدخول بياهو + alt: تسجيل الدخول ب Yahoo OpenID + wordpress: + title: تسجيل الدخول بووردبريس + alt: تسجيل الدخول ب Wordpress OpenID + aol: + title: تسجيل الدخول بإيه أو إل + alt: تسجيل الدخول ب AOL OpenID logout: title: تسجيل الخروج heading: الخروج من خريطة الشارع المفتوحة @@ -1431,12 +1638,17 @@ ar: flash changed: كلمة المرور الخاصة بك قد تغيرت. flash token bad: لم نجد هذا النموذج، تحقق من الرابط ربما؟ new: - title: إنشئ حساباً + title: أنشئ حسابا no_auto_account_create: للأسف نحن غير قادرين في الوقت الحالي على إنشاء حساب لك تلقائيًا. contact_webmaster: يرجى الاتصال <a href="mailto:webmaster@openstreetmap.org">بمسؤول الموقع</a> لترتيب الحساب المراد إنشاؤه - وسنحاول التعامل مع هذا الطلب بأسرع وقت ممكن. + about: + header: مجانا وقابلة للتحرير + html: |- + <p>على عكس الخرائط الأخرى تماما، يتم إنشاء خريطة الشارع المفتوحة من قبل الناس مثلك، وهي حرة ويمكن لأي أحد الإصلاح والتحديث والتنزيل والاستخدام.</p> + <P> أنشىء حسابا لبدء المساهمة.سنقوم بإرسال بريد إلكتروني لتأكيد حسابك.</p> license_agreement: عند تأكيد حسابك ستحتاج إلى الموافقة على <a href="http://www.osmfoundation.org/wiki/License/Contributor_Terms">شروط المساهم</a>. email address: 'عنوان البريد الإلكتروني:' @@ -1447,10 +1659,16 @@ ar: display name: 'اسم المستخدم:' display name description: اسم المستخدم الخاص بك الظاهر علنًا. يمكنك تغيير هذه التفضيلات في وقت لاحق. + external auth: 'مصادقة طرف ثالث:' password: 'كلمة السر:' confirm password: 'تأكيد كلمة المرور:' - continue: إنشئ حساباً + use external auth: 'بدلا من ذلك، استخدم طرفا آخر للدخول:' + auth no password: مع مصادقة طرف ثالث كلمة السر غير مطلوبة، ولكن بعض الأدوات + إضافية أو الخادم قد لا تزال تحتاج إلى واحدة. + continue: أنشئ حسابا terms accepted: نشكرك على قبول شروط المساهم الجديدة! + terms declined: نحن نأسف أن كنت قد قررت عدم قبول شروط المساهمة الجديدة. لمزيد + من المعلومات، يرجى الاطلاع على <a href="%{url}">صفحة الويكي هذه</a>. terms: title: 'شروط المساهم:' heading: 'شروط المساهم:' @@ -1460,6 +1678,8 @@ ar: consider_pd_why: ما هذا؟ agree: أوافق decline: انخفاض + you need to accept or decline: الرجاء القراءة ومن ثم قبول أو رفض شروط المساهمة + الجديدة للمتابعة. legale_select: 'الرجاء اختيار بلد الإقامة:' legale_names: france: فرنسا @@ -1475,6 +1695,9 @@ ar: new diary entry: مدخلة يومية جديدة my edits: المُساهمات my traces: آثاري + my notes: ملاحظاتي + my messages: رسائلي + my profile: ملفي الشخصي my settings: الإعدادات my comments: التعليقات oauth settings: "\uFEFFإعدادات oauth" @@ -1484,7 +1707,7 @@ ar: diary: يومية edits: مساهمات traces: آثار - remove as friend: أزل كصديق + remove as friend: إلغاء الصداقة add as friend: أضف كصديق mapper since: 'مُخطط منذ:' ago: (%{time_in_words_ago}) @@ -1496,6 +1719,7 @@ ar: email address: 'عنوان البريد الإلكتروني:' created from: 'أُنشىء من:' status: 'الحالة:' + spam score: 'نتيجة السخام:' description: الوصف user location: الموقع if set location: إن قمت بتعيين موقعك، خريطة وأشياء جميلة سوف تظهر أدناه. يمكنك @@ -1541,6 +1765,7 @@ ar: current email address: 'عنوان البريد الإلكرتروني الحالي:' new email address: 'عنوان البريد الإلكتروني الجديد:' email never displayed publicly: (لا يظهر علنًا) + external auth: 'مصادقة خارجية:' openid: link: http://wiki.openstreetmap.org/wiki/OpenID link text: ما هذا ؟ @@ -1563,12 +1788,16 @@ ar: heading: 'شروط المساهم:' agreed: لقد وافقتَ على شروط المساهم الجديدة. not yet agreed: لم توافق بعد على شروط المساهم الجديدة. + review link text: يرجى اتباع هذا الرابط في الوقت الذي يناسبك لمراجعة وقبول + شروط المساهمة الجديدة. agreed_with_pd: وقد أعلنتَ أيضًا أنك تعتبر تعديلاتك ملكية عامة. link text: ما هذا؟ profile description: 'وصف الملف الشخصي:' preferred languages: 'اللغات المفضّلة:' preferred editor: 'المحرر المفضل:' image: "\uFEFFالصورة:" + gravatar: + link text: ما هذا؟ new image: أضف صورة keep image: احتفظ بالصورة الحالية delete image: أزل الصورة الحالية @@ -1587,9 +1816,18 @@ ar: flash update success: تم تحديث معلومات المستخدم بنجاح. confirm: heading: تحقق من بريدك الإلكتروني + introduction_1: أرسلنا لك رسالة تأكيد بالبريد الإلكتروني. + introduction_2: أكد حسابك عن طريق النقر على الرابط في البريد الإلكتروني وستكون + قادرا على البدء في رسم الخرائط. press confirm button: اضغط على زر التأكيد أدناه لتنشيط حسابك. button: أكّد success: تم تأكيد حسابك، شكرًا للاشتراك! + already active: هذا الحساب سبق أن تم تأكيده. + unknown token: رمز التأكيد انتهت صلاحيته أو غير موجود. + reconfirm_html: إذا كنت في حاجة لإعادة إرسال تأكيد البريد الإلكتروني، email + <a href="%{reconfirm}">انقر هنا</a>. + confirm_resend: + failure: المستخدم %{name} غير موجود. confirm_email: heading: أكّد تغيير عنوان البريد الإلكتروني press confirm button: اضغط على زر تأكيد أدناه لتأكيد عنوان بريدك الإلكتروني @@ -1597,11 +1835,13 @@ ar: button: أكّد success: تم تأكيد عنوان بريدك الإلكتروني، شكرًا للاشتراك! failure: عنوان بريد إلكتروني تم تفعيله مسبقًا بهذا النموذج. + unknown_token: رمز التأكيد انتهت صلاحيته أو غير موجود. set_home: flash success: موقع المنزل حُفظ بنجاح go_public: flash success: جميع تعديلاتك الآن عامة، ومسموح لك بالتعديل الآن. make_friend: + heading: إضافة %{user} كصديق؟ button: أضف كصديق success: '%{name} الآن صديقك.' failed: عفوًا، تعذر إضافة %{name} كصديق. @@ -1615,6 +1855,12 @@ ar: list: title: المستخدمون heading: المستخدمون + showing: + one: صفحة%{page} (%{first_item} %{items}) + other: صفحة %{page} (%{first_item}-%{last_item} %{items}) + summary: '%{name} تم إنشاؤها من %{ip_address} في %{date}' + summary_no_ip: '%{name} تم إنشاؤها في %{date}' + confirm: تأكيد المستخدمين المحددين hide: إخفاء المستخدمين المحددين empty: لا سجلات مطابقة تم العثور عليها! suspended: @@ -1625,6 +1871,19 @@ ar: تلقائيًا بسبب نشاط مشبوه. \n</p>\n<p style=\";text-align:right;direction:rtl\">\nسيراجع مسؤول هذا القرار عما قريب، أو يمكنك الاتصال بالمسؤول\nعن الموقع (%{webmaster}) إذا كنت ترغب في مناقشة هذا الأمر. \n</p>" + auth_failure: + connection_failed: فشل الاتصال بموفر المصادقة + invalid_credentials: بيانات اعتماد المصادقة غير صالحة + no_authorization_code: لا يوجد رمز ترخيص + unknown_signature_algorithm: خوارزمية توقيع غير معروفة + invalid_scope: نطاق غير صالح + auth_association: + heading: لم يرتبط اسم المستخدم الخاص بك بحساب خريطة الشارع المفتوحة حتى الآن. + option_1: إذا كنت جديدا في خريطة الشارع المفتوح، الرجاء إنشاء حساب جديد باستخدام + النموذج أدناه. + option_2: إذا كان لديك بالفعل حساب، يمكنك الدخول إلى حسابك باستخدام اسم المستخدم + وكلمة المرور الخاصة بك ومن ثم ربط الحساب باسم المستخدم الخاص بك في إعدادات + المستخدم. user_role: filter: not_an_administrator: يحق فقط للإداريين القيام بتغيير دور المستخدم، وأنت لست @@ -1737,6 +1996,8 @@ ar: heading: '%{block_on} عُرقل بواسطة %{block_by}' time_future: ينتهي في %{time} time_past: انتهى منذ %{time} + created: تم الإنشاء + ago: قبل %{time} status: الحالة show: اعرض edit: تعديل @@ -1747,22 +2008,79 @@ ar: revoker: 'المبطل:' needs_view: المستخدم يحتاج لتسجيل الدخول قبل أن يتم مسح هذه العرقلة. note: + description: + opened_at_html: تم الإنشاء قبل %{when} + opened_at_by_html: تم الإنشاء قبل %{when} بواسطة %{user} + commented_at_html: تم التحديث قبل %{when} + commented_at_by_html: تم التحديث قبل %{when} بواسطة %{user} + closed_at_html: تم الحل قبل %{when} + closed_at_by_html: تم الحل قبل %{when} بواسطة %{user} + reopened_at_html: تم التنشيط قبل %{when} + reopened_at_by_html: تم التنشيط قبل %{when} بواسطة %{user} + rss: + title: ملاحظات خريطة الشارع المفتوحة + opened: ملاحظة جديدة (بالقرب من %{place}) + commented: تعليق جديد (بالقرب من %{place}) + closed: مذكرة مغلقة (بالقرب من %{place}) + reopened: مذكرة منشطة (بالقرب من %{place}) entry: comment: تعليق full: ملاحظة كاملة + mine: + title: ملاحظات مقدمة أو علق عليها %{user} + heading: ملاحظات %{user} + subheading: ملاحظات مقدمة أو علق عليها %{user} + last_changed: أحدث تغيير javascripts: close: أغلق share: title: شارك cancel: ألغ image: صورة + link: وصلة أو HTML + long_link: وصلة + short_link: رابط قصير + geo_uri: يو آر إل جغرافي + custom_dimensions: تعيين المكونات المخصصة + format: 'التنسيق:' + scale: 'المقياس:' + download: نزل + include_marker: تتضمن علامة + paste_html: ألصق HTML لتضمينه في موقع ويب + view_larger_map: عرض خريطة بحجم أكبر + only_standard_layer: يمكن استيراد الطبقة القياسية فقط كصورة + embed: + report_problem: أبلغ عن مشكلة + key: + title: مفتاح الخريطة + tooltip: مفتاح الخريطة + tooltip_disabled: مفتاح الخريطة غير متاح لهذه الطبقة map: + zoom: + in: قرب + out: بعد + locate: + title: أظهر موقعي + popup: أنت ضمن {distance} {unit} من هذه النقطة base: cycle_map: خريطة للدراجات transport_map: خريطة تنقلات + hot: إنساني + layers: + header: طبقات الخريطة + data: بيانات الخريطة + overlays: تمكين طبقات لاستكشاف الخريطة + copyright: © <a href='%{copyright_url}'>مساهمو خريطة الشارع المفتوحة</a> + donate_link_text: <a class='donate-attr' href='%{donate_url}'>تقديم تبرع</a> site: edit_tooltip: عدّل الخريطة edit_disabled_tooltip: قم بالتكبير لتحرير الخريطة + createnote_tooltip: إضافة ملاحظة إلى الخريطة + createnote_disabled_tooltip: تكبير لإضافة ملاحظة إلى الخريطة + map_notes_zoom_in_tooltip: تكبير الخريطة لرؤية ملاحظات الخريطة + map_data_zoom_in_tooltip: تكبير الخريطة لرؤية بيانات الخريطة + queryfeature_tooltip: ميزات الاستعلام + queryfeature_disabled_tooltip: ميزات تكبير الاستعلام changesets: show: comment: التعليق @@ -1770,15 +2088,86 @@ ar: unsubscribe: إلغاء الاشتراك hide_comment: إخفاء unhide_comment: أظهر + notes: + show: + anonymous_warning: تتضمن هذه المذكرة تعليقات المستخدمين المجهولين التي ينبغي + التحقق منها بشكل مستقل. + reactivate: نشط + comment_and_resolve: تعليق وحل + comment: تعليق + edit_help: انقل الخريطة وكبر الموقع الذي تريد تحريره، ثم اضغط هنا. + directions: + engines: + graphhopper_bicycle: دراجة (GraphHopper) + graphhopper_foot: قدم (GraphHopper) + mapquest_bicycle: دراجة (MapQuest) + mapquest_car: سيارة (MapQuest) + mapquest_foot: قدم (MapQuest) + osrm_car: سيارة (OSRM) + mapzen_bicycle: دراجة (Mapzen) + mapzen_car: سيارة (Mapzen) + mapzen_foot: قدم (Mapzen) + directions: الاتجاهات + distance: المسافات + errors: + no_route: لا يمكن أن تجد طريقا بين هذين المكانين. + no_place: عذرا - لا يمكن أن تجد هذا المكان. + instructions: + continue_without_exit: الاستمرار في %{name} + slight_right_without_exit: اتجه إلى اليمين قليلا %{name} + offramp_right_without_exit: خذ الطريق المنحدرة إلى اليمين باتجاه %{name} + onramp_right_without_exit: اتجه يمينا على منحدر إلى %{name} + endofroad_right_without_exit: في نهاية الطريق انعطف يمينا إلى %{name} + merge_right_without_exit: انعطف يمينا إلى %{name} + fork_right_without_exit: عند التقاطع انعطف يمينا إلى %{name} + turn_right_without_exit: انعطف يمينا إلى %{name} + uturn_without_exit: انعطف على طول %{name} + turn_left_without_exit: انعطف يسارا إلى %{name} + offramp_left_without_exit: خذ الطريق المنحدرة إلى اليسار إلى %{name} + onramp_left_without_exit: انعطف يسارا على المنحدر إلى %{name} + endofroad_left_without_exit: في نهاية الطريق انعطف يسارا إلى %{name} + merge_left_without_exit: انعطف يسارا إلى %{name} + fork_left_without_exit: عند التقاطع انعطف يسارا إلى %{name} + slight_left_without_exit: اتجه إلى اليمين قليلا %{name} + via_point_without_exit: (نقطة وسيطة) + follow_without_exit: اتبع %{name} + leave_roundabout_without_exit: ترك الطريق الملتوية - %{name} + stay_roundabout_without_exit: البقاء في طريق ملتوية - %{name} + start_without_exit: ابدأ من نهاية %{name} + destination_without_exit: الوصول إلى الوجهة + against_oneway_without_exit: الذهاب عكس في طريق اتجاه واحد %{name} + end_oneway_without_exit: نهاية طريق اتجاه واحد %{name} + unnamed: طريق غير مسمى + query: + nothing_found: لم يتم إيجاد ميزات + error: 'خطأ في الاتصال %{server}: %{error}' + timeout: مهلة الاتصال %{server} redaction: edit: description: الوصف + submit: حفظ التنقيح + index: + empty: لا يوجد تنقيح لإظهاره. new: description: الوصف + heading: أدخل معلومات عن التنقيح الجديد + submit: إنشاء تنقيح + title: إنشاء تنقيح جديد show: description: 'الوصف:' + heading: عرض التنقيح "%{title}" + title: عرض التنقيح user: 'المنشئ:' + edit: تعديل هذا التنقيح + destroy: إزالة هذا التنقيح confirm: هل أنت متأكد؟ + create: + flash: تم إنشاء التنقيح. update: flash: تمّ حفظ التغييرات. + destroy: + not_empty: التنقيح ليس فارغا; يُرجَى إلغاء حجب جميع الإصدارات التي تنتمي إلى + هذا التنقيح قبل تدميره. + flash: التنقيح تم تدميره. + error: حدث خطأ في تدمير هذا التنقيح. ... diff --git a/config/locales/arz.yml b/config/locales/arz.yml index 0a74f4c34..f9a4e88ba 100644 --- a/config/locales/arz.yml +++ b/config/locales/arz.yml @@ -730,9 +730,7 @@ arz: primary: طريق رئيسي secondary: طريق ثانوي unclassified: طريق غير مصنّف - unsurfaced: طريق غير معبد track: مسار - byway: طريق فرعي bridleway: مسلك خيول cycleway: طريق دراجات footway: طريق مشاة @@ -753,7 +751,6 @@ arz: golf: ملعب غولف park: منتزه resident: منطقه سكنية - tourist: مزار سياحي common: - شائع - مرج diff --git a/config/locales/ast.yml b/config/locales/ast.yml index 8e8f13ae0..671d4a77c 100644 --- a/config/locales/ast.yml +++ b/config/locales/ast.yml @@ -1,6 +1,8 @@ # Messages for Asturian (asturianu) # Exported from translatewiki.net # Export driver: phpyaml +# Author: Enolp +# Author: Macofe # Author: Xuacu --- ast: @@ -10,7 +12,7 @@ ast: activerecord: models: acl: Llista de Control d'Accesu - changeset: Conxuntu de cambios + changeset: Conxuntu de cambeos changeset_tag: Etiqueta del conxuntu de cambeos country: País diary_comment: Comentariu del diariu @@ -157,6 +159,7 @@ ast: way: vía relation: rellación changeset: conxuntu de cambios + note: nota timeout: sorry: Sentímoslo, los datos pa %{type} con id %{id}, tardaron demasiao en descargase. type: @@ -164,6 +167,7 @@ ast: way: vía relation: rellación changeset: conxuntu de cambios + note: nota redacted: redaction: Redaición de %{id} message_html: La versión %{version} de %{type} nun se pue amosar porque ta redactada. @@ -250,6 +254,7 @@ ast: diary_entry: new: title: Nueva entrada del diariu + publish_button: Espublizar list: title: Diarios d'usuarios title_friends: Diarios de collacios @@ -1009,9 +1014,9 @@ ast: href="http://wiki.openstreetmap.org/wiki/Legal_FAQ">Entrugues y rempuestes llegales</a> (n'inglés) de la comunidá. more_2_html: |- Anque OpenStreetMap son datos abiertos, nun podemos ufrir una API de mapes de baldre pa desendolcadores d'aplicaciones pa terceros. - Llei la nuesa <a href="http://wiki.openstreetmap.org/wiki/API_usage_policy">Política d'usu de la API</a> (n'inglés), - <a href="http://wiki.openstreetmap.org/wiki/Tile_usage_policy">Política d'usu d'imaxes</a> (n'inglés) - y <a href="http://wiki.openstreetmap.org/wiki/Nominatim#Usage_Policy">Política d'usu de Nominatim</a> (n'inglés tamién). + Llei la nuesa <a href="https://operations.osmfoundation.org/policies/api/">Política d'usu de la API</a> (n'inglés), + <a href="https://operations.osmfoundation.org/policies/tiles/">Política d'usu del mosaicu</a> (n'inglés) + y <a href="https://operations.osmfoundation.org/policies/nominatim/">Política d'usu de Nominatim</a> (n'inglés tamién). contributors_title_html: Los nuesos collaboradores contributors_intro_html: 'Los nuesos collaboradores son miles de persones. Incluimos tamién datos con llicencia abierta d''axencies cartográfiques nacionales y @@ -1067,9 +1072,9 @@ ast: de retirada de datos</a> o pidilo direutamente nel nuesu <a href="http://dmca.openstreetmap.org/">formulariu en llinia</a>. trademarks_title_html: <span id="trademarks"></span>Marques rexistraes - trademarks_1_html: OpenStreetMap ya'l logotipu de la lente son marques rexistraes - de la Fundación OpenStreetMap. Si tienes entrugues tocante al to usu de les - marques, mándales al <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">grupu + trademarks_1_html: OpenStreetMap ,el logotipu de la lente y Estáu del Mapa son + marques rexistraes de la Fundación OpenStreetMap. Si tienes entrugues tocante + al usu de les marques, mándales al <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">grupu de trabayu sobro llicencies</a>. welcome_page: title: ¡Bienveníu! @@ -1182,7 +1187,7 @@ ast: about_page: next: Siguiente copyright_html: <span>©</span> Collaboradores<br>d'OpenStreetMap - used_by: '%{name} proporciona datos de mapes a cientos de sitios web, aplicaciones + used_by: '%{name} proporciona datos de mapes a milenta sitios web, aplicaciones pa móviles, y preseos de hardware' lede_text: OpenStreetMap ta construíu por una comunidá de cartógrafos que contribuyen y caltienen datos de carreteres, senderos, cafeteríes, estaciones de ferrocarril, @@ -1204,16 +1209,19 @@ ast: legal_title: Llegal legal_html: "Esti sitiu y munchos otros servicios rellacionaos xestiónalos formalmente la \n<a href='http://osmfoundation.org/'>Fundación OpenStreetMap</a> (OSMF) - \nnel nome de la comunidá.\n<br> \n<a href='http://osmfoundation.org/Contact'>Comunícate + \nnel nome de la comunidá. L'usu de tolos servicios remanaos pola OSMF tán suxetos + les nueses <a href=\"http://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy\">polítiques + d'usu aceptable</a> y la nuesa <a href=\"http://wiki.osmfoundation.org/wiki/Privacy_Policy\">política + de privacidá</a>\n<br> \n<a href='http://osmfoundation.org/Contact'>Comunícate cola OSMF</a> \nsi tienes entrugues o problemes relativos a les llicencies, drechos d'autor u otru tema llegal." partners_title: Asociaos notifier: diary_comment_notification: - subject: '[OpenStreetMap] %{user} comentó na to entrada del diariu' + subject: '[OpenStreetMap] %{user} comentó n''una entrada del diariu' hi: Bones %{to_user}, - header: '%{from_user} comentó na to entrada reciente del diariu d''OpenStreetMap - col asuntu %{subject}:' + header: '%{from_user} comentó na entrada del diariu d''OpenStreetMap col asuntu + %{subject}:' footer: Tamién pues lleer el comentariu en %{readurl}, y comentalu en %{commenturl} o contestar en %{replyurl} message_notification: @@ -1432,15 +1440,17 @@ ast: table: entry: motorway: Autopista + main_road: Carretera principal trunk: Carretera nacional primary: Carretera primaria secondary: Carretera secundaria unclassified: Carretera ensin clasificar - unsurfaced: Carretera ensin asfaltar track: Pista - byway: Camín bridleway: Caleya cycleway: Carril bici + cycleway_national: Carril bici nacional + cycleway_regional: Carril bici rexonal + cycleway_local: Carril bici llocal footway: Camín peatonal rail: Ferrocarril subway: Metro @@ -1462,7 +1472,6 @@ ast: golf: Campu de golf park: Parque resident: Área residencial - tourist: Atracción turística common: - Espaciu comunal - prau @@ -1492,9 +1501,11 @@ ast: tunnel: Borde de rayes = túnel bridge: Borde prietu = ponte private: Accesu priváu - permissive: Accesu permisivu destination: Accesu pa destín construction: Carreteres en construcción + bicycle_shop: Tienda de bicicletes + bicycle_parking: Aparcamientu de bicicletes + toilets: Servicios richtext_area: edit: Editar preview: Vista previa @@ -1653,6 +1664,7 @@ ast: allow_read_gpx: lleer les tos traces GPS privaes. allow_write_gpx: xubir traces GPS. allow_write_notes: camudar notes. + grant_access: Permitir accesu oauthorize_success: title: Solicitú d'autorización permitida allowed: Permitió que l'aplicación %{app_name} tenga accesu a la so cuenta. @@ -1763,6 +1775,12 @@ ast: windowslive: title: Anicia sesión con Windows Live alt: Anicia sesión con una cuenta de Windows Live + github: + title: Aniciar sesión con GitHub + alt: Aniciar sesión con una cuenta de GitHub + wikipedia: + title: Aniciar sesión con Wikipedia + alt: Aniciar sesión con una cuenta de Wikipedia yahoo: title: Aniciar sesión con Yahoo alt: Aniciar sesión con una OpenID de Yahoo @@ -1798,9 +1816,9 @@ ast: title: Date d'alta no_auto_account_create: Por desgracia anguaño nun podemos crear una cuenta por ti automáticamente. - contact_webmaster: Ponte en contautu col <a href="mailto:webmaster@openstreetmap.org">webmaster</a> - p'arreglar la creación d'una cuenta - procuraremos xestionar la solicitú lo - más aína que podamos. + contact_webmaster: Comunícate col <a href="%{webmaster}">webmaster</a> p'arreglar + la creación d'una cuenta - procuraremos xestionar la solicitú lo más aína + que podamos. about: header: Llibre y editable html: |- @@ -1811,9 +1829,9 @@ ast: de collaboración</a>. email address: 'Direición de corréu electrónicu:' confirm email address: 'Confirmar direición de corréu:' - not displayed publicly: Nun s'amuesa en público (ver la <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" - title="política de protección de datos na wiki, qu'incluye una seición sobro - direiciones de corréu">política de protección de datos</a>) + not displayed publicly: La to direición nun s'amuesa en público, ver la <a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy" + title="política de protección de datos de la OSMF, qu'incluye una seición + sobro direiciones de corréu">política de protección de datos</a> pa más información display name: 'Nome a amosar:' display name description: El nome d'usuariu que s'amuesa en público. Pue camudalo más sero nes preferencies. @@ -1823,16 +1841,6 @@ ast: use external auth: Alternativamente, usa un terceru p'aniciar sesión auth no password: Cola autenticación con un terceru nun fai falta una contraseña, pero delles ferramientes estra o sirvidores inda puen necesitala. - auth association: |- - <p>La to ID inda nun ta asociada con una cuenta d'OpenStreetMap.</p> - <ul> - <li>Si yes nuevu n'OpenStreetMap, crea una cuenta nueva usando'l formulariu de más abaxo.</li> - <li> - Si yá tienes una cuenta, pues aniciar sesión con ella usando'l to - nome d'usuariu y contraseña y llueu asociar la cuenta cola - to ID na configuración d'usuariu. - </li> - </ul> continue: Date d'alta terms accepted: ¡Gracies por aceutar les condiciones de collaboración! terms declined: Sentimos que decidieras nun aceutar les Condiciones de Collaborador. @@ -1862,6 +1870,7 @@ ast: heading: L'usuariu %{user} nun esiste body: Lo siento, nun hai dengún usuariu col nome %{user}. Comprueba la escritura o si calcasti nun enllaz enquivocáu. + deleted: desaniciao view: my diary: El mio diariu new diary entry: nueva entrada del diariu @@ -1913,16 +1922,16 @@ ast: revoke: administrator: Quitar accesu d'alministrador moderator: Quitar accesu de moderador - block_history: bloqueos recibíos - moderator_history: bloqueos puestos + block_history: Bloqueos activos + moderator_history: Bloqueos puestos comments: Comentarios - create_block: bloquiar esti usuariu - activate_user: activar esti usuariu - deactivate_user: desactivar esti usuariu - confirm_user: confirmar esti usuariu - hide_user: anubrir esti usuariu - unhide_user: amosar esti usuariu - delete_user: desaniciar esti usuariu + create_block: Bloquiar esti usuariu + activate_user: Activar esti usuariu + deactivate_user: Desactivar esti usuariu + confirm_user: Confirmar esti usuariu + hide_user: Anubrir esti usuariu + unhide_user: Amosar esti usuariu + delete_user: Desaniciar esti usuariu confirm: Confirmar friends_changesets: conxuntos de cambios de los amigos friends_diaries: entraes de diariu de los amigos @@ -1977,6 +1986,8 @@ ast: gravatar: Usar Gravatar link: http://wiki.openstreetmap.org/wiki/Gravatar link text: ¿qué ye esto? + disabled: Desactivóse Gravatar. + enabled: Activóse la vista del to Gravatar. new image: Amestar una imaxe keep image: Mantener la imaxe actual delete image: Desaniciar la imaxe actual @@ -2011,8 +2022,8 @@ ast: success: Venimos d'unviar un nuevu corréu de confirmación a %{email} y darréu de confirmar la to cuenta tarás preparáu pa mapear. <br /><br />Si uses un sistema escontra'l corréu puxarra qu'unvia solicitúes de confirmación, asegúrate - d'amestar webmaster@openstreetmap.org na llista blanca de remitentes seguros, - porque nós nun podemos responder solicitúes de confirmación. + d'amestar %{sender} na llista blanca de remitentes seguros, porque nós nun + podemos responder solicitúes de confirmación. failure: Nun s'alcontró l'usuariu %{name}. confirm_email: heading: Confirmar el cambiu de direición de corréu electrónicu @@ -2070,6 +2081,15 @@ ast: no_authorization_code: Nun hai códigu d'autorización unknown_signature_algorithm: Algoritmu de firma desconocíu invalid_scope: Ámbitu inválidu + auth_association: + heading: La to ID inda nun ta asociada con una cuenta d'OpenStreetMap. + option_1: |- + Si yes nuevu n'OpenStreetMap, crea una cuenta nueva + usando'l formulariu de más abaxo. + option_2: |- + Si yá tienes una cuenta, puedes aniciar sesión nella + usando'l to nome d'usuariu y contraseña y llueu asociar + la cuenta cola ID nes preferencies d'usuariu. user_role: filter: not_an_administrator: Namái los alministradores pueden xestionar los roles, @@ -2247,10 +2267,13 @@ ast: center_marker: Centrar el mapa na marca paste_html: Pegar el HTML pa empotrar nun sitiu web view_larger_map: Ver mapa mayor + only_standard_layer: Sólo la capa estándar puede esportase como imaxen + embed: + report_problem: Informar d'un problema key: title: Clave del mapa tooltip: Clave del mapa - tooltip_disabled: Lleenda del Mapa disponible sólo pa la capa estándar + tooltip_disabled: La lleenda del mapa nun ta disponible nesta capa map: zoom: in: Ampliar @@ -2262,12 +2285,12 @@ ast: standard: Estándar cycle_map: Mapa ciclista transport_map: Mapa de tresportes - mapquest: MapQuest Open hot: Humanitariu layers: header: Capes del mapa notes: Notes de mapa data: Datos del mapa + gps: Traces GPS públiques overlays: Activar les superposiciones pa diagnosticar el mapa title: Capes copyright: © <a href='%{copyright_url}'>collaboradores d'OpenStreetMap</a> @@ -2312,6 +2335,9 @@ ast: mapquest_car: Coche (MapQuest) mapquest_foot: A pie (MapQuest) osrm_car: En coche (OSRM) + mapzen_bicycle: En bicicleta (Mapzen) + mapzen_car: En coche (Mapzen) + mapzen_foot: A pie (Mapzen) directions: Indicaciones distance: Distancia errors: @@ -2320,11 +2346,23 @@ ast: instructions: continue_without_exit: Siguir en %{name} slight_right_without_exit: Llixeramente a la drecha haza %{name} + offramp_right_without_exit: Cueye la rampla a la drecha haza %{name} + onramp_right_without_exit: Xira a la drecha na rampla haza %{name} + endofroad_right_without_exit: Al final de la carretera xira a la drecha haza + %{name} + merge_right_without_exit: Xúnite a la drecha haza %{name} + fork_right_without_exit: Nel biforcu xira a la drecha haza %{name} turn_right_without_exit: Xira a la drecha haza %{name} sharp_right_without_exit: Fuerte a la drecha haza %{name} uturn_without_exit: Cambiu de sentíu en %{name} sharp_left_without_exit: Fuerte a la izquierda haza %{name} turn_left_without_exit: Xira a la izquierda haza %{name} + offramp_left_without_exit: Cueye la rampla a la izquierda haza %{name} + onramp_left_without_exit: Xira a la izquierda na rampla haza %{name} + endofroad_left_without_exit: Al final de la carretera xira a la izquierda + haza %{name} + merge_left_without_exit: Xúnite a la izquierda haza %{name} + fork_left_without_exit: Nel biforcu xira a la izquierda haza %{name} slight_left_without_exit: Llixeramente a la izquierda haza %{name} via_point_without_exit: (pel puntu) follow_without_exit: Siguir %{name} @@ -2336,6 +2374,11 @@ ast: against_oneway_without_exit: Dir escontra direición per %{name} end_oneway_without_exit: Final de sentíu únicu en %{name} roundabout_with_exit: Na rotonda coyer la salida %{exit} haza %{name} + turn_left_with_exit: Na rotonda xira a la izquierda haza %{name} + slight_left_with_exit: Na rotonda xira llixeramente a la izquierda haza %{name} + turn_right_with_exit: Na rotonda xira a la derecha haza %{name} + slight_right_with_exit: Na rotonda xira llixeramente a la derecha haza %{name} + continue_with_exit: Na rotonda siguir de frente haza %{name} unnamed: ensin nome courtesy: Direiciones cortesía de %{link} time: Tiempu diff --git a/config/locales/az.yml b/config/locales/az.yml index b1cdf39f8..5345f315d 100644 --- a/config/locales/az.yml +++ b/config/locales/az.yml @@ -53,7 +53,7 @@ az: body: Mətn diary_entry: user: Ä°stifadəçi - title: Başlıq + title: Mövzu latitude: En dairəsi longitude: Uzunluq dairəsi language: Dil @@ -71,7 +71,7 @@ az: description: Ä°zah message: sender: Göndərən - title: Başlıq + title: Mövzu body: Mətn recipient: Qəbul edən user: @@ -93,8 +93,10 @@ az: name: Uzaqdan idarəetmə description: Uzaqdan idarəetmə (JOSM və ya Merkaartor) browse: + download_xml: XML endir changeset: title: Dəyişikliklər dəsti + belongs_to: Müəllif changesetxml: XML dəyişikliklər dəsti osmchangexml: osmChange XML feed: @@ -773,7 +775,7 @@ az: attribution_example: alt: Nümunə üçün, veb-səhifədən OpenStreetMap-ə necə istinad vermək title: Müəllifin göstərilməsinin nümunəsi - more_title_html: Daha çox öyrən + more_title_html: Daha ətraflı öyrən contributors_title_html: Kimlər bizim layihəyə töhfə verir contributors_ca_html: <strong>Kanada</strong> GeoBase ®, GeoGratis (© Kanadanın Təbii Ehtiyatlar Departamenti), CanVec (© Kanadanın Təbii Ehtiyatlar Departamenti) @@ -901,7 +903,6 @@ az: primary: Birinci dərəcəli yol secondary: Ä°kici dərəcəli yol unclassified: Təsnifatsız yol - unsurfaced: Torpaq yol track: Cığır footway: Piyada yolu rail: Dəmir yolu @@ -916,7 +917,6 @@ az: forest: Meşə park: Park resident: Yaşayış sahəsi - tourist: Turist attraksionu common: 1: çəmənlik retail: Ticarət sahəsi @@ -939,7 +939,6 @@ az: - Zirvə - pik private: Xüsusi giriş - permissive: Açıq giriş richtext_area: preview: Sınaq görüntüsü markdown_help: diff --git a/config/locales/be-Tarask.yml b/config/locales/be-Tarask.yml index 5f4a2a1d4..6916b98cf 100644 --- a/config/locales/be-Tarask.yml +++ b/config/locales/be-Tarask.yml @@ -3,6 +3,7 @@ # Export driver: phpyaml # Author: EugeneZelenko # Author: Jim-by +# Author: Macofe # Author: Red Winged Duck # Author: Renessaince # Author: Wizardist @@ -97,12 +98,14 @@ be-Tarask: created: Створана closed: Закрытае changeset: - title: Набор зьменаў + title: 'Набор зьменаў: %{id}' changesetxml: Набор зьменаў у фармаце XML osmchangexml: osmChange XML feed: title: Набор зьменаў %{id} title_comment: Набор зьменаў %{id} - %{comment} + way: + nodes: Вузлы relation_member: entry_role: '%{type} %{name} як %{role}' type: @@ -113,7 +116,7 @@ be-Tarask: entry: Адносіны %{relation_name} entry_role: Адносіны %{relation_name} (як %{relation_role}) not_found: - sorry: Прабачце, %{type} з ідэнтыфікатарам %{id} ня знойдзены. + sorry: Прабачце, %{type} № %{id} ня знойдзены. type: node: вузел way: шлях @@ -139,13 +142,13 @@ be-Tarask: load_data: Загрузіць зьвесткі loading: Загрузка… tag_details: - tags: 'Меткі:' + tags: Меткі wiki_link: key: Старонка вікі, якая апісвае тэг %{key} tag: Старонка вікі, якая апісвае тэг %{key}=%{value} wikipedia_link: Артыкул %{page} у Вікіпэдыі note: - title: Нататка + title: 'Нататка: %{id}' changeset: changeset_paging_nav: showing_page: Старонка %{page} @@ -408,7 +411,7 @@ be-Tarask: archaeological_site: Археалягічныя раскопкі battlefield: Поле гістарычнай бойкі boundary_stone: Памежны камень - building: Будынак + building: Гістарычны будынак castle: Замак church: Царква citywalls: Мескія муры @@ -560,7 +563,7 @@ be-Tarask: preserved: Закансэрваваная чыгуначная каляя spur: Чыгуначнае разгалінаваньне station: Чыгуначная станцыя - subway: Станцыя мэтро + subway: Мэтро subway_entrance: Уваход у мэтро switch: Чыгуначная стрэлка tram: Трамвайная каляя @@ -688,11 +691,11 @@ be-Tarask: layouts: logo: alt_text: Лягатып OpenStreetMap - home: дамоў - logout: выйсьці - log_in: увайсьці + home: Перайсьці дамоў + logout: Выйсьці + log_in: Увайсьці log_in_tooltip: Увайсьці з існуючым рахункам - sign_up: зарэгістравацца + sign_up: Зарэгістравацца sign_up_tooltip: Стварыць рахунак для рэдагаваньня edit: Рэдагаваць history: Гісторыя @@ -713,7 +716,7 @@ be-Tarask: для чытаньня, таму што праводзяцца неабходныя тэхнічныя работы. donate: Падтрымайце OpenStreetMap %{link} у фонд абнаўленьня абсталяваньня. help: Дапамога - copyright: Аўтарскія правы і ліцэнзія + copyright: Аўтарскія правы community_blogs: Блёгі супольнасьці community_blogs_title: Блёгі чальцоў супольнасьці OpenStreetMap foundation: Фундацыя @@ -737,24 +740,18 @@ be-Tarask: legal_babble: title_html: Аўтарскія правы і ліцэнзія intro_1_html: |- - OpenStreetMap is <i>open data</i>, licensed under the <a - href="http://opendatacommons.org/licenses/odbl/">Open Data - Commons Open Database License</a> (ODbL). - intro_2_html: |- - Вы можаце капіяваць, распаўсюджваць, перадаваць і зьмяняць нашыя мапы - і зьвесткі, да той пары, пакуль Вы спасылаецеся на OpenStreetMap і яе - ўдзельнікаў. Калі Вы зьмяняеце ці выкарыстоўваеце нашыя мапы і зьвесткі, Вы можаце - распаўсюджваць вынікі толькі на ўмовах такой жа ліцэнзіі. Поўны тэкст ліцэнзіі - <a - href="http://creativecommons.org/licenses/by-sa/2.0/legalcode">legal - code</a> растлумачыць Вам правы і адказнасьці. + OpenStreetMap<sup><a href="#trademarks">®</a></sup> — <i>вольныя зьвесткі</i>, ліцэнзаваныя паводле <a + href="http://opendatacommons.org/licenses/odbl/">ліцэнзіі Адкрытых баз зьвестак Адкрытых агульных зьвестак</a> (ODbL) <a + href="http://osmfoundation.org/">Фундацыяй OpenStreetMap Foundation</a> (OSMF). + intro_2_html: Вы можаце капіяваць, распаўсюджваць, перадаваць і зьмяняць нашыя + зьвесткі да той пары, пакуль Вы спасылаецеся на OpenStreetMap і яе ўдзельнікаў. + Калі Вы зьмяняеце ці выкарыстоўваеце нашыя зьвесткі, Вы можаце распаўсюджваць + вынікі толькі на ўмовах такой жа ліцэнзіі. Поўны <a href="http://opendatacommons.org/licenses/odbl/1.0/">тэкст + ліцэнзіі</a> растлумачыць Вам правы і адказнасьці. credit_title_html: Як спасылацца на OpenStreetMap credit_1_html: |- - Калі Вы выкарыстоўваеце выявы мапаў OpenStreetMap, мы патрабуем, каб - Вы рабілі спасылку хаця б “© удзельнікі OpenStreetMap - , CC BY-SA”. Калі Вы выкарыстоўваеце толькі картаграфічныя зьвесткі, - мы патрабуем наяўнасьць “Картаграфічныя зьвесткі © Удзельнікі OpenStreetMap, - CC BY-SA”. + Мы патрабуем, каб + Вы пазначалі “© удзельнікі OpenStreetMap”. credit_2_html: |- Дзе магчыма, павінна быць гіпэр-спасылка на OpenStreetMap <a href="http://www.openstreetmap.org/">http://www.openstreetmap.org/</a> @@ -767,8 +764,8 @@ be-Tarask: www.creativecommons.org. more_title_html: Даведацца болей more_1_html: |- - Даведайцеся болей пра выкарыстаньне нашых зьвестак на <a - href="http://wiki.openstreetmap.org/wiki/Legal_FAQ">старонцы адказаў + Даведайцеся болей пра выкарыстаньне нашых зьвестак і пра спасыланьне на нас на <a + href="http://osmfoundation.org/Licence">старонцы ліцэнзіі OSMF</a> і <a href="http://wiki.openstreetmap.org/wiki/Legal_FAQ">старонцы адказаў і пытаньняў</a>. more_2_html: |- Удзельнікі OSM павінны памятаць пра тое, што забаронена дадаваць зьвесткі @@ -871,14 +868,12 @@ be-Tarask: outbox: зыходзячыя messages: Вы маеце %{new_messages} і %{old_messages} new_messages: - few: '%{count} новыя паведамленьні' - many: '%{count} новых паведамленьняў' one: '%{count} новае паведамленьне' + few: '%{count} новыя паведамленьні' other: '%{count} новых паведамленьняў' old_messages: - few: '%{count} старыя паведамленьня' - many: '%{count} старых паведамленьняў' one: '%{count} старое паведамленьне' + few: '%{count} старыя паведамленьні' other: '%{count} старых паведамленьняў' from: Ад subject: Тэма @@ -910,9 +905,8 @@ be-Tarask: inbox: уваходзячыя outbox: зыходзячыя messages: - few: Вы маеце %{count} дасланыя паведамленьня - many: Вы маеце %{count} дасланых паведамленьняў one: Вы маеце %{count} дасланае паведамленьне + few: Вы маеце %{count} дасланыя паведамленьні other: Вы маеце %{count} дасланых паведамленьняў to: Да subject: Тэма @@ -985,9 +979,7 @@ be-Tarask: primary: Галоўная дарога secondary: Другасная дарога unclassified: Дарога раённага значэньня - unsurfaced: Дарога без пакрыцьця track: Грунтовая дарога - byway: Завулак bridleway: Дарога для коней cycleway: Роварная дарога footway: Пешаходная дарога @@ -1011,7 +1003,6 @@ be-Tarask: golf: Поле для гольфу park: Парк resident: Жылы раён - tourist: Славутасьць common: - Грамадзкая зямля - луг @@ -1041,7 +1032,6 @@ be-Tarask: tunnel: Пункцір = тунэль bridge: Чорная лінія = мост private: Прыватны доступ - permissive: Доступ па дазволах destination: Мэтавы доступ construction: Будаўніцтва дарогаў richtext_area: @@ -1098,9 +1088,16 @@ be-Tarask: upload_trace: Загрузіць трэк see_all_traces: Паказаць усе трэкі see_your_traces: Паказаць усе Вашыя трэкі - traces_waiting: У Вас %{count} трэкаў, якія чакаюць загрузкі. Калі ласка, пачакайце - сканчэньня перадачы гэтых трэкаў, перад тым як загружаць іншыя, гэта дазволіць - не блякаваць чаргу для іншых удзельнікаў. + traces_waiting: + one: Вы маеце %{count} трэк, які чакае загрузкі. Калі ласка, пачакайце сканчэньня + перадачы гэтага трэку перад тым, як загружаць іншыя, гэта дазволіць не блякаваць + чаргу для іншых удзельнікаў. + few: Вы маеце %{count} трэкі, якія чакаюць загрузкі. Калі ласка, пачакайце + сканчэньня перадачы гэтых трэкаў перад тым, як загружаць іншыя, гэта дазволіць + не блякаваць чаргу для іншых удзельнікаў. + other: Вы маеце %{count} трэкаў, якія чакаюць загрузкі. Калі ласка, пачакайце + сканчэньня перадачы гэтых трэкаў перад тым, як загружаць іншыя, гэта дазволіць + не блякаваць чаргу для іншых удзельнікаў. trace_optionals: tags: Тэгі view: @@ -1123,7 +1120,7 @@ be-Tarask: trace_not_found: Трэк ня знойдзены! visibility: 'Бачнасьць:' trace_paging_nav: - showing_page: Паказаная старонка %{page} + showing_page: Старонка %{page} trace: pending: ЧАКАЕ count_points: '%{count} пунктаў' @@ -1192,8 +1189,7 @@ be-Tarask: url: 'URL-адрас ключа запыту:' access_url: 'URL-адрас ключа доступу:' authorize_url: 'URL-адрас аўтарызацыі:' - support_notice: Мы падтрымліваем HMAC-SHA1 (рэкамэндуецца) і звычайны тэкст - у SSL-рэжыме. + support_notice: Мы падтрымліваем HMAC-SHA1 (рэкамэндуецца) і подпісы RSA-SHA1. edit: Рэдагаваць падрабязнасьці requests: 'Запыт наступных дазволаў ад удзельніка:' allow_read_prefs: чытаць іх налады ўдзельніка. @@ -1286,10 +1282,10 @@ be-Tarask: flash changed: Ваш пароль быў зьменены. flash token bad: Немагчыма знайсьці такі ключ, можа праверце URL-адрас? new: - title: Стварыць рахунак + title: Зарэгістравацца no_auto_account_create: На жаль, мы зараз ня можам стварыць для Вас рахунак аўтаматычна. - contact_webmaster: Калі ласка, зьвяжыцеся з <a href="mailto:webmaster@openstreetmap.org">вэбмайстрам</a> + contact_webmaster: Калі ласка, зьвяжыцеся з <a href="%{webmaster}">вэбмайстрам</a> з запытам на стварэньне падобнага рахунку. Мы паспрабуем стварыць Вам рахунак як мага хутчэй. license_agreement: Калі Вы пацьвердзіце Ваш рахунак, Вам трэба будзе пагадзіцца @@ -1346,10 +1342,10 @@ be-Tarask: blocks by me: заблякаваныя мной send message: даслаць паведамленьне diary: дзёньнік - edits: рэдагаваньні - traces: трэкі - remove as friend: выдаліць зь сяброў - add as friend: дадаць у сябры + edits: Рэдагаваньні + traces: Трэкі + remove as friend: Выдаліць зь сяброў + add as friend: Дадаць у сябры mapper since: 'Стварае мапы з:' ago: (%{time_in_words_ago} таму) ct status: 'Умовы супрацоўніцтва:' @@ -1460,27 +1456,26 @@ be-Tarask: электроннай пошты. flash update success: Зьвесткі пра карыстальніка пасьпяхова абноўленыя. confirm: - heading: Пацьверджаньне рахунку + heading: Праверце электронную пошту! press confirm button: Націсьніце кнопку «Пацьвердзіць» для актывацыі Вашага рахунку. button: Пацьвердзіць success: Ваш рахунак пацьверджаны, дзякуй за рэгістрацыю! already active: Гэты рахунак ужо пацьверджаны. - unknown token: Выглядае, што гэты ключ не існуе. + unknown token: Гэты код пацьверджаньня скончыўся альбо не існуе. confirm_resend: success: Мы даслалі новы ліст з пацьверджаньнем на адрас %{email} і, як толькі Вы пацьвердзіце Ваш рахунак, Вы зможаце пачаць працаваць з мапамі.<br /><br />Калі Вы карыстаецеся сыстэмай абароны ад спаму, якая дасылае запыты на пацьверджаньне, - калі ласка, упэўніцеся, што адрас webmaster@openstreetmap.org знаходзіцца - ў Вашым давераным сьпісе, таму што мы ня маем магчымасьці адказваць на любыя - запыты. + калі ласка, упэўніцеся, што адрас %{sender} знаходзіцца ў Вашым давераным + сьпісе, таму што мы ня маем магчымасьці адказваць на любыя запыты. failure: Удзельнік %{name} ня знойдзены. confirm_email: heading: Пацьвердзіць зьмену адрасу электроннай пошты press confirm button: Націсьніце кнопку пацьверджаньня ніжэй, каб пацьвердзіць Ваш новы адрас электроннай пошты. button: Пацьвердзіць - success: Ваш адрас электроннай пошты пацьверджаны, дзякуй за рэгістрацыю! + success: Зьмена Вашага адрасу электроннай пошты пацьверджаная! failure: Адрас электроннай пошты ужо быў пацьверджаны гэтым ключом. set_home: flash success: Вашае месцазнаходжаньне пасьпяхова захаванае @@ -1488,7 +1483,7 @@ be-Tarask: flash success: Усе Вашыя рэдагаваньні цяпер публічныя, і цяпер Вам дазволена рэдагаваньне. make_friend: - success: Цяпер %{name} — Ваш сябар. + success: Цяпер %{name} — Ваш сябар! failed: Прабачце, немагчыма дадаць %{name} да сьпісу сяброў. already_a_friend: Вы ўжо сябруеце з %{name}. remove_friend: @@ -1501,8 +1496,8 @@ be-Tarask: title: Удзельнікі heading: Карыстальнікі showing: - one: Паказаная старонка %{page} з (%{first_item} %{items}) - other: Паказаныя старонкі %{page} (%{first_item}-%{last_item} з %{items}) + one: Старонка %{page} (%{first_item} з %{items}) + other: Старонкі %{page} (%{first_item}—%{last_item} з %{items}) summary: '%{name} створаны з %{ip_address}, %{date}' summary_no_ip: '%{name} створаны %{date}' confirm: Пацьвердзіць выбраных карыстальнікаў @@ -1601,9 +1596,8 @@ be-Tarask: revoke: Адклікаць! flash: Гэтае блякаваньне было адкліканае. period: - few: '%{count} гадзіны' - many: '%{count} гадзінаў' one: '%{count} гадзіна' + few: '%{count} гадзіны' other: '%{count} гадзінаў' partial: show: Паказаць diff --git a/config/locales/be.yml b/config/locales/be.yml index f99b80ec8..f9619c73e 100644 --- a/config/locales/be.yml +++ b/config/locales/be.yml @@ -4,6 +4,8 @@ # Author: Alex73 # Author: Goshaproject # Author: Jim-by +# Author: Macofe +# Author: Mechanizatar # Author: Unomano # Author: Дзяніс Тутэйшы # Author: Тест @@ -24,29 +26,29 @@ be: friend: Сябар language: Мова message: Паведамленне - node: Вузел - node_tag: Тэг вузла + node: Пункт + node_tag: Тэг пункта notifier: Абвяшчэнне - old_node: Стары вузел - old_node_tag: Стары тэг вузла - old_relation: Старыя адносіны - old_relation_member: Стары ўдзельнік сувязі - old_relation_tag: Стары тэг адносін + old_node: Стары пункт + old_node_tag: Стары тэг пункта + old_relation: Старое дачыненне + old_relation_member: Стары ўдзельнік дачынення + old_relation_tag: Стары тэг дачынення old_way: Старая лінія - old_way_node: Стары вузел лініі + old_way_node: Стары пункт лініі old_way_tag: Стары тэг лініі - relation: Адносіны - relation_member: Удзельнік сувязі - relation_tag: Тэг адносін + relation: Дачыненне + relation_member: Удзельнік дачынення + relation_tag: Тэг дачынення session: Сеанс trace: След - tracepoint: Кропка следу + tracepoint: Пункт следу tracetag: Тэг следу user: Карыстальнік user_preference: Налады карыстальніка user_token: Токен карыстальніка way: Лінія - way_node: Вузел лініі + way_node: Пункт лініі way_tag: Тэг лініі attributes: diary_comment: @@ -67,7 +69,7 @@ be: size: Памер latitude: Шырата longitude: Даўгата - public: Публічны + public: Агульны description: Апісанне message: sender: Ад @@ -116,12 +118,12 @@ be: changeset: title: 'Набор змен: %{id}' belongs_to: Аўтар - node: Вузлы (%{count}) - node_paginated: Вузлы (%{x}-%{y} з %{count}) - way: Крывыя (%{count}) + node: Пункты (%{count}) + node_paginated: Пункты (%{x}-%{y} з %{count}) + way: Лініі (%{count}) way_paginated: Лініі (%{x}-%{y} з %{count}) - relation: Адносіны (%{count}) - relation_paginated: Сувязі (%{x}-%{y} з %{count}) + relation: Дачыненні (%{count}) + relation_paginated: Дачыненні (%{x}-%{y} з %{count}) comment: Каментары (%{count}) hidden_commented_by: Схаваны каментар ад %{user} <abbr title='%{exact_time}'>%{when} таму</abbr> @@ -134,51 +136,53 @@ be: join_discussion: Увайдзіце ў сістэму, каб далучыцца да абмеркавання discussion: Абмеркаванне node: - title: 'Вузел: %{name}' - history_title: 'Гісторыя вузла: %{name}' + title: 'Пункт: %{name}' + history_title: 'Гісторыя пункта: %{name}' way: title: 'Лінія: %{name}' - history_title: 'Гісторыя крывой: %{name}' - nodes: Вузлы + history_title: 'Гісторыя лініі: %{name}' + nodes: Пункты also_part_of: - one: з'яўляецца часткай крывой %{related_ways} - other: з'яўляецца часткай крывых % {related_ways} + one: частка лініі %{related_ways} + other: частка ліній %{related_ways} relation: - title: 'Адносіны: %{name}' - history_title: 'Гісторыя сувязі: %{name}' + title: 'Дачыненне: %{name}' + history_title: 'Гісторыя дачынення: %{name}' members: Удзельнікі relation_member: entry_role: '%{type} %{name} як %{role}' type: - node: Вузел + node: Пункт way: Лінія - relation: Адносіны + relation: Дачыненне containing_relation: - entry: Адносіны %{relation_name} - entry_role: Адносіны %{relation_name} (як %{relation_role}) + entry: Дачыненне %{relation_name} + entry_role: Дачыненне %{relation_name} (як %{relation_role}) not_found: sorry: Прабачце, %{type} з нумарам %{id} не знойдзены. type: - node: вузел + node: пункт way: лінія - relation: адносіны + relation: дачыненне changeset: набор змен + note: заўвага timeout: sorry: Прабачце, дадзеныя для %{type} з ідэнтыфікатарам %{id} занадта доўгія для атрымання. type: - node: вузел + node: пункт way: лінія - relation: адносіны + relation: дачыненне changeset: набор змен + note: заўвага redacted: redaction: Рэдакцыя %{id} - message_html: Версія %{version} гэтага %{type} не можа быць паказаная, бо яна + message_html: Версія %{version} гэтай %{type} не можа быць паказаная, бо яна была адрэдагаваная. Глядзіце %{redaction_link} для падрабязнасцяў. type: - node: вузел + node: пункт way: лінія - relation: адносіны + relation: дачыненне start_rjs: feature_warning: Неабходна загрузіць %{num_features} аб'ектаў, што можа запаволіць ваш браўзэр. Вы ўпэўнены, што жадаеце праглядзець гэтыя дадзеныя? @@ -257,14 +261,15 @@ be: diary_entry: new: title: Новы запіс дзённіку + publish_button: Апублікаваць list: title: Дзённікі карыстальнікаў - title_friends: Дзеннікі сяброў + title_friends: Дзённікі сяброў title_nearby: Дзённікі карыстальнікаў паблізу user_title: Дзённік %{user} in_language_title: Дзённік запісаў у %{language} new: Новы запіс дзённіку - new_title: Новы запіс для вашага дзённіку + new_title: Напісаць у вашым дзённіку no_entries: Няма запісаў recent_entries: Нядаўнія запісы ў дзённіку older_entries: Старэйшыя запісы @@ -272,7 +277,7 @@ be: edit: title: Правіць запіс у дзённіку subject: 'Тэма:' - body: 'Цела:' + body: 'Змест:' language: 'Мова:' location: 'Месца:' latitude: 'Шырата:' @@ -288,7 +293,7 @@ be: login: Увайсці save_button: Запісаць no_such_entry: - title: Няма такіх запісаў у дзенніку + title: Няма такіх запісаў у дзённіку heading: 'Няма запісу з нумарам: %{id}' body: Прабаце, не існуе запісу ў дзённіку ці каментара з нумарам %{id}. Праверце свой правапіс, ці, магчыма, вам далі няправільную спасылку. @@ -310,7 +315,7 @@ be: location: location: 'Месца:' view: Прагляд - edit: Рэдагаваць + edit: Правіць feed: user: title: Запісы ў дзённіку OpenStreetMap карыстальніка %{user} @@ -404,7 +409,7 @@ be: aerodrome: Аэрадром apron: Перон gate: Вароты - helipad: Верталетная пляцоўка + helipad: Верталётная пляцоўка runway: Узлётна-пасадачная паласа taxiway: Рулёжныя дарожкі terminal: Тэрмінал @@ -499,7 +504,7 @@ be: toilets: Прыбіральні townhall: Ратуша university: Універсітэт - vending_machine: Гандлевы аўтамат + vending_machine: Гандлёвы аўтамат veterinary: Ветэрынарная хірургія village_hall: Вясковая зала waste_basket: Кош для смецця @@ -834,7 +839,7 @@ be: jewelry: Ювелірная крама kiosk: Кіёск laundry: Пральня - mall: Гандлевы цэнтр + mall: Гандлёвы цэнтр market: Рынак mobile_phone: Салон мабільнай сувязі motorcycle: Крама матацыклаў @@ -904,11 +909,11 @@ be: "yes": Водны маршрут admin_levels: level2: Мяжа краіны - level4: Дзяржаўная мяжа + level4: Мяжа сталіцы і абласцей level5: Мяжа рэгіёна - level6: Мяжа акругі + level6: Мяжа райцэнтра і раёна level8: Мяжа горада - level9: Мяжа вёскі + level9: Мяжа раёну н/п level10: Мяжа прыгараду description: title: @@ -1103,12 +1108,12 @@ be: слоў, якія могуць быць карыснымі. editor_html: <Strong>Рэдактар</strong> - гэта праграма або вэб-сайт, які вы можаце выкарыстоўваць для рэдагавання карты. - node_html: <Strong>Вузел (node)</strong> - гэта кропка на карце, напрыклад, - рэстаран ці дрэва. + node_html: <Strong>Пункт (node)</strong> - гэта пункт на карце, напрыклад, рэстаран + ці дрэва. way_html: <Strong>Лінія (way)</strong> - гэта лінія або многавугольнік, напрыклад, дарогі, рэкі, азёры або будынкі. tag_html: |- - <strong>Цэтлік (tag)</strong> - гэта элемент апісання вузла або лініі, напрыклад, + <strong>Тэг (tag)</strong> - гэта элемент апісання пункта або лініі, напрыклад, назва рэстарана або абмежаванне хуткасці на дарозе. rules: title: Правілы! @@ -1195,7 +1200,7 @@ be: about_page: next: Далей copyright_html: <span>©</span>OpenStreetMap<br>contributors - used_by: '%{name} забяспечвае картаграфічнымі дадзенымі сотні сайтаў, мабільных + used_by: '%{name} забяспечвае картаграфічнымі дадзенымі тысячы сайтаў, мабільных праграм і прыстасаванняў' lede_text: OpenStreetMap створаны супольнасцю картографаў, якія дадаюць і падтрымліваюць дадзеныя аб дарогах, сцежках, кафэ, вакзалах і многіх іншых аб'ектах па ўсім @@ -1429,7 +1434,7 @@ be: Flash-плэер з Adobe.com</a>. Існуюць і <a href="http://wiki.openstreetmap.org/wiki/Editing">іншыя магчымасці</a> для рэдагавання OpenStreetMap. potlatch_unsaved_changes: Маюцца незахаваныя змены. (Для захавання ў Potlatch - зніміце вылучэнне з лініі або кропкі, калі рэдагуеце ў «жывым» рэжыме, альбо + зніміце вылучэнне з лініі або пункта, калі рэдагуеце ў «жывым» рэжыме, альбо націсніце кнопку «захаваць», калі вы ў рэжыме адкладзенага захавання.) potlatch2_not_configured: Potlatch 2 не быў наладжаны. Калі ласка, паглядзіце http://wiki.openstreetmap.org/wiki/The_Rails_Port @@ -1453,13 +1458,12 @@ be: table: entry: motorway: Аўтамагістраль + main_road: Галоўная дарога trunk: Шаша primary: Асноўная дарога secondary: Другасная дарога unclassified: Некласіфікаваная дарога - unsurfaced: Дарога без пакрыцця track: Палявая дарога - byway: Сцежка bridleway: Дарога для коней cycleway: Веласіпедная дарожка footway: Пешаходная дарожка @@ -1483,7 +1487,6 @@ be: golf: Поле для гольфа park: Парк resident: Жылы раён - tourist: Турыстычная славутасць common: - Агульныя - луг @@ -1513,9 +1516,11 @@ be: tunnel: Тунэль (пункцірам) bridge: Мост (суцэльная лінія) private: Прыватны доступ - permissive: Доступ з дазволу destination: Мэтавы доступ construction: Дарогі ў стадыі будаўніцтва + bicycle_shop: Крама ровараў + bicycle_parking: Паркоўка для ровараў + toilets: Прыбіральні richtext_area: edit: Рэдагаваць preview: Папярэдні прагляд @@ -1542,7 +1547,7 @@ be: identifiable: Ідэнтыфікуемы (паказваецца ў сьпісе слядоў як ідэнтыфікуемы са спарадкаванымі кропкамі і меткамі часу) create: - upload_trace: Зацягнуць GPS-трэк + upload_trace: Адаслаць GPS-след trace_uploaded: Ваш GPX-файл быў адасланы і чакае ўстаўкі ў базу дадзеных. Гэта звычайна робіцца не больш за паўгадзіны. Вы атрымаеце працврджанне аб заканчэнні працэсу па электроннай пошце @@ -1622,7 +1627,7 @@ be: map: карта list: public_traces: Агульныя GPS-сляды - your_traces: Вашыя GPS-трэкі + your_traces: Вашыя GPS-сляды public_traces_from: Агульныя GPS-сляды карыстальніка %{user} description: Агляд нядаўна дададзеных GPS-слядоў tagged_with: ' адмечана як %{tags}' @@ -1671,6 +1676,7 @@ be: allow_read_gpx: чытаць уласныя GPS-сляды. allow_write_gpx: адаслаць GPS-сляды. allow_write_notes: змяняць заўвагі. + grant_access: Прадастаўленне Доступу oauthorize_success: title: Запыт на аўтарызацыю дазволены allowed: Вы надалі дастасаванню %{app_name} доступ да вашага рахунка. @@ -1783,6 +1789,9 @@ be: windowslive: title: Увайсці праз Windows live alt: Увайсці праз рахунак Windows Live + github: + title: Уваход праз GitHub + alt: Увайсці праз уліковы запіс GitHub yahoo: title: Уваход праз Yahoo alt: Уваход праз Yahoo OpenID @@ -1817,7 +1826,7 @@ be: new: title: Стварыць рахунак no_auto_account_create: На жаль, мы не можам стварыць для вас рахунак аўтаматычна. - contact_webmaster: Калі ласка, спішыцеся з <a href="mailto:webmaster@openstreetmap.org">вэм-майстрам</a> + contact_webmaster: Калі ласка, спішыцеся з <a href="%{webmaster}">вэм-майстрам</a> каб стварыць вам рахунак - мы паспрабуем выдаць вам рахунак як мага хутчэй. about: header: Свабодная і даступная для рэдагавання @@ -1828,7 +1837,7 @@ be: license_agreement: Ствараючы рахунак, вы згаджаецеся з <a href="http://www.osmfoundation.org/wiki/License/Contributor_Terms">умовамі удзелу</a>. email address: 'Паштовы адрас:' - confirm email address: 'Пацверджанне паштовага адрасу:' + confirm email address: 'Пацвердзіце электронны адрас:' not displayed publicly: Не паказваецца астатнім (глядзіце <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" title="палітыка неразглашэння на wiki, у тым ліку секцыя пра паштовыя адрасы">палітыку неразглашэння</a>) @@ -1841,16 +1850,6 @@ be: use external auth: 'Для альтэрнатыўнага ўваходу, залагіньцеся цераз:' auth no password: Пры выкарыстанні знешняй аўтэнтыфікацыі пароль не патрэбны, але для некаторых дадатковых інструментаў або сервераў ён усё яшчэ спатрэбіцца. - auth association: |- - <p>Ваш ID яшчэ не звязаны з рахунакам на OpenStreetMap.</p> - <ul> - <li>Калі вы пачатковец у OpenStreetMap, калі ласка, стварыце новы рахунак, выкарыстоўваючы форму ніжэй.</li> - <li> -     Калі ў вас ужо ёсць рахунак, вы можаце ўвайсці ў яго, -     выкарыстоўваючы вашыя імя карыстальніка і пароль, і асацыяваць свой рахунак -     з вашым ID у наладах карыстальніка. - </li> - </ul> continue: Зарэгістравацца terms accepted: Дзякуй за прыняцце новых умоў ўдзелу! terms declined: Нам шкада, што Вы вырашылі не прыняць новыя ўмовы супрацоўніцтва. @@ -1862,8 +1861,8 @@ be: read and accept: Калі ласка, пачытайце пагадненне ніжэй і націсніце кнопку «Згодны», каб пацвердзіць што Вы пагаджаецеся з умовамі гэтага пагаднення адносна Вашага існуючага і будучых ўнёскаў. - consider_pd: У дадатак да прыведзенага пагаднення, я пацвярджаю, што мой унёсак - знаходзіцца ў грамадзкім набытку + consider_pd: У дадатак да прыведзенага пагаднення, я пацвярджаю, што мой уклад + знаходзіцца ў грамадскім набытку consider_pd_why: што гэта? guidance: 'Інфармацыя, якая дапаможа зразумець гэтыя ўмовы: <a href="%{summary}">кароткае апісанне</a> і некалькі <a href="%{translations}">неафіцыйных перакладаў</a>' @@ -1881,6 +1880,7 @@ be: heading: Карыстальнік %{user} не існуе body: Прабачце, карыстальнік %{user} не знойдзены. Please check your spelling, Калі ласка, праверце свой правапіс, ці, магчыма, вам далі няправільную спасылку. + deleted: выдалены view: my diary: Мой дзённік new diary entry: новы запіс у дзённіку @@ -1933,16 +1933,16 @@ be: revoke: administrator: Адклікаць доступ з правамі адміністратара moderator: Скасаваць доступ мадэратара - block_history: атрыманыя блакіроўкі - moderator_history: створаныя блакіроўкі + block_history: Дзейныя блакіроўкі + moderator_history: Створаныя блакіроўкі comments: Каментары - create_block: заблякаваць гэтага карыстальніка - activate_user: актывацыя гэтага карыстальніка - deactivate_user: адключыць гэтага карыстальніка - confirm_user: пацвердзіць гэтага карыстальніка - hide_user: схаваць гэтага карыстальніка - unhide_user: паказаць гэтага карыстальніка - delete_user: выдаліць гэтага карыстальніка + create_block: Заблакаваць гэтага карыстальніка + activate_user: Актываваць гэтага карыстальніка + deactivate_user: Дэактываваць гэтага карыстальніка + confirm_user: Пацвердзіць гэтага карыстальніка + hide_user: Схаваць гэтага карыстальніка + unhide_user: Паказаць гэтага карыстальніка + delete_user: Выдаліць гэтага карыстальніка confirm: Пацвердзіць friends_changesets: наборы зменаў сяброў friends_diaries: запісы дзёньнікаў сяброў @@ -1972,13 +1972,13 @@ be: disabled link text: чаму я не магу рэдагаваць? public editing note: heading: Агульнае рэдагаванне - text: У цяперашні момант Вашыя рэдагаванні з'яўляюцца ананімнымі і людзі не - могуць дасылаць Вам паведамленні, ці бачыць Вашае месцазнаходжанне. Каб - быў бачны Ваш унёсак і людзі маглі кантактаваць з Вамі праз вэб-сайт, націсніце - кнопку ніжэй. <b>Пасля зменаў API вэрсіі 0.6, толькі даступныя для сувязі - карыстальнікі могуць рэдагаваць звесткі на карце</b>. (<a href="http://wiki.openstreetmap.org/wiki/Anonymous_edits">даведацца - чамуе можа быць адменена і ўсе новыя карыстальнікі цяпер даступныя для сувязі - па змоўчванні.</li></ul> + text: У цяперашні момант Вашы рэдагаванні з'яўляюцца ананімнымі, і людзі не + могуць дасылаць Вам паведамленні, ці бачыць Ваша месцазнаходжанне. Каб быў + бачны Ваш уклад, і людзі маглі звязацца з Вамі праз вэб-сайт, націсніце + кнопку ніжэй. <b>Пасля пераходу на API версіі 0.6, толькі даступныя для + сувязі карыстальнікі могуць рэдагаваць звесткі на карце</b>. (<a href="http://wiki.openstreetmap.org/wiki/Anonymous_edits">даведацца, + чаму</a>) <ul><li>Гэта дзеянне не можа быць адменена, а ўсе новыя карыстальнікі + цяпер даступныя для сувязі па змаўчанні.</li></ul> contributor terms: heading: 'Умовы ўдзелу:' agreed: Вы пагадзіліся на новыя ўмовы ўдзелу. @@ -1995,6 +1995,8 @@ be: gravatar: gravatar: Выкарыстоўваць Gravatar link text: што гэта? + disabled: Граватар быў адключаны. + enabled: Паказ вашага Граватара быў уключаны. new image: Дадаць выяву keep image: Захаваць бягучую выяву delete image: Выдаліць бягучую выяву @@ -2009,7 +2011,8 @@ be: make edits public button: Зрабіць усе мае змены публічнымі return to profile: Вярнуцца да профілю flash update success confirm needed: Звесткі аб карыстальніку паспяхова абноўленыя. - Праверце сваю пошту, вам павінны прыйсці запыт на пацверджанне змены адрасу. + Праверце сваю эл.пошту, вам павінен прыйсці запыт на пацвярджэнне вашага новага + адраса. flash update success: Звесткі аб карыстальніку паспяхова абноўленыя. confirm: heading: Праверце вашу электронную пошту! @@ -2027,12 +2030,11 @@ be: success: Мы даслалі новы ліст з пацверджаннем на адрас %{email} і, як толькі Вы пацвердзіце Ваш рахунак, Вы зможаце пачаць працаваць з картай.<br /><br />Калі Вы карыстаецеся сістэмай абароны ад спаму, якая дасылае запыты на пацверджанне, - калі ласка, упэўніцеся, што адрас webmaster@openstreetmap.org знаходзіцца - ў Вашым давераным спісе, таму што мы не маем магчымасці адказваць на любыя - запыты. + калі ласка, упэўніцеся, што адрас %{sender} знаходзіцца ў Вашым давераным + спісе, таму што мы не маем магчымасці адказваць на любыя запыты. failure: Карыстальнік %{name} не знойдзены. confirm_email: - heading: Пацвердзіць змену паштовага адрасу + heading: Пацвердзіць змену паштовага адраса press confirm button: Націсніце кнопку, каб пацвердзіць ваш новы паштовы адрас. button: Пацвердзіць success: Змена вамі адраса электроннай пошты пацверджана! @@ -2084,6 +2086,13 @@ be: no_authorization_code: Няма кода аўтарызацыі unknown_signature_algorithm: Невядомы алгарытм подпісу invalid_scope: Няправільны дыяпазон + auth_association: + heading: Ваш ID пакуль што не звязаны з рахункам OpenStreetMap. + option_1: Калі вы пачатковец у ОСМ, калі ласка, стварыце новы ўліковы запіс + скарыстаўшыся формай ніжэй. + option_2: Калі ў вас ужо ёсць рахунак, то вы можаце ўвайсці ў свой рахунак выкарыстоўваючы + свой лагін і пароль і затым звязаць уліковы запіс з вашым ID ў вашых наладах + карыстальніка. user_role: filter: not_an_administrator: Толькі адміністратары могуць кіраваць ролямі карыстальнікаў, @@ -2266,6 +2275,10 @@ be: center_marker: Цэнтраваць карту па маркеры paste_html: Уставіць HTML для ўбудовы ў вэб-сайт view_larger_map: Праглядзець большую карту + only_standard_layer: Толькі стандартны пласт можа быць экспартаваны ў выглядзе + выявы + embed: + report_problem: Паведаміць аб праблеме key: title: Умоўныя абазначэнні tooltip: Умоўныя абазначэнні @@ -2276,7 +2289,7 @@ be: out: Паменшыць locate: title: Паказаць маё месцазнаходжанне - popup: Вы знаходзіцеся ў межах {distance} {unit} ад гэтай кропкі + popup: Вы знаходзіцеся ў межах {distance} {unit} ад гэтага пункта base: standard: Звычайная карта cycle_map: Веласіпедная карта @@ -2331,6 +2344,9 @@ be: mapquest_car: Аўтамабіль (MapQuest) mapquest_foot: Пешаход (MapQuest) osrm_car: Аўтамабіль (OSRM) + mapzen_bicycle: Веласіпед (Mapzen) + mapzen_car: Аўтамабіль (Mapzen) + mapzen_foot: Пешшу (Mapzen) directions: Маршрут distance: Адлегласць errors: @@ -2359,11 +2375,11 @@ be: courtesy: Маршрут прадастаўлены %{link} time: Час query: - node: Вузел + node: Пункт way: Лінія - relation: Адносіны + relation: Дачыненне nothing_found: Аб’екты не знойдзены - error: 'Памылка сувязі %{server}: %{error}' + error: 'Памылка сувязі з %{server}: %{error}' timeout: Тайм-аўт падключэння да %{server} redaction: edit: diff --git a/config/locales/bg.yml b/config/locales/bg.yml index 76544478f..dfbd128bb 100644 --- a/config/locales/bg.yml +++ b/config/locales/bg.yml @@ -1,95 +1,290 @@ # Messages for Bulgarian (български) # Exported from translatewiki.net -# Export driver: spyc +# Export driver: phpyaml # Author: DCLXVI +# Author: Lyubomirv # Author: MrPanyGoff +# Author: Plamen +# Author: Ricordo.tenerissimo +# Author: StanProg +# Author: Vodnokon4e +# Author: АдмиралАнимЕ --- bg: + time: + formats: + friendly: '%e %B %Y в %H:%M' activerecord: models: + changeset: Списък с промени + country: Държава + friend: Приятел language: Език message: Съобщение + node: Възел + old_node: Стар възел + relation: Релация + relation_member: Член на релация + relation_tag: Таг на релация session: Сесия + trace: Следа + tracepoint: Точка от следа + tracetag: Таг на следа user: Потребител + user_preference: Потребителски настройки + way: Път attributes: + diary_comment: + body: Текст diary_entry: user: Потребител + title: Тема + latitude: Географска ширина + longitude: Географска дължина language: Език friend: user: Потребител friend: Приятел trace: user: Потребител + visible: Видим name: Име size: Размер + latitude: Географска ширина + longitude: Географска дължина + public: Публичен + description: Описание + message: + sender: Подател + title: Тема + body: Текст + recipient: Получател user: + email: Електронна поща + active: Активен + display_name: Видимо потребителско име description: Описание languages: Езици pass_crypt: Парола + editor: + default: По подразбиране (в момента %{name}) + potlatch: + name: Potlatch 1 + description: Potlatch 1 (редактор в браузъра) + id: + name: iD + description: iD (редактиране в браузър) + potlatch2: + name: Potlatch 2 + description: Potlatch 2 (редактиране в браузър) + remote: + name: Дистанционно управление + description: Дистанционно управление (JOSM или Merkaartor) browse: + created: Създаден + closed: Затворен + created_html: Създаден <abbr title="%{title}">преди %{time}</abbr> + version: Версия + in_changeset: Списък с промени + anonymous: анонимен + no_comment: (без коментар) + part_of: Част от + download_xml: Сваляне на GPX + view_history: Показване на историята + view_details: Вижте детайлите + location: 'Местоположение:' + changeset: + title: 'Списък с промени: %{id}' + belongs_to: Автор + node: Точки (%{count}) + node_paginated: Точки (%{x}-%{y} от %{count}) + way: Пътища (%{count}) + way_paginated: Пътища (%{x}-%{y} от общо %{count}) + relation: Релации (%{count}) + relation_paginated: Релации(%{x}-%{y} от %{count}) + comment: Коментари (%{count}) + osmchangexml: osmChange XML + join_discussion: Впишете се, за да се присъедините към обсъждането + discussion: Обсъждане + node: + title: 'Точка: %{name}' + history_title: 'История на точка: %{name}' + way: + title: 'Път: %{name}' + history_title: 'История на пътя: %{name}' + nodes: Точки + also_part_of: + one: част от път %{related_ways} + other: част от пътища %{related_ways} + relation: + title: 'Релация: %{name}' + history_title: 'Историята на релация: %{name}' + members: Членове relation_member: type: node: Възел + way: Път relation: Релация containing_relation: - entry: 'Релация %{relation_name}' - entry_role: 'Релация %{relation_name} (като %{relation_role})' + entry: Релация %{relation_name} + entry_role: Релация %{relation_name} (като %{relation_role}) not_found: + sorry: Съжаляваме, %{type} с ID:%{id} не е намерен. type: node: възел way: път relation: релация + changeset: списък с промени + note: Бележка + timeout: + type: + way: път + relation: релация + changeset: списък с промени + note: бележка redacted: type: node: възел + way: път + relation: релация start_rjs: loading: Зареждане... + tag_details: + tags: Етикети note: - description: 'Описание:' + new_note: Нова бележка + description: Описание + open_by: Създадено от %{user} <abbr title='%{exact_time}'>преди %{when}</abbr> changeset: + changeset_paging_nav: + showing_page: Страница %{page} + next: Следващ » + previous: « Предишен changeset: anonymous: Анонимен + no_edits: (без промяна) changesets: id: Номер + saved_at: Записан на user: Потребител comment: Коментар + area: Област + list: + title: Списък с промени + empty: Няма намерени списъци с промени. + empty_area: Няма списъци с промени в този район. + empty_user: Няма списъци с промени от този потребител. + load_more: Зареждане на още + rss: + full: Пълно обсъждане diary_entry: + new: + publish_button: Публикуване + list: + title: Дневници на потребителя + title_friends: Дневници на приятели + title_nearby: Дневници на потребители наблизо + user_title: Дневник на %{user} + new: Нов запис в дневник + no_entries: Няма записи в дневника + older_entries: По-стари записи + newer_entries: По-нови записи edit: + subject: 'Тема:' + body: 'Текст:' language: 'Език:' location: 'Местоположение:' latitude: 'Географска ширина:' longitude: 'Географска дължина:' - save_button: Запази + use_map_link: използвай карта + save_button: Съхраняване view: + user_title: дневник на %{user} leave_a_comment: Оставете коментар + login_to_leave_a_comment: '%{login_link} за да оставите коментар' login: Влизане save_button: Съхраняване + no_such_entry: + title: Няма такива записи в дневник diary_entry: comment_count: + zero: няма коментари one: 1 коментар other: '%{count} коментара' + edit_link: Редактиране на този пост + hide_link: Скриване на този пост confirm: Потвърди + diary_comment: + hide_link: Скрий този коментар + confirm: Потвърждаване + location: + location: 'Местоположение:' + view: Преглед + edit: Редактиране comments: + when: Кога + comment: Коментар + ago: преди %{ago} newer_comments: По-нови коментари older_comments: По-стари коментари export: + title: Изнасяне start: + area_to_export: Зона за изнасяне + manually_select: Ръчно избиране на друга област + format_to_export: Формат за изнасяне + embeddable_html: HTML-код за вграждане licence: Лиценз too_large: + advice: 'Ако изнасянето по-горе не сработи, моля, използвайте един от следните + източници:' + overpass: + title: Overpass API other: title: Други източници options: Настройки + format: Формат + scale: Мащаб + max: макс. + image_size: Размер на изображението + zoom: Мащабиране + add_marker: Добавяне на маркер на картата + latitude: 'Геогр. шир:' + longitude: 'Геогр. дълж:' + export_button: Изнасяне geocoder: + search: + title: + latlon: <a href="http://openstreetmap.org/">Вътрешни</a> резултати + us_postcode: Резултати от <a href="http://geocoder.us/">Geocoder.us</a> + uk_postcode: Резултати от <a href="http://www.npemap.org.uk/">NPEMap / FreeThe + Postcode</a> + ca_postcode: Резултати от <a href="http://geocoder.us/">Geocoder.CA</a> + osm_nominatim: Резултати от <a href="http://nominatim.openstreetmap.org">OpenStreetMap + Nominatim</a> + geonames: Резултати от <a href="http://www.geonames.org/">GeoNames</a> + osm_nominatim_reverse: Резултати от <a href="http://nominatim.openstreetmap.org">OpenStreetMap + Nominatim</a> + geonames_reverse: Резултати от <a href="http://www.geonames.org/">GeoNames</a> search_osm_nominatim: prefix: + aerialway: + cable_car: Кабинков лифт + chair_lift: Седалков лифт + aeroway: + helipad: Вертолетна площадка + taxiway: Път за рулиране + terminal: Терминал amenity: - airport: Летище - arts_centre: Арт център + animal_shelter: Приют за животни + arts_centre: Център на изкуствата + atm: Банкомат bank: Банка bar: Бар bbq: Барбекю bench: Пейка bicycle_parking: Паркинг за велосипеди + bureau_de_change: Обменно бюро bus_station: Автобусна спирка cafe: Кафене car_rental: Коли под наем @@ -97,40 +292,33 @@ bg: casino: Казино cinema: Кино clinic: Поликлиника - club: Клуб + clock: Часовник college: Колеж community_centre: Обществен център courthouse: Съд crematorium: Крематориум - dentist: Стоматолог + dentist: Зъболекар + doctors: Лекари dormitory: Пансион drinking_water: Питейна вода embassy: Посолство - emergency_phone: > - Телефон за спешни - повиквания - fast_food: > - Заведения за бързо - хранене + emergency_phone: Телефон за спешни повиквания + fast_food: Заведения за бързо хранене fire_hydrant: Пожарен кран fire_station: Пожарна станция fountain: Фонтан + fuel: Гориво grave_yard: Гробище gym: Фитнес зала - hall: Зала hospital: Болница - hotel: Хотел ice_cream: Сладолед kindergarten: Детска градина library: Библиотека market: Пазар marketplace: Пазар - mountain_rescue: > - Планинска спасителна - служба + monastery: Манастир nightclub: Нощен клуб office: Офис - park: Парк parking: Паркинг pharmacy: Аптека place_of_worship: Място за поклонение @@ -140,7 +328,6 @@ bg: prison: Затвор pub: Кръчма public_building: Обществена сграда - public_market: Общински пазар reception_area: Рецепция restaurant: Ресторант sauna: Сауна @@ -149,7 +336,6 @@ bg: shop: Магазин shower: Душ studio: Студио - supermarket: Супэрмаркет swimming_pool: Плувен басейн taxi: Такси telephone: Телефон @@ -157,35 +343,47 @@ bg: toilets: Тоалетна townhall: Кметство university: Университет + vending_machine: Автомат veterinary: Ветеринарна клиника village_hall: Кметство - wifi: Достъп до WiFi - WLAN: Достъп до WiFi youth_centre: Младежки център boundary: - administrative: > - Административна - граница + administrative: Административна граница national_park: Национален парк protected_area: Защитена зона bridge: aqueduct: Акведукт suspension: Висящ мост viaduct: Виадукт - yes: Мост + "yes": Мост building: - yes: Сграда + "yes": Сграда + craft: + brewery: Пивоварна + carpenter: Дърводелец + electrician: Електротехник + gardener: Градинар + painter: Художник + photographer: Фотограф + plumber: Водопроводчик + shoemaker: Обущар + tailor: Шивач + "yes": Работилница emergency: - fire_hydrant: Пожарен кран - phone: > - Телефон за спешна - връзка + ambulance_station: Пожарна + landing_site: Място за аварийно кацане + phone: Телефон за спешни повиквания highway: + abandoned: Изоставена железопътна линия + bridleway: Конен път bus_stop: Автобусна спирка construction: Магистрала в строеж cycleway: Велосипедна пътека + elevator: Асансьор + emergency_access_point: Пункт за спешна помощ footway: Пешеходна пътека - minor: Второстепенен път + ford: Брод + milestone: Километричен камък motorway: Магистрала motorway_link: Скоростен път path: Пътека @@ -193,78 +391,103 @@ bg: platform: Платформа primary: Главен път primary_link: Главен път + proposed: Предложен маршрут raceway: Състезателна писта - residential: Жилищен + residential: Жилищна улица rest_area: Зона за почивка road: Път secondary: Второстепенен път secondary_link: Второстепенен път service: Сервизен път - speed_camera: > - Камера за контрол на - скоростта + speed_camera: Камера за контрол на скоростта steps: Стълбище street_lamp: Улична лампа + trunk: Скоростен път + trunk_link: Скоростен път unsurfaced: Път без настилка + "yes": Път historic: archaeological_site: Археологическа зона battlefield: Бойно поле boundary_stone: Граничен камък - building: Сграда + building: Историческа сграда + bunker: Бункер castle: Замък church: Църква + city_gate: Градска порта citywalls: Градски стени fort: Форт + heritage: Културно наследство house: Къща icon: Икона - mine: Мина + manor: Имение + memorial: Паметник + mine: Рудник monument: Паметник - museum: Музей - ruins: Руини + roman_road: Римски път + ruins: Развалини + stone: Камък tomb: Гробница tower: Кула landuse: basin: Басейн cemetery: Гробище + commercial: Търговска зона + conservation: Резерват construction: Строителство farm: Ферма farmland: Обработваема земя + farmyard: Стопански двор forest: Гора + garages: Гаражи grass: Трева industrial: Промишлена зона + landfill: Сметище + meadow: Ливада military: Военна зона - mine: Мина + mine: Рудник orchard: Овощна градина - nature_reserve: Природен резерват - park: Парк + quarry: Каменоломна + railway: Железница reservoir: Язовир residential: Жилищна зона vineyard: Лозя leisure: beach_resort: Морски курорт + club: Клуб + dog_park: Парк за кучета fishing: Място за риболов garden: Градина - golf_course: Голф игрище + golf_course: Игрище за голф + horse_riding: Конна езда ice_rink: Ледена пързалка + marina: Пристанище за лодки miniature_golf: Мини-голф nature_reserve: Природен резерват park: Парк + pitch: Спортна площадка + playground: Детска площадка + resort: Курорт sauna: Сауна sports_centre: Спортен център stadium: Стадион swimming_pool: Плувен басейн - water_park: Аква парк + water_park: Аквапарк + man_made: + lighthouse: Фар + tower: Кула + works: Фабрика military: - airfield: Военен летище + airfield: Военно летище barracks: Казарма bunker: Бункер mountain_pass: - yes: Планински проход + "yes": Планински проход natural: bay: Залив beach: Плаж cape: Нос - channel: Канал + cave_entrance: Вход на пещера cliff: Скала crater: Кратер dune: Дюна @@ -276,23 +499,28 @@ bg: hill: Хълм island: Остров land: Земя + mud: Кал peak: Връх - river: Река + reef: Риф rock: Скала + saddle: Седло + sand: Пясък + spring: Ручей + stone: Камък tree: Дърво valley: Долина volcano: Вулкан water: Вода + wood: Дърво office: accountant: Счетоводител architect: Архитект - employment_agency: > - Агенцията по - заетостта + company: Фирма + employment_agency: Агенцията по заетостта insurance: Застрахователно бюро lawyer: Адвокат travel_agent: Туристическа агенция - yes: Офис + "yes": Офис place: airport: Летище city: Град @@ -303,174 +531,446 @@ bg: house: Къща houses: Къщи island: Остров - islet: островче - moor: тресавище - municipality: община - neighbourhood: квартал - postcode: пощенски код + islet: Островче + moor: Тресавище + municipality: Община + neighbourhood: Квартал + postcode: Пощенски код region: Регион - sea: море - suburb: предградие - town: град - village: село + sea: Море + suburb: Предградие + town: Град + village: Село + "yes": Място railway: - abandoned: > - изоставена - железопътна линия - construction: > - железопътна линия в - строеж + abandoned: Изоставена железопътна линия + construction: Железопътна линия в строеж disused_station: изоставена гара halt: железопътна спирка - historic_station: > - гара с историческо - значение - junction: железопътен възел - level_crossing: прелез - monorail: монорелсов + historic_station: Гара с историческо значение + junction: Железопътен възел + level_crossing: Прелез + light_rail: Бърз трамвай + monorail: Монорелсов път narrow_gauge: Теснолинейка - platform: > - Железопътната - платформа - station: Жп-гара + platform: Железопътна платформа + station: Железопътна гара stop: Железопътна спирка - subway: Метростанция - subway_entrance: вход към метростанция + subway: Метро + subway_entrance: Вход към метростанция tram: Трамвай tram_stop: Трамвайна спирка shop: antiques: Антики - art: Арт Магазин - bakery: пекарна + art: Магазин на изкуствата + bakery: Пекарна beauty: Салон за красота beverages: Магазин за напитки bicycle: Магазин за велосипеди books: Книжарница boutique: Бутик - butcher: месар - department_store: универсален магазин - dry_cleaning: химическо чистене - fish: рибен магазин - food: хранителни стоки - furniture: мебели + butcher: Месарница + car: Автосалон + car_parts: Авточасти + car_repair: Автосервиз + carpet: Магазин за килими + clothes: Магазин за дрехи + department_store: Универсален магазин + dry_cleaning: Химическо чистене + fish: Рибен магазин + food: Хранителни стоки + furniture: Мебели gallery: Галерия - garden_centre: градински център - gift: магазин за подаръци - greengrocer: плод и зеленчук - grocery: бакалия - hairdresser: фризьор - insurance: застраховане + garden_centre: Градински център + general: Смесен магазин + gift: Магазин за подаръци + greengrocer: Плод и зеленчук + grocery: Бакалия + hairdresser: Фризьорски салон + insurance: Застраховане jewelry: Бижутериен магазин laundry: Пералня - mall: търговски център + mall: Търговски център market: Пазар - mobile_phone: > - Магазин за мобилни - телефони + mobile_phone: Магазин за мобилни телефони music: Музикален магазин optician: Оптика - pet: > - Магазин за домашни - любимци + pet: Магазин за домашни любимци pharmacy: Аптека photo: Фотомагазин shoes: Магазин за обувки shopping_centre: Търговски център sports: Спортен магазин - stationery: > - Канцеларски - материали + stationery: Канцеларски материали supermarket: Супермаркет tailor: Шивач toys: Магазин за играчки travel_agency: Туристическа агенция + "yes": Магазин tourism: + apartment: Апартамент + artwork: Произведения на изкуството + chalet: Хижа + gallery: Галерия guest_house: Къща за гости hostel: Хостел hotel: Хотел - information: Информация + information: Сведения motel: Мотел museum: Музей picnic_site: Място за пикник theme_park: Увеселителен парк - valley: Долина - zoo: зологическа градина + zoo: Зологическа градина tunnel: - yes: Тунел + "yes": Тунел waterway: canal: Канал - dam: язовирна стена - mineral_spring: Минерален извор + dam: Яз river: Река waterfall: Водопад admin_levels: level2: Държавна граница level5: Граница на региона level6: Държавна граница - level8: граница на града + level8: Граница на града level9: Граница на селото - level10: > - Граница на - предградията + level10: Граница на предградията + description: + types: + places: Места results: - no_results: > - Не бяха открити - резултати + no_results: Не бяха открити резултати more_results: Повече резултати - direction: - south_west: югозапад - south: юг - south_east: югоизток - east: изток - north_east: североизток - north: север - north_west: северозапад - west: запад layouts: logout: Излизане - log_in: влизане + log_in: Влизане + log_in_tooltip: Вписване със съществуващ профил + sign_up: Регистриране + edit: Редактиране + history: История + export: Изнасяне + data: Данни + export_data: Изнасяне на данни + gps_traces: GPS-следи + gps_traces_tooltip: Управление на GPS-следи + user_diaries: Дневник + user_diaries_tooltip: Дневници на потребители + edit_with: Редактиране с %{editor} + tag_line: Свободна Wiki-карта на света + intro_header: Добре дошли в OpenStreetMap! + intro_2_create_account: Създаване на сметка + partners_partners: партньори + help: Помощ + about: За проекта + copyright: Авторски права + community: Общност + make_a_donation: + text: Направете дарение + learn_more: Научете повече + more: Още + license_page: + foreign: + title: За този превод + text: В случай на противоречие между тази преведена страница и %{english_original_link}, + страницата на английски ще е с приоритет + english_link: Оригиналът на английски + native: + title: За тази страница + legal_babble: + title_html: Авторски права и лиценз + infringement_title_html: Нарушаване на авторските права + welcome_page: + title: Добре дошли! + rules: + title: Правилата! + questions: + title: Въпроси? + fixthemap: + how_to_help: + title: Как да помогна + help_page: + welcome: + title: Добре дошли в OSM + beginners_guide: + title: Наръчник за начинаещи + mailing_lists: + title: Пощенски списъци + forums: + title: Форуми + irc: + title: IRC + switch2osm: + title: switch2osm + wiki: + url: http://wiki.openstreetmap.org/ + title: wiki.openstreetmap.org + about_page: + next: Следващ + legal_title: Правни въпроси notifier: diary_comment_notification: - hi: Здравейте ((to_user)), + hi: Здравейте %{to_user}, + message_notification: + hi: Здравейте %{to_user}, + gpx_notification: + greeting: Здравейте, + your_gpx_file: Това изглежда като GPX файла Ви + and_the_tags: 'и следните етикети:' + and_no_tags: и без етикети. + signup_confirm: + greeting: Здравейте! email_confirm: - subject: '[OpenStreetMap] Потвърждаване на вашия адрес за е-поща' + subject: '[OpenStreetMap] Потвърждаване на вашия адрес за електронна поща' + email_confirm_plain: + greeting: Здравейте, + email_confirm_html: + greeting: Здравейте, + hopefully_you: 'Някой (надяваме се, че това сте Вие) желае да промени адреса + си на електронна поща намиращ се на %{server_url} на адрес: %{new_address}.' + click_the_link: Ако това сте вие, то отворете линка, разположен по-долу, за + да потвърдите промяната. + lost_password: + subject: '[OpenStreetMap]Заявка за промяна на парола' + lost_password_plain: + greeting: Здравейте, + lost_password_html: + greeting: Здравейте, + note_comment_notification: + greeting: Здравейте, + changeset_comment_notification: + greeting: Здравейте, message: + inbox: + title: Входящи + my_inbox: Входяща кутия + from: От + subject: Тема + date: Дата + message_summary: + unread_button: Отбелязване като непрочетено + read_button: Отбелязване като прочетено + reply_button: Отговор + delete_button: Изтрий new: + subject: Тема send_button: Изпращане + message_sent: Съобщението е изпратено + no_such_message: + title: Няма такова съобщение + heading: Няма такова съобщение + outbox: + to: До + subject: Тема + date: Дата read: from: От subject: Тема date: Дата - unread_button: > - Отбелязване като - непрочетено + reply_button: Отговор + unread_button: Отбелязване като непрочетено + back: Назад + to: До + sent_message_summary: + delete_button: Изтриване + site: + index: + createnote: Добавяне на бележка + sidebar: + search_results: Резултати от търсенето + close: Затваряне + search: + search: Търсене + get_directions_title: Намерете маршрут между две точки + from: От to: До + where_am_i: Къде съм аз? + submit_text: Напред + key: + table: + entry: + motorway: Магистрала + main_road: Главен път + trunk: Междуградски път + primary: Главен път + secondary: Второстепенен път + bridleway: Конен път + cycleway: Велосипедна пътека + footway: Пътека + rail: Железопът + subway: Метро + tram: + - Бърз трамвай + - трамвай + cable: + - Кабинков лифт + - седалков лифт + runway: + - Летищна писта + - път за рулиране + apron: + - Летищен перон + - терминал + admin: Административна граница + forest: Гора + wood: Лес + golf: Игрище за голф + park: Парк + resident: Жилищна зона + common: + 1: ливада + retail: Зона за търговия на дребно + industrial: Промишлена зона + commercial: Търговска зона + heathland: Пустош + lake: + - Езеро + farm: Земеделско стопанство + cemetery: Гробище + pitch: Спортна площадка + centre: Спортен център + reserve: Природен резерват + military: Военна зона + school: + - Училище + building: Значима сграда + station: Железопътна гара + summit: + - Било + - връх + tunnel: Тунел (пунктирана линия) + bridge: Мост (плътна линия) + construction: Пътища в изграждане + bicycle_shop: Магазин за велосипеди + richtext_area: + edit: Редактиране + preview: Преглед + markdown_help: + headings: Заглавия + heading: Заглавие + subheading: Подзаглавие + unordered: Неподреден списък + ordered: Подреден списък + link: Препратка + text: Текст + image: Изображение + alt: Алтернативен текст + url: Адрес trace: edit: filename: 'Име на файл:' + map: карта edit: редактиране + owner: 'Собственик:' description: 'Описание:' - save_button: > - Съхраняване на - промените + tags: 'Етикети:' + save_button: Съхраняване на промените + visibility: 'Видимост:' trace_form: + description: 'Описание:' + tags: 'Етикети:' + visibility: 'Видимост:' + upload_button: Качване help: Помощ + trace_optionals: + tags: Етикети view: filename: 'Име на файл:' + map: карта edit: редактиране + owner: 'Собственик:' + tags: 'Етикети:' + visibility: 'Видимост:' trace: + view_map: Вижте на картата edit: редактиране + edit_map: Редактиране на картата in: в + map: карта + oauth: + oauthorize: + allow_write_api: промени картата. oauth_clients: new: submit: Регистриране edit: submit: Редактиране + show: + allow_write_api: промяна на картата. form: name: Име + allow_write_api: промяна на картата. user: + login: + title: Вписване + email or username: 'Електронна поща или потребителско име:' + password: 'Парола:' + remember: Запомни ме + lost password link: Забравена парола? + login_button: Вписване + register now: Регистрирайте се + no account: Нямате сметка? + auth_providers: + google: + title: Вписване с Гугъл + facebook: + title: Вписване с Фейсбук + wikipedia: + title: Вписване с Уикипедия + yahoo: + title: Вписване с Яху + lost_password: + email address: 'Електронна поща:' reset_password: password: 'Парола:' + confirm password: 'Потвърждаване на паролата:' + flash changed: Паролата е променена успешно. + new: + title: Регистриране + email address: 'Електронна поща:' + confirm email address: 'Потвърждаване на електронната поща:' + password: 'Парола:' + confirm password: 'Потвърждаване на паролата:' + continue: Регистриране + terms: + legale_select: 'Държава на пребиваване:' + legale_names: + france: Франция + italy: Италия + rest_of_world: В останалата част на света + no_such_user: + title: Няма такъв потребител + view: + my edits: Mоите редакции + my messages: Моите съобщения + my settings: Моите настройки + edits: Редакции + notes: Бележки + mapper since: 'Картограф от:' + latest edit: 'Последна редакция %{ago}:' + email address: 'Електронна поща:' + description: Описание + user location: Местоположение + km away: '%{count} км от вас' + account: + title: Редакция на профил + my settings: Моите настройки + current email address: 'Текуща електронна поща:' + new email address: 'Нова електронна поща:' + preferred languages: 'Предпочитани езици:' + preferred editor: 'Предпочитан редактор:' + image: 'Изображение:' + new image: Добавяне на изображение + keep image: Запазване на текущото изображение + replace image: Заменяне на текущото изображение + latitude: 'Географска ширина:' + longitude: 'Географска дължина:' + flash update success confirm needed: Сведенията за потребителя са успешно обновени. + Проверете електронната си поща за писмо, с което да потвърдите новия адрес. + confirm: + heading: Проверете електронна си поща + introduction_1: Изпратихме ви писмо за потвърждаване. + confirm_email: + heading: Потвърдете смяната на електронната поща user_role: grant: confirm: Потвърждаване @@ -483,3 +983,70 @@ bg: creator_name: Създател reason: Причина за блокиране status: Статут + show: + ago: преди %{time} + edit: Редактиране + note: + mine: + ago_html: преди %{when} + javascripts: + share: + title: Споделяне + cancel: Отказ + image: Изображение + link: Препратка или код + custom_dimensions: Размер по избор + format: 'Формат:' + scale: 'Мащаб:' + download: Изтегляне + include_marker: Добавяне на маркер + key: + title: Легенда + map: + zoom: + in: Увеличаване + out: Отдалечаване + locate: + title: Моето местоположение + base: + standard: Стандартен + cycle_map: Колоездачна карта + transport_map: Превозна карта + hot: Хуманитарна карта + layers: + header: Слоеве на картата + notes: Бележки + data: Данни + overlays: Слоеве за отстраняване на грешки + title: Слоеве + donate_link_text: <a class='donate-attr' href='%{donate_url}'>Направете дарение</a> + site: + edit_tooltip: Редактиране на картата + createnote_tooltip: Добавяне на бележка на картата + notes: + new: + add: Добавяне на бележка + directions: + engines: + graphhopper_bicycle: Велосипед (GraphHopper) + graphhopper_foot: Пеша (GraphHopper) + mapquest_bicycle: Велосипед (MapQuest) + mapquest_car: Кола (MapQuest) + mapquest_foot: Пеша (MapQuest) + osrm_car: Кола (OSRM) + mapzen_bicycle: Велосипед (Mapzen) + mapzen_car: Кола (Mapzen) + mapzen_foot: Пеша (Mapzen) + directions: Насоки + distance: Разстояние + instructions: + continue_without_exit: Продължете по %{name} + endofroad_right_without_exit: В края на пътя завийте надясно по %{name} + turn_left_without_exit: Завийте наляво по %{name} + endofroad_left_without_exit: В края на пътя завийте наляво по %{name} + roundabout_without_exit: На кръговото движение вземете %{name} + start_without_exit: Тръгнете от края на %{name} + destination_without_exit: Пристигнахте на местоназначението + unnamed: неименуван път + time: Време +... diff --git a/config/locales/bn.yml b/config/locales/bn.yml new file mode 100644 index 000000000..d74d289a7 --- /dev/null +++ b/config/locales/bn.yml @@ -0,0 +1,1409 @@ +# Messages for Bangla (বাংলা) +# Exported from translatewiki.net +# Export driver: phpyaml +# Author: Aftabuzzaman +# Author: Bellayet +# Author: Bodhisattwa +# Author: Ehsanulhb +# Author: Elias Ahmmad +# Author: Kayser Ahmad +# Author: Nasir8891 +# Author: Sayma Jahan +# Author: Tauhid16 +# Author: Wikisagnik +# Author: আজিজ +# Author: এম আবু সাঈদ +--- +bn: + time: + formats: + friendly: '%e %B %Y %H:%M-এ' + activerecord: + models: + acl: প্রবেশাধিকার নিয়ন্ত্রণ তালিকা + changeset: পরিবর্তনধার্য + changeset_tag: পরিবর্তনধার্য ট্যাগ + country: দেশ + diary_comment: ডাইরি মন্তব্য + diary_entry: ডাইরি ভুক্তি + friend: বন্ধু + language: ভাষা + message: বার্তা + node: সংযোগস্থল + node_tag: সংযোগস্থল ট্যাগ + notifier: নোটিফায়ার + old_node: পুরাতন সংযোগস্থল + old_node_tag: পুরাতন সংযোগস্থল ট্যাগ + old_relation: পুরনো সম্পর্ক + old_relation_member: পুরনো সম্পর্ক সদস্য + old_relation_tag: পুরনো সম্পর্ক ট্যাগ + old_way: পুরাতন পদ্ধতি + old_way_node: পুরাতন পদ্ধতির নোড + old_way_tag: পুরাতন পদ্ধতির ট্যাগ + relation: সম্পর্ক + relation_member: সম্পর্ক সদস্য + relation_tag: সম্পর্ক টাগ + session: সেশন + trace: ট্রেস + tracepoint: পথচিহ্ন বিন্দু + tracetag: ট্রেস ট্যাগ + user: ব্যবহারকারী + user_preference: ব্যবহারকারীর পছন্দ + user_token: ব্যবহারকারী টোকেন + way: রাস্তা + way_node: রাস্তার নোড + way_tag: রাস্তার ট্যাগ + attributes: + diary_comment: + body: মূলাংশ + diary_entry: + user: ব্যবহারকারী + title: বিষয় + latitude: অক্ষাংশ + longitude: দ্রাঘিমাংশ + language: ভাষা + friend: + user: ব্যবহারকারী + friend: বন্ধু + trace: + user: ব্যবহারকারী + visible: দৃশ্যমান + name: নাম + size: আকার + latitude: অক্ষাংশ + longitude: দ্রাঘিমাংশ + public: পাবলিক + description: বিবরণ + message: + sender: প্রেরক + title: শিরোনাম + body: বডি + recipient: প্রাপক + user: + email: ইমেইল + active: সক্রিয় + display_name: প্রদর্শনের জন্য নাম + description: বিবরণ + languages: ভাষা + pass_crypt: পাসওয়ার্ড + editor: + default: ডিফল্ট (বর্তমানে %{name}) + potlatch: + name: পটল্যাচ ১ + description: পটল্যাচ ১ (ব্রাউজার থেকে সম্পাদনা) + id: + name: আইডি + description: আইডি (ব্রাউজার সম্পাদকে) + potlatch2: + name: পটল্যাচ ২ + description: পটল্যাচ ২ (ব্রাউজার থেকে সম্পাদনা) + remote: + name: রিমোট কন্ট্রোল + description: রিমোট কন্ট্রোল (JOSM অথবা Merkaartor) + browse: + created: তৈরি হয়েছে + closed: বন্ধ + created_html: <abbr title='%{title}'>%{time} আগে</abbr> তৈরি + closed_html: <abbr title='%{title}'>%{time} আগে</abbr> বন্ধ + created_by_html: '%{user} কর্তৃক <abbr title=''%{title}''>%{time} আগে</abbr> তৈরি' + deleted_by_html: '%{user} কর্তৃক <abbr title=''%{title}''>%{time}আগে</abbr> অপসারণ' + edited_by_html: '%{user} কর্তৃক <abbr title=''%{title}''>%{time} আগে</abbr> সম্পাদিত' + closed_by_html: '%{user} কর্তৃক <abbr title=''%{title}''>%{time} আগে</abbr> বন্ধ' + version: সংস্করণ + in_changeset: পরিবর্তনসমূহ + anonymous: নামহীন + no_comment: (কোন মন্তব্য নেই) + part_of: অংশ + download_xml: এক্সএমএল ডাউনলোড + view_history: ইতিহাস দেখুন + view_details: বিস্তারিত দেখুন + location: 'অবস্থান:' + changeset: + title: 'পরিবর্তনধার্য: %{id}' + belongs_to: লেখক + node: (%{count}টি) সংযোগস্থল + node_paginated: সংযোগস্থল (%{count}টির %{x}-%{y}) + way: (%{count}টি) রাস্তা + way_paginated: পথসমূহ (%{count}টির %{x}-%{y}) + relation: সম্পর্ক (%{count}টি) + relation_paginated: সম্পর্ক (%{count}টির %{x}-%{y}) + comment: মন্তব্য (%{count}টি) + hidden_commented_by: '%{user} থেকে <abbr title=''%{exact_time}''>%{when} আগের</abbr> + মন্তব্য লুকান' + commented_by: <abbr title='%{exact_time}'>%{when} আগে</abbr> %{user} থেকে মন্তব্য + changesetxml: পরিবর্তনধার্য এক্সএমএল + osmchangexml: osmChange এক্সএমএল + feed: + title: পরিবর্তনধার্য %{id} + title_comment: পরিবর্তনধার্য %{id} - %{comment} + join_discussion: আলোচনায় যোগ দিতে প্রবেশ করুন + discussion: আলোচনা + node: + title: 'সংযোগস্থল: %{name}' + history_title: 'সংযোগস্থলের ইতিহাস: %{name}' + way: + title: 'রাস্তা: %{name}' + history_title: 'রাস্তা ইতিহাস: %{name}' + nodes: সংযোগস্থলসমূহ + relation: + title: 'সম্পর্ক: %{name}' + history_title: 'সম্পর্ক ইতিহাস: %{name}' + members: সদস্যবৃন্দ + relation_member: + entry_role: '%{type} %{name} %{role} হিসাবে' + type: + node: সংযোগস্থল + way: রাস্তা + relation: সম্পর্ক + containing_relation: + entry: সম্পর্ক %{relation_name} + entry_role: সম্পর্ক %{relation_name} (যখন %{relation_role}) + not_found: + sorry: 'দুঃখিত, %{type} #%{id} পাওয়া যায়নি।' + type: + node: সংযোগস্থল + way: রাস্তা + relation: সম্পর্ক + changeset: পরিবর্তনধার্য + note: টীকা + timeout: + sorry: দুঃখিত, %{type} এর সাথে সম্পৃক্ত আইডি %{id}-র তথ্য, পুনরুদ্ধার করতে অতিরিক্ত + সময় লেগেছে। + type: + node: সংযোগস্থল + way: দিক + relation: সম্পর্ক + changeset: পরিবর্তনধার্য + note: টীকা + redacted: + redaction: সম্পর্ক %{id} + message_html: কোনও কারণে %{type}-এর %{version} সংস্করণটি দেখানো যাবে না। বিস্তারিত + জানতে %{redaction_link} দেখুন। + type: + node: সংযোগস্থল + way: দিক + relation: সম্পর্ক + start_rjs: + feature_warning: '%{num_features} বৈশিষ্ট্যগুলো লোড হচ্ছে, যা আপনার ব্রাউজারকে + ধীর অথবা সংবেদনহীন করতে পারে। আপনি কি এই তথ্য প্রদর্শনের ব্যপারে নিশ্চিত?' + load_data: তথ্য লোড করুন + loading: লোডিং... + tag_details: + tags: 'ট্যাগসমূহ:' + wiki_link: + key: '%{key} ট্যাগ এর উইকি বর্ণনা পাতা' + tag: '%{key}=%{value} ট্যাগ এর উইকি বর্ণনা পাতা' + wikidata_link: উইকিউপাত্ত উপাদানে %{page} + wikipedia_link: উইকিপিডিয়াতে %{page} প্রবন্ধ + telephone_link: '%{phone_number}-এ কল করুন' + note: + title: টীকা:%{id} + new_note: নতুন টীকা + description: 'বর্ণনা:' + open_title: 'অমীমাংসিত টীকা #%{note_name}' + closed_title: 'মীমাংসিত টীকা #%{note_name}' + hidden_title: 'লুকানো টীকা #%{note_name}' + open_by: '%{user} কর্তৃক <abbr title=''%{exact_time}''>%{when} আগে</abbr> তৈরি' + open_by_anonymous: বেনামী ব্যবহারকারী কর্তৃক <abbr title='%{exact_time}'>%{when} + আগে</abbr> তৈরি + commented_by: '%{user} কর্তৃক করা <abbr title=''%{exact_time}''>%{when} আগের</abbr> + মন্তব্য' + commented_by_anonymous: বেনামি ব্যবহারকারী কর্তৃক করা <abbr title='%{exact_time}'>%{when} + আগের</abbr> মন্তব্য + closed_by: '%{user} কর্তৃক <abbr title=''%{exact_time}''>%{when} আগে</abbr> + মীমাংসিত' + closed_by_anonymous: বেনামি ব্যবহারকারী দ্বারা <abbr title='%{exact_time}'>%{when} + আগে</abbr> সমাধানকৃত + reopened_by: '%{user} কর্তৃক <abbr title=''%{exact_time}''>%{when} আগে</abbr> + পুনঃসক্রিয়কৃত' + reopened_by_anonymous: বেনামি ব্যবহারকারী দ্বারা <abbr title='%{exact_time}'>%{when} + আগে</abbr> পুনঃসক্রিয়কৃত + hidden_by: '%{user} কর্তৃক <abbr title=''%{exact_time}''>%{when} আগে লুকায়িত</abbr>' + query: + title: বৈশিষ্ট্য অনুসন্ধান করুন + introduction: নিকটবর্তী বৈশিষ্ট্য খুঁজে পেতে মানচিত্রে ক্লিক করুন। + nearby: নিকটবর্তী বৈশিষ্ট্য + enclosing: আবদ্ধ বৈশিষ্ট্য + changeset: + changeset_paging_nav: + showing_page: '%{page}টি পাতা' + next: পরবর্তী » + previous: « পূর্ববর্তী + changeset: + anonymous: বেনামী ব্যবহারকারী + no_edits: (কোনো সম্পাদনা নেই) + view_changeset_details: পরিবর্তনধার্যে বিস্তারিত দেখুন + changesets: + id: আইডি + saved_at: সংরক্ষণ হয়েছে + user: ব্যবহারকারী + comment: মন্তব্য + area: এলাকা + list: + title: পরিবর্তনসমূহ + title_user: '%{user} দ্বারা পরিবর্তন ধার্য' + title_friend: আপনার বন্ধুদের পরিবর্তনসেট + title_nearby: আপনার কাছকাছি ব্যবহারকারীর পরিবর্তনসেট + empty: কোনো পরিবর্তনসেট পাওয়া যায়নি। + empty_area: এই এলাকায় কোনো পরিবর্তনসেট নেই। + empty_user: এই ব্যবহারকারীর দ্বারা আর কোনো পরিবর্তনসেট নেই। + no_more: আর কোনো পরিবর্তনসেট পাওয়া যায়নি। + no_more_area: এই এলাকায় কোনো পরিবর্তনসেট নেই। + no_more_user: এই ব্যবহারকারীর দ্বারা আর কোনো পরিবর্তনসেট নেই। + load_more: আরও লোড করুন + timeout: + sorry: দুঃখিত, আপনি যেই পরিবর্তনসেটটির জন্য আবেদন করছেন সেটি ফিরিয়ে আনতে আরও + সময় লাগবে। + rss: + title_all: ওপেনস্ট্রীটম্যাপ পরিবর্তনধার্য সম্পর্কিত আলোচনা + title_particular: ওপেনস্ট্রীটম্যাপ পরিবর্তনধার্য %{changeset_id} সম্পর্কিত আলোচনা + comment: '%{author} কর্তৃক পরিবর্তনধার্য %{changeset_id}-এ নতুন মন্তব্য' + commented_at_html: '%{when} আগে থেকেই হালনাগাদকৃত' + commented_at_by_html: '%{user} কর্তৃক %{when} আগে হালনাগাদকৃত' + full: সম্পূর্ণ আলোচনা + diary_entry: + new: + title: নতুন দিনলিপির ভুক্তি + publish_button: প্রকাশ করুন + list: + title: ব্যবহারকারীর দিনলিপি + title_friends: বন্ধুর দিনলিপি + title_nearby: নিকটবর্তী ব্যবহারকারীর দিনলিপি + user_title: '%{user}-এর দিনলিপি' + in_language_title: '%{language} ভাষায় দিনলিপির ভুক্তি' + new: নতুন দিনলিপির ভুক্তি + new_title: আপনার ব্যবহারকারী দিনলিপিতে একটি নতুন ভুক্তি রচনা করুন + no_entries: কোনও দিনলিপির ভুক্তি নেই + recent_entries: সাম্প্রতিক দিনলিপির ভুক্তি + older_entries: পুরাতন ভুক্তি + newer_entries: নতুন ভুক্তি + edit: + title: দিনলিপির ভুক্তি সম্পাদনা করুন + subject: 'বিষয়:' + body: 'মূলাংশ:' + language: 'ভাষা:' + location: 'অবস্থান:' + latitude: 'অক্ষাংশ:' + longitude: 'দ্রাঘিমাংশ:' + use_map_link: মানচিত্র ব্যবহার করুন + save_button: সংরক্ষণ + marker_text: দিনলিপির ভুক্তির অবস্থান + view: + title: '%{user}-এর দিনলিপি | %{title}' + user_title: '%{user}-এর দিনলিপি' + leave_a_comment: মন্তব্য করুন + login_to_leave_a_comment: মন্তব্য করতে %{login_link} করুন + login: প্রবেশ + save_button: সংরক্ষণ + no_such_entry: + title: এমন কোন দিনলিপির ভুক্তি নেই + heading: '%{id} এই আইডি থেকে কোনও ভুক্তি নেই' + body: দুঃখিত, %{id} এই আইডি থেকে কোনও দিনলিপির ভুক্তি অথবা মন্তব্য নেই। দয়া + করে আপনার বানান যাচাই করুন, অথবা হতে পারে আপনি যে লিংকটিতে ক্লিক করেছেন তা + ভুল। + diary_entry: + comment_link: এই ভুক্তিতে মন্তব্য করুন + reply_link: এই ভুক্তির প্রত্যুত্তর দিন + comment_count: + zero: কোন মন্তব্য নেই + one: '%{count}টি মন্তব্য' + other: '%{count}টি মন্তব্য' + edit_link: এই ভুক্তি সম্পাদনা করুন + hide_link: এই ভুক্তি লুকান + confirm: নিশ্চিত করুন + diary_comment: + comment_from: '%{comment_created_at}-এ %{link_user} কর্তৃক মন্তব্য' + hide_link: এই মন্তব্যটি লুকান + confirm: নিশ্চিত করুন + location: + location: 'অবস্থান:' + view: দেখাও + edit: সম্পাদনা + feed: + user: + title: ওপেনস্ট্রীটম্যাপে %{user}-এর জন্য দিনলিপির ভুক্তি + description: ওপেনস্ট্রীটম্যাপে %{user}-এর সাম্প্রতিক দিনলিপির ভুক্তি + language: + title: ওপেনস্ট্রীটম্যাপে %{language_name} ভাষায় দিনলিপির ভুক্তি + description: ওপেনস্ট্রীটম্যাপ ব্যবহারকারীগণ কর্তৃক %{language_name} ভাষায় + সাম্প্রতিক দিনলিপির ভুক্তি + all: + title: ওপেনস্ট্রীটম্যাপ দিনলিপির ভুক্তি + description: ওপেনস্ট্রীটম্যাপ ব্যবহারকারীগণ কর্তৃক সাম্প্রতিক দিনলিপির ভুক্তি + comments: + has_commented_on: '%{display_name} নিম্নলিখিত দিনলিপি ভুক্তিসমূহে মন্তব্য করেছেন' + post: পোস্ট + when: কখন + comment: মন্তব্য + ago: '%{ago} আগে' + newer_comments: নতুন মন্তব্য + older_comments: পুরাতন মন্তব্য + export: + title: রপ্তানি + start: + area_to_export: রপ্তানির এলাকা + manually_select: ম্যানুয়ালি একটি ভিন্ন জায়গা নির্বাচন করুন + format_to_export: রপ্তানির বিন্যাস + osm_xml_data: ওপেনস্ট্রীটম্যাপ এক্সএমএল উপাত্ত + map_image: মানচিত্র ছবি (মান্য স্তর দেখাও) + embeddable_html: অভ্যন্তরীণ HTML + licence: লাইসেন্স + export_details: ওপেনস্ট্রীটম্যাপের সমস্ত উপাত্ত <a href="http://opendatacommons.org/licenses/odbl/1.0/">ওপেন + ডাটা কমন্স ওপেন ডাটাবেস লাইসেন্সের</a> (ODbL) আওতায় প্রকাশিত। + too_large: + advice: 'যদি উপরের রপ্তানি ব্যর্থ হয়, দয়া করে নীচে তালিকাভুক্ত উৎসের কোন + একটি ব্যবহারের জন্য বিবেচনা করুন:' + planet: + title: ওএসএম জগৎ + description: সম্পূর্ণ ওপেনস্ট্রীটম্যাপ ডাটাবেসের নিয়মিত হালনাগাদের অনুলিপি + overpass: + title: ওভারপাস API + geofabrik: + title: জিওফ্যাব্রিক ডাউনলোড + other: + title: অন্যান্য উৎস + description: ওপেনস্ট্রীটম্যাপ উইকিতে তালিকাভুক্ত অতিরিক্ত সূত্র + options: বিকল্প + format: বিন্যাস + scale: স্কেল + max: সর্বোচ্চ + image_size: চিত্রের আকার + zoom: জুম + add_marker: মানচিত্রে একটি চিহ্নিতকারী যোগ করুন + latitude: 'অক্ষাংশ:' + longitude: 'দ্রাঘিমাংশ:' + output: আউটপুট + paste_html: তথ্যক্ষেত্রে HTML নিহিত করতে প্রতিলেপন করুন + export_button: রপ্তানি + geocoder: + search: + title: + latlon: <a href="http://openstreetmap.org/">অভ্যন্তরীণ</a> থেকে ফলাফল + us_postcode: <a href="http://geocoder.us/">Geocoder.us</a থেকে ফলাফল + uk_postcode: <a href="http://www.npemap.org.uk/">NPEMap / FreeThe Postcode</a> + থেকে ফলাফল + ca_postcode: <a href="http://geocoder.ca/">Geocoder.CA</a> থেকে ফলাফল + osm_nominatim: <a href="http://nominatim.openstreetmap.org/">ওপেনস্ট্রীটম্যাপ + নমিনাতিম</a> থেকে ফলাফল + geonames: <a href="http://www.geonames.org/">জিওনেমস</a> থেকে ফলাফল + osm_nominatim_reverse: <a href="http://nominatim.openstreetmap.org/">ওপেনস্ট্রীটম্যাপ + নমিনাতিম</a> থেকে ফলাফল + geonames_reverse: <a href="http://www.geonames.org/">জিওনেমস</a> থেকে ফলাফল + search_osm_nominatim: + prefix: + aerialway: + cable_car: ক্যাবল কার + station: বিমানপথ স্টেশন + aeroway: + aerodrome: বিমানশালা + apron: বর্হিবাস + gate: প্রবেশপথ + helipad: হেলিপ্যাড + runway: রানওয়ে + taxiway: ট্যাক্সিওয়ে + terminal: টার্মিনাল + amenity: + animal_shelter: পশুদের আশ্রয়স্থল + arts_centre: শিল্পকলা কেন্দ্র + atm: এটিএম + bank: ব্যাংক + bar: বার + bench: বেঞ্চ + bicycle_parking: সাইকেল পার্কিং + bicycle_rental: ভাড়ার সাইকেল + biergarten: বিয়ার বাগ + boat_rental: ভাড়ার নৌকা + brothel: পতিতালয় + bureau_de_change: পরিবর্তন ব্যুরো + bus_station: বাস স্টেশন + cafe: ক্যাফে + car_rental: ভাড়ার কার + car_sharing: শেয়ারিং কার + car_wash: গাড়ি ধোয়া + casino: ক্যাসিনো + charging_station: চার্জিং স্টেশন + childcare: শিশু যত্ন + cinema: সিনেমা + clinic: ক্লিনিক + clock: ঘড়ি + college: কলেজ + community_centre: কমিউনিটি সেন্টার + courthouse: আদালত + crematorium: শ্মশান + dentist: দন্তচিকিৎসক + doctors: ডাক্তার + dormitory: ছাত্রাবাস + drinking_water: পানীয় জল + driving_school: ড্রাইভিং স্কুল + embassy: দূতাবাস + emergency_phone: জরুরি ফোন + fast_food: ফাস্ট ফুড + ferry_terminal: ফেরিঘাট + fire_hydrant: ফায়ার হাইড্র্যান্ট + fire_station: অগ্নি নির্বাপন কেন্দ্র + food_court: খাবার দোকান + fountain: ঝরনা + fuel: জ্বালানি + gambling: জুয়াখেলার আড্ডা + grave_yard: কবরস্থান + gym: ব্যায়াম কেন্দ্র / জিমখানা + health_centre: স্বাস্থকেন্দ্র + hospital: হাসপাতাল + hunting_stand: শিকারশালা + ice_cream: আইসক্রিম + kindergarten: শিশুবিদ্যালয় + library: পাঠাগার + market: বাজার + marketplace: নগরচত্বর + monastery: আশ্রম + motorcycle_parking: মোটরসাইকেল পার্কিং + nightclub: নৈশক্লাব + nursery: শিশুশালা + nursing_home: নার্সিংহোম + office: দপ্তর + parking: পার্কিং + parking_entrance: পার্কিং প্রবেশপথ + pharmacy: ঔষধালয় + place_of_worship: উপাসনালয় + police: পুলিশ + post_box: ডাকবাক্স + post_office: ডাকঘর + preschool: প্রাক-বিদ্যালয় + prison: কারাগার + pub: মদ্যশালা + public_building: সরকারি ভবন + reception_area: অভ্যর্থন এলাকা + restaurant: রেঁস্তোরা + retirement_home: অবসর গৃহ + school: বিদ্যালয় + shelter: আশ্রয় + shop: দোকান + shower: ঝরনা + social_centre: সামাজিক কেন্দ্র + social_club: সামাজিক সমিতি + social_facility: সামাজিক সুবিধা + studio: স্টুডিও + swimming_pool: সুইমিং পুল + taxi: ট্যাক্সি + telephone: সরকারি টেলিফোন + theatre: নাট্যশালা + toilets: পায়খানা + townhall: টাউনহল + university: বিশ্ববিদ্যালয় + vending_machine: ভেন্ডিং মেশিন + veterinary: ভেটেরিনারি সার্জারি + village_hall: গ্রামগৃহ + waste_basket: বর্জ্যদানি + waste_disposal: বর্জ্য পুনর্বাসন + youth_centre: যুব কেন্দ্র + boundary: + administrative: প্রশাসনিক সীমানা + national_park: জাতীয় উদ্যান + protected_area: সুরক্ষিত এলাকা + bridge: + aqueduct: জলপ্রণালী + suspension: ঝুলন্ত সেতু + swing: দোলনা সেতু + viaduct: ভায়াডাক্ট + "yes": সেতু + building: + "yes": ভবন + craft: + brewery: ভাটিখানা + carpenter: ছুতোর + electrician: বিদ্যুৎ মিস্তিরি + gardener: মালি + painter: চিত্রশিল্পী + photographer: আলোকচিত্ৰকর + plumber: নল মিস্তিরি + shoemaker: মুচি + tailor: দর্জি + emergency: + ambulance_station: রুগ্নবাহিকা স্টেশন + landing_site: জরুরি অবতরণ ক্ষেত্র + phone: জরুরি ফোন + highway: + abandoned: পরিত্যক্ত মহাসড়ক + bridleway: অঙ্কুশ পথ + bus_guideway: নির্দেশিত বাস পথ + bus_stop: বাস স্টপ + construction: নির্মীয়মাণ মহাসড়ক + cycleway: সাইকেল রাস্তা + elevator: লিফট + emergency_access_point: জরুরি প্রবেশ স্থল + footway: ফুটপাথ + milestone: মাইলফলক + path: পাথ + pedestrian: পাদচারী পথ + platform: প্লাটফর্ম + primary: প্রাথমিক সড়ক + primary_link: প্রাথমিক সড়ক + proposed: প্রস্তাবিত সড়ক + raceway: ধাবনপথ + residential: আবাসিক সড়ক + rest_area: বিশ্রামস্থল + road: রাস্তা + secondary: অপ্রধান সড়ক + secondary_link: অপ্রধান সড়ক + service: পার্শ্ব সড়ক + speed_camera: গতিমাপক ক্যামেরা + steps: ধাপ + street_lamp: রাস্তার বাতি + tertiary: প্রশাখা সড়ক + tertiary_link: প্রশাখা সড়ক + traffic_signals: ট্রাফিক সংকেত + trunk: মূল সড়ক + trunk_link: মূল সড়ক + unclassified: অশ্রেণীকৃত সড়ক + unsurfaced: কাঁচা সড়ক + "yes": সড়ক + historic: + archaeological_site: প্রত্নতাত্ত্বিক স্থান + battlefield: যুদ্ধক্ষেত্র + boundary_stone: সীমানাজ্ঞাপক পাথর + building: ঐতিহাসিক ভবন + castle: কেল্লা + church: গির্জা + city_gate: নগর দ্বার + citywalls: নগর প্রাচীর + fort: দুর্গ + heritage: ঐতিহ্য স্থান + house: বাড়ি + icon: আইকন + manor: জমিদারি + memorial: স্মারক + mine: খনি + monument: স্মৃতিস্তম্ভ + roman_road: রোমান সড়ক + ruins: ধ্বংসাবশেষ + stone: প্রস্তর + tomb: সমাধি + tower: মিনার + junction: + "yes": জংশন + landuse: + basin: অববাহিকা + cemetery: কবরস্থান + commercial: বানিজ্যিক এলাকা + construction: নির্মাণকার্য + farm: খামার + farmland: কৃষিজমি + farmyard: গোলাবাড়ির উঠোন + forest: অরণ্য + garages: গ্যারেজ + grass: ঘাস + greenfield: তৃণভূমি + industrial: শিল্পাঞ্চল + meadow: তৃণভূমি + military: সামরিক এলাকা + mine: খনি + orchard: ফলবাগিচা + quarry: আকরিক + railway: রেলপথ + recreation_ground: চিত্তবিনোদন মাঠ + reservoir: জলাধার + reservoir_watershed: জলাধারের বিভাগরেখা + residential: আবাসিক এলাকা + road: সড়ক এলাকা + village_green: হরিত গ্রাম + vineyard: আঙুর খেত + "yes": ব্যবহার্য ভূমি + leisure: + beach_resort: সৈকতীয় রিসোর্ট + club: ক্লাব + common: সাধারণ ভূমি + dog_park: কুকুর উদ্যান + fishing: মৎস শিকারের এলাকা + garden: বাগান + golf_course: গল্ফ মাঠ + nature_reserve: সংরক্ষিত প্রাকৃতিক ভূমি + park: উদ্যান + playground: খেলার মাঠ + recreation_ground: চিত্তবিনোদন মাঠ + resort: রিসোর্ট + sports_centre: ক্রীড়া কেন্দ্র + stadium: ক্রিড়াঙ্গন + swimming_pool: সুইমিং পুল + water_park: বারি উদ্যান + "yes": অবসর + man_made: + lighthouse: বাতিঘর + pipeline: পাইপলাইন + tower: টাওয়ার + works: কারখানা + "yes": মনুষ্য-নির্মিত + military: + airfield: সামরিক বিমানপোত + barracks: সেনানিবাস + mountain_pass: + "yes": গিরিপথ + natural: + bay: উপসাগর + beach: সৈকত + cape: অন্তরীপ + cave_entrance: গুহা প্রবেশিকা + cliff: দুরারোহ পর্বতগাত্র + crater: গর্ত + dune: বালিয়াড়ি + fjord: সমুদ্রের খাড়ি + forest: অরণ্য + geyser: উষ্ণপ্রস্রবণ + glacier: হিমবাহ + grassland: চারণক্ষেত্র + heath: স্বাস্থ্য + hill: পাহাড় + island: দ্বীপ + land: জমি + marsh: দলদল + moor: প্রাস্তর + mud: কাদা + peak: শৃঙ্গ + point: স্থানবিন্দু + reef: প্রবালপ্রাচীর + ridge: শৈলশিরা + rock: শিলা + sand: বালু + scrub: ঝাড়ভূমি + spring: বসন্ত + stone: পাথর + strait: প্রণালী + tree: গাছ + valley: উপত্যকা + volcano: আগ্নেয়গিরি + water: পানি + wetland: জলাভূমি + office: + accountant: হিসাবরক্ষক + administrative: প্রশাসন + architect: স্থপতি + company: কোম্পানি + employment_agency: কর্মসংস্থান সংস্থা + estate_agent: এস্টেট এজেন্ট + government: সরকারি দপ্তর + insurance: বিমা দপ্তর + lawyer: উকিল + ngo: এনজিও দপ্তর + telecommunication: টেলিযোগাযোগ দপ্তর + travel_agent: ভ্রমণ দালাল + "yes": দপ্তর + place: + block: ব্লক + airport: বিমানবন্দর + city: নগর + country: দেশ + county: প্রদেশ + farm: খামার + hamlet: পল্লি + house: বাড়ি + houses: বাড়িগুলো + island: দ্বীপ + islet: ক্ষুদ্র দ্বীপ + isolated_dwelling: বিচ্ছিন্ন বাসস্থান + locality: বসতি + moor: প্রাস্তর + municipality: পৌরসভা + neighbourhood: শহরতলি + postcode: ডাক সংখ্যা + region: অঞ্চল + sea: সাগর + state: রাজ্য + subdivision: মহকুমা + suburb: উপনগর + town: শহর + unincorporated_area: অনিগমিত এলাকা + village: গ্রাম + "yes": স্থান + railway: + abandoned: পরিত্যক্ত রেলপথ + construction: নির্মীয়মাণ রেলপথ + disused: অব্যবহৃত রেলপথ + disused_station: অব্যবহৃত রেল স্টেশন + historic_station: ঐতিহাসিক রেল স্টেশন + junction: রেল জংশন + monorail: মনোরেল + narrow_gauge: সংকীর্ণ গেজ রেল + platform: রেলওয়ে প্লাটফর্ম + preserved: সংরক্ষিত রেলপথ + proposed: প্রস্তাবিত রেলপথ + station: রেল স্টেশন + stop: রেল থামার স্থান + subway: ভূগর্ভস্থ পথ + subway_entrance: ভূগর্ভস্থ পথের প্রবেশিকা + tram: ট্রামপথ + shop: + antiques: প্রাচীন শিল্পকর্ম + art: শিল্পকলা সংক্রান্ত দোকান + bakery: বেকারি + beauty: প্রসাধনীর দোকান + beverages: পানীয় দোকান + bicycle: বাইসাইকেল দোকান + books: বইয়ের দোকান + butcher: মাংসবিক্রেতা + carpet: কার্পেটের দোকান + clothes: কাপড়ের দোকান + computer: কম্পিউটারের দোকান + confectionery: মিষ্টান্নের দোকান + convenience: কনভেনিয়েন্স স্টোর + copyshop: কপি শপ + cosmetics: প্রসাধনী সামগ্রীর দোকান + deli: যন্ত্রাংশ + discount: সস্তা সামগ্রীর দোকান + doityourself: নিজে-করো + dry_cleaning: কাপড় ধোয়ার দোকান + electronics: বৈদ্যুতিক জিনিসের দোকান + estate_agent: এস্টেট এজেন্ট + farm: কৃষি ভাণ্ডার + fashion: ফ্যাশন সামগ্রীর দোকান + fish: মাছের দোকান + florist: ফুলওয়ালা + food: খাবারের দোকান + funeral_directors: অন্ত্যেষ্টিক্রিয়া পরিচালকবৃন্দ + furniture: আসবাবপত্র + gallery: চিত্রশালা + garden_centre: বাগান কেন্দ্র + general: সাধারণ দোকান + gift: উপহারের দোকান + greengrocer: সবজিওয়ালা + grocery: মুদি দোকান + hairdresser: নাপিত + hardware: যন্ত্রাংশের দোকান + hifi: হাই-ফাই + insurance: বিমা + jewelry: গহনার দোকান + laundry: ধোপার দোকান + mall: মল + market: বাজার + mobile_phone: মোবাইল ফোনের দোকান + motorcycle: মোটোরসইকেলের দোকান + music: সঙ্গীতের দোকান + newsagent: সংবাদপত্র বিক্রেতা + optician: চশমা বিক্রেতা + organic: জৈব খাদ্যের দোকান + pharmacy: ঔষধালয় + photo: ছবির দোকান + salon: সালোন + second_hand: পুরনো-সামগ্রীর দোকান + shoes: জুতোর দোকান + shopping_centre: বিপনি কেন্দ্র + sports: ক্রীড়াসামগ্রীর দোকান + stationery: স্টেশনারি দোকান + supermarket: অধিবিপণী + tailor: দর্জি + toys: খেলনার দোকান + travel_agency: ভ্রমণ দালাল + "yes": দোকান + tourism: + attraction: আকর্ষণ + gallery: গ্যালারি + guest_house: অতিথি বাড়ি + hostel: হোস্টেল + hotel: হোটেল + information: তথ্য + motel: মোটেল + museum: যাদুঘর + picnic_site: বনভোজনের স্থান + zoo: চিড়িয়াখানা + tunnel: + culvert: সাঁকো + "yes": সুড়ঙ্গ + waterway: + artificial: কৃত্রিম জলপথ + boatyard: নৌকাক্ষেত্র + canal: খাল + dam: বাঁধ + derelict_canal: পরিত্যক্ত খাল + ditch: খাই + dock: ফেরিঘাট + drain: নালা + lock: বন্ধ + lock_gate: ফটক বন্ধ + mooring: নঙ্গরাবদ্ধকরণ + river: নদী + wadi: ওয়াদি + waterfall: জলপ্রপাত + "yes": জলপথ + admin_levels: + level2: রাষ্ট্রের সীমানা + level4: রাজ্যের সীমানা + level5: অঞ্চলের সীমানা + level6: প্রদেশের সীমানা + level8: নগরের সীমান + level9: গ্রামের সীমানা + level10: উপনগরের সীমানা + description: + title: + osm_nominatim: <a href="http://nominatim.openstreetmap.org/">ওপেনস্ট্রীটম্যাপ + Nominatim</a> থেকে অবস্থান + geonames: <a href="http://www.geonames.org/">জিওনেম্স</a> থেকে অবস্থান + types: + cities: নগর + towns: শহর + places: স্থান + results: + no_results: ফলাফল খুঁজে পাওয়া যায়নি + more_results: আরও ফলাফল + layouts: + logo: + alt_text: ওপেনস্ট্রীটম্যাপ লোগো + home: নিড় অবস্থানে যান + logout: প্রস্থান + log_in: প্রবেশ + log_in_tooltip: একটি বিদ্যমান অ্যাকাউন্ট দিয়ে প্রবেশ করুন + sign_up: যোগ দিন + start_mapping: মানচিত্রকরণ শুরু করুন + sign_up_tooltip: সম্পাদনা করতে একটি অ্যাকাউন্ট তৈরি করুন + edit: সম্পাদনা + history: ইতিহাস + export: রপ্তানি + data: উপাত্ত + export_data: উপাত্ত রপ্তানি করুন + gps_traces: জিপিএস ট্রেস + gps_traces_tooltip: জিপিএস ট্রেস ব্যাবস্থাপনা + user_diaries: ব্যবহারকারীর দিনলিপি + user_diaries_tooltip: ব্যবহারকারী দিনলিপি দেখুন + edit_with: '%{editor} দিয়ে সম্পাদনা করুন' + tag_line: মুক্ত উইকি বিশ্ব মানচিত্র + intro_header: ওপেনস্ট্রীটম্যাপে স্বাগতম! + intro_text: ওপেনস্ট্রীটম্যাপ বিশ্বের, একটি মানচিত্র; যা আপনার মতো মানুষের দ্বারা + নির্মিত এবং এটি মুক্ত লাইসেন্সের অধীনে বিনামূল্যে ব্যবহারযোগ্য। + intro_2_create_account: একটি ব্যবহারকারী অ্যাকাউন্ট তৈরি করুন + partners_html: হোস্টিং %{ucl}, %{ic} ও %{bytemark}, এবং অন্যান্য %{partners} কর্তৃক + সমর্থিত। + partners_ic: ইম্পেরিয়াল মহাবিদ্যালয় লন্ডন + partners_partners: সহযোগীগণ + help: সাহায্য + about: পরিচিতি + copyright: মেধাসত্ব + community: সম্প্রদায় + community_blogs: সম্প্রদায়ের ব্লগ + community_blogs_title: ওপেনস্ট্রীটম্যাপ সম্প্রদায়ের সদস্যগণের ব্লগ + foundation: ফাউন্ডেশন + foundation_title: ওপেনস্ট্রীটম্যাপ ফাউন্ডেশন + make_a_donation: + title: আর্থিক অনুদান দিয়ে ওপেনস্ট্রীটম্যাপকে সাহায্য করুন + text: দান করুন + learn_more: আরও পড়ুন + more: আরও + license_page: + foreign: + title: এই অনুবাদ সম্পর্কে + english_link: মূল ইংরেজি + native: + title: এই পাতা সম্পর্কে + text: আপনি মেধাস্বত্ব পৃষ্ঠার ইংরেজি সংস্করণ দেখছেন। আপনি এই পৃষ্ঠার %{native_link}-এ + ফিরে যেতে পারেন অথবা আপনি মেধাস্বত্ব এবং %{mapping_link} সম্পর্কে পড়া বন্ধ + করতে পারেন। + native_link: THIS_LANGUAGE_NAME_HERE সংস্করণ + mapping_link: মানচিত্রকরণ শুরু করুন + legal_babble: + title_html: কপিরাইট ও লাইসেন্স + intro_1_html: |- + ওপেনস্ট্রীটম্যাপ<sup><a href="#trademarks">®</a></sup> একটি <i>মুক্ত উপাত্ত</i> যা <a + href="http://osmfoundation.org/">ওপেনস্ট্রীটম্যাপ ফাউন্ডেশন কর্তৃক</a> (OSMF) <a + href="http://opendatacommons.org/licenses/odbl/">মুক্ত উপাত্ত কমন্স মুক্ত তথ্যভিত লাইসেন্সের</a> (ODbL) আওতায় লাইসেন্সকৃত। + attribution_example: + title: আরোপণ উদাহরণ + more_title_html: আরও খুঁজা হচ্ছে + more_1_html: |- + আমাদের উপাত্তের ব্যাবহার, ও কৃতজ্ঞতা স্বীকার সম্পর্কে আরও জানতে, এখানে <a + href="http://osmfoundation.org/Licence">OSMF Licence page</a> and the community <a + href="http://wiki.openstreetmap.org/wiki/Legal_FAQ">Legal + FAQ</a> পড়ুন। + contributors_title_html: আমাদের অবদানকারীগণ + infringement_title_html: কপিরাইট লঙ্ঘন + trademarks_title_html: <span id="trademarks"></span>ট্রেডমার্ক + welcome_page: + title: স্বাগতম! + whats_on_the_map: + title: মানচিত্রে কী আছে + basic_terms: + title: মানচিত্রকরণের জন্য মৌলিক শর্তাবলী + rules: + title: নিয়মাবলী! + questions: + title: কোনও প্রশ্ন? + start_mapping: মানচিত্রকরণ শুরু করুন + add_a_note: + title: সম্পাদনার সময় নেই? একটি টীকা যোগ করুন! + fixthemap: + how_to_help: + join_the_community: + title: সম্প্রদায়ে যোগ দিন + other_concerns: + title: অন্যান্য উদ্বেগ + help_page: + welcome: + url: /স্বাগতম + title: ওএসএম-এ স্বাগতম + beginners_guide: + url: http://wiki.openstreetmap.org/wiki/Bn:Beginners%27_guide + title: আরম্ভকারী সহায়িকা + help: + url: https://help.openstreetmap.org/ + title: help.openstreetmap.org + mailing_lists: + title: মেইলিং তালিকা + irc: + title: আইআরসি + wiki: + url: http://wiki.openstreetmap.org/ + title: wiki.openstreetmap.org + about_page: + next: পরবর্তী + copyright_html: <span>©</span>ওপেনস্ট্রীটম্যাপ<br>অবদানকারী + local_knowledge_title: স্থানীয় অভিজ্ঞতা + community_driven_title: সম্প্রদায় চালক + open_data_title: মুক্ত তথ্য + legal_title: আইনগত + partners_title: অংশীদার + notifier: + diary_comment_notification: + subject: '[OpenStreetMap] %{user} একটি দিনলিপির ভুক্তিতে মন্তব্য করেছেন' + hi: হাই %{to_user}, + message_notification: + hi: হাই %{to_user}, + friend_notification: + had_added_you: '%{user} আপনাকে ওপেনস্ট্রীটম্যাপে বন্ধু হিসেবে যোগ করেছেন।' + see_their_profile: আপনি %{userurl}-এ তাদের প্রোফাইল দেখতে পারেন। + gpx_notification: + greeting: হাই, + with_description: বিবরণ সহ + and_the_tags: 'এবং নিম্নলিখিত ট্যাগ:' + signup_confirm: + subject: '[OpenStreetMap] ওপেনস্ট্রীটম্যাপে স্বাগতম' + created: কেউ একজন (আশা করছি আপনি) এইমাত্র %{site_url}-এ একটি অ্যাকাউন্ট তৈরি + করেছেন। + email_confirm: + subject: '[OpenStreetMap] আপনার ইমেইল ঠিকানা নিশ্চিত করুন' + email_confirm_plain: + greeting: হাই, + click_the_link: এটি যদি আপনি হন, দয়া করে পরিবর্তন নিশ্চিত করতে নিচের লিংকে + ক্লিক করুন। + email_confirm_html: + greeting: হাই, + click_the_link: এটি যদি আপনি হন, দয়া করে পরিবর্তন নিশ্চিত করতে নিচের লিংকে + ক্লিক করুন। + lost_password: + subject: '[ওপেনস্ট্রীটম্যাপ] পাসওয়ার্ড পুনঃধার্য করার অনুরোধ' + lost_password_plain: + greeting: হাই, + click_the_link: এটি যদি আপনি হন, তবে পাসওয়ার্ড পুনঃধার্য করতে দয়া করে নিচের + লিংকে ক্লিক করুন। + lost_password_html: + greeting: হাই, + click_the_link: এটি যদি আপনি হন, তবে পাসওয়ার্ড পুনঃধার্য করতে দয়া করে নিচের + লিংকে ক্লিক করুন। + note_comment_notification: + anonymous: একজন বেনামি ব্যবহারকারী + greeting: হাই, + details: টীকাটি সম্পর্কে আরও বিস্তারিত %{url|এখানে} পাওয়া যাবে। + changeset_comment_notification: + greeting: হাই, + details: পরিবর্তনধার্য সম্পর্কে আরও বিস্তারিত %{url|এখানে} পাওয়া যাবে। + message: + inbox: + title: ইনবক্স + my_inbox: আমার ইনবক্স + outbox: আউটবক্স + subject: বিষয় + date: তারিখ + people_mapping_nearby: কাছাকাছি অবদানকারী + message_summary: + unread_button: অপঠিত হিসেবে চিহ্নিত করুন + read_button: পঠিত হিসেবে চিহ্নিত করুন + reply_button: প্রত্যুত্তর + delete_button: মুছুন + new: + title: বার্তা পাঠান + send_message_to: '%{name}কে একটি নতুন বার্তা পাঠান' + subject: বিষয় + body: মূলাংশ + send_button: পাঠান + back_to_inbox: অন্তঃবক্সে ফেরৎ যান + message_sent: বার্তা পাঠানো হয়েছে + limit_exceeded: সাম্প্রতিক আপনি একগুচ্ছ বার্তা পাঠিয়েছেন। আর কোন বার্তা পাঠানোর + পূর্বে দয়া করে কিছুক্ষণ অপেক্ষা করুন। + no_such_message: + title: কোন বার্তা নেই + heading: কোন বার্তা নেই + outbox: + title: বহির্বাক্স + my_inbox: আমার %{inbox_link} + inbox: অন্তঃবাক্স + outbox: বহির্বাক্স + to: প্রাপক + subject: বিষয় + date: তারিখ + people_mapping_nearby: কাছাকাছি মানচিত্রকার + read: + subject: বিষয় + date: তারিখ + reply_button: প্রত্যুত্তর + unread_button: অপঠিত হিসেবে চিহ্নিত করুন + back: পিছনে + to: প্রাপক + sent_message_summary: + delete_button: মুছে ফেলুন + mark: + as_read: বার্তা পঠিত হিসেবে চিহ্নিত + as_unread: বার্তা অপঠিত হিসেবে চিহ্নিত + delete: + deleted: বার্তা মোছা হয়েছে + site: + index: + js_1: আপনি এমন একটি ব্রাউজার ব্যবহার করছেন যা জাভাস্ক্রিপ্ট সমর্থন করে না অথবা + আপনি জাভাস্ক্রিপ্ট অক্ষম করেছেন। + permalink: স্থায়ী সংযোগ + createnote: একটি দ্রষ্টব্য যোগ করুন + edit: + user_page_link: ব্যবহারকারীর পাতা + sidebar: + search_results: অনুসন্ধানের ফলাফল + close: বন্ধ + search: + search: অনুসন্ধান + get_directions: দিক নির্দেশনা পান + get_directions_title: দুটি বিন্দুর মধ্যে নির্দেশনী খুঁজুন + from: থেকে + to: হতে + where_am_i: আমি কোথায়? + where_am_i_title: অনুসন্ধান যন্ত্র ব্যবহার করে বর্তমান অবস্থানটি বর্ণনা করুন + submit_text: যাও + key: + table: + entry: + motorway: মোটোরপথ + main_road: প্রধান সড়ক + trunk: মূল সড়ক + primary: প্রাথমিক সড়ক + secondary: অপ্রধান সড়ক + unclassified: অশ্রেণীকৃত সড়ক + cycleway: সাইকেলপথ + cycleway_national: জাতীয় সাইকেলের রাস্তা + cycleway_regional: আঞ্চলিক সাইকেলের রাস্তা + cycleway_local: স্থানীয় সাইকেলের রাস্তা + footway: ফুটপাথ + rail: রেলপথ + subway: ভূগর্ভস্থ পথ + tram: + 1: ট্রাম + cable: + - ক্যাবল কার + apron: + 1: টার্মিনাল + admin: প্রশাসনিক সীমানা + forest: অরণ্য + golf: গল্ফ মাঠ + park: উদ্যান + resident: আবাসিক এলাকা + industrial: শিল্পাঞ্চল + commercial: বাণিজ্যিক এলাকা + lake: + - হ্রদ + - জলাধার + farm: খামার + cemetery: কবরস্থান + centre: ক্রীড়া কেন্দ্র + military: সামরিক এলাকা + school: + - বিদ্যালয় + - বিশ্ববিদ্যালয় + summit: + 1: শৃঙ্গ + bicycle_shop: সাইকেলের দোকান + bicycle_parking: সাইকেল পার্কিং + toilets: পায়খানা + richtext_area: + edit: সম্পাদনা + preview: প্রাকদর্শন + markdown_help: + link: লিঙ্ক + image: চিত্র + url: ইউআরএল + trace: + create: + upload_trace: জিপিএস অনুসরণ আপলোড + trace_uploaded: আপনার জিপিএক্স ফাইলটি আপলোড হয়েছে এবং ডাটাবেইজ এ অন্তর্ভুক্তির + জন্য অপেক্ষা করছে। সাধারণত, এটি আধা ঘন্টার মধ্যেই সম্পন্ন হয় এবং সমাপ্ত হতেই + আপনার কাছে একটি ই-মেইল পৌছে যাবে। + edit: + title: অনুসরণ সম্পাদনা %{name} + heading: অনুসরণ সম্পাদনা %{name} + filename: 'ফাইলের নাম:' + download: ডাউনলোড + uploaded_at: 'আপলোড হয়েছে:' + points: 'পয়েন্ট:' + start_coord: 'প্রারম্ভের কোঅর্ডিনেট:' + map: মানচিত্র + edit: সম্পাদনা + owner: 'মালিক:' + description: 'বিবরণ:' + tags: 'ট্যাগসমূহ:' + save_button: পরিবর্তন সংরক্ষণ + visibility: দৃষ্টিযোগ্যতা + visibility_help: এটার মানে কি? + trace_form: + upload_gpx: 'জিপিএক্স ফাইল আপলোড:' + description: 'বিবরণ:' + tags: 'ট্যাগসমূহ:' + visibility: 'দৃষ্টিযোগ্যতা:' + visibility_help: এটার মানে কি? + upload_button: আপলোড + help: সাহায্য + trace_header: + upload_trace: অনুসরণ আপলোড + see_all_traces: সব অনুসরণগুলো দেখুন + see_your_traces: আপনার সব অনুসরণগুলো দেখুন + traces_waiting: আপনার %{count}টি অনুসরণ আপলোড হতে বাকি আছে। দয়া করে এগুলো আপলোড + হওয়া পর্যন্ত অপেক্ষা করুন, যেন অন্য ব্যবহারকারীদের অনুসরণ আপলোড করার সুযোগ + দেয়া যায়। + trace_optionals: + tags: ট্যাগসমূহ + view: + title: '%{name} অনুসরণটি দেখছেন' + heading: '%{name} অনুসরণটি দেখছেন' + pending: অমিমাংসিত + filename: 'ফাইলের নাম:' + download: ডাউনলোড + uploaded: 'আপলোড হয়েছে:' + points: 'পয়েন্ট:' + start_coordinates: 'প্রারম্ভের কোঅর্ডিনেট:' + map: মানচিত্র + edit: সম্পাদনা + owner: 'মালিক:' + description: 'বিবরণ:' + tags: 'ট্যাগসমূহ:' + none: কোনটিই নয় + edit_track: এই অনুসরণটি সম্পাদনা করুন + delete_track: এই অনুসরণটি মুছে ফেলুন + trace_not_found: অনুসরণ পাওযা যায়নি। + visibility: দৃষ্টিযোগ্যতা + trace_paging_nav: + showing_page: '%{page} পাতা' + trace: + pending: অমিমাংসিত + count_points: '%{count} পয়েন্ট' + ago: '%{time_in_words_ago} পূর্বে' + more: আরও + trace_details: অনুসরণের বিস্তারিত দেখুন + view_map: মানচিত্র দেখুন + edit: সম্পাদনা + edit_map: মানচিত্র সম্পাদনা + identifiable: শনাক্তকরণযোগ্য + private: ব্যাক্তিগত + trackable: অনুসরণযোগ্য + by: দ্বারা + map: মানচিত্র + list: + your_traces: আপনার জিপিএস অনুসরণ + offline_warning: + message: জিপিএক্স ফাইল আপলোড বর্তমানে সম্ভব নয় + offline: + message: জিপিএক্স ফাইল সংরক্ষণ এবং আপলোড বর্তমানে সম্ভব নয় + oauth_clients: + new: + title: একটি নতুন আবেদন নিবন্ধন করুন + submit: নিবন্ধন + edit: + submit: সম্পাদনা + show: + edit: বিবরণ সম্পাদনা করুন + confirm: আপনি কি নিশ্চিত? + form: + name: নাম + user: + login: + title: প্রবেশ + heading: প্রবেশ + email or username: ইমেইল ঠিকানা অথবা ব্যবহারকারীনাম + password: 'পাসওয়ার্ড:' + remember: আমাকে মনে রাখো + login_button: প্রবেশ + register now: এখনই নিবন্ধন করুন + with username: 'ইতিমধ্যে একটি ওপেনস্ট্রিটম্যাপ অ্যাকাউন্ট আছে? দয়া করে ব্যবহারকারীনাম + এবং পাসওয়ার্ড দিয়ে প্রবেশ করুন:' + new to osm: ওপেনস্ট্রিটম্যাপে নতুন? + no account: কোনও অ্যাকাউন্ট নেই? + auth_providers: + google: + title: গুগল দিয়ে প্রবেশ + facebook: + title: ফেসবুক দিয়ে প্রবেশ + github: + title: গিটহাব দিয়ে প্রবেশ করুন + alt: একটি গিটহাব অ্যাকাউন্ট দিয়ে প্রবেশ করুন + wikipedia: + title: উইকিপিডিয়া দিয়ে প্রবেশ + yahoo: + title: ইয়াহু দিয়ে প্রবেশ + wordpress: + title: ওয়ার্ডপ্রেস দিয়ে প্রবেশ + logout: + title: প্রস্থান + logout_button: প্রস্থান + lost_password: + heading: পাসওয়ার্ড ভুলে গেছেন? + email address: 'ইমেইল ঠিকানা:' + reset_password: + password: 'পাসওয়ার্ড:' + confirm password: 'পাসওয়ার্ড নিশ্চিত করুন:' + flash changed: আপনার পাসওয়ার্ড পরিবর্তন করা হয়েছে। + terms: + agree: একমত + legale_select: 'আপনার দেশ বাছাই করুন:' + legale_names: + france: ফ্রান্স + italy: ইতালি + rest_of_world: অন্যান্য দেশসমূহ + view: + my edits: আমার সম্পাদনা + my profile: আমার প্রোফাইল + edits: সম্পাদনাসমূহ + email address: 'ই-মেইল ঠিকানা:' + description: বিবরণ + settings_link_text: সেটিংস + block_history: সক্রিয় বাধাসমূহ + moderator_history: প্রদত্ত বাধাগুলি + comments: মন্তব্যসমূহ + create_block: এই ব্যবহারকারীকে বাধা দাও + activate_user: এই ব্যবহাকারীকে সক্রিয় করুন + deactivate_user: এই ব্যবহারকারীকে নিষ্ক্রিয় করুন + confirm_user: এই ব্যবহারকারীকে নিশ্চিত করুন + hide_user: এই ব্যবহারকারীকে লুকান + unhide_user: এই ব্যবহাকারীকে দেখান + delete_user: এই ব্যবহাকারীকে অপসারণ করুন + confirm: নিশ্চিত করুন + popup: + your location: আপনার অবস্থান + account: + current email address: 'বর্তমান ই-মেইল ঠিকানা:' + new email address: 'নতুন ই-মেইল ঠিকানা:' + public editing: + enabled link text: এটি কী? + contributor terms: + link text: এটি কী? + image: 'চিত্র:' + gravatar: + link text: এটি কী? + new image: চিত্র যোগ করুন + latitude: 'অক্ষাংশ:' + longitude: 'দ্রাঘিমাংশ:' + confirm: + button: নিশ্চিত করুন + confirm_email: + button: নিশ্চিত করুন + go_public: + flash success: আপনার সকল সম্পাদনা এখন উন্মুক্ত, এবং এখন আপনার সম্পাদনের অনুমতি + রয়েছে। + list: + title: ব্যবহারকারীগণ + heading: ব্যবহারকারীগণ + user_role: + filter: + not_an_administrator: শুধুমাত্র এডমিনিস্ট্রেটরই ব্যবহারকারীর দায়িত্ব প্রদান + করতে পারে এবং আপনি এডমিনিষ্ট্রেটর নন। + not_a_role: উক্ত `%{role}' টি কোন সঠিক দায়িত্ব নয়। + already_has_role: এই ব্যবহারকারী %{role} দায়িত্বটি এখনো আছে। + doesnt_have_role: এই ব্যবহারকারীর %{role} দায়িত্বটি নেই। + grant: + title: দায়িত্ব প্রদানকরণ নিশ্চিত করুন + heading: দায়িত্ব প্রদানকরণ নিশ্চিত করুন + are_you_sure: আপনি কি `%{name}' ব্যবহারকারী কে `%{role}' দায়িত্বটি দিতে চান? + confirm: নিশ্চিত করুন + fail: '`%{name}'' ব্যবহারকারীর `%{role}'' দায়িত্বটি প্রদান সম্ভব হয় নি। দয়া + করে দেখুন যে এই ব্যবহারকারী এবং দায়িত্বটি সঠিক কিনা।' + revoke: + title: দায়িত্ব বাতিলকরণ নিশ্চিত করুন + heading: দায়িত্ব বাতিলকরণ নিশ্চিত করুন + are_you_sure: আপনি কি নিশ্চিতভাবে `%{name}' ব্যবহারকারীর উক্ত `%{role}' দায়িত্বটি + বাতিল করতে চান? + confirm: নিশ্চিত করুন + fail: '`%{name}'' ব্যবহারকারীর `%{role}'' দায়িত্বটি বাতিল অযোগ্য। দয়া করে + দেখুন যে এই ব্যবহারকারী এবং দায়িত্বটি সঠিক কিনা।' + user_block: + partial: + edit: সম্পাদনা + confirm: আপনি কি নিশ্চিত? + display_name: বাধাপ্রাপ্ত ব্যবহারকারী + next: পরবর্তী » + previous: « পূর্ববর্তী + show: + created: তৈরি হয়েছে + ago: '%{time} আগে' + status: স্থিতি + show: দেখাও + edit: সম্পাদনা + confirm: আপনি কি নিশ্চিত? + note: + entry: + comment: মন্তব্য + javascripts: + close: বন্ধ + share: + title: বণ্টন + cancel: বাতিল + image: চিত্র + format: 'বিন্যাস:' + download: ডাউনলোড + short_url: সংক্ষিপ্ত ইউআরএল + map: + layers: + data: মানচিত্র উপাত্ত + site: + edit_tooltip: মানচিত্রটি সম্পাদনা করুন + changesets: + show: + comment: মন্তব্য + notes: + new: + add: টীকাযুক্ত করুন + show: + hide: লুকান + resolve: মিমাংসা করুন + reactivate: পুনঃসক্রিয় + comment: মন্তব্য + directions: + directions: দিক + distance: দূরত্ব + errors: + no_place: দুঃখিত - এই স্থানটি খুঁজে পাওয়া যায়নি। + instructions: + continue_without_exit: '%{name}-এ যেতে থাকুন' + slight_right_without_exit: '%{name}-এ সামান্য ডান দিকে সরান' + turn_right_without_exit: '%{name}-এ ডানদিকে মোড় নিন' + turn_left_without_exit: '%{name}-এ ডানদিকে মোড় নিন' + slight_left_without_exit: '%{name}-এ সামান্য বামে' + via_point_without_exit: (বিন্দুর মাধ্যমে) + follow_without_exit: '%{name} অনুসরণ করুন' + start_without_exit: '%{name}-এর শেষে শুরু' + destination_without_exit: গন্তব্যে পৌঁছানো + against_oneway_without_exit: '%{name}-এ একমুখীর বিরুদ্ধে যান' + end_oneway_without_exit: '%{name}-এর একমুখী শেষ' + unnamed: নামহীন সড়ক + time: সময় + query: + node: সংযোগস্থল + way: রাস্তা + relation: সম্পর্ক + nothing_found: বৈশিষ্ট্য খুঁজে পাওয়া যায়নি + redaction: + edit: + description: বিবরণ + heading: সম্পাদনা সম্পাদন করুন + submit: সম্পাদন সংরক্ষণ করুন + title: সম্পাদনা সম্পাদন করুন + index: + empty: প্রদর্শন করার মতো সম্পাদন নেই। + heading: সম্পাদন সমূহের তালিকা + title: সম্পাদন সমূহের তালিকা + new: + description: বিবরণ + heading: নতুন সম্পাদনের জন্য তথ্য লিখুন + submit: সম্পাদন তৈরি করুন + title: নতুন সম্পাদন তৈরি করা হচ্ছে + show: + description: 'বিবরণ:' + confirm: আপনি কি নিশ্চিত? + update: + flash: পরিবর্তন সংরক্ষিত। +... diff --git a/config/locales/br.yml b/config/locales/br.yml index 26684983c..c1e9bf6cc 100644 --- a/config/locales/br.yml +++ b/config/locales/br.yml @@ -4,6 +4,7 @@ # Author: Fohanno # Author: Fulup # Author: Gwenn-Ael +# Author: Macofe # Author: Nemo bis # Author: Shirayuki # Author: Y-M D @@ -162,6 +163,7 @@ br: way: hent relation: darempred changeset: strollad kemmoù + note: notenn timeout: sorry: Digarezit, ar roadennoù evit ar seurt %{type} ha gant an id %{id} a zo re hir da adtapout. @@ -170,6 +172,7 @@ br: way: hent relation: darempred changeset: strollad kemmoù + note: notenn redacted: redaction: ↓Aozañ %{id} message_html: ↓Stumm %{version} eus an %{type}-mañ na c'hall ket bezañ diskouezet @@ -257,6 +260,7 @@ br: diary_entry: new: title: Enmoned nevez en deizlevr + publish_button: Embann list: title: Deizlevrioù an implijerien title_friends: Marilhoù ar vignoned @@ -986,9 +990,8 @@ br: legal_babble: title_html: Copyright hag aotre-implijout intro_1_html: |- - OpenStreetMap zo <i>dindan un aotre-implijout digor</i>, a c'haller kavout en <a - href="http://opendatacommons.org/licenses/odbl/">Open Data - Commons Open Database License</a> (ODbL). + OpenStreetMap <sup><a href="#trademarks">®</a></sup> zo <i>dindan un aotre-implijout digor</i>, Open Data + Commons Open Database License</a> (ODbL) gant <sup><a href="#trademarks">®</a></sup> intro_2_html: "Dieub oc'h da eilañ, da skignañ, da gas ha da azasaat hor c'hartennoù\n \ hag hor roadennoù, gant ma root kred da OpenStreetMap ha d'e\n genlabourerien. Ma kemmit pe ma implijit hor c'hartennoù pe hor roadennoù e labourioù all,\n @@ -1018,9 +1021,9 @@ br: alt: Skouer eus penaos deverkañ OpenStreetMap war ur bajenn web title: Skouer deverkadur more_title_html: Titouroù ouzhpenn - more_1_html: |- - Ma fell deoc'h kaout muioc'h a ditouroù diwar-benn adimplij hor roadennoù, lennit <a - href="http://wiki.openstreetmap.org/wiki/Legal_FAQ">FAG ar reolennoù</a>. + more_1_html: Ma fell deoc'h kaout muioc'h a ditouroù diwar-benn adimplij hor + roadennoù, lennit <a href="http://osmfoundation.org/Licence"> Licence OSMF + Licence page</a> hag ar gumuniezh <a more_2_html: |- Daoust da OpenStreetMap bezañ un hollad roadennoù digor, n'omp ket evit pourchas un API digoust evit an diorroerien diavaez. @@ -1055,6 +1058,9 @@ br: contributors_nz_html: |- <strong>Zeland-Nevez</strong> : Ennañ roadennoù eus Land Information New Zealand. Crown Copyright reserved. + contributors_si_html: |- + <Strong>Slovenia</strong>: zo enni roadennoù eus <a href="http://www.gu.gov.si/en/">Aotrouniezh steuñvidigezh ha Kartografiezh </a> hag eus <a href="http://www.mkgp.gov.si/en/">Ministrerezh al Labour-douar, ar C'hoadeier hag ar Boued</a> + (titouroù foran eus Slovenia) contributors_za_html: |- <strong>Afrika ar Su</strong> : Ennañ roadennoù eus <a href="http://www.ngi.gov.za/">Chief Directorate: @@ -1078,6 +1084,7 @@ br: da c'houzout d'hon <a href="http://www.osmfoundation.org/wiki/License/Takedown_procedure">argerzh dizober</a>, mar plij, pe skrivit war-eeun war hor <a href="http://dmca.openstreetmap.org/">furmskrid enlinenn</a>. + trademarks_title_html: <span id="merkoù"></span>Merkoù welcome_page: title: Deuet-mat oc'h ! introduction_html: Degemer mat en OpenStreetMap, ar gartenn digoust eus ar bed @@ -1148,11 +1155,31 @@ br: url: /welcome title: Deuet-mat oc'h en OSM description: Krogit gant ar sturlevr-mañ evit deskiñ diazezoù OpenStreetMap + beginners_guide: + url: http://wiki.openstreetmap.org/wiki/FR:Sturlevr an deraouidi + title: Sturlevr evit deraouidi + description: Sturlevr evit an deraouidi dalc'het gant ar gumuniezh help: url: https://help.openstreetmap.org/ title: help.openstreetmap.org description: Ober ur goulenn pe klask respontoù e lec'hienn goulennoù-respontoù OSM + mailing_lists: + title: Roll skignañ + description: Sevel ur goulenn pe divizout diwar-benn goulennoù dedennus war + un niver bras a demoù pe diwar-benn rolloù skignañ rannvroel. + forums: + title: Foromoù + description: Goulennoù ha divizoù evit ar re a gav gwelloc'h un etrefas e stil + un daolenn skritellañ + irc: + title: IRC + description: Flap etreoberiat e meur a yezh disheñvel ha diwar-benn danvezioù + a bep seurt. + switch2osm: + title: switch2osm + description: Skoazell evit an embregerezhioù hag an aozadurioù trec'haoliñ e + OpenStreetMap, hervez ar c'hartennoù hag ar servijoù all. wiki: url: http://wiki.openstreetmap.org/ title: wiki.openstreetmap.org @@ -1160,7 +1187,7 @@ br: about_page: next: War-lerc'h copyright_html: <span>©</span>OpenStreetMap<br>kenlabourerien - used_by: '%{name} a bourchas kartennoù da gantadoù a lec''hiennoù web, da arloadoù + used_by: '%{name} a bourchas kartennoù da viliadoù a lec''hiennoù web, da arloadoù hezoug ha da vekanikoù' lede_text: Savet eo OpenStreetMap gant ur gumuniezh gartennerien a-youl vat a genlabour hag a gempenn roadennoù diwar-benn hentoù, gwenodennoù, kafedioù, @@ -1179,6 +1206,13 @@ br: warnañ. Ma cheñchit ar roadennoù pe ma harpit warno e doareoù zo, e c''hallit skignañ an disoc''h dindan ar memes aotre-implij hepken. Sellit ouzh <a href=''%{copyright_path}''>Aotre-eilañ ha pajenn an aotre-implij</a> evit gouzout hiroc''h.' + legal_title: Lezennel + legal_html: "Al lec'hienn-mañ hag e-leizh a servijoù all kar zo korvoet ent furmel + gant an <a href=\"http://osmfoundation.org/\">Diazezaddur OpenStreetMap</a> + (OSMF) \nen anv ar gumuniezh.\n<br>\nKit <a href=\"http://osmfoundation.org/Contact\">contacter + l'OSMF</a> e darempred gant an OSMF</a>, mar plij, m'ho peus goulennoù da sevel + diwar-benn an aotreoù-implijout, ar gwirioù oberour pe diwar-benn goulennoù + lezennel all." partners_title: Kevelerien notifier: diary_comment_notification: @@ -1425,15 +1459,16 @@ br: table: entry: motorway: Gourhent + main_road: Hent pennañ trunk: Hent broadel primary: Hent bras secondary: Hent bihan unclassified: Hent n'eo ket rummet - unsurfaced: Hent n'eo ket goloet track: Roudenn - byway: Gwenodenn bridleway: Hent evit kezeg cycleway: Roudenn divrodegoù + cycleway_national: roudenn vroadel evit an divrodegoù + cycleway_local: roudenn lec'hel evit an divrodegoù footway: Hent evit an dud war droad rail: Hent-houarn subway: Linenn vetro @@ -1455,7 +1490,6 @@ br: golf: Tachenn golf park: Park resident: Takad annez - tourist: Diduañs evit an douristed common: - prad - prad @@ -1485,9 +1519,10 @@ br: tunnel: Bord poentoùigoù = riboul bridge: Bord du = pont private: Moned prevez - permissive: Moned aotreüs destination: Moned d'ar pal construction: Hentoù war ar stern + bicycle_shop: Stal varc'hoù-houarn + toilets: Privezioù richtext_area: edit: Aozañ preview: Rakwelet @@ -1740,6 +1775,34 @@ br: auth failure: Ho tigarez, met n'eus ket bet gallet hoc'h anavezout gant an titouroù pourchaset. openid_logo_alt: Kevreañ gant un OpenID + auth_providers: + openid: + title: Kevreañ ouzh OpenID + alt: Kevreañ ouzh un URL OpenID + google: + title: Kevreañ ouzh Google + alt: Kevreañ ouzh OpenID Google + facebook: + title: Kevreañ ouzh Facebook + alt: Kevreañ ouzh ur gont facebook + windowslive: + title: Kevreañ ouzh Windows Live + alt: Kevreañ ouzh ur gont Windows Live + github: + title: Kevreañ dre GitHub + alt: Kevreañ gant ur gont GitHub + wikipedia: + title: Kevreañ dre Wikipedia + alt: Kevreañ gant ur gont Wikipedia + yahoo: + title: Kevreañ ouzh Yahoo + alt: Kevreañ ouzh Yahoo OpenID + wordpress: + title: Kevreañ ouzh Wordpress + alt: Kevreañ ouzh OpenID Wordpress + aol: + title: Kevreañ ouzh AOL + alt: Kevreañ ouzh AOL OpenID logout: title: Digevreañ heading: Kuitaat OpenStreetMap @@ -1765,7 +1828,7 @@ br: new: title: Kevreañ no_auto_account_create: Siwazh n'omp ket evit krouiñ ur gont evidoc'h ent emgefreek. - contact_webmaster: Kit e darempred gant ar <a href="mailto:webmaster@openstreetmap.org">mestr-gwiad</a>, + contact_webmaster: Kit e darempred gant ar <a href="%{webmaster}">mestr-gwiad</a>, mar plij, evit ma krouo ur gont evidoc'h - klask a raimp plediñ gant ho koulenn kerkent ha ma vo tu. about: @@ -1783,6 +1846,7 @@ br: display name: 'Anv diskwelet :' display name description: Emañ hoc'h anv implijer a-wel d'an holl. Se a c'hallit cheñch diwezhatoc'h en ho penndibaboù. + external auth: 'Dilesadur trede :' password: 'Ger-tremen :' confirm password: 'Kadarnaat ar ger-tremen :' continue: En em enskrivañ @@ -1817,6 +1881,7 @@ br: heading: N'eus ket eus an implijer %{user} body: Ho tigarez, n'eus implijer ebet en anv %{user}. Gwiriit hag-eñ eo skrivet mat, pe marteze hoc'h eus kliket war ul liamm fall. + deleted: dilamet view: my diary: ma deizlevr new diary entry: enmoned nevez en deizlevr @@ -1868,16 +1933,16 @@ br: revoke: administrator: Disteurel ar moned merour moderator: Disteurel ar moned habaskaer - block_history: stankadurioù resevet - moderator_history: stankadurioù roet + block_history: stankadurioù oberiant + moderator_history: Stankadurioù roet comments: evezhiadennoù - create_block: stankañ an implijer-mañ - activate_user: gweredekaat an implijer-mañ - deactivate_user: diweredekaat an implijer-mañ - confirm_user: kadarnaat an implijer-mañ - hide_user: kuzhat an implijer-mañ + create_block: Stankañ an implijer-mañ + activate_user: Gweredekaat an implijer-mañ + deactivate_user: Diweredekaat an implijer-mañ + confirm_user: Kadarnaat an implijer-mañ + hide_user: Kuzhat an implijer-mañ unhide_user: Diguzhat an implijer-mañ - delete_user: dilemel an implijer-mañ + delete_user: Dilemel an implijer-mañ confirm: Kadarnaat friends_changesets: Strolladoù kemmoù graet gant mignoned friends_diaries: Enmonedoù deizlevr ar vignoned @@ -1893,6 +1958,7 @@ br: current email address: 'Chomlec''h postel a-vremañ :' new email address: 'Chomlec''h postel nevez :' email never displayed publicly: (n'eo ket diskwelet d'an holl morse) + external auth: 'Dilesadur diavaez :' openid: link: http://wiki.openstreetmap.org/wiki/OpenID link text: petra eo se ? @@ -1964,17 +2030,17 @@ br: confirm_resend: success: Kaset hon eus ur postel kadarnaat da %{email}. Kerkent ha kadarnaet ho kont e c'hallot kregiñ da gartennañ.<br /><br />Ma implijit ur reizhiad - enep-strob hag a gas goulennoù kadarnaat, lakait webmaster@openstreetmap.org - en ho listenn wenn, mar plij, rak n'omp ket evit respont d'ar posteloù-se. + enep-strob hag a gas goulennoù kadarnaat, lakait %{sender} en ho listenn wenn, + mar plij, rak n'omp ket evit respont d'ar posteloù-se. failure: N'eo ket bet kavet an implijer %{name}. confirm_email: heading: Kadarnaat ur c'hemm chomlec'h postel press confirm button: Pouezit war ar bouton kadarnaat evit kadarnaat ho chomlec'h postel nevez. button: Kadarnaat - success: Kadarnaet eo ho chomlec'h postel, trugarez evit bezañ en em enskrivet - ! + success: Kadarnaet eo ho chomlec'h postel ! failure: Kadarnaet ez eus bet ur chomlec'h postel dija gant art jedouer-mañ. + unknown_token: N'eo ket mat ar c'hod kadarnaat-mañ ken pe n'eus ket anezhañ set_home: flash success: Enrollet eo bet lec'hiadur ar gêr go_public: @@ -2015,6 +2081,16 @@ br: <p> Gwiriet e vo an diviz-se a-benn nebeut gant ur merour. Gallout a rit mont e darempred gant ar%{webmaster} m'hoc'h eus c'hoant da gaozeal diwar-benn an dra-se. </p> + auth_failure: + connection_failed: C'hwitet eo ar gevreadenn ouzh ur pourchaser dilesa + invalid_credentials: Titouroù dilesa direizh + no_authorization_code: Kod aotre ebet + unknown_signature_algorithm: Kod aotre dianav + invalid_scope: Astenn dianav + auth_association: + heading: N'eo ket kevredet ho ID ouzh ur gont OpenStreetMap. + option_1: Ma'z oc'h un den nevez en OpenStreetMap, krouit ur gont nevez, mar + plij, war-bouez ar furmskrid amañ dindan. user_role: filter: not_an_administrator: N'eus nemet ar verourien a c'hall merañ ar rolloù, ha @@ -2132,6 +2208,8 @@ br: heading: '%{block_on} stanket gant %{block_by}' time_future: Echuiñ a ray a-benn %{time} time_past: Echuet %{time} zo + created: Krouet + ago: '%{time}zo' status: Statud show: Diskouez edit: Aozañ @@ -2182,6 +2260,7 @@ br: link: Liamm pe HTML long_link: Liamm short_link: Liamm berr + geo_uri: Geo URI embed: HTML custom_dimensions: Lakaat mentoù personelaet format: 'Furmad :' @@ -2193,6 +2272,8 @@ br: center_marker: Kreizañ ar gartenn war ar merker paste_html: Pegañ HTML evit bezañ enkorfet en ul lec'hienn web view_larger_map: Gwelet ur gartenn vrasoc'h + embed: + report_problem: Menegiñ ur gudenn key: title: Alc'hwez ar gartenn tooltip: Alc'hwez ar gartenn @@ -2208,7 +2289,6 @@ br: standard: Standard cycle_map: Kelc'hiad kartenn transport_map: Kartenn treuzdougen - mapquest: MapQuest digor hot: Denegour layers: header: Gwiskadoù kartenn @@ -2260,12 +2340,33 @@ br: mapquest_car: Karr (MapQuest) mapquest_foot: Troad (MapQuest) osrm_car: Karr(OSRM) + mapzen_bicycle: Marc'h-houarn (Mapzen) + mapzen_car: Karr (Mapzen) + mapzen_foot: War droad (Mapzen) directions: Tuioù distance: Hed errors: no_route: Ne c'haller ket kavout un hent etre an daou lec'h-mañ. no_place: Ho tigarez, ne c'haller ket kavout al lec'h-mañ. instructions: + continue_without_exit: Kenderc'hel war%{name} + slight_right_without_exit: Troit un tammig a-zehoù war %{name} + turn_right_without_exit: Treiñ a-zehoù war %{name} + sharp_right_without_exit: Troit prim a-zehoù war %{name} + uturn_without_exit: Grit hanter dro war %{name} + sharp_left_without_exit: Troit prim a-gleiz war %{name} + turn_left_without_exit: Treiñ a-gleiz war %{name} + slight_left_without_exit: Troit un tammig a-gleiz war %{name} + via_point_without_exit: (dre ar poent) + follow_without_exit: Heuliañ %{name} + roundabout_without_exit: Er c'hroashent-tro, troit %{name} + leave_roundabout_without_exit: Kuitaat ar c'roashent-tro - %{name} + stay_roundabout_without_exit: Chom war ar c'hroashent-tro -%{name} + start_without_exit: Loc'hañ e dibenn %{name} + destination_without_exit: Tizhout al lec'h + against_oneway_without_exit: Mont gant ar straed untu war %{name} + end_oneway_without_exit: Dibenn an tremen untun war %{name} + roundabout_with_exit: Er c'hroashent-tro, kemer an hent-maez %{exit} war %{name} unnamed: hep anv courtesy: Hent a-berzh %{link} time: Eur diff --git a/config/locales/bs.yml b/config/locales/bs.yml index 7f48be0d9..81e353f26 100644 --- a/config/locales/bs.yml +++ b/config/locales/bs.yml @@ -6,9 +6,12 @@ # Author: DzWiki # Author: Edinwiki # Author: KWiki +# Author: Macofe # Author: Maxmus +# Author: Palapa # Author: Ruila # Author: Srdjan m +# Author: Сербијана --- bs: time: @@ -99,6 +102,8 @@ bs: browse: created: Napravljeno closed: Zatvoreno + created_html: Kreirano <abbr title='%{title}'>%{time} prije</abbr> + closed_html: Zatvoreno <abbr title='%{title}'>%{time} prije</abbr> version: Verzija in_changeset: Skup promijena anonymous: anonimno @@ -111,11 +116,25 @@ bs: changeset: title: 'Skup promjena: %{id}' belongs_to: Autor + node: Čvorovi (%{count}) + node_paginated: Čvorovi (%{x}-%{y} of %{count}) + way: Putevi (%{count}) + way_paginated: Putevi (%{x}-%{y} of %{count}) + relation: Relacije (%{count}) + relation_paginated: Relacije (%{x}-%{y} of %{count}) + comment: Komentari (%{count}) + hidden_commented_by: Skriveni komentar korisnika %{user} <abbr title='%{exact_time}'>%{when} + ago</abbr> + commented_by: Komentar korisnika %{user} <abbr title='%{exact_time}'>%{when} + ago</abbr> changesetxml: XML seta promjena osmchangexml: osmChange XML feed: title: Set promjena %{id} title_comment: Set promjena %{id} - %{comment} + discussion: Diskusija + node: + title: 'Čvor: %{name}' way: nodes: Tačke relation: @@ -163,6 +182,10 @@ bs: wikipedia_link: Članak o %{page} na Wikipediji note: new_note: Nova biljeÅ¡ka + description: Opis + query: + nearby: Obližnje značajke + enclosing: Značajke okruženja changeset: changeset_paging_nav: showing_page: Stranica %{page} @@ -187,6 +210,8 @@ bs: timeout: sorry: Žao nam je, listi seta promjena koju ste tražili je predugo trajalo za preuzimanje. + rss: + full: Cijela diskusija diary_entry: new: title: Novi unos u dnevnik @@ -336,6 +361,7 @@ bs: charging_station: Stanica za punjenje cinema: Kino clinic: Klinika + clock: Sat college: Koledž community_centre: DruÅ¡tveni centar courthouse: Sud @@ -354,6 +380,7 @@ bs: food_court: DvoriÅ¡te restorana fountain: Fontana fuel: Benzinska pumpa + gambling: Kockanje grave_yard: Groblje gym: Fitness centar health_centre: Zdravstveni centar @@ -364,11 +391,14 @@ bs: library: Biblioteka market: Tržnica marketplace: Tržnica + monastery: Manastir + motorcycle_parking: Parking za motore nightclub: Noćni klub nursery: Čuvanje djece nursing_home: Starački dom office: Kancelarija parking: Parking + parking_entrance: Ulaz u parking pharmacy: Apoteka place_of_worship: Bogomolja police: Policija @@ -402,6 +432,7 @@ bs: veterinary: Veterinar village_hall: Seoski Dom waste_basket: Kanta za otpatke + waste_disposal: Odlaganje otpada youth_centre: Centar za omladinu boundary: administrative: Administrativna granica @@ -416,6 +447,15 @@ bs: "yes": Most building: "yes": Građevina + craft: + carpenter: Stolar + electrician: Električar + gardener: Vrtlar + painter: Slikar + photographer: Fotograf + plumber: Vodoinstalater + shoemaker: Obućar + tailor: Krojač emergency: phone: S.O.S. Telefon highway: @@ -461,7 +501,8 @@ bs: archaeological_site: ArheoloÅ¡ko nalaziÅ¡te battlefield: Bojno polje boundary_stone: Granični kamen - building: Građevina + building: Historijska građevina + bunker: Bunker castle: Dvorac church: Crkva citywalls: Gradski zidovi @@ -473,11 +514,14 @@ bs: mine: Rudnik monument: Spomenik ruins: RuÅ¡evine + stone: Kamen tomb: Grobnica tower: Toranj wayside_cross: KrajputaÅ¡ wayside_shrine: Usputni hram wreck: Olupina + junction: + "yes": Raskršće landuse: allotments: Vrtovi basin: Bazen @@ -512,6 +556,7 @@ bs: leisure: beach_resort: OdmaraliÅ¡te - plaža bird_hide: Posmatračnica ptica + club: Klub common: Općinsko zemljiÅ¡te fishing: Ribolovno područje fitness_station: Fitnes centar @@ -525,6 +570,7 @@ bs: pitch: Sportski teren playground: IgraliÅ¡te recreation_ground: Teren za rekreaciju + resort: BoraviÅ¡te sauna: Sauna slipway: Navoz sports_centre: Sportski centar @@ -629,7 +675,7 @@ bs: preserved: Sačuvana pruga spur: Pruga station: Željeznička stanica - subway: Stanica podzemne željeznice + subway: Podzemna željeznica subway_entrance: Ulaz u podzemnu željezničku stanicu switch: Skretnica tram: Tramvaj @@ -713,6 +759,7 @@ bs: camp_site: Kamp caravan_site: Kamp-kućice (mjesto) chalet: Planinska kuća + gallery: Galerija guest_house: Apartman hostel: Hostel hotel: Hotel @@ -821,7 +868,7 @@ bs: text: Vi gledate englesku verziju stranice o autorskim pravima. Možete se vratiti na %{native_link} ove stranice ili možete prestati čitati o autorskim pravima i %{mapping_link}. - native_link: BOSANSKI verzija + native_link: bosansko izdanje mapping_link: počnite sa ucrtavanjem legal_babble: title_html: Autorska prava i dozvola @@ -922,8 +969,11 @@ bs: url: /dobrodoÅ¡lica beginners_guide: url: http://wiki.openstreetmap.org/wiki/Bs:Beginners%27_guide + irc: + title: IRC about_page: next: Slijedeće + open_data_title: Open Data notifier: diary_comment_notification: subject: '[OpenStreetMap] %{user} je komentirao tvoj unos u dnevnik' @@ -989,6 +1039,13 @@ bs: njihovim e-mail adresama openstreetmap.org računa. click_the_link: Ako ste ovo Vi, kliknite na link ispod za ponovno postavljanje lozinke. + note_comment_notification: + greeting: Zdravo, + commented: + subject_own: '[OpenStreetMap] %{commenter} je dao komentar na jednu od tvojih + biljeÅ¡ki.' + changeset_comment_notification: + greeting: Zdravo, message: inbox: title: Dolazna poÅ¡ta @@ -1098,6 +1155,8 @@ bs: close: Zatvoriti search: search: Pretraga + from: Od + to: Za where_am_i: Gdje sam? where_am_i_title: OpiÅ¡ite trenutnu lokaciju koristeći pretraživač submit_text: Idi @@ -1109,9 +1168,7 @@ bs: primary: Državna cesta secondary: Sekundarna cesta unclassified: Neklasificirana cesta - unsurfaced: Neasfaltirana cesta track: Staza - byway: Prečica bridleway: Konjička staza cycleway: Biciklistička staza footway: PjeÅ¡ačka staza @@ -1135,7 +1192,6 @@ bs: golf: Golf teren park: Park resident: Stambeno područje - tourist: Turistička atrakcija common: - Travnjaci - Livada @@ -1165,7 +1221,6 @@ bs: tunnel: Iscrtkani rubovi = tunel bridge: Crni rubovi = most private: Privatni pristup - permissive: Pristup uz dozvolu destination: Pristup odrediÅ¡tu construction: Ceste u izgradnji richtext_area: @@ -1279,6 +1334,7 @@ bs: public_traces: Javne GPS trase your_traces: VaÅ¡e GPS trase public_traces_from: Javne GPS trase korisnika %{user} + description: Pretraži nedavno objavljene GPS tragove tagged_with: ' označeno sa %{tags}' empty_html: JNoÅ¡ uvijek nema niÅ¡ta ovdje. <a href='%{upload_link}'>Postavite novu trasu</a> ili naučite viÅ¡e o GPS trasiranju na <a href='http://wiki.openstreetmap.org/wiki/Bs:Beginners'_guide'>wiki @@ -1343,6 +1399,7 @@ bs: allow_write_api: Izmijenite kartu. allow_read_gpx: Pročitajte njihove privatne GPS trase. allow_write_gpx: Postaviti GPS trase. + allow_write_notes: izmijeni biljeÅ¡ke. index: title: Moji OAuth detalji my_tokens: Moje ovlaÅ¡tene aplikacije @@ -1369,6 +1426,7 @@ bs: allow_write_api: Izmijenite kartu. allow_read_gpx: Pročitajte njihove privatne GPS trase. allow_write_gpx: Postaviti GPS trase. + allow_write_notes: izmijeni biljeÅ¡ke. not_found: sorry: Žao mi je, taj se %{type} ne može naći. create: @@ -1403,6 +1461,13 @@ bs: da diskutujete o ovome. auth failure: Žao mi je, ne možemo Vas prijaviti s ovim detaljima. openid_logo_alt: Prijavite se sa OtvorenimID + auth_providers: + yahoo: + title: Prijavite se sa Yahoo nalogom + alt: Prijavite se sa Yahoo OpenID + wordpress: + title: Prijavite se sa Wordpress nalogom + alt: Prijavite se sa Wordpress OpenID logout: title: Odjava heading: Odjava iz OpenStreetMap @@ -1429,7 +1494,7 @@ bs: title: Otvorite račun no_auto_account_create: Nažalost nismo u mogućnosti automatski otvarati korisničke račune. - contact_webmaster: Molimo da kontaktirate s <a href="mailto:webmaster@openstreetmap.org">webmasterom</a> + contact_webmaster: Molimo da kontaktirate s <a href="%{webmaster}">webmasterom</a> da omogući stvaranje korisničkog računa - pokuÅ¡at ćemo se pozabaviti ovim u najkraćem mogućem vremenu. license_agreement: Kada potvrdite VaÅ¡ račun moraćete pristati na <a href="http://www.osmfoundation.org/wiki/License/Contributor_Terms">Uslove @@ -1478,6 +1543,7 @@ bs: new diary entry: Novi unos u dnevnik my edits: Moje promjene my traces: Moje trase + my profile: Moj profil my settings: Moja podeÅ¡avanja my comments: Moji komentari oauth settings: Oauth podeÅ¡avanja @@ -1607,15 +1673,15 @@ bs: confirm_resend: success: Poslali smo novu potvrdu na e-mail %{email} a čim potvrdite svoj račun, moći ćete početi mapirati.<br /><br />Ako koristite antispam sistem koji Å¡alje - potvrdu zahtjeva, molimo Vas da provjerite jeli webmaster@openstreetmap.org - na tzv. "bijeloj listi", jer nismo u mogućnosti odgovarati na potvrde zahtjeva. + potvrdu zahtjeva, molimo Vas da provjerite jeli %{sender} na tzv. "bijeloj + listi", jer nismo u mogućnosti odgovarati na potvrde zahtjeva. failure: Korisnik %{name} nije pronađen. confirm_email: heading: Potvrditi promjenu e-mail adrese. press confirm button: Pritsnite potvrdno dugme ispod da bi ste potvrdili novu e-mail adresu. button: Potvrditi - success: VaÅ¡a e-mail adresa je potvrđena, hvala na uključenju! + success: Promjena adrese e-poÅ¡te je potvrđena! failure: E-mail adresa je već potvrđena sa ovom značkom. set_home: flash success: Matična lokacija uspjeÅ¡no snimljena. @@ -1765,6 +1831,8 @@ bs: heading: '%{block_on} blokiran od strane %{block_by}' time_future: ZavrÅ¡ava u %{time} time_past: ZavrÅ¡eno prije %{time} + created: Napravljeno + ago: '%{time} prije' status: Stanje show: Pokazati edit: Urediti @@ -1775,8 +1843,11 @@ bs: revoker: 'Opozivalac:' needs_view: Korisnik se mora prijaviti prije nego se blokada očisti. note: + description: + opened_at_html: Kreirano prije %{when} mine: id: Id + creator: Izradio description: Opis created_at: 'Napravljeno:' last_changed: Posljednji put promijenjeno @@ -1790,9 +1861,11 @@ bs: link: Veza ili HTML long_link: Veza short_link: Kratki link + geo_uri: Geo URI embed: HTML custom_dimensions: Postavi prilagođene dimenzije format: 'Format:' + scale: 'Mjerilo:' download: Preuzmi short_url: Kratki URL include_marker: Uključi oznaku diff --git a/config/locales/ca.yml b/config/locales/ca.yml index a08e74574..f9e647fa6 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -4,15 +4,18 @@ # Author: Aleator # Author: Alvaro Vidal-Abarca # Author: Annamerida +# Author: Eduardo Martinez # Author: El libre # Author: Fitoschido # Author: Gemmaa # Author: Grondin +# Author: Jaumeortola # Author: Jconstanti # Author: Jmontane # Author: Macofe # Author: Martorell # Author: McDutchie +# Author: Medol # Author: Micru # Author: Mlforcada # Author: Nemo bis @@ -29,6 +32,8 @@ # Author: 아라 --- ca: + html: + dir: ltr time: formats: friendly: '%e %B %Y a les %H.%M' @@ -143,10 +148,10 @@ ca: way_paginated: Vies (%{x}-%{y} de %{count}) relation: Relacions (%{count}) relation_paginated: Relacions (%{x}-%{y} de %{count}) - comment: (%{count}) comentaris - hidden_commented_by: Comentari ocult de l'usuari %{user} <abbr title='%{exact_time}'>%{when} - ago</abbr> - commented_by: Comentari de %{user} <abbr title='%{exact_time}'>%{when} ago</abbr> + comment: Comentaris(%{count}) + hidden_commented_by: Comentari ocult de l'usuari %{user}<abbr title='%{exact_time}'>fa + %{when}</abbr> + commented_by: Comentari de %{user} <abbr title='%{exact_time}'>fa %{when}</abbr> changesetxml: XML del conjunt de canvis osmchangexml: XML en format osmChange feed: @@ -184,6 +189,7 @@ ca: way: via relation: relació changeset: conjunt de canvis + note: nota timeout: sorry: Ho sentim, hem trigat massa en obtenir les dades pel tipus %{type} amb identificador %{id}. @@ -192,6 +198,7 @@ ca: way: via relation: relació changeset: conjunt de canvis + note: nota redacted: redaction: Redacció %{id} message_html: La versió %{version} d'aquest %{type} no pot ser mostrada com @@ -218,7 +225,7 @@ ca: title: 'Nota: %{id}' new_note: Nova nota description: Descripció - open_title: 'nota no resolta: #%{note_name}' + open_title: 'Nota no resolta: #%{note_name}' closed_title: 'Nota resolta #%{note_name}' hidden_title: 'Nota oculta #%{note_name}' open_by: Creat per %{user} fa <abbr title='%{exact_time}'>%{when}</abbr> @@ -275,6 +282,7 @@ ca: diary_entry: new: title: Nova Entrada de Diari + publish_button: Publica list: title: Diaris d'usuari/a title_friends: Diaris dels amics @@ -949,7 +957,7 @@ ca: h1: OpenStreetMap logo: alt_text: logotip de l'OpenStreetMap - home: Anar a la localització de casa + home: Vés a la ubicació d'inici logout: Tancar sessió log_in: Inicia sessió log_in_tooltip: Inicia una sessió amb un compte existent @@ -1051,9 +1059,9 @@ ca: Freqüents sobre legalitat</a>. more_2_html: Encara que les dades d'OpenStreetMap són dades obertes, no podem oferir una API gratuïta per als desenvolupadors de terceres parts. Vegeu la - <a href="http://wiki.openstreetmap.org/wiki/API_usage_policy">Política d'ús - de l'API</a>, la <a href="http://wiki.openstreetmap.org/wiki/Tile_usage_policy">Política - d'ús de les tessel·les</a> i la <a href="http://wiki.openstreetmap.org/wiki/Nominatim#Usage_Policy">Política + <a href="https://operations.osmfoundation.org/policies/api/">política d'ús + de l'API</a>, la <a href="https://operations.osmfoundation.org/policies/tiles/">política + d'ús de les tessel·les</a> i la <a href="https://operations.osmfoundation.org/policies/nominatim/">política d'ús de Nominatim</a>. contributors_title_html: Els nostres col·laboradors contributors_intro_html: 'Els nostres col·laboradors són milers de persones. @@ -1081,6 +1089,9 @@ ca: contributors_nz_html: |- <strong>Nova Zelanda</strong>: conté dades d'origen de Informació Nova Zelanda de la terra. Corona de drets d'autor reservat. + contributors_si_html: '<strong>Eslovènia</strong>: Conté dades de l''<a href="http://www.gu.gov.si/en/">Autoritat + de Topografia i Cartografia</a> i el <a href="http://www.mkgp.gov.si/en/">Ministeri + d''Agricultura, Silvicultura i Alimentació</a> (informació pública d''Eslovènia).' contributors_za_html: |- <strong>Sud-àfrica</strong>: conté dades del <a href="http://www.ngi.gov.za/">Chief Directorate: @@ -1107,6 +1118,10 @@ ca: per eliminar dades protegides pels drets d'autor</a> o empleneu aquest <a href="http://dmca.openstreetmap.org/">formulari en línia.</a>. trademarks_title_html: <span id="trademarks"></span>Marques registrades + trademarks_1_html: OpenStreetMap i el logotip de la lupa són marques registrades + de la Fundació OpenStreetMap. Si teniu preguntes sobre l'ús de les marques, + si us plau envieu les vostres al <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">Grup + de Treball de Llicències</a>. welcome_page: title: Benvingut! introduction_html: Us donem la benvinguda a l'OpenStreetMap, el mapa lliure i @@ -1135,6 +1150,14 @@ ca: sèquia, llac o edifici. tag_html: Una <strong>etiqueta</strong> és un recull de dades sobre un node o una via, com ara el nom d'un restaurant o la velocitat màxima d'una carretera. + rules: + title: Regles + paragraph_1_html: "OpenStreetMap té poques les regles formals, pel que esperem + que tots els participants col·laborin i es comuniquin amb la comunitat. Si + està considerant\naltres activitats que no sigui l'edició manual, si us plau, + llegiu i seguiu les directrius d' \n<a href=\"http://wiki.openstreetmap.org/wiki/Import/Guidelines\">Importació</a> + i \n<a href=\"http://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct\">Edició + Automàtica</a>." questions: title: Alguna pregunta més? paragraph_1_html: OpenStreetMap té multitud de recursos per conèixer aquest @@ -1190,10 +1213,19 @@ ca: respostes d'OSM. mailing_lists: title: Llistes de correu + description: Pregunta o debat sobre qüestions interessants en relació a una + àmplia sèrie de llistes de correu tòpiques o regionals. forums: title: Fòrums + description: Preguntes i debats, per a aquells que prefereixen l'estil de la + interfície d'un tauler d'anuncis. irc: title: IRC + description: Xat interactiu en llengües diferents i sobre diferents temes. + switch2osm: + title: switch2osm + description: Ajuda per a empreses i organitzacions que canviïn als mapes i altres + serveis basats en OpenStreetMap. wiki: url: http://wiki.openstreetmap.org/ title: wiki.openstreetmap.org @@ -1201,8 +1233,8 @@ ca: about_page: next: Següent copyright_html: Col·laboradors de<br><span>©</span>OpenStreetMap - used_by: '%{name} integra dades de mapes en centenars de llocs web, aplicacions - per a mòbils i dispositius de maquinari' + used_by: '%{name} integra dades de mapes en milers de llocs web, aplicacions per + a mòbils i dispositius de maquinari' lede_text: OpenStreetMap està construït per una comunitats de catògrafs que contibueixen i mantenen dades sobre carreteres, senders, cafeteries, estacions de ferrocarril, i molt més, per tot el món. @@ -1221,12 +1253,20 @@ ca: podeu distribuir el resultat només sota la mateixa llicència. Vegeu la <a href=''%{copyright_path}''>pàgina de copyright i llicència</a> per a més detalls.' legal_title: Avisos legals + legal_html: "Aquest lloc web i molts altres serveis relacionats són operats formalment + per la \n<a href=\"http://osmfoundation.org/\">Fundació OpenStreetMap</a> (OSMF) + \ en nom de la comunitat. L'ús de tots els serveis operats per l'OSMF es troba + subjecte a les nostres <a href=\"http://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy\">\npolítiques + d'ús acceptable</a> i a les nostres <a href=\"http://wiki.osmfoundation.org/wiki/Privacy_Policy\">polítiques + de privadesa</a>\n<br> \n<a href=\"http://osmfoundation.org/Contact\">Contacteu + amb l'OSMF</a> \nsi teniu qüestions sobre llicències, drets d'autor o altres + aspectes legals." partners_title: Socis notifier: diary_comment_notification: - subject: '[OpenStreetMap] %{user}, va comentar sobre la vostra entrada del diari' + subject: '[OpenStreetMap] %{user} ha comentat en una entrada de diari' hi: Hola %{to_user}, - header: '%{from_user} ha comentat en la vostra recent entrada del diari OpenStreetMap + header: '%{from_user} ha comentat en una entrada de diari de l''OpenStreetMap amb el tema %{subject}:' footer: També podeu llegir el comentari a les %{readurl} i es pot comentar als %{commenturl} o respondre a les %{replyurl} @@ -1263,8 +1303,8 @@ ca: confirm: 'Primer de tot hem de confirmar que aquesta petició ha estat feta per vostè, si ha estat així, si us plau, premeu sobre el següent enllaç per tal confirmar la vostra petició de creació del compte d''usuari:' - welcome: Després que confirmis el teu compte, et donarem més informació per - tal que puguis començar amb els coneixements bàsics. + welcome: Una vegada hàgiu confirmat el compte, us donarem alguna informació + addicional perquè pugueu començar. email_confirm: subject: '[OpenStreetMap] Confirmeu l''adreça de correu' email_confirm_plain: @@ -1399,9 +1439,9 @@ ca: unread_button: Marca com a no llegit back: Enrere to: Per a - wrong_user: Heu iniciat la sessió com a "%{user}", però el missatge que proveu - de llegir a no va ser enviat o adreçat a aquest usuari. Si us plau connecteu-vos - com l'usuari correcte per poder llegir-ho. + wrong_user: Heu iniciat la sessió com a "%{user}", però el missatge que voleu + llegir no va ser enviat per o adreçat a aquest usuari. Connecteu-vos com l'usuari + correcte per a poder llegir-lo. sent_message_summary: delete_button: Suprimeix mark: @@ -1423,8 +1463,8 @@ ca: remote_failed: L'edició ha fallat. Assegureu-vos que el JOSM, o el Merkaartor, esta executant-se i que l'opció de comandament a distància està habilitada edit: - not_public: No heu fet les configuracions necessàries per tal que les vostres - modificacions siguin públiques. + not_public: No heu fet les configuracions necessàries perquè les vostres modificacions + siguin públiques. not_public_description: Ja no podeu modificar el mapa a menys que feu públics els vostres canvis. Podeu configurar les modificacions com a públiques a la vostra %{user_page}. @@ -1459,15 +1499,17 @@ ca: table: entry: motorway: Autopista + main_road: Carretera principal trunk: Autovia de primary: Carretera principal secondary: Carretera secundària unclassified: Carretera sense classificar - unsurfaced: Unsurfaced road track: Pista - byway: Byway bridleway: Camí de ferradura cycleway: Carril bici + cycleway_national: Via ciclista nacional + cycleway_regional: Via ciclista regional + cycleway_local: Via ciclista local footway: Footway rail: Ferrocarril subway: Metro @@ -1489,7 +1531,6 @@ ca: golf: Camp de golf park: Parc resident: Zona residencial - tourist: Atracció turística common: - Comú - Prat @@ -1519,9 +1560,11 @@ ca: tunnel: Carcassa de guions = túnel bridge: Embolcall negre = bridge private: Accés privat - permissive: Permissiva accés destination: Accés de destinació construction: Carreteres en construcció + bicycle_shop: Botiga de bicicletes + bicycle_parking: Aparcament de bicicleta + toilets: Lavabos richtext_area: edit: Modifica preview: Previsualització @@ -1681,6 +1724,7 @@ ca: allow_read_gpx: llegir les vostres traces GPS privades. allow_write_gpx: carregar traces GPS. allow_write_notes: modificar les notes. + grant_access: Concedeix accés oauthorize_success: title: Sol·licitud d'autorització permesa allowed: Heu permès que l'aplicació %{app_name} accedeixi al vostre compte. @@ -1765,6 +1809,7 @@ ca: register now: Registreu-vos-hi ara with username: 'Ja teniu un compte de l''OpenStreetMap? Incieu sessió amb el nom d''usuari i contrasenya:' + with external: Alternativament, inicieu una sessió mitjançant un tercer new to osm: Nou a OpenStreetMap? to make changes: Per fer canvis a les dades de OpenStreetMap, ha de tenir un compte. @@ -1778,6 +1823,34 @@ ca: si voleu parlar-ne. auth failure: Ho sentim, no podeu registrar-vos amb aquesta informació. openid_logo_alt: Inicia sessió amb un compte OpenID + auth_providers: + openid: + title: Inicia sessió amb un compte OpenID + alt: Inicia sessió amb un compte OpenID + google: + title: Inicieu la sessió amb Google + alt: Inici de sessió amb un compte OpenID de Google + facebook: + title: Inicieu la sessió amb Facebook + alt: Entrar amb un Compte de Facebook + windowslive: + title: Inici de sessió amb Windows Live + alt: Inici de sessió amb un Compte de Windows Live + github: + title: Inicia la sessió amb GitHub + alt: Inicia la sessió amb un compte de GitHub + wikipedia: + title: Inicia la sessió amb Viquipèdia + alt: Inicia la sessió amb un compte de Viquipèdia + yahoo: + title: Inicieu la sessió amb Yahoo + alt: Inici de sessió amb un compte OpenID de Yahoo + wordpress: + title: Inicieu sessió amb Wordpress + alt: Inici de sessió amb un compte OpenID de Wordpress + aol: + title: Inici de sessió amb AOL + alt: Inici de sessió amb un compte OpenID d'AOL logout: title: Tanca la sessió heading: Tanca la sessió d'OpenStreetMap @@ -1803,9 +1876,9 @@ ca: new: title: Crear un compte no_auto_account_create: No us podem crear automàticament un compte. - contact_webmaster: Contacteu amb el <a href="mailto:webmaster@openstreetmap.org">webmestre</a> - per gestionar la creació d'un compte - intentarem tractar la sol·licitud tan - aviat com sigui possible. + contact_webmaster: Contacteu amb el <a href="%{webmaster}">webmestre</a> per + gestionar la creació d'un compte - intentarem tractar la sol·licitud tan aviat + com sigui possible. about: header: Lliure i editable html: |- @@ -1816,14 +1889,19 @@ ca: de col·laboracio</a>. email address: 'Adreça de correu:' confirm email address: 'Confirmeu l''adreça de correu electrònic:' - not displayed publicly: No es mostrarà públicament (vegeu la <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" - title="wiki privacy policy including section on email addresses">política - de privacitat</a>) + not displayed publicly: La vostra adreça no es mostrarà públicament (vegeu la + nostra <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" title="wiki + privacy policy including section on email addresses">política de privadesa</a> + per a més informació) display name: 'Nom visible:' display name description: El nom d'usuari que es motrarà públicament. El podeu canviar més endavant a les preferències. + external auth: 'Autenticació mitjançant tercers:' password: 'Contrasenya:' confirm password: 'Confirmeu la contrasenya:' + use external auth: Alternativament, inicieu una sessió mitjançant un tercer + auth no password: Amb l'autentificació per tercers no es requereix una contrasenya, + però alguns servidors o eines extres poden encara necessitar una. continue: Crear un compte terms accepted: Gràcies per a l'acceptació de les condicions de col. laborador nou! @@ -1855,6 +1933,7 @@ ca: heading: L'usuari %{user} no existeix body: No hi ha cap usuari amb el nom %{user}. Comproveu l'ortografia, o potser l'enllaç on heu fet clic és incorrecte. + deleted: esborrat view: my diary: El meu diari new diary entry: Nova entrada del diari @@ -1901,20 +1980,20 @@ ca: administrator: Aquest usuari és administrador moderator: Aquest usuari és moderador grant: - administrator: Concedir accés d'administrador - moderator: Concedir accés de moderador + administrator: Concedeix accés d'administrador + moderator: Concedeix accés de moderador revoke: administrator: Revocar l'accés d'administrador moderator: Revocar l'accés de moderador - block_history: blocs rebuts - moderator_history: blocs donats + block_history: Blocatges actius + moderator_history: Blocatges imposats comments: Comentaris - create_block: bloca aquest usuari - activate_user: activa aquest usuari - deactivate_user: desactiva aquest usuari - confirm_user: confirma aquest usuari - hide_user: amagar aquest usuari - unhide_user: Inamagui's d'aquest usuari + create_block: Bloqueja aquest usuari + activate_user: Activa aquest usuari + deactivate_user: Desactiva aquest usuari + confirm_user: Confirma aquest usuari + hide_user: Amaga aquest usuari + unhide_user: No amagar d'aquest usuari delete_user: Suprimeix aquest usuari confirm: Confirma friends_changesets: conjunts de canvis dels vostres amics @@ -1971,16 +2050,18 @@ ca: gravatar: Usa Gravatar link: http://wiki.openstreetmap.org/wiki/Gravatar link text: què és això? + disabled: S'ha inhabilitat Gravatar. + enabled: S'ha habilitat que es mostri el vostre Gravatar. new image: Afegeix una imatge keep image: Conserva la imatge actual delete image: Suprimeix la imatge actual replace image: Reemplaça la imatge actual - image size hint: (Plaça imatges com a mínim 100 x 100 treball millor) + image size hint: (val més usar imatges quadrades d'almenys 100x100) home location: 'Ubicació inicial:' no home location: No heu especificat la ubicació d'origen. latitude: 'Latitud:' longitude: 'Longitud:' - update home location on click: Localització de casa d'actualització quan faig + update home location on click: Voleu actualitzar la ubicació d'inici en fer clic al mapa? save changes button: Desa els canvis make edits public button: Fes totes les meves modificacions públiques @@ -2005,18 +2086,19 @@ ca: success: Hem enviat un bitllet de confirmació nou per %{email} i tan aviat com confirmeu el vostre compte podreu cartografiar.<br><br>Si utilitzeu un sistema contra el correu brossa que envia les sol·licituds de confirmació, llavors - autoritzeu webmaster@openstreetmap.org ja que no som capaços de respondre - les sol·licituds de confirmació. + autoritzeu %{sender} ja que no som capaços de respondre les sol·licituds de + confirmació. failure: L'usuari %{name} no s'ha trobat. confirm_email: heading: Confirma un canvi d'adreça electrònica press confirm button: Premeu el botó de confirmar sota per confirmar la seva adreça de correu electrònic nou. button: Confirma - success: S'ha confirmat l'adreça electrònica, gràcies per registrar-vos-hi! + success: S'ha confirmat el canvi de la teva adreça electrònica! failure: Una adreça de correu electrònic ja ha estat confirmat amb aquesta fitxa. + unknown_token: Aquest codi de confirmació ha expirat o no existeix. set_home: - flash success: Localització de casa desat correctament + flash success: La ubicació d'inici s'ha desat correctament go_public: flash success: Ara totes les vostres edicions són públiques i ja teniu autorització per editar @@ -2057,6 +2139,20 @@ ca: Aquesta decisió serà revisat per un administrador en breu, o es pot contactar amb el %{webmaster} si desitgeu discutir això. </p> + auth_failure: + connection_failed: La connexió al proveïdor d'autenticació ha fallat + invalid_credentials: Credencials d'autenticació no vàlides + no_authorization_code: Sense codi d'autorització + unknown_signature_algorithm: Algorisme de signatura desconegut + invalid_scope: Àmbit no vàlid + auth_association: + heading: El teu ID encara no està associat a cap compte a OpenStreetMap + option_1: |- + Si sou nou a OpenStreetMap, si us plau creeu un compte nou + Utilitzant el formulari de sota. + option_2: |- + Si ja teniu un compte, podeu iniciar sessió al vostre compte + utilitzant el vostre nom d'usuari i contrasenya i, a continuació associar el compte amb el ID a la configuració d'usuari. user_role: filter: not_an_administrator: Només els administradors poden realitzar l'administració @@ -2174,6 +2270,8 @@ ca: heading: '%{block_on} bloquejat per %{block_by}' time_future: Finalitza en %{time} time_past: Va acabar fa %{time} + created: Creat + ago: fa %{time} status: Estat show: Mostra edit: Edició @@ -2224,6 +2322,7 @@ ca: link: Enllaç o HTML long_link: Enllaç short_link: Enllaç curt + geo_uri: Geo-URI embed: HTML custom_dimensions: Estableix dimensions personalitzades format: 'Format:' @@ -2235,10 +2334,13 @@ ca: center_marker: Centra el mapa al marcador paste_html: Engnaxa l'HTML per inserir-ho a un lloc web view_larger_map: Mostra un mapa més gran + only_standard_layer: Només la capa estàndard es pot exportar com a imatge + embed: + report_problem: Informeu sobre un problema key: title: Llegenda tooltip: Llegenda - tooltip_disabled: La llegenda només està disponible per a la capa estàndard + tooltip_disabled: La llegenda no és disponible per a aquesta capa map: zoom: in: Amplia @@ -2250,12 +2352,12 @@ ca: standard: Estàndard cycle_map: Cycle Map transport_map: Mapa de transports - mapquest: MapQuest Open hot: Humanitarian layers: header: Capes del mapa notes: Notes de mapa data: Dades del mapa + gps: Traces GPS públiques overlays: Activar capes extra per als problemes del mapa title: Capes del mapa copyright: © <a href='%{copyright_url}'>Col·laboradors d'OpenStreetMap</a> @@ -2302,6 +2404,9 @@ ca: mapquest_car: Cotxe (MapQuest) mapquest_foot: A peu (MapQuest) osrm_car: Cotxe (OSRM) + mapzen_bicycle: Bicicleta (Mapzen) + mapzen_car: Cotxe (Mapzen) + mapzen_foot: A peu (Mapzen) directions: Indicacions distance: Distància errors: @@ -2310,19 +2415,39 @@ ca: instructions: continue_without_exit: Continuar a %{name} slight_right_without_exit: Gira lleugerament a la dreta a %{name} + offramp_right_without_exit: Agafeu el carril de la dreta a %{name} + onramp_right_without_exit: Gireu a la dreta al carril a %{name} + endofroad_right_without_exit: Al final de la carretera gireu a la dreta a + %{name} + merge_right_without_exit: Incorporeu-vos a la dreta a %{name} + fork_right_without_exit: A la cruïlla gireu a la dreta a %{name} turn_right_without_exit: Gira a la dreta per %{name} sharp_right_without_exit: Gira a la dreta a %{name} uturn_without_exit: Canvi de sentit a %{name} sharp_left_without_exit: Gira a l'esquerra a %{name} turn_left_without_exit: Gira a l'esquerra per %{name} + offramp_left_without_exit: Agafeu el carril de l'esquerra a %{name} + onramp_left_without_exit: Gireu a l'esquerra al carril a %{name} + endofroad_left_without_exit: Al final de la carretera gireu a l'esquerra a + %{name} + merge_left_without_exit: Incorporeu-vos a l'esquerra a %{name} + fork_left_without_exit: A la cruïlla gireu a l'esquerra a %{name} slight_left_without_exit: Gira lleugerament a l'esquerra a %{name} + via_point_without_exit: (pel punt) follow_without_exit: Segueix %{name} roundabout_without_exit: A la rotonda agafa %{name} leave_roundabout_without_exit: Surt de la rotonda %{name} stay_roundabout_without_exit: Segueix a la rotonda - %{name} start_without_exit: Comença al final de %{name} destination_without_exit: Arriba a la destinació. + against_oneway_without_exit: Anar en contra-direcció a %{name} end_oneway_without_exit: Fi del sentit únic a %{name} + roundabout_with_exit: A la rotonda, agafar la sortida %{exit} a %{name} + turn_left_with_exit: A la rotonda gireu a l'esquerra cap a %{name} + slight_left_with_exit: A la rotonda gireu lleument a l'esquerra cap a %{name} + turn_right_with_exit: A la rotonda gireu a la dreta cap a %{name} + slight_right_with_exit: A la rotonda gireu lleument a la dreta cap a %{name} + continue_with_exit: A la rotonda continueu endavant cap a %{name} unnamed: sense nom courtesy: Direccions cortesia de %{link} time: Temps @@ -2347,7 +2472,7 @@ ca: description: Descripció heading: Introduïu informació per una nova redacció submit: Crea una redacció - title: Creant una nova redacció + title: Creació d’una versió nova show: description: 'Descripció:' heading: Mostrant la redacció "%{title}" diff --git a/config/locales/cs.yml b/config/locales/cs.yml index 98e3b932d..ca65c0af2 100644 --- a/config/locales/cs.yml +++ b/config/locales/cs.yml @@ -5,12 +5,16 @@ # Author: Chmee2 # Author: Cvanca # Author: DemonioCZ +# Author: Dvorapa # Author: H4nek # Author: JAn Dudík # Author: Jezevec # Author: Jkjk # Author: Kuvaly # Author: Luk +# Author: LukasJandera +# Author: Marek Pavlica +# Author: Martin Urbanec # Author: Masox # Author: Matěj Grabovský # Author: Michaelbrabec @@ -21,7 +25,9 @@ # Author: Paxt # Author: Reaperman # Author: Tchoř +# Author: Urbanecm # Author: Veritaslibero +# Author: Walter Klosse --- cs: time: @@ -49,14 +55,14 @@ cs: old_relation_tag: Tag staré relace old_way: Stará cesta old_way_node: Uzel staré cesty - old_way_tag: Starý tag cesty + old_way_tag: Starý způsob tagu relation: Relace relation_member: Člen relace relation_tag: Tag relace session: Relace trace: Stopa tracepoint: Bod stopy - tracetag: Å títek stopy + tracetag: Tag stopy user: Uživatel user_preference: Uživatelské nastavení user_token: Uživatelský token @@ -115,12 +121,14 @@ cs: closed: Uzavřeno created_html: Vytvořeno <abbr title='%{title}'>před %{time}</abbr> closed_html: Uzavřeno <abbr title='%{title}'>před %{time}</abbr> - created_by_html: Vytvořil <abbr title='%{title}'>před %{time}</abbr> %{user} + created_by_html: Vytvořeno <abbr title='%{title}'>před %{time}</abbr> uživatelem + %{user} deleted_by_html: Smazáno <abbr title='%{title}'>před %{time}</abbr> uživatelem %{user} edited_by_html: Upraveno <abbr title='%{title}'>před %{time}</abbr> uživatelem %{user} - closed_by_html: Uzavřel <abbr title='%{title}'>před %{time}</abbr> uživatel %{user} + closed_by_html: Uzavřeno <abbr title='%{title}'>před %{time}</abbr> uživatelem + %{user} version: Verze in_changeset: Sada změn anonymous: anonym @@ -140,15 +148,15 @@ cs: relation: Relace (%{count}) relation_paginated: Relace (%{x}–%{y} z %{count}) comment: Komentáře (%{count}) - hidden_commented_by: Skrytý komentář od %{user} <abbr title='%{exact_time}'>Před + hidden_commented_by: Skrytý komentář od uživatele %{user} <abbr title='%{exact_time}'>před %{when}</abbr> commented_by: <abbr title='%{exact_time}'>Před %{when}</abbr> okomentoval %{user} - changesetxml: Soubor změn XML + changesetxml: Sada změn XML osmchangexml: osmChange XML feed: title: Sada změn %{id} - title_comment: 'Sada změn: %{id} - %{comment}' - join_discussion: Pokud chcete diskutovat, přihlaste se + title_comment: Sada změn %{id} - %{comment} + join_discussion: Chcete-li diskutovat, přihlaste se discussion: Diskuse node: title: 'Uzel: %{name}' @@ -180,6 +188,7 @@ cs: way: cesta relation: relace changeset: sada změn + note: poznámka timeout: sorry: Promiňte, ale načítání dat %{type} číslo %{id} trvalo příliÅ¡ dlouho. type: @@ -187,6 +196,7 @@ cs: way: cesty relation: relace changeset: sady změn + note: poznámka redacted: redaction: Redakce %{id} message_html: Verzi %{version} tohoto objektu %{type} nelze zobrazit, protože @@ -217,19 +227,22 @@ cs: hidden_title: 'Skrytá poznámka #%{note_name}' open_by: Vytvořil %{user} <abbr title='%{exact_time}'>před %{when}</abbr> open_by_anonymous: Vytvořil anonym <abbr title='%{exact_time}'>před %{when}</abbr> - commented_by: <abbr title='%{exact_time}'>Před %{when}</abbr> okomentoval %{user} + commented_by: <abbr title='%{exact_time}'>Před %{when}</abbr> okomentoval uživatel + %{user} commented_by_anonymous: <abbr title='%{exact_time}'>Před %{when}</abbr> okomentoval anonym - closed_by: VyřeÅ¡il <abbr title='%{exact_time}'>před %{when}</abbr> %{user} + closed_by: VyřeÅ¡il <abbr title='%{exact_time}'>před %{when}</abbr> uživatel + %{user} closed_by_anonymous: VyřeÅ¡il <abbr title='%{exact_time}'>před %{when}</abbr> anonym - reopened_by: Reaktivoval <abbr title='%{exact_time}'>před %{when}</abbr> %{user} + reopened_by: Reaktivoval <abbr title='%{exact_time}'>před %{when}</abbr> uživatel + %{user} reopened_by_anonymous: Reaktivoval <abbr title='%{exact_time}'>před %{when}</abbr> anonym - hidden_by: Skryl <abbr title='%{exact_time}'>před %{when}</abbr> %{user} + hidden_by: Skryl <abbr title='%{exact_time}'>před %{when}</abbr> uživatel %{user} query: title: Průzkum prvků - introduction: Pro nalezení okolních prvků klikněte do mapy. + introduction: Pro nalezení okolních prvků klikněte na mapu. nearby: Okolní prvky enclosing: Umístění prvku changeset: @@ -256,7 +269,7 @@ cs: empty_area: Pro tuto oblast neexistují žádné sady změn. empty_user: Tento uživatel nemá žádné sady změn. no_more: Nebyly nalezeny žádné další sady změn. - no_more_area: Nebyly nalezeny žádné další sady změn pro tuto oblast. + no_more_area: Pro tuto oblast nebyly nalezeny žádné další sady změn. no_more_user: Nebyly nalezeny žádné další sady změn tohoto uživatele. load_more: Načíst další timeout: @@ -271,6 +284,7 @@ cs: diary_entry: new: title: Nový záznam do deníčku + publish_button: Publikovat list: title: Deníčky uživatelů title_friends: Deníčky přátel @@ -280,7 +294,7 @@ cs: new: Nový záznam do deníčku new_title: Vložit nový záznam do vaÅ¡eho uživatelského deníčku no_entries: Žádné záznamy v deníčku - recent_entries: Aktuální deníčkové záznamy + recent_entries: Nedávné deníčkové záznamy older_entries: Starší záznamy newer_entries: Novější záznamy edit: @@ -332,7 +346,7 @@ cs: description: Nedávné záznamy v OpenStreetMap deníčku uživatele %{user} language: title: Deníčkové záznamy OpenStreetMap v jazyce %{language_name} - description: Aktuální záznamy v deníčcích uživatelů OpenStreetMap v jazyce + description: Nedávné záznamy v deníčcích uživatelů OpenStreetMap v jazyce %{language_name} all: title: Deníčkové záznamy OpenStreetMap @@ -361,7 +375,7 @@ cs: advice: 'Pokud se tento export nezdaří, zvažte použití jednoho z následujících zdrojů:' body: 'Tato oblast je pro export do XML formátu OpenStreetMap příliÅ¡ velká. - Přejděte na větší měřítko, zvolte menší oblast nebo použijte jeden z následujících + Přejděte na větší měřítko, zvolte menší oblast, nebo použijte jeden z následujících zdrojů pro stahování velkého množství dat:' planet: title: Planeta OSM @@ -563,7 +577,7 @@ cs: motorway: Dálnice motorway_junction: Dálniční křižovatka motorway_link: Dálnice - path: Pěšina + path: Stezka pedestrian: Pěší zóna platform: NástupiÅ¡tě primary: Silnice první třídy @@ -572,7 +586,7 @@ cs: raceway: Závodní dráha residential: Ulice rest_area: Odpočívadlo - road: Cesta + road: Silnice secondary: Silnice druhé třídy secondary_link: Silnice druhé třídy service: Účelová komunikace @@ -1030,7 +1044,7 @@ cs: FAQ</a>. more_2_html: |- Přestože OpenStreetMap tvoří svobodná data, nemůžeme zdarma poskytovat třetím stranám mapové API. - Vizte naÅ¡e <a href="http://wiki.openstreetmap.org/wiki/API_usage_policy">Pravidla použití API</a>, <a href="http://wiki.openstreetmap.org/wiki/Tile_usage_policy">Pravidla použití dlaždic</a> a <a href="http://wiki.openstreetmap.org/wiki/Nominatim#Usage_Policy">Pravidla použití Nominatimu</a>. + Vizte naÅ¡e <a href="https://operations.osmfoundation.org/policies/api/">Pravidla použití API</a>, <a href="https://operations.osmfoundation.org/policies/tiles/">Pravidla použití dlaždic</a> a <a href="https://operations.osmfoundation.org/policies/nominatim/">Pravidla použití Nominatimu</a>. contributors_title_html: NaÅ¡i přispěvatelé contributors_intro_html: 'NaÅ¡imi přispěvateli jsou tisíce jednotlivců. Také zahrnujeme svobodně licencovaná data z národních zeměměřických úřadů a dalších @@ -1078,9 +1092,9 @@ cs: pro odstranění</a> nebo přímo podejte výzvu pomocí <a href="http://dmca.openstreetmap.org/">on-line formuláře</a>. trademarks_title_html: <span id="trademarks"></span>Ochranné známky - trademarks_1_html: OpenStreetMap a logo s lupou jsou zapsané ochranné známky - OpenStreetMap Foundation. Pokud máte dotazy ohledně vaÅ¡eho používání těchto - známek, zaÅ¡lete své dotazy <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">pracovní + trademarks_1_html: OpenStreetMap, logo s lupou a State of the Map jsou zapsané + ochranné známky OpenStreetMap Foundation. Pokud máte dotazy ohledně vaÅ¡eho + používání těchto známek, zaÅ¡lete své dotazy <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">pracovní skupině pro licencování</a>. welcome_page: title: Vítejte! @@ -1187,7 +1201,7 @@ cs: about_page: next: Další copyright_html: <span>©</span>přispěvatelé<br>OpenStreetMap - used_by: Díky %{name} fungují mapová data na stovkách webových stránek, mobilních + used_by: Díky %{name} fungují mapová data na tisících webových stránek, mobilních aplikací a hardwarových zařízení lede_text: OpenStreetMap tvoří komunita uživatelů, kteří přidávají a udržují data o silnicích, cestách, kavárnách, železničních stanicích a mnohém dalším po celém @@ -1208,16 +1222,16 @@ cs: práva a licence</a>.' legal_title: Právní informace legal_html: |- - Tento web a mnoho dalších souvisejících služeb za komunitu oficiálně provozuje <a href='http://osmfoundation.org/'>OpenStreetMap Foundation</a> (OSMF). + Tento web a mnoho dalších souvisejících služeb za komunitu oficiálně provozuje <a href='http://osmfoundation.org/'>OpenStreetMap Foundation</a> (OSMF). Použití vÅ¡ech služeb provozovaných OSMF podléhá naÅ¡im <a href="http://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy">Pravidlům přijatelného užití</a> a naÅ¡im <a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy">Pravidlům ochrany osobních údajů</a>. <br> Pokud máte problémy či dotazy týkající se licencování, autorských práv či jiných právních záležitostí, <a href='http://osmfoundation.org/Contact'>kontaktujte prosím OSMF</a>. partners_title: Partneři notifier: diary_comment_notification: - subject: '[OpenStreetMap] %{user} okomentoval váš deníčkový záznam' + subject: '[OpenStreetMap] %{user} okomentoval deníčkový záznam' hi: Ahoj, uživateli %{to_user}, - header: '%{from_user} okomentoval váš nedávný záznam v deníčku na OpenStreetMap - s předmětem %{subject}:' + header: '%{from_user} okomentoval záznam v deníčku na OpenStreetMap s předmětem + %{subject}:' footer: Také si můžete komentář přečíst na %{readurl}, komentovat na %{commenturl} nebo odpovědět na %{replyurl} message_notification: @@ -1449,15 +1463,17 @@ cs: table: entry: motorway: Dálnice + main_road: Hlavní silnice trunk: Významná silnice primary: Silnice první třídy secondary: Silnice druhé třídy unclassified: Silnice - unsurfaced: Nezpevněná cesta track: Lesní a polní cesta - byway: Cesta bridleway: Koňská stezka cycleway: Cyklostezka + cycleway_national: Národní cyklotrasa + cycleway_regional: Regionální cyklotrasa + cycleway_local: Místní cyklotrasa footway: Pěší cesta rail: Železnice subway: Metro @@ -1479,7 +1495,6 @@ cs: golf: Golfové hřiÅ¡tě park: Park resident: Obytná oblast - tourist: Turistická atrakce common: - Pastvina - louka @@ -1509,9 +1524,11 @@ cs: tunnel: Čárkované obrysy = tunel bridge: Černé obrysy = most private: Soukromý pozemek - permissive: Přístup tolerován destination: Průjezd zakázán construction: Cesta ve výstavbě + bicycle_shop: Cykloobchod + bicycle_parking: ParkoviÅ¡tě pro kola + toilets: Záchody richtext_area: edit: Upravit preview: Náhled @@ -1675,6 +1692,7 @@ cs: allow_read_gpx: číst vaÅ¡e soukromé GPS stopy. allow_write_gpx: nahrávat GPS stopy. allow_write_notes: měnit poznámky. + grant_access: Udělit přístup oauthorize_success: title: Požadavek na autorizaci povolen allowed: Udělili jste aplikaci %{app_name} přístup k vaÅ¡emu účtu. @@ -1694,8 +1712,8 @@ cs: submit: Upravit show: title: Podrobnosti OAuth pro %{app_name} - key: 'Uživatelský klíč:' - secret: 'Tajný klíč uživatele:' + key: 'Klíč konzumenta (consumer key):' + secret: 'Tajemství konzumenta (consumer secret):' url: 'URL tokenu požadavku:' access_url: 'URL přístupového tokenu:' authorize_url: 'Autorizační URL:' @@ -1785,6 +1803,12 @@ cs: windowslive: title: Přihlásit se přes Windows Live alt: Přihlášení pomocí účtu služeb Windows Live + github: + title: Přihlásit se přes GitHub + alt: Přihlásit se pomocí GitHub účtu + wikipedia: + title: Přihlásit se účtem na Wikipedii + alt: Přihlásit se účtem na Wikipedii yahoo: title: Přihlásit se prostřednictvím Yahoo alt: Přihlášení pomocí Yahoo OpenID @@ -1820,7 +1844,7 @@ cs: title: Zaregistrovat se no_auto_account_create: Bohužel za vás momentálně nejsme schopni vytvořit účet automaticky. - contact_webmaster: Pokud chcete zařídit založení účtu, kontaktujte <a href="mailto:webmaster@openstreetmap.org">webmastera</a> + contact_webmaster: Pokud chcete zařídit založení účtu, kontaktujte <a href="%{webmaster}">webmastera</a> – pokusíme se vaÅ¡i žádost vyřídit co možná nejrychleji. about: header: Svobodná a editovatelná @@ -1831,9 +1855,10 @@ cs: pro přispěvatele</a>. email address: 'E-mailová adresa:' confirm email address: 'Potvrdit e-mailovou adresu:' - not displayed publicly: Nezobrazuje se veřejně (vizte <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" - title="Pravidla ochrany osobních údajů na wiki, včetně části o e-mailových - adresách">pravidla ochrany osobních údajů</a>) + not displayed publicly: VaÅ¡e adresa se nezobrazuje veřejně, více informací získáte + v naÅ¡ich <a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy" title="Pravidla + ochrany osobních údajů OSMF, včetně části o e-mailových adresách">pravidlech + ochrany osobních údajů</a> display name: 'Zobrazované jméno:' display name description: VaÅ¡e veřejně zobrazované uživatelské jméno. Můžete si ho později změnit ve svém nastavení. @@ -1843,16 +1868,6 @@ cs: use external auth: Případně se přihlaste prostřednictvím třetí strany auth no password: S autentizací třetí stranou není heslo potřeba, ale některé další nástroje nebo servery je mohou přesto potřebovat. - auth association: |- - <p>VaÅ¡e ID dosud nebylo propojeno s účtem na OpenStreetMap.</p> - <ul> - <li>Pokud jste na OpenStreetMap noví, vytvořte si nový účet pomocí formuláře níže.</li> - <li> - Pokud již účet máte, můžete se k němu přihlásit - pomocí uživatelského jména a hesla a poté ho - v uživatelském nastavení propojit se svým ID. - </li> - </ul> continue: Zaregistrovat se terms accepted: Děkujeme za odsouhlasení nových podmínek pro přispěvatele! terms declined: Je nám líto, že jste se rozhodli nepřijmout nové Podmínky pro @@ -1883,6 +1898,7 @@ cs: heading: Uživatel %{user} neexistuje body: Je mi líto, ale uživatel %{user} neexistuje. Zkontrolujte překlepy nebo jste možná klikli na chybný odkaz. + deleted: smazán view: my diary: Můj deníček new diary entry: nový záznam do deníčku @@ -1935,16 +1951,16 @@ cs: revoke: administrator: Odebrat práva správce moderator: Odebrat práva moderátora - block_history: zablokování - moderator_history: udělená zablokování + block_history: Účinná zablokování + moderator_history: Udělená zablokování comments: Komentáře - create_block: blokovat tohoto uživatele - activate_user: aktivovat tohoto uživatele - deactivate_user: deaktivovat tohoto uživatele - confirm_user: potvrdit tohoto uživatele - hide_user: skrýt tohoto uživatele - unhide_user: zobrazit tohoto uživatele - delete_user: odstranit tohoto uživatele + create_block: Blokovat tohoto uživatele + activate_user: Aktivovat tohoto uživatele + deactivate_user: Deaktivovat tohoto uživatele + confirm_user: Potvrdit tohoto uživatele + hide_user: Skrýt tohoto uživatele + unhide_user: Zobrazit tohoto uživatele + delete_user: Odstranit tohoto uživatele confirm: Potvrdit friends_changesets: sady změn přátel friends_diaries: záznamy v deníčcích přátel @@ -1999,6 +2015,8 @@ cs: gravatar: Používat Gravatar link: http://wiki.openstreetmap.org/wiki/CS:Gravatar link text: co to znamená? + disabled: Gravatar byl zakázán. + enabled: Zobrazování vaÅ¡eho Gravataru bylo povoleno. new image: Přidat obrázek keep image: Zachovat stávající obrázek delete image: Odstranit stávající obrázek @@ -2032,8 +2050,7 @@ cs: success: Poslali jsme na %{email} novou potvrzovací zprávu, jakmile potvrdíte svůj účet, budete moci začít tvořit mapy.<br /><br />Pokud používáte nějaký protispamový systém, který vyžaduje potvrzení, nezapomeňte zařídit výjimku - pro webmaster@openstreetmap.org, neboÅ¥ na žádosti o potvrzení nejsme schopni - reagovat. + pro %{sender}, neboÅ¥ na žádosti o potvrzení nejsme schopni reagovat. failure: Uživatel %{name} nebyl nalezen. confirm_email: heading: Potvrzení změny e-mailové adresy @@ -2089,6 +2106,12 @@ cs: no_authorization_code: Bez autorizačního kódu unknown_signature_algorithm: Neznámý algoritmus podpisu invalid_scope: Neplatný rozsah + auth_association: + heading: VaÅ¡e ID dosud není propojeno s účtem OpenStreetMap. + option_1: Pokud jste na OpenStreetMap noví, založte si prosím nový účet pomocí + níže zobrazeného formuláře. + option_2: Pokud již účet máte, můžete se k němu přihlásit pomocí svého uživatelského + jména a hesla a poté v uživatelském nastavení účet propojit s vaším ID. user_role: filter: not_an_administrator: Spravovat role mohou pouze administrátoři. Vy administrátor @@ -2265,10 +2288,13 @@ cs: center_marker: Vycentrovat mapu na značku paste_html: HTML ke vložení na webovou stránku view_larger_map: Zobrazit větší mapu + only_standard_layer: Jako obrázek lze exportovat jen standardní vrstvu + embed: + report_problem: Nahlásit problém key: title: Legenda tooltip: Legenda - tooltip_disabled: Legenda je dostupná pouze pro vrstvu Standardní + tooltip_disabled: Pro tuto vrstvu není legenda dostupná map: zoom: in: Přiblížit @@ -2280,12 +2306,12 @@ cs: standard: Standardní cycle_map: Cyklomapa transport_map: Dopravní mapa - mapquest: MapQuest Open hot: Humanitární layers: header: Mapové vrstvy notes: Poznámky k mapě data: Data k mapě + gps: Veřejné GPS stopy overlays: Zapnout vrstvy pro ladění mapy title: Vrstvy copyright: © <a href='%{copyright_url}'>přispěvatelé OpenStreetMap</a> @@ -2331,6 +2357,9 @@ cs: mapquest_car: Autem (MapQuest) mapquest_foot: Pěšky (MapQuest) osrm_car: Autem (OSRM) + mapzen_bicycle: Na kole (Mapzen) + mapzen_car: Autem (Mapzen) + mapzen_foot: Pěšky (Mapzen) directions: Pokyny distance: Vzdálenost errors: @@ -2339,12 +2368,23 @@ cs: instructions: continue_without_exit: Pokračujte na %{name} slight_right_without_exit: Mírně vpravo na %{name} + offramp_right_without_exit: Použijte nájezd vpravo na %{name} + onramp_right_without_exit: Odbočte vpravo na nájezd na %{name} + endofroad_right_without_exit: Na konci silnice odbočte vpravo na %{name} + merge_right_without_exit: Připojte se vpravo na %{name} + fork_right_without_exit: Na rozcestí odbočte vpravo na %{name} turn_right_without_exit: Odbočte vpravo na %{name} sharp_right_without_exit: Ostře vpravo na %{name} uturn_without_exit: Otočte se na %{name} sharp_left_without_exit: Ostře vlevo na %{name} turn_left_without_exit: Odbočte vlevo na %{name} + offramp_left_without_exit: Použijte nájezd vlevo na %{name} + onramp_left_without_exit: Odbočte vlevo na nájezd na %{name} + endofroad_left_without_exit: Na konci silnice odbočte vlevo na %{name} + merge_left_without_exit: Připojte se vlevo na %{name} + fork_left_without_exit: Na rozcestí odbočte vlevo na %{name} slight_left_without_exit: Mírně vlevo na %{name} + via_point_without_exit: (zastávka) follow_without_exit: Jeďte po %{name} roundabout_without_exit: Na kruhovém objezdu použijte %{name} leave_roundabout_without_exit: Vyjeďte z kruhového objezdu – %{name} @@ -2354,6 +2394,11 @@ cs: against_oneway_without_exit: Jeďte protisměrem na %{name} end_oneway_without_exit: Konec jednosměrky na %{name} roundabout_with_exit: Na kruhovém objezdu vyjeďte %{exit}. výjezdem na %{name} + turn_left_with_exit: Na kruhovém objezdu odbočte vlevo na %{name} + slight_left_with_exit: Na kruhovém objezdu mírně vlevo na %{name} + turn_right_with_exit: Na kruhovém objezdu odbočte vpravo na %{name} + slight_right_with_exit: Na kruhovém objezdu mírně vpravo na %{name} + continue_with_exit: Na kruhovém objezdu pokračujte rovně na %{name} unnamed: nepojmenovaná cesta courtesy: Trasa díky %{link} time: Čas diff --git a/config/locales/cy.yml b/config/locales/cy.yml index e2650c14f..c90978652 100644 --- a/config/locales/cy.yml +++ b/config/locales/cy.yml @@ -7,21 +7,29 @@ cy: time: formats: - friendly: '%e %B %Y am %H:%M' + friendly: '%e %B %Y at %H:%M' activerecord: models: acl: Rhestr Rheoli Mynediad + changeset: Changeset + changeset_tag: Tag Changeset country: Gwlad diary_comment: Nodyn Dyddiadur diary_entry: Cofnod Dyddiadur friend: Ffrind language: Iaith message: Neges + node: Nod + node_tag: Tag Nod notifier: Hysbysydd + old_node: Hen Nod + old_node_tag: Tag Hen Nod old_relation: Hen Berthynas old_relation_member: Aelod o Hen Berthynas old_relation_tag: Tag Hen Berthynas old_way: Hen Lwybr + old_way_node: Nod Hen Ffordd + old_way_tag: Tag Hen Ffordd relation: Perthynas session: Sesiwn trace: Dargopïo @@ -71,6 +79,8 @@ cy: id: name: iD description: iD (golygydd y porwr) + remote: + name: Rheolaeth o bell browse: created: Crewyd closed: Wedi cau @@ -293,14 +303,20 @@ cy: search_osm_nominatim: prefix: aerialway: + cable_car: Car Cebl chair_lift: Cadair godi drag_lift: Cadair lusg + gondola: Lifft Gondola + station: Gorsaf Awyr aeroway: aerodrome: Maesawyr apron: Ffedog gate: Giat helipad: Pad Hofrennydd + runway: Rhedfa Awyr + terminal: Terfynell amenity: + animal_shelter: Cysgod Anifeiliaid arts_centre: Canolfan Grefftau atm: Peiriant Codi Arian bank: Banc @@ -310,6 +326,7 @@ cy: bicycle_parking: Man Cadw Beic bicycle_rental: Man Llogi Beic biergarten: Gardd Gwrw + boat_rental: Llogi Cychod brothel: Puteindy bureau_de_change: Bureau de Change bus_station: Gorsaf Fysiau @@ -319,19 +336,23 @@ cy: car_wash: Golchwr Cerbyd casino: Casino charging_station: Gorsaf Gwefru + childcare: Man Gwarchod Plant cinema: Sinema clinic: Clinic + clock: Cloc college: Coleg community_centre: Canolfan Cymunedol courthouse: Llys crematorium: Amlosgfa dentist: Deintydd doctors: Meddygfa + dormitory: Noswylfa drinking_water: Dŵr Yfed driving_school: Ysgol Yrru embassy: Llysgenhadaeth emergency_phone: Ffôn Argyfwng fast_food: Bwyd Parod + ferry_terminal: Terfynell Fferi fire_station: Gorsaf Dân food_court: Cwrt Fwydydd fountain: Ffynnon @@ -345,11 +366,14 @@ cy: library: Llyfrgell market: Marchnad marketplace: Marchnad + monastery: Mynachdy + motorcycle_parking: Man Parcio Beiciau Modur nightclub: Clwb Nôs nursery: Meithrinfa nursing_home: Cartref Nyrsio office: Swyddfa parking: Parcio + parking_entrance: Mynedfa Man Parcio pharmacy: Fferyllfa place_of_worship: Man addoli police: Heddlu @@ -394,10 +418,21 @@ cy: "yes": Pont building: "yes": Adeilad + craft: + brewery: Bragdy + carpenter: Saer + electrician: Trydanydd + gardener: Garddwr + painter: Peintiwr + photographer: Ffotograffydd + plumber: Plymar + "yes": Siop Grefftau emergency: + ambulance_station: Gorsaf Ambiwlans phone: Ffôn Argyfwng highway: bridleway: Llwybr Ceffyl + bus_guideway: Lon Bysiau bus_stop: Stop Bysiau construction: Priffordd yn cael ei Adeiladu cycleway: Llwybr Beicio @@ -414,10 +449,12 @@ cy: primary: Priffordd primary_link: Priffordd proposed: Ffordd Arfaethedig + residential: Ffordd rest_area: Man Gorffwys road: Ffordd secondary: Ffordd Eilaidd secondary_link: Ffordd Eilaidd + service: Ffordd Waith services: Gwasanaethau Traffordd speed_camera: Camera Cyflymder steps: Grisiau @@ -425,32 +462,41 @@ cy: tertiary: Ffordd Trydyddol tertiary_link: Ffordd Trydyddol track: Trac + traffic_signals: Goleuadau Traffig trail: Llwybr trunk: Cefnffordd trunk_link: Cefnffordd unclassified: Ffordd Diddosbarth unsurfaced: Ffordd Heb Wyneb + "yes": Ffordd historic: archaeological_site: Safle Archaeolegol battlefield: Maes Brwydr boundary_stone: Maen Terfyn - building: Adeilad + building: Adeilad Hanesyddol + bunker: Byncar castle: Castell church: Eglwys + city_gate: Gat y Ddinas citywalls: Waliau Ddinas fort: Caer + heritage: Safle Dreftadaeth house: TÅ· icon: Eicon manor: Maenor memorial: Cofeb mine: Mwynfa monument: Cofadail + roman_road: Ffordd Rufeinig ruins: Adfeilion + stone: Carreg tomb: Beddrod tower: Tŵr wayside_cross: Croes Min Ffordd wayside_shrine: Cysegrfa Min Ffordd wreck: Llongddrylliad + junction: + "yes": Cyffordd landuse: allotments: Rhandiroedd basin: Basn @@ -481,8 +527,11 @@ cy: vineyard: Gwinllan leisure: beach_resort: Ardal Wyliau + club: Clwb common: Tir Comin + dog_park: Parc Cwn fishing: Man Pysgota + fitness_centre: Canolfan Gadw'n Heini garden: Gardd golf_course: Cwrs Golff ice_rink: Llawr Sglefrio @@ -500,6 +549,11 @@ cy: swimming_pool: Pwll Nofio track: Trac Rhedeg water_park: Parc Dŵr + man_made: + lighthouse: Goleudy + pipeline: Pibell + works: Ffatri + "yes": Wnaed gan Ddyn military: airfield: Maes Awyr Milwrol barracks: Barics @@ -518,6 +572,7 @@ cy: forest: Coedwig geyser: Geiser glacier: Rhewlif + grassland: Caeau heath: Rhos hill: Bryn island: Ynys @@ -530,7 +585,9 @@ cy: reef: Riff ridge: Cefn rock: Craig + sand: Tywod scree: Sgri + scrub: Llwyni spring: Ffynnon stone: Carreg strait: Culfor @@ -542,6 +599,7 @@ cy: wood: Coed office: accountant: Cyfrifydd + administrative: Gweinyddu architect: Pensaer company: Cwmni employment_agency: Asiantaeth Cyflogi @@ -593,6 +651,7 @@ cy: proposed: Rheilfford Arfaethedig spur: Cainc Rheilffordd station: Gorsaf Drenau + stop: Siop Reilffordd subway: Gorsaf Drenau Tanddaearol subway_entrance: Mynedfa at Drenau Tanddaearol tram: Tramffordd @@ -681,6 +740,7 @@ cy: camp_site: Man Gwersylla caravan_site: Parc Carafanau chalet: Chalet + gallery: Galeri guest_house: Llety hostel: Hostel hotel: Gwesty @@ -695,6 +755,7 @@ cy: culvert: Twnel Ddŵr "yes": Twnel waterway: + boatyard: Iard Gychod canal: Camlas dam: Argae derelict_canal: Camlas Diffaith @@ -719,6 +780,10 @@ cy: level9: Ffin Pentref level10: Ffin Maesdref description: + title: + osm_nominatim: Lleoliad o <a href="http://nominatim.openstreetmap.org/">OpenStreetMap + Nominatim</a> + geonames: Lleoliad o <a href="http://www.geonames.org/">GeoNames</a> types: cities: Dinasoedd towns: Trefi @@ -779,6 +844,7 @@ cy: english_link: y Saesneg gwreiddiol native: title: Ynghylch y dudalen hon + native_link: Cymraeg mapping_link: dechrau mapio legal_babble: title_html: Hawlfraint a Thrwydded @@ -923,7 +989,6 @@ cy: primary: Priffordd secondary: Ffordd eilaidd unclassified: Ffordd annosbarthedig - unsurfaced: Ffordd heb arwyneb track: Trac footway: Ffordd droed rail: Rheilffordd @@ -936,7 +1001,6 @@ cy: wood: Coed golf: Cwrs golff park: Parc - tourist: Atyniad twristiaid common: - Comin - dôl @@ -963,7 +1027,6 @@ cy: - Copa - Crib private: Mynediad preifat - permissive: Mynediad gyda chaniatâd destination: Mynediad cyrchfan richtext_area: edit: Golygu diff --git a/config/locales/da.yml b/config/locales/da.yml index 7b0660afc..7fc38de1f 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -8,10 +8,14 @@ # Author: Freek # Author: Gnonthgol # Author: Gorbi +# Author: Hede2000 # Author: Hein0170 # Author: Hylle +# Author: Jens Jensen +# Author: JrOsm # Author: Kaare # Author: Luckas +# Author: Macofe # Author: Nemo bis # Author: OleLaursen # Author: Peter Alberti @@ -174,6 +178,7 @@ da: way: vej relation: relation changeset: ændringssæt + note: bemærk timeout: sorry: Beklager, data for %{type} med id %{id} tog for lang tid at hente type: @@ -181,6 +186,7 @@ da: way: vej relation: relation changeset: ændringssæt + note: bemærk redacted: redaction: Omarbejdelse %{id} message_html: Version %{version} af %{type} kan ikke vises, da den er omarbejdet. @@ -229,6 +235,7 @@ da: title: Forespørgselsfunktioner introduction: Klik pÃ¥ kortet for at finde funktioner i nærheden. nearby: Funktioner i nærheden + enclosing: Indkapslede omrÃ¥der changeset: changeset_paging_nav: showing_page: Side %{page} @@ -269,6 +276,7 @@ da: diary_entry: new: title: Nyt blogindlæg + publish_button: Offentliggør list: title: Brugerblogs title_friends: Venners blogs @@ -420,6 +428,7 @@ da: taxiway: Rullevej terminal: Terminal amenity: + animal_shelter: Dyreinternat arts_centre: Kunstcenter atm: Pengeautomat bank: Bank @@ -538,7 +547,9 @@ da: plumber: Blikkenslager shoemaker: Skomager tailor: Skrædder + "yes": HÃ¥ndsværksbutik emergency: + ambulance_station: Ambulancestation defibrillator: Hjertestarter landing_site: Nødlandingsplads phone: Nødtelefon @@ -578,7 +589,7 @@ da: tertiary: Hovedvej tertiary_link: Hovedvej track: Hjulspor - traffic_signals: Traffiklys + traffic_signals: Trafiklys trail: Spor trunk: Motortrafikvej trunk_link: Motortrafikvej @@ -596,6 +607,7 @@ da: city_gate: Byport citywalls: Bymure fort: Skanse + heritage: Kulturarvssted house: Hus icon: Ikon manor: HerregÃ¥rd @@ -651,6 +663,7 @@ da: common: Fælles arealer dog_park: Hundepark fishing: FiskeomrÃ¥de + fitness_centre: Motionscenter fitness_station: Udendørs fitness udstyr garden: Have golf_course: Golfbane @@ -663,6 +676,7 @@ da: pitch: Sportsarena playground: Legeplads recreation_ground: Idrætsplads + resort: Feriested sauna: Sauna slipway: Bedding sports_centre: Sportscenter @@ -909,12 +923,12 @@ da: "yes": Vandvej admin_levels: level2: Landegrænse - level4: Statsgrænse + level4: Regionsgrænse level5: Regionsgrænse level6: Kommunegrænse level8: Bygrænse - level9: Landsbygrænse - level10: Forstadsgrænse + level9: Bydelsgrænse + level10: Sognegrænse description: title: osm_nominatim: Position fra <a href="http://nominatim.openstreetmap.org/">OpenStreetMap @@ -991,9 +1005,10 @@ da: legal_babble: title_html: Ophavsret og licens intro_1_html: |- - OpenStreetMap er <i>Ã¥bne data</i>, licenseret under <a + OpenStreetMap<sup><a href="#trademarks">®</a></sup> er <i>Ã¥bne data</i>, licenseret under <a href="http://opendatacommons.org/licenses/odbl/">Open Data - Commons Open Database License</a> (ODbL). + Commons Open Database License</a> (ODbL) af <a + href="http://osmfoundation.org/">OpenStreetMap Foundation</a> (OSMF). intro_2_html: "Du kan frit kopiere, distribuere, overføre og tilpasse vores data, \nsÃ¥ længe du angiver OpenStreetMap og dets\nbidragsydere som kilde. Hvis du ændrer eller bygger pÃ¥ vores\ndata, mÃ¥ du kun distribuere resultatet @@ -1022,7 +1037,8 @@ da: title: Eksempel pÃ¥ kildeangivelse more_title_html: Læs mere more_1_html: |- - Læs mere om brug af vores data, og hvordan du kreditere os, pÃ¥ den <a + Læs mere om brug af vores data, og hvordan du kreditere os, pÃ¥ <a + href="http://osmfoundation.org/Licence">OSMF Licenssiden</a> og pÃ¥ den <a href="http://wiki.openstreetmap.org/wiki/Legal_FAQ">juridiske FAQ</a>. more_2_html: |- @@ -1060,6 +1076,11 @@ da: (<a href="http://www.and.com">www.and.com</a>) contributors_nz_html: "<strong>New Zealand</strong>: Indeholder data fra \nLand Information New Zealand. Crown Copyright reserveret." + contributors_si_html: |- + <strong>Slovenien</strong>: Indeholder data fra + <a href="http://www.gu.gov.si/en/">OpmÃ¥lings- og Kortlægnings-myndigheden</a> og + <a href="http://www.mkgp.gov.si/en/">Ministeriet for Landbrug, Skovbrug og Fødevarer</a> + (offentlig information Slovenien). contributors_za_html: |- <strong>Syd Afrika</strong>: Indeholder data fra <a href="http://www.ngi.gov.za/">Chief Directorate: @@ -1085,6 +1106,10 @@ da: føjet til OpenStreetMap databasen eller dette websted, bedes du følge vores <a href="http://www.osmfoundation.org/wiki/License/Takedown_procedure">procedure til fjernelse a materiale</a> eller udfyld formular direkte pÃ¥ vores <a href="http://dmca.openstreetmap.org/">on-line side</a>. + trademarks_title_html: <span id="trademarks"></span>Varemærker + trademarks_1_html: OpenStreetMap og forstørrelsesglaslogoet er registrerede + varemærker for OpenStreetMap Foundation. Hvis du har spørgsmÃ¥l om din brug + af mærkerne, bedes du sende dine spørgsmÃ¥l til <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">Licens-arbejdsgruppen</a>. welcome_page: title: Velkommen! introduction_html: Velkommen til OpenStreetMap, det frie brugerredigerede verdenskort. @@ -1114,6 +1139,14 @@ da: tag_html: En <strong>egenskab</strong> er en lille bid information om et "punkt" eller en "vej", f.eks. navnet pÃ¥ en restaurant eller hastighedsbegrænsningen pÃ¥ en vej. + rules: + title: Regler! + paragraph_1_html: "OpenStreetMap har fÃ¥ formelle regler, men vi forventer, at + alle deltagere vil samarbejde\nmed, og kommunikere med fællesskabet. Hvis + du overvejer\nandre aktiviteter end manuel redigering af en side, skal du + læse og følge retningslinjerne pÃ¥ \n<a href=\"http://wiki.openstreetmap.org/wiki/Import/Guidelines\">Import</a> + og \n<a href=\"http://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct\">Automatiserede + Redigeringer</a>." questions: title: SpørgsmÃ¥l? paragraph_1_html: |- @@ -1160,11 +1193,28 @@ da: description: Start med denne hurtige guide der dækker det grundlæggende i OpenStreetMap. beginners_guide: url: http://wiki.openstreetmap.org/wiki/Da:Beginners%27_guide + title: Hjælp for nybegyndere + description: Hjælp for nybegyndere, som vedligeholdes af fællesskabet. help: url: https://help.openstreetmap.org/ title: help.openstreetmap.org description: Stil et spørgsmÃ¥l eller find et svar pÃ¥ OSMs spørgsmÃ¥l og svar side. + mailing_lists: + title: Mailinglister + description: Stil et spørgsmÃ¥l eller diskuter interessante spørgsmÃ¥l pÃ¥ en bred + vifte af tematiske eller regionale mailinglister. + forums: + title: Fora + description: SpørgsmÃ¥l og diskussioner for dem, der foretrækker et opslagstavlelignende + interface. + irc: + title: IRC + description: Interaktiv chat pÃ¥ mange forskellige sprog, og om mange emner. + switch2osm: + title: switch2osm + description: Hjælp til virksomheder og organisationer, der skifter til OpenStreetMap + baserede kort og andre tjenester. wiki: url: http://wiki.openstreetmap.org/ title: wiki.openstreetmap.org @@ -1172,7 +1222,7 @@ da: about_page: next: Næste copyright_html: <span>©</span>OpenStreetMap<br>bidragsydere - used_by: '%{name} stiller kortdata til rÃ¥dighed for hundredvis af websteder, mobile + used_by: '%{name} stiller kortdata til rÃ¥dighed for tusindvis af websteder, mobile apps og hardware-enheder' lede_text: OpenStreetMap er bygget af et fællesskab af kortlæggere, der bidrager og vedligeholder data om veje, stier, caféer, jernbanestationer og meget mere, @@ -1196,6 +1246,12 @@ da: sÃ¥ længe du nævner OpenStreetMap og dets bidragsydere. Hvis du ændrer eller bygger oven pÃ¥ data pÃ¥ bestemte mÃ¥der, mÃ¥ du kun distribuere resultatet under den samme licens. Se siden om <a href='%{copyright_path}'>ophavsret og licens</a> for detaljer. + legal_title: Juridisk + legal_html: "Dette websted og mange andre relaterede ydelser er formelt drevet + af \n<a href=\"http://osmfoundation.org/\">OpenStreetMap Foundation</a> (OSMF) + \npÃ¥ vegne af fællesskabet.\n<br> \nDu bedes <a href=\"http://osmfoundation.org/Contact\">kontakte + OSMF</a> \nhvis du har spørgsmÃ¥l om licenser, ophavsret eller andre juridiske + spørgsmÃ¥l og problemstillinger." partners_title: Partnere notifier: diary_comment_notification: @@ -1430,13 +1486,12 @@ da: table: entry: motorway: Motorvej + main_road: Hovedvej trunk: Motortrafikvej primary: Hovedvej (primærrute) secondary: Hovedvej (sekundærrute) unclassified: Anden vej - unsurfaced: Uasfalteret vej track: Hjulspor - byway: Stikvej bridleway: Ridesti cycleway: Cykelsti footway: Gangsti @@ -1460,7 +1515,6 @@ da: golf: Golfbane park: Park resident: BoligomrÃ¥de - tourist: Seværdighed common: - Fælled - eng @@ -1490,9 +1544,10 @@ da: tunnel: Stiplet kant = tunnel bridge: Sort kant = bro private: Privat adgang - permissive: Adgang kræver tilladelse destination: Ærindekørsel tilladt construction: Veje under konstruktion + bicycle_parking: Cykelparkering + toilets: Toiletter richtext_area: edit: Redigér preview: ForhÃ¥ndsvisning @@ -1651,6 +1706,7 @@ da: allow_read_gpx: læse dine private GPS-spor. allow_write_gpx: Upload GPS-spor. allow_write_notes: ændre bemærkninger. + grant_access: Tillad adgang oauthorize_success: title: Anmodning om tilladelse godkendt allowed: Du har givet programmet %{app_name} adgang til din konto. @@ -1755,6 +1811,12 @@ da: google: title: Log pÃ¥ med Google alt: Log pÃ¥ med et Google OpenID + facebook: + title: Log pÃ¥ med Facebook + alt: Log pÃ¥ med en Facebook-konto + windowslive: + title: Log pÃ¥ med Windows Live + alt: Log pÃ¥ med en Windows Live-konto yahoo: title: Log pÃ¥ med Yahoo alt: Log pÃ¥ med et Yahoo OpenID @@ -1790,9 +1852,9 @@ da: title: Opret konto no_auto_account_create: Vi kan desværre ikke oprette en konto automatisk for dig pt. - contact_webmaster: Kontakt venligst <a href="mailto:webmaster@openstreetmap.org">webmaster</a> - for at fÃ¥ oprettet en konto - vi vil forsøge at hÃ¥ndtere forespørgslen sÃ¥ - hurtigt som muligt. + contact_webmaster: Kontakt venligst <a href="%{webmaster}">webmaster</a> for + at fÃ¥ oprettet en konto - vi vil forsøge at hÃ¥ndtere forespørgslen sÃ¥ hurtigt + som muligt. about: header: Fri og redigerbar html: |- @@ -1813,16 +1875,6 @@ da: use external auth: Alternativt kan du bruge en tredjepart for at logge pÃ¥ auth no password: Med tredjeparts-godkendelse er en adgangskode ikke pÃ¥krævet, men nogle ekstra værktøjer eller servere, har muligvis stadig brug for en. - auth association: |- - <p>Dit ID er endnu ikke tilknyttet en OpenStreetMap konto.</p> - <ul> - <li>Hvis du er ny pÃ¥ OpenStreetMap, skal du oprette en ny konto ved hjælp af formularen nedenfor.</li> - <li> - Hvis du allerede har en konto, kan du logge pÃ¥ din konto - ved hjælp af dit brugernavn og adgangskode og derefter knytte kontoen - med dit ID i dine brugerindstillinger. - </li> - </ul> continue: Opret konto terms accepted: Tak for at du accepterede de nye vilkÃ¥r for bidragsydere! terms declined: Vi er kede af at du har besluttet at du ikke kan acceptere de @@ -1853,6 +1905,7 @@ da: heading: Brugeren %{user} findes ikke body: Der findes desværre ingen bruger ved navn %{user}. Tjek venligst stavningen, ellers kan linket du trykkede pÃ¥ være forkert. + deleted: slettet view: my diary: Min blog new diary entry: nyt blogindlæg @@ -1930,6 +1983,7 @@ da: current email address: 'Nuværende e-mailadresse:' new email address: 'Ny e-mailadresse:' email never displayed publicly: (vises aldrig offentligt) + external auth: 'Ekstern godkendelse:' openid: link: http://wiki.openstreetmap.org/wiki/OpenID link text: hvad er dette? @@ -2000,8 +2054,7 @@ da: success: Vi har sendt en ny e-mail bekræftelse til %{email}, og sÃ¥ snart du har bekræftet din konto, kan du gÃ¥ i gang med kortlægningen.<br /><br />Hvis du bruger et antispam-system som sender bekræftelsesforespørgsler, sÃ¥ sørg - for at du har hvidlistet webmaster@openstreetmap.org da vi ikke kan svare - pÃ¥ den slags forespørgsler. + for at du har hvidlistet %{sender} da vi ikke kan svare pÃ¥ den slags forespørgsler. failure: Bruger %{name} ikke fundet. confirm_email: heading: Bekræft ændring af e-mailadresse @@ -2048,6 +2101,21 @@ da: mistænkelig aktivitet. \n</p>\n<p>\n Denne beslutning vil blive gennemgÃ¥et af en administrator snarest, eller du kan kontakte %{webmaster} hvis du ønsker at drøfte det.\n</p>" + auth_failure: + connection_failed: Forbindelse til godkendelsesudbyder mislykkedes + invalid_credentials: Ugyldig godkendelse af legitimationsoplysninger + no_authorization_code: Ingen godkendelseskode + unknown_signature_algorithm: Ukendt signaturalgoritme + invalid_scope: Ugyldigt anvendelsesomrÃ¥de + auth_association: + heading: Dit ID er ikke forbundet med en OpenStreetMap konto endnu. + option_1: |- + Hvis du er ny pÃ¥ OpenStreetMap, skal du oprette en ny konto + ved hjælp af formularen nedenfor. + option_2: |- + Hvis du allerede har en konto, kan du logge pÃ¥ din konto + ved hjælp af dit brugernavn og adgangskode og derefter knytte den konto + med dit ID i dine brugerindstillinger. user_role: filter: not_an_administrator: Kun administratorer kan forvalte brugerroller, og du er @@ -2163,6 +2231,8 @@ da: heading: '%{block_on} blokeret af %{block_by}' time_future: Slutter om %{time} time_past: Sluttede %{time} siden + created: Oprettet + ago: '%{time} siden' status: Status show: Vis edit: Redigér @@ -2213,6 +2283,7 @@ da: link: Link eller HTML long_link: Link short_link: Kort link + geo_uri: Geo-URI embed: HTML custom_dimensions: Angiv brugerdefinerede dimensioner format: 'Format:' @@ -2288,11 +2359,35 @@ da: mapquest_car: Bil (MapQuest) mapquest_foot: Til fods (MapQuest) osrm_car: Bil (OSRM) + mapzen_bicycle: Cykel (Mapzen) + mapzen_car: Bil (Mapzen) + mapzen_foot: Fod (Mapzen) directions: Rutevejledning distance: Afstand errors: no_route: Kunne ikke finde en rute mellem de to steder. no_place: Beklager - kunne ikke finde det sted. + instructions: + continue_without_exit: Fortsæt ad %{name} + slight_right_without_exit: Svagt til højre ind pÃ¥ %{name} + turn_right_without_exit: Drej til højre ind pÃ¥ %{name} + sharp_right_without_exit: Skarpt til højre ind pÃ¥ %{name} + uturn_without_exit: U-vending langs %{name} + sharp_left_without_exit: Skarpt til venstre ind pÃ¥ %{name} + turn_left_without_exit: Drej til venstre ind pÃ¥ %{name} + slight_left_without_exit: Svagt til venstre ind pÃ¥ %{name} + via_point_without_exit: (via punkt) + follow_without_exit: Følg %{name} + roundabout_without_exit: Ved rundkørslen, tag %{name} + leave_roundabout_without_exit: Forlad rundkørslen - %{name} + stay_roundabout_without_exit: Bliv i rundkørslen - %{name} + start_without_exit: Start ved slutningen af %{name} + destination_without_exit: NÃ¥ mÃ¥let + against_oneway_without_exit: Kør mod ensretningen pÃ¥ %{name} + end_oneway_without_exit: Slutningen af ensretningen pÃ¥ %{name} + roundabout_with_exit: Ved rundkørslen, tag afkørsel %{exit} mod %{name} + unnamed: unavngiven vej + courtesy: Anvisninger stillet til rÃ¥dighed af %{link} time: Tid query: node: Punkt diff --git a/config/locales/de.yml b/config/locales/de.yml index a7b9f3e43..7b5976c61 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -15,8 +15,10 @@ # Author: Drolbr # Author: Fujnky # Author: Geitost +# Author: GerdP # Author: Grille chompa # Author: Holger +# Author: HolgerJeromin # Author: Inkowik # Author: Jacobbraeutigam # Author: John07 @@ -24,13 +26,16 @@ # Author: Katpatuka # Author: Kerosin # Author: Kghbln +# Author: Malenki # Author: Markobr # Author: MarkusHD # Author: McDutchie # Author: Metalhead64 # Author: Michi # Author: Mormegil +# Author: P24 # Author: Pill +# Author: Predatorix # Author: Purodha # Author: Raymond # Author: Reneman @@ -38,7 +43,9 @@ # Author: Snocker15 # Author: Str4nd # Author: Suriyaa Kudo +# Author: Tehabe # Author: The Evil IP address +# Author: ThePiscin # Author: Thomas Bohn # Author: Umherirrender # Author: Woodpeck @@ -51,37 +58,37 @@ de: models: acl: Zugangskontrollliste changeset: Änderungssatz - changeset_tag: Änderungssatz-Tag + changeset_tag: Änderungssatz-Attribut country: Staat diary_comment: Blog-Kommentar - diary_entry: Blogeintrag + diary_entry: Blog-Eintrag friend: Freund language: Sprache message: Nachricht node: Knoten - node_tag: Knoten-Tag - notifier: Benachrichtigung + node_tag: Knoten-Attribut + notifier: Benachrichtiger old_node: Alter Knoten - old_node_tag: Alter Knoten-Tag + old_node_tag: Altes Knoten-Attribut old_relation: Alte Relation - old_relation_member: Altes Relation-Mitglied - old_relation_tag: Alter Relation-Tag - old_way: Alter Weg - old_way_node: Alter Weg-Knoten - old_way_tag: Alter Weg-Tag + old_relation_member: Altes Relations-Mitglied + old_relation_tag: Altes Relations-Attribut + old_way: Alte Linie + old_way_node: Alter Linien-Knoten + old_way_tag: Altes Linien-Attribut relation: Relation - relation_member: Relation-Mitglied - relation_tag: Relation-Tag + relation_member: Relations-Mitglied + relation_tag: Relations-Attribut session: Sitzung trace: Track tracepoint: Track-Punkt - tracetag: Track-Tag + tracetag: Track-Attribut user: Benutzer user_preference: Benutzer-Einstellungen user_token: Benutzer-Token - way: Weg - way_node: Weg-Knoten - way_tag: Weg-Tag + way: Linie + way_node: Linien-Knoten + way_tag: Linien-Attribut attributes: diary_comment: body: Text @@ -118,7 +125,7 @@ de: printable_name: with_name_html: '%{name} (%{id})' editor: - default: Standard (derzeit %{name}) + default: Voreinstellung (derzeit %{name}) potlatch: name: Potlatch 1 description: Potlatch 1 (im Browser eingebetteter Editor) @@ -142,52 +149,53 @@ de: closed_by_html: Geschlossen <abbr title='%{title}'>vor %{time}</abbr> von %{user} version: Version in_changeset: Änderungssatz - anonymous: anonym + anonymous: Anonym no_comment: (kein Kommentar) part_of: Teil von download_xml: XML herunterladen - view_history: Chronik ansehen - view_details: Einzelheiten ansehen + view_history: Chronik anzeigen + view_details: Details anzeigen location: 'Standort:' changeset: title: 'Änderungssatz: %{id}' belongs_to: Autor node: Knoten (%{count}) node_paginated: Knoten (%{x}–%{y} von %{count}) - way: Wege (%{count}) - way_paginated: Wege (%{x}–%{y} von %{count}) + way: Linien (%{count}) + way_paginated: Linien (%{x}–%{y} von %{count}) relation: Relationen (%{count}) relation_paginated: Relationen (%{x}–%{y} von %{count}) comment: Kommentare (%{count}) - hidden_commented_by: Versteckter Kommentar von %{user} <abbr title='%{exact_time}'>vor + hidden_commented_by: Versteckter Diskussionsbeitrag von %{user} <abbr title='%{exact_time}'>vor + %{when}</abbr> + commented_by: Diskussionsbeitrag von %{user} <abbr title='%{exact_time}'>vor %{when}</abbr> - commented_by: Kommentar von %{user} <abbr title='%{exact_time}'>vor %{when}</abbr> changesetxml: Änderungssatz-XML osmchangexml: osmChange-XML feed: title: 'Änderungssatz: %{id}' title_comment: Änderungssatz %{id} - %{comment} - join_discussion: Melde dich an, um der Diskussion beizutreten + join_discussion: Anmelden, um mitzudiskutieren discussion: Diskussion node: title: 'Knoten: %{name}' - history_title: 'Knotenchronik: %{name}' + history_title: 'Chronik des Knotens: %{name}' way: - title: 'Weg: %{name}' - history_title: 'Wegechronik: %{name}' + title: 'Linie: %{name}' + history_title: 'Chronik der Linie: %{name}' nodes: Knoten also_part_of: - one: Teil des Weges %{related_ways} - other: Teil der Wege %{related_ways} + one: Teil der Linie %{related_ways} + other: Teil der Linien %{related_ways} relation: title: 'Relation: %{name}' - history_title: 'Relationschronik: %{name}' + history_title: 'Chronik der Relation: %{name}' members: Mitglieder relation_member: entry_role: '%{type} %{name} als %{role}' type: node: Knoten - way: Weg + way: Linie relation: Relation containing_relation: entry: Relation %{relation_name} @@ -196,24 +204,26 @@ de: sorry: '%{type} mit der Nummer %{id} konnte leider nicht gefunden werden.' type: node: Der Knoten - way: Der Weg + way: Die Linie relation: Die Relation changeset: Der Änderungssatz + note: Hinweis timeout: sorry: Entschuldigung, es dauerte zu lange, die Daten für %{type} mit der ID %{id} abzurufen. type: node: den Knoten - way: den Weg + way: die Linie relation: die Relation changeset: den Änderungssatz + note: Hinweis redacted: - redaction: Ausblendung %{id} - message_html: 'Version %{version} diese%{type} kann nicht angezeigt werden. - Weitere Informationen sind hier angegeben: %{redaction_link}.' + redaction: Redigierung %{id} + message_html: 'Version %{version} diese%{type} kann nicht angezeigt werden, + da hier redigiert wurde. Weitere Informationen gibt es hier: %{redaction_link}.' type: node: s Knotens - way: s Wegs + way: r Linie relation: r Relation start_rjs: feature_warning: Laden von %{num_features} Funktionen, was deinen Browser langsam @@ -221,12 +231,12 @@ de: load_data: Daten laden loading: Lade … tag_details: - tags: Tags + tags: Attribute wiki_link: - key: Erläuterungsseite für das %{key}-Tag - tag: Erläuterungsseite für das %{key}=%{value}-Tag + key: Die Wiki-Erläuterungsseite für den Schlüssel %{key} + tag: Die Wiki-Erläuterungsseite für das Attribut %{key}=%{value} wikidata_link: Das Objekt %{page} auf Wikidata - wikipedia_link: Artikel zu %{page} in der Wikipedia + wikipedia_link: Der Artikel zu %{page} in der Wikipedia telephone_link: '%{phone_number} anrufen' note: title: 'Kartenfehler: %{id}' @@ -236,21 +246,21 @@ de: closed_title: Erledigter Kartenfehler Nr. %{note_name} hidden_title: Versteckter Kartenfehler Nr. %{note_name} open_by: Erstellt von %{user} <abbr title='%{exact_time}'>vor %{when}</abbr> - open_by_anonymous: Erstellt von anonym <abbr title='%{exact_time}'>vor %{when}</abbr> + open_by_anonymous: Erstellt von Anonym <abbr title='%{exact_time}'>vor %{when}</abbr> commented_by: Kommentar von %{user} <abbr title='%{exact_time}'>vor %{when}</abbr> - commented_by_anonymous: Kommentar von anonym <abbr title='%{exact_time}'>vor + commented_by_anonymous: Kommentar von Anonym <abbr title='%{exact_time}'>vor %{when}</abbr> closed_by: Erledigt von %{user} <abbr title='%{exact_time}'>vor %{when}</abbr> - closed_by_anonymous: Erledigt von anonym <abbr title='%{exact_time}'>vor %{when}</abbr> + closed_by_anonymous: Erledigt von Anonym <abbr title='%{exact_time}'>vor %{when}</abbr> reopened_by: Reaktiviert von %{user} <abbr title='%{exact_time}'>vor %{when}</abbr> - reopened_by_anonymous: Reaktiviert von anonym <abbr title='%{exact_time}'>vor + reopened_by_anonymous: Reaktiviert von Anonym <abbr title='%{exact_time}'>vor %{when}</abbr> hidden_by: Versteckt von %{user} <abbr title='%{exact_time}'>vor %{when}</abbr> query: title: Objektabfrage introduction: Klicke auf die Karte, um benachbarte Objekte zu finden. nearby: Objekte in der Nähe - enclosing: Einschließende Objekte + enclosing: Umschließende Objekte changeset: changeset_paging_nav: showing_page: Seite %{page} @@ -258,8 +268,8 @@ de: previous: « Vorige changeset: anonymous: Anonym - no_edits: (keine Bearbeitung) - view_changeset_details: Details des Änderungssatzes + no_edits: (keine Bearbeitungen) + view_changeset_details: Details des Änderungssatzes anzeigen changesets: id: ID saved_at: Gespeichert am @@ -279,25 +289,27 @@ de: no_more_user: Keine weiteren Änderungssätze von diesem Benutzer. load_more: Mehr laden timeout: - sorry: Es hat leider zu lange gedauert, die von dir angeforderten Änderungssätze + sorry: Entschuldigung, es hat leider zu lange gedauert, die angeforderten Änderungssätze abzurufen. rss: title_all: Diskussion zum OpenStreetMap-Änderungssatz title_particular: Diskussion zum OpenStreetMap-Änderungssatz Nr. %{changeset_id} - comment: Neuer Kommentar zum Änderungssatz Nr. %{changeset_id} von %{author} + comment: Neuer Diskussionsbeitrag zum Änderungssatz Nr. %{changeset_id} von + %{author} commented_at_html: vor %{when} aktualisiert commented_at_by_html: vor %{when} durch %{user} aktualisiert full: Vollständige Diskussion diary_entry: new: - title: Selbst Bloggen + title: Neuer Blog-Eintrag + publish_button: Veröffentlichen list: - title: Blogs - title_friends: Blogs meiner Freunde + title: Benutzer-Blogs + title_friends: Blogs deiner Freunde title_nearby: Blogs von Nutzern in der Nähe user_title: Blog von %{user} - in_language_title: Blogeinträge in %{language} - new: Selbst Bloggen + in_language_title: Blog-Einträge in %{language} + new: Neuer Blog-Eintrag new_title: Blogeintrag erstellen no_entries: Dieser Benutzer hat noch kein Blog recent_entries: Neueste Einträge @@ -444,7 +456,7 @@ de: terminal: Terminal amenity: animal_shelter: Tierheim - arts_centre: Kulturzentrum + arts_centre: Kunstzentrum atm: Geldautomat bank: Bank bar: Bar @@ -468,7 +480,7 @@ de: clinic: Krankenhaus clock: Uhr college: Hochschule - community_centre: Gemeindezentrum + community_centre: Gemeinschaftszentrum courthouse: Gericht crematorium: Krematorium dentist: Zahnarzt @@ -511,7 +523,7 @@ de: post_office: Postamt preschool: Vorschule prison: Gefängnis - pub: Pub + pub: Kneipe public_building: Öffentliches Gebäude reception_area: Empfangsbereich recycling: Recycling-Center @@ -535,7 +547,7 @@ de: university: Universität vending_machine: Selbstbedienungsautomat veterinary: Tierarzt - village_hall: Gemeindeamt + village_hall: Gemeindezentrum waste_basket: Mülleimer waste_disposal: Abfallentsorgung youth_centre: Jugendzentrum @@ -569,7 +581,7 @@ de: landing_site: Notlandeplatz phone: Notrufsäule highway: - abandoned: Verlassene Schnellstraße + abandoned: Aufgegebene Straße bridleway: Reitweg bus_guideway: Busspur bus_stop: Bushaltestelle @@ -601,8 +613,8 @@ de: speed_camera: Blitzer steps: Treppe street_lamp: Straßenlaterne - tertiary: Gemeindestraße - tertiary_link: Tertiärstraße-Auffahrt + tertiary: Hauptstraße + tertiary_link: Hauptstraße-Auffahrt track: Feldweg traffic_signals: Lichtzeichenanlage trail: Pfad @@ -622,7 +634,7 @@ de: city_gate: Stadttor citywalls: Stadtmauern fort: Fort - heritage: Bauerbe + heritage: Denkmalgeschützt house: Historisches Haus icon: Symbol manor: Gutshaus @@ -642,26 +654,26 @@ de: landuse: allotments: Kleingärten basin: Becken - brownfield: Brache + brownfield: Brachland cemetery: Friedhof commercial: Gewerbegebiet conservation: Naturschutzgebiet construction: Baustelle farm: Bauernhof farmland: Acker - farmyard: Bauernhof + farmyard: landwirtschaftliche Betriebsfläche forest: Wald garages: Garagen grass: Wiese - greenfield: unerschlossene Fläche + greenfield: unerschlossenes Bauland industrial: Industriegebiet landfill: Deponie meadow: Wiese military: Militärgebiet mine: Mine - orchard: Obstgarten + orchard: Obstplantage quarry: Steinbruch - railway: Bahnkörper + railway: Bahngelände recreation_ground: Erholungsgebiet reservoir: Reservoir reservoir_watershed: Wassereinzugsgebiet @@ -669,7 +681,7 @@ de: retail: Einzelhandel road: Straßenfläche village_green: Dorfwiese (brit.) - vineyard: Weingut + vineyard: Weinberg "yes": Bodennutzung leisure: beach_resort: Strandbad @@ -679,10 +691,10 @@ de: dog_park: Hundepark fishing: Fischereigrund fitness_centre: Fitnessstudio - fitness_station: Fitnessstudio + fitness_station: Freiluft-Fitnesseinrichtung garden: Garten golf_course: Golfplatz - horse_riding: Reiten + horse_riding: Reitanlage ice_rink: Eislaufplatz marina: Sporthafen miniature_golf: Minigolf @@ -720,7 +732,7 @@ de: cliff: Klippe crater: Krater dune: Düne - fell: Weide + fell: Fjell fjord: Fjord forest: Wald geyser: Geysir @@ -759,10 +771,10 @@ de: employment_agency: Arbeitsamt estate_agent: Immobilienhändler government: Amt - insurance: Krankenversicherungsbüro + insurance: Versicherungsbüro lawyer: Rechtsanwalt ngo: NGO - telecommunication: Postamt + telecommunication: Telekommunikationsbüro travel_agent: Reisebüro "yes": Büro place: @@ -794,13 +806,13 @@ de: village: Dorf "yes": Ort railway: - abandoned: Aufgelassene Bahnstrecke - construction: Eisenbahn im Bau + abandoned: Aufgegebene Bahnstrecke + construction: Bahnstrecke im Bau disused: Aufgelassene Bahnstrecke disused_station: Aufgelassener Bahnhof funicular: Standseilbahn - halt: Haltepunkt - historic_station: Ehemaliger Bahnhof + halt: Haltestelle + historic_station: Historischer Bahnhof junction: Bahnknoten level_crossing: Eisenbahnkreuzung light_rail: Stadtbahn @@ -838,7 +850,7 @@ de: clothes: Bekleidungsgeschäft computer: Computergeschäft confectionery: Konditorei - convenience: Tante-Emma-Laden + convenience: Nachbarschaftsladen copyshop: Copyshop cosmetics: Parfümerie deli: Feinkostladen @@ -856,7 +868,7 @@ de: funeral_directors: Bestattungsunternehmen furniture: Möbelgeschäft gallery: Galerie - garden_centre: Garten-Center + garden_centre: Gartenzentrum general: Gemischtwarenladen gift: Geschenkeladen greengrocer: Obst- und Gemüsehändler @@ -873,10 +885,10 @@ de: mobile_phone: Handygeschäft motorcycle: Motorradgeschäft music: Musikladen - newsagent: Zeitschriftenladen + newsagent: Zeitungsladen optician: Optiker organic: Bio-Laden - outdoor: Außenbekleidungsladen + outdoor: Outdoor-Ausrüster pet: Tierhandlung pharmacy: Apotheke photo: Fotoladen @@ -895,7 +907,7 @@ de: "yes": Geschäft tourism: alpine_hut: Berghütte - apartment: Apartment + apartment: Ferienwohnung artwork: Kunstwerk attraction: Sehenswürdigkeit bed_and_breakfast: Bed and Breakfast @@ -910,7 +922,7 @@ de: information: Information motel: Motel museum: Museum - picnic_site: Piknikplatz + picnic_site: Picknickplatz theme_park: Freizeitpark viewpoint: Aussichtspunkt zoo: Zoo @@ -1067,10 +1079,12 @@ de: Mehr Informationen dazu, wie unsere Daten verwendet werden können und wie man auf unsere Urheberschaft hinweist, kann man auf unserer <a href="http://osmfoundation.org/Licence">OSMF-Lizenzseite</a> und in den <a href="http://wiki.openstreetmap.org/wiki/DE:Legal_FAQ">Häufigen rechtlichen Fragen (Legal FAQ)</a> nachlesen. - more_2_html: "Obwohl OpenStreetMap „Open Data“ ist, können wir keine \nunentgeltliche - Karten-API für Drittparteienentwickler bereitstellen.\nSiehe unsere <a href=\"http://wiki.openstreetmap.org/wiki/API_usage_policy\">API-Verwendungsrichtlinie</a>,\n<a - href=\"http://wiki.openstreetmap.org/wiki/Tile_usage_policy\">Kachelverwendungsrichtlinie</a>\nund - <a href=\"http://wiki.openstreetmap.org/wiki/Nominatim#Usage_Policy\">Nominatim-Verwendungsrichtlinie</a>." + more_2_html: |- + Obwohl OpenStreetMap „Open Data“ ist, können wir keine + unentgeltliche Karten-API für Drittparteien bereitstellen. + Siehe unsere <a href="https://operations.osmfoundation.org/policies/api/">API-Verwendungsrichtlinie</a>, + die <a href="https://operations.osmfoundation.org/policies/tiles/">Kachelverwendungsrichtlinie</a> + und die <a href="https://operations.osmfoundation.org/policies/nominatim/">Nominatim-Verwendungsrichtlinie</a>. contributors_title_html: Unsere Mitwirkenden contributors_intro_html: 'Unsere Mitwirkenden sind tausende einzelne Menschen. Wir beziehen auch offen lizenzierte Daten von nationalen Kartenagenturen und @@ -1123,9 +1137,9 @@ de: zum Entfernen von Inhalten</a> oder melde dies direkt mit unserem <a href="http://dmca.openstreetmap.org/">Onlineformular</a>. trademarks_title_html: <span id="trademarks"></span>Markenzeichen - trademarks_1_html: OpenStreetMap und das Lupenlogo sind eingetragene Warenzeichen - der OpenStreetMap Foundation. Falls du Fragen über deine Verwendung der Marken - hast, sende deine Fragen bitte an die <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">Lizenz-Arbeitsgruppe</a>. + trademarks_1_html: OpenStreetMap, das Lupenlogo und „State of the Map“ sind + eingetragene Warenzeichen der OpenStreetMap Foundation. Falls du Fragen über + deine Verwendung der Marken hast, sende deine Fragen bitte an die <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">Lizenz-Arbeitsgruppe</a>. welcome_page: title: Willkommen! introduction_html: |- @@ -1146,13 +1160,14 @@ de: ein paar davon, die nützlich sein dürften. editor_html: Ein <strong>Editor</strong> ist ein Programm oder eine Webseite, mit der man die Karte bearbeiten kann. - node_html: Ein <strong>Node</strong> (Knoten) in OSM ist ein Punkt auf der Karte, - z.B. ein Restaurant oder ein Baum. - way_html: Ein <strong>Way</strong> ("Weg") in OSM ist eine Linie oder Fläche - wie z.B. eine Straße, ein Weg, ein Fluss oder ein Gebäude. - tag_html: |- - Ein <strong>tag</strong> ist eine Eigenschaft, die man einem Objekt zuweist. Z.B. der Name eines Restaurants - oder die maximal erlaubte Geschwindigkeit auf einer Straße. + node_html: Ein <strong>Node</strong> ("Knoten") in OSM ist ein Punkt auf der + Karte, z.B. ein Restaurant oder ein Baum. + way_html: Ein <strong>Way</strong> ("Weg") in OSM ist eine offene Linie wie + z.B. eine Straße, ein Weg, ein Fluss oder bildet eine geschlossene Fläche, + z.B. ein Gebäude. + tag_html: Ein <strong>tag</strong> ("Attribut") ist eine Eigenschaft, die man + einem Objekt zuweist. Z.B. der Name eines Restaurants oder die maximal erlaubte + Geschwindigkeit auf einer Straße. rules: title: Regeln! paragraph_1_html: "OpenStreetMap hat nur wenige formale Regeln, aber wir erwarten, @@ -1238,7 +1253,7 @@ de: about_page: next: Nächste copyright_html: <span>©</span>OpenStreetMap<br>Mitwirkende - used_by: '%{name} stellt Kartendaten für hunderte von Webseiten, Apps und andere + used_by: '%{name} stellt Kartendaten für tausende von Webseiten, Apps und andere Geräte zur Verfügung' lede_text: |- OpenStreetMap wird von einer Vielzahl von Mappern erstellt, die Daten zu @@ -1264,19 +1279,24 @@ de: abänderst oder auf bestimmte Art einbaust, darfst du das Ergebnis nur unter der gleichen Lizenz verbreiten. Siehe die <a href='%{copyright_path}'>Urheberrechts- und Lizenzseite</a> für Einzelheiten. - legal_title: Gesetzliche Hinweise + legal_title: Rechtliche Hinweise legal_html: |- - Diese Website und viele andere ähnliche Dienste werden im Auftrag der Gemeinschaft - formal betrieben von der <a href='http://osmfoundation.org/'>OpenStreetMap Foundation</a> (OSMF). + Diese Website und viele damit in Zusammenhang stehende Dienste werden + von der <a href='http://osmfoundation.org/'>OpenStreetMap Foundation</a> (OSMF) + für die OSM-Gemeinschaft betrieben. Die Verwendung aller OSMF-betriebenen Dienste + ist Thema unserer + „<a href="http://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy">Acceptable Use Policies</a>“ + und unserer <a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy">Datenschutzrichtlinie</a>. <br> Bitte <a href='http://osmfoundation.org/Contact'>kontaktiere die OSMF</a>, falls du Lizenz-, Urheberrechts- oder andere rechtliche Fragen und Probleme hast. partners_title: Partner notifier: diary_comment_notification: - subject: '[OpenStreetMap] %{user} hat deinen Blogeintrag kommentiert' + subject: '[OpenStreetMap] %{user} hat zu einem Blogeintrag kommentiert' hi: Hallo %{to_user}, - header: '%{from_user} hat deinen Blogeintrag %{subject} kommentiert:' + header: '%{from_user} hat zu dem OpenStreetMap-Blogeintrag mit dem Thema %{subject} + kommentiert:' footer: Hier gehts zum Eintrag %{readurl}, du kannst ihn kommentieren %{commenturl} oder direkt beantworten %{replyurl}. message_notification: @@ -1375,20 +1395,24 @@ de: den du kommentiert hattest, reaktivert.' details: Weitere Details über den Hinweis findest du unter %{url}. changeset_comment_notification: + hi: Hallo %{to_user}, greeting: Hallo, commented: - subject_own: '[OpenStreetMap] %{commenter} hat zu einem deiner Änderungssätze - kommentiert' + subject_own: '[OpenStreetMap] %{commenter} hat einen deiner Änderungssätze + diskutiert' subject_other: '[OpenStreetMap] %{commenter} hat zu einem Änderungssatz kommentiert, an dem du interessiert bist' - your_changeset: '%{commenter} hinterließ einen Kommentar zu einem deiner Änderungssätze, - erstellt am %{time}' - commented_changeset: '%{commenter} hinterließ einen Kommentar zu einem Kartenänderungssatz, - den du beobachtest, erstellt von %{changeset_author} am %{time}' - partial_changeset_with_comment: mit dem Kommentar „%{changeset_comment}“ + your_changeset: '%{commenter} hinterließ einen Diskussionsbeitrag zu einem + deiner Änderungssätze, erstellt am %{time}' + commented_changeset: '%{commenter} hinterließ einen Diskussionbeitrag zu einem + Kartenänderungssatz, den du beobachtest, erstellt von %{changeset_author} + am %{time}' + partial_changeset_with_comment: mit der Bemerkung „%{changeset_comment}“ partial_changeset_without_comment: ohne Kommentar - details: Weitere Einzelheiten über den Änderungssatz können gefunden werden - unter %{url}. + details: Weitere Details über den Änderungssatz können gefunden werden unter + %{url}. + unsubscribe: Um die Aktualisierungen an diesem Änderungssatz abzubestellen, + besuche %{url} und klicke auf „Abmelden“. message: inbox: title: Posteingang @@ -1487,8 +1511,8 @@ de: den Flash Player von Adobe.com herunter</a>. <a href="http://wiki.openstreetmap.org/wiki/DE:Editing">Einige andere Möglichkeiten</a>, um OpenStreetMap zu editieren, sind hier beschrieben. potlatch_unsaved_changes: Du hast deine Arbeit noch nicht gespeichert. (Um sie - in Potlach zu speichern, klicke auf eine leere Fläche bzw. deselektiere den - Weg oder Punkt, wenn du im Live-Modus editierst oder klicke auf Speichern, + in Potlach zu speichern, klicke auf eine leere Fläche bzw. deselektiere die + Linie oder den Knoten, wenn du im Live-Modus editierst oder klicke auf Speichern, wenn ein Speicherbutton vorhanden ist.) potlatch2_not_configured: Potlatch 2 wurde nicht konfiguriert - Bitte besuche http://wiki.openstreetmap.org/wiki/The_Rails_Port @@ -1513,15 +1537,17 @@ de: table: entry: motorway: Autobahn + main_road: Hauptstraße trunk: Schnellstraße primary: Bundesstraße secondary: Landes-, Kreisstraße unclassified: Straße - unsurfaced: Unbefestigte Straße track: Wald-, Feldweg - byway: Seitenweg (brit.) bridleway: Reitweg cycleway: Radweg + cycleway_national: Nationaler Radweg + cycleway_regional: Regionaler Radweg + cycleway_local: Lokaler Radweg footway: Fußweg rail: Eisenbahn subway: U-Bahn @@ -1543,7 +1569,6 @@ de: golf: Golfplatz park: Park resident: Wohngebiet - tourist: Sehenswürdigkeit common: - öffentliche Grünfläche (brit.) - Wiese @@ -1559,31 +1584,33 @@ de: cemetery: Friedhof allotments: Kleingartenanlage pitch: Spielfeld - centre: Sportplatz + centre: Sportzentrum reserve: Naturschutzgebiet military: Militärgebiet school: - Schule - Universität - building: Gebäude + building: Bedeutendes Gebäude station: Bahnhof summit: - Gipfel - Bergspitze - tunnel: Strichlierter Rand = Tunnel - bridge: Dicker Rand = Brücke + tunnel: Gestrichelter Rand = Tunnel + bridge: Schwarzer Rand = Brücke private: Privater Zugang - permissive: Eingeschänkter Zugang destination: Nur für Anrainer - construction: Straße im Bau + construction: Straßen im Bau + bicycle_shop: Fahrradladen + bicycle_parking: Fahrradparkplatz + toilets: Toiletten richtext_area: edit: Bearbeiten preview: Vorschau markdown_help: title_html: Interpretiert mit <a href="http://daringfireball.net/projects/markdown/">Markdown</a> headings: Überschriften - heading: Hauptüberschrift - subheading: Überschrift + heading: Überschrift + subheading: Zwischenüberschrift unordered: Aufzählung ordered: Nummerierte Liste first: Erstes Element @@ -1595,13 +1622,13 @@ de: url: URL trace: visibility: - private: PRIVAT (werden nur als anonyme, unsortierte Punkte ohne Zeitangaben + private: Privat (werden nur als anonyme, unsortierte Punkte ohne Zeitangaben gezeigt) - public: ÖFFENTLICH (wird in der Trackliste angezeigt, jedoch nur als anonyme, - unsortierte Punktfolge ohne Zeitstempel) - trackable: VERFOLGBAR (wird in der Trackliste als anonyme, sortierte Punktfolge + public: Öffentlich (wird in der Trackliste angezeigt, jedoch nur als anonyme, + unsortierte Punktfolge) + trackable: Verfolgbar (wird in der Trackliste als anonyme, sortierte Punktfolge mit Zeitstempel angezeigt) - identifiable: IDENTIFIZIERBAR (wird in der Trackliste als identifizierbare, + identifiable: Identifizierbar (wird in der Trackliste als identifizierbare, sortierte Punktfolge mit Zeitstempel angezeigt) create: upload_trace: Lade einen GPS-Track hoch @@ -1624,20 +1651,20 @@ de: tags_help: durch Komma getrennt save_button: Speichern visibility: 'Sichtbarkeit:' - visibility_help: Was heißt das? + visibility_help: Was bedeutet das? trace_form: upload_gpx: 'GPX-Datei hochladen:' description: 'Beschreibung:' tags: 'Tags:' - tags_help: durch Komma ( , ) getrennt + tags_help: durch Komma getrennt visibility: 'Sichtbarkeit:' - visibility_help: Was heißt das? + visibility_help: Was bedeutet das? upload_button: Hochladen help: Hilfe help_url: http://wiki.openstreetmap.org/wiki/DE:Upload trace_header: - upload_trace: Lade einen GPS-Track hoch - see_all_traces: Alle GPS-Tracks + upload_trace: Lade einen Track hoch + see_all_traces: Alle Tracks ansehen see_your_traces: Meine Tracks ansehen traces_waiting: one: Du hast momentan %{count} Track in der Warteschlange. Bitte warte, bis @@ -1652,7 +1679,7 @@ de: pending: WARTEND filename: 'Dateiname:' download: herunterladen - uploaded: 'Hochgeladen am:' + uploaded: 'Hochgeladen:' points: 'Punkte:' start_coordinates: 'Startkoordinate:' map: Karte @@ -1672,9 +1699,9 @@ de: trace: pending: WARTEND count_points: '%{count} Punkte' - ago: '%{time_in_words_ago} her' + ago: vor %{time_in_words_ago} more: Details - trace_details: Details des GPS-Tracks anzeigen + trace_details: Details des Tracks anzeigen view_map: Karte anzeigen edit: bearbeiten edit_map: Karte bearbeiten @@ -1738,6 +1765,7 @@ de: allow_read_gpx: Deine privaten GPS-Tracks auszulesen allow_write_gpx: GPS-Tracks hochzuladen allow_write_notes: Hinweise zu geben/Fehler zu melden + grant_access: Zugriff gewähren oauthorize_success: title: Autorisierungsanfrage genehmigt allowed: Du hast den Benutzerkontenzugriff für die Anwendung %{app_name} gewährt. @@ -1849,6 +1877,12 @@ de: windowslive: title: Mit Windows Live anmelden alt: Mit einem Windows-Live-Konto anmelden + github: + title: Mit GitHub anmelden + alt: Mit einem GitHub-Konto anmelden + wikipedia: + title: Mit Wikipedia anmelden + alt: Mit einem Wikipedia-Benutzerkonto anmelden yahoo: title: Mit Yahoo anmelden alt: Mit einer Yahoo-OpenID anmelden @@ -1887,8 +1921,8 @@ de: title: Registrieren no_auto_account_create: Im Moment ist das automatische Erstellen eines Benutzerkontos leider nicht möglich. - contact_webmaster: Bitte kontaktiere den <a href="mailto:webmaster@openstreetmap.org">Webmaster</a>, - um ein Benutzerkonto zu bekommen. - Wir werden die Anfrage möglichst schnell + contact_webmaster: Bitte kontaktiere den <a href="%{webmaster}">Webmaster</a>, + um ein Benutzerkonto zu bekommen. – Wir werden die Anfrage möglichst schnell bearbeiten. about: header: Frei und editierbar @@ -1901,7 +1935,10 @@ de: für Mitwirkende</a> zustimmen. email address: 'E-Mail-Adresse:' confirm email address: 'Bitte wiederhole die E-Mail-Adresse:' - not displayed publicly: Nicht öffentlich sichtbar (<a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy">Datenschutzrichtlinie</a>) + not displayed publicly: Deine Anrede wird nicht öffentlich angezeigt, siehe + unsere <a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy" title="OSMF-Datenschutzrichtlinie + inklusive des Abschnitts zu E-Mail-Adressen">Datenschutzrichtlinie</a> für + weitere Informationen. display name: 'Benutzername:' display name description: Dein öffentlich angezeigter Benutzername. Er kann später in den Einstellungen geändert werden. @@ -1911,16 +1948,6 @@ de: use external auth: Verwende alternativ eine Drittpartei zur Anmeldung auth no password: Mit Drittparteiauthentifikation ist kein Passwort erforderlich, jedoch können einige Extrawerkzeuge oder Server eines benötigen. - auth association: |- - <p>Deine ID ist noch nicht mit einem OpenStreetMap-Benutzerkonto verknüpft.</p> - <ul> - <li>Falls du neu auf OpenStreetMap bist, erstelle bitte mithilfe des unten stehenden Formulars ein neues Benutzerkonto.</li> - <li> - Falls du schon ein Benutzerkonto besitzt, kannst du dich bei deinem Konto - mit Benutzernamen und Passwort anmelden und anschließend das Benutzerkonto - in den Einstellungen mit deiner ID verknüpfen. - </li> - </ul> continue: Registrieren terms accepted: Vielen Dank, dass du den neuen Bedingungen für Mitwirkende zugestimmt hast! @@ -1953,6 +1980,7 @@ de: heading: Der Benutzer %{user} existiert nicht body: Es gibt leider keinen Benutzer mit dem Namen %{user}. Du hast dich möglicherweise vertippt oder bist einem ungültigem Link gefolgt. + deleted: gelöscht view: my diary: Mein Blog new diary entry: Neuer Blogeintrag @@ -1978,7 +2006,7 @@ de: ct status: 'Bedingungen für Mitwirkende:' ct undecided: Unentschlossen ct declined: Abgelehnt - ct accepted: Vor %{ago} akzeptiert + ct accepted: '%{ago} akzeptiert' latest edit: 'Letzte Änderung %{ago}:' email address: 'E-Mail-Adresse:' created from: 'erstellt aus:' @@ -2005,7 +2033,7 @@ de: revoke: administrator: Administrator-Rechte entziehen moderator: Moderator-Rechte entziehen - block_history: Erhaltene Sperren + block_history: Aktive Sperren moderator_history: Vergebene Sperren comments: Kommentare create_block: Benutzer sperren @@ -2017,9 +2045,9 @@ de: delete_user: Benutzer löschen confirm: Bestätigen friends_changesets: Änderungssätze deiner Freunde - friends_diaries: Tagebucheinträge deiner Freunde + friends_diaries: Blogs deiner Freunde nearby_changesets: Änderungssätze von Benutzern in der Nähe - nearby_diaries: Tagebucheinträge von Benutzern in der Nähe + nearby_diaries: Blogs von Benutzern in der Nähe popup: your location: Standort nearby mapper: Mapper in der Nähe @@ -2070,6 +2098,8 @@ de: gravatar: Gravatar verwenden link: http://wiki.openstreetmap.org/wiki/Gravatar link text: Was ist das? + disabled: Gravatar wurde deaktiviert. + enabled: Die Anzeige deines Gravatars wurde aktiviert. new image: Bild einfügen keep image: Bild unverändert beibehalten delete image: Bild löschen @@ -2096,10 +2126,7 @@ de: press confirm button: Zur Aktivierung Deines Benutzerkontos klicke bitte unten auf „Bestätigen“. button: Bestätigen - success: |- - Dein Benutzerkonto wurde bestätigt, danke fürs Registrieren! - <br /><br /> - Auf <a href="http://www.openstreetmap.de/willkommen/">dieser Seite</a> findest du nützliche Links und Informationen, die dir den Einstieg erleichtern. + success: Dein Benutzerkonto wurde bestätigt, danke fürs Registrieren! already active: Dieses Benutzerkonto wurde bereits bestätigt. unknown token: Dieser Bestätigungscode ist abgelaufen oder nicht vorhanden. reconfirm_html: Um die Bestätigungs-E-Mail erneut zuzusenden, <a href="%{reconfirm}">klicke @@ -2108,8 +2135,8 @@ de: success: Wir haben eine neue Bestätigungsnachricht an %{email} gesendet. Sobald du dein Benutzerkonto bestätigt hast, kannst du mit dem Kartieren beginnen.<br /><br />Sofern du ein Antispamsystem nutzt, das selbst Bestätigungen anfordert, - musst du webmaster@openstreetmap.org auf dessen Positivliste setzen, da wir - auf keine Bestätigungsanfragen reagieren können. + musst du %{sender} auf dessen Positivliste setzen, da wir auf keine Bestätigungsanfragen + reagieren können. failure: Benutzer %{name} konnte nicht gefunden werden. confirm_email: heading: Änderung der E-Mail-Adresse bestätigen @@ -2161,6 +2188,15 @@ de: no_authorization_code: Kein Autorisierungscode unknown_signature_algorithm: Unbekannter Signaturalgorithmus invalid_scope: Ungültiger Bereich + auth_association: + heading: Deine ID ist noch nicht mit einem OpenStreetMap-Konto verknüpft. + option_1: |- + Falls du neu auf OpenStreetMap bist, erstelle bitte + mithilfe des unten stehenden Formulars ein neues Benutzerkonto. + option_2: |- + Falls du bereits ein Benutzerkonto hast, kannst du dich bei deinem Konto + mithilfe deines Benutzernamens und Passwortes anmelden und dann das Benutzerkonto + mit deiner ID in deinen Benutzereinstellungen verknüpfen. user_role: filter: not_an_administrator: Benutzerrollen können nur von Administratoren verwaltet @@ -2297,14 +2333,14 @@ de: wird. note: description: - opened_at_html: vor %{when} erstellt - opened_at_by_html: vor %{when} von %{user} erstellt - commented_at_html: vor %{when} aktualisiert - commented_at_by_html: vor %{when} von %{user} aktualisiert - closed_at_html: vor %{when} gelöst - closed_at_by_html: vor %{when} von %{user} gelöst - reopened_at_html: vor %{when} reaktiviert - reopened_at_by_html: vor %{when} von %{user} reaktiviert + opened_at_html: '%{when} erstellt' + opened_at_by_html: '%{when} von %{user} erstellt' + commented_at_html: '%{when} aktualisiert' + commented_at_by_html: '%{when} von %{user} aktualisiert' + closed_at_html: '%{when} gelöst' + closed_at_by_html: '%{when} von %{user} gelöst' + reopened_at_html: '%{when} reaktiviert' + reopened_at_by_html: '%{when} von %{user} reaktiviert' rss: title: OpenStreetMap Hinweise description_area: Übersicht der gemeldeten, kommentierten oder geschlossen Hinweise/Fehler @@ -2348,10 +2384,13 @@ de: center_marker: Karte am Marker zentrieren paste_html: HTML zur Einbettung in Webseiten kopieren view_larger_map: Größere Karte anzeigen + only_standard_layer: Nur die Standardebene kann als Bild exportiert werden + embed: + report_problem: Ein Problem melden key: title: Legende tooltip: Legende - tooltip_disabled: Die Legende ist nur für die Standardebene verfügbar + tooltip_disabled: Die Legende ist nicht für diese Ebene verfügbar map: zoom: in: Vergrößern @@ -2363,19 +2402,19 @@ de: standard: Standard cycle_map: Radfahrerkarte transport_map: Verkehrskarte - mapquest: MapQuest Open hot: Humanitarian layers: header: Kartenebenen notes: Hinweise/Fehlermeldungen data: Kartendaten + gps: Öffentliche GPS-Tracks overlays: Overlays zur Fehlersuche aktivieren title: Ebenen copyright: © <a href='%{copyright_url}'>OpenStreetMap-Mitwirkende</a> donate_link_text: <a class='donate-attr' href='%{donate_url}'>Spenden</a> site: edit_tooltip: Karte bearbeiten - edit_disabled_tooltip: Zum Editieren muss eine höhere Zoomstufe gewählt werden + edit_disabled_tooltip: Zum Bearbeiten muss eine höhere Zoomstufe gewählt werden createnote_tooltip: Einen Hinweis/Fehler zu den Kartendaten melden createnote_disabled_tooltip: Zum Erstellen von Hinweisen muss eine höhere Zoomstufe gewählt werden @@ -2416,6 +2455,9 @@ de: mapquest_car: Auto (MapQuest) mapquest_foot: Fuß (MapQuest) osrm_car: Auto (OSRM) + mapzen_bicycle: Fahrrad (Mapzen) + mapzen_car: Auto (Mapzen) + mapzen_foot: Fuß (Mapzen) directions: 'Routenanweisungen:' distance: Distanz errors: @@ -2424,28 +2466,43 @@ de: instructions: continue_without_exit: Weiter auf %{name} slight_right_without_exit: Leicht rechts auf %{name} + offramp_right_without_exit: Die rechte Auffahrt auf %{name} nehmen + onramp_right_without_exit: Bei der Auffahrt rechts abbiegen auf %{name} + endofroad_right_without_exit: Am Straßenende rechts abbiegen auf %{name} + merge_right_without_exit: Rechts einfädeln in %{name} + fork_right_without_exit: Bei der Gabelung rechts abbiegen auf %{name} turn_right_without_exit: Rechts abbiegen auf %{name} sharp_right_without_exit: Scharf rechts auf %{name} uturn_without_exit: Umkehren entlang %{name} sharp_left_without_exit: Scharf links auf %{name} turn_left_without_exit: Links abbiegen auf %{name} + offramp_left_without_exit: Die linke Auffahrt auf %{name} nehmen + onramp_left_without_exit: Bei der Auffahrt links abbiegen auf %{name} + endofroad_left_without_exit: Am Straßenende links abbiegen auf %{name} + merge_left_without_exit: Links einfädeln in %{name} + fork_left_without_exit: Bei der Gabelung links abbiegen auf %{name} slight_left_without_exit: Leicht links auf %{name} via_point_without_exit: (über Punkt) follow_without_exit: '%{name} folgen' - roundabout_without_exit: Im Kreisverkehr nehme %{name} + roundabout_without_exit: Im Kreisverkehr nimm %{name} leave_roundabout_without_exit: Kreisverkehr verlassen – %{name} stay_roundabout_without_exit: Auf Kreisverkehr bleiben – %{name} start_without_exit: Starten beim Ende von %{name} destination_without_exit: Ziel erreicht against_oneway_without_exit: Gegen die Einbahnstraße gehen auf %{name} end_oneway_without_exit: Ende der Einbahnstraße auf %{name} - roundabout_with_exit: Beim Kreisverkehr nehme die Ausfahrt %{exit} auf %{name} + roundabout_with_exit: Beim Kreisverkehr nimm die Ausfahrt %{exit} auf %{name} + turn_left_with_exit: Beim Kreisverkehr links abbiegen auf %{name} + slight_left_with_exit: Beim Kreisverkehr leicht links abbiegen auf %{name} + turn_right_with_exit: Beim Kreisverkehr rechts abbiegen auf %{name} + slight_right_with_exit: Beim Kreisverkehr leicht rechts abbiegen auf %{name} + continue_with_exit: Beim Kreisverkehr geradeaus bleiben auf %{name} unnamed: unbekannt courtesy: Routenanweisungen stammen von %{link} time: Zeit query: node: Knoten - way: Weg + way: Linie relation: Relation nothing_found: Keine Objekte gefunden error: 'Fehler beim Kontaktieren von %{server}: %{error}' diff --git a/config/locales/diq.yml b/config/locales/diq.yml index 75578d9d6..69b7a28b4 100644 --- a/config/locales/diq.yml +++ b/config/locales/diq.yml @@ -1,8 +1,12 @@ # Messages for Zazaki (Zazaki) # Exported from translatewiki.net # Export driver: phpyaml +# Author: 1917 Ekim Devrimi +# Author: Asmen # Author: Erdemaslancan # Author: Gorizon +# Author: Gırd +# Author: Kumkumuk # Author: Marmase # Author: Mirzali --- @@ -82,16 +86,62 @@ diq: default: Hesabiyaye (%{name}yo nıkayên) potlatch: name: Potlatch 1 + description: Potlatch 1 (browser vurnayoğ) + id: + name: iD + description: iD (browser vurnayoğ) potlatch2: name: Potlatch 1 + description: Potlatch 2 (browser vurnayoğ) + remote: + name: Duri da qontrol + description: Duri ra Qonrtol (JOSM yana Merkaartor) browse: + created: Vıraziye + closed: Racneya + created_html: <abbr title='%{title}'>%{time} veror</abbr> vıraziye + closed_html: <abbr title='%{title}'>%{time} veror</abbr> racneye version: Versiyon + in_changeset: Qeydê Vurnayışan + anonymous: anonim + no_comment: (be vatış) + part_of: Letey + download_xml: XML ron + view_history: Tarixi Bıvêne + view_details: Teferuatan Bıvêne + location: 'Lokasyon:' changeset: title: 'Koma vurnayışi: %{id}' belongs_to: Nuştekar + node: '%{count} noqtey' + node_paginated: pero piya (%{x}-%{y} - %{count}) noqtey + way: '%{count} ray' + way_paginated: Ray (%{x}-%{y} - pêro piya %{count}) + relation: Eleqey %{count} + relation_paginated: Eleqey %{x}-%{y} pêro piya %{count} + comment: Mışewreyi (%{count}) + changesetxml: Vurnayışê peyênê XML + osmchangexml: OsmVurnayışê XML + feed: + title: 'Koma vurnayışi: %{id}' + join_discussion: Dekewtena vatenayışi rê qeyd bê + discussion: Werênayış + node: + title: Noqta:%{name} + history_title: 'Verora nokta: %{name}' + way: + title: Ray:%{name} + history_title: Verora rayer:%{name} + nodes: Noqtey + also_part_of: + one: letey ray %{related_ways} + other: letey rayer %{related_ways} relation: + title: Eleqe:%{name} + history_title: 'Verorê eleqey: %{name}' members: Ezay relation_member: + entry_role: '%{type} %{name}, de %{role}' type: node: Qedyin way: Ray @@ -100,17 +150,20 @@ diq: entry: Eleqe %{relation_name} entry_role: Eleqe %{relation_name} (%{relation_role} deye) not_found: + sorry: 'Qısur mewni, #%{id} numreya %{type} nêvine yê.' type: node: qedyin way: ray relation: eleqe changeset: Qeydê Vurnayışan + note: Not timeout: type: node: qedyin way: ray relation: eleqe changeset: Qeydê Vurnayışan + note: Not redacted: redaction: Temamey %{id} type: @@ -122,24 +175,44 @@ diq: loading: Bar beno... tag_details: tags: 'Etiketi:' + telephone_link: Veynd %{phone_number} note: + title: 'Not: %{id}' + new_note: Nota Newi description: Şınasnayış + query: + title: Xısusiyetan bıasne + introduction: Xısusiyetanê nezdiyan vinayışi rê xeriter sero bıploğnê + nearby: Nezdıra xısusiyeti + enclosing: Muhtewa xısusiyeti changeset: changeset_paging_nav: showing_page: Pele %{page} next: Peyên » previous: « Verên changeset: - no_edits: (vurnayış çıniyo) + anonymous: Anonim + no_edits: (vırnayış çıniyo) + view_changeset_details: Teferuatê vurnayışê seti bıvin changesets: id: ID - saved_at: Deme qeydi + saved_at: Demê qeydi user: Karber comment: Mışewre area: Erz list: title: Seta vurnayışan + title_user: Vurriyayışê setê %{user} + title_friend: Qeydê vurnayışê embazan + title_nearby: Nezdıra vurriyayışê setê karberi + load_more: Dehana vêşi + rss: + full: Vaten pêro diary_entry: + new: + publish_button: Vıla ke + list: + user_title: '%{user} (Rocek)' edit: subject: 'Mewzu:' body: 'Vêrey mesaci:' @@ -159,19 +232,33 @@ diq: confirm: Tesdiq ke location: location: 'Herun:' - view: Bıvin + view: Bımotne edit: Bıvurne comments: post: Bırışe when: Key comment: Mışewre ago: Verdê %{ago} - newer_comments: Mışewreyê Tewr Neweyi + newer_comments: Tewr Vatışê Newey older_comments: Vatışo Tewr Kehan export: + title: Teber de start: area_to_export: Cayo ke cıra bıvciyo + manually_select: Be desti ra yew cayo bin weçıne + format_to_export: Formatê teberi ra eştışi + osm_xml_data: OpenStreetMap XML Data licence: Lisans + too_large: + planet: + title: Geyrenıka OSM + overpass: + title: Overpass API + metro: + title: Çap kerdenê Metroy + description: Çap kerdenê metroyan u banliyo + other: + title: Çemê bini options: Weçinegi format: Format scale: Sence @@ -195,6 +282,10 @@ diq: geonames: <a href="http://www.geonames.org/">GeoNames.org</a> ra neticey search_osm_nominatim: prefix: + aerialway: + cable_car: Kabloy ereber + gondola: Telesiyej + station: Ä°stasyona teleferiki aeroway: aerodrome: Hewaherun apron: Apron @@ -204,6 +295,7 @@ diq: taxiway: Raya Texsiyan terminal: Terminal amenity: + animal_shelter: Kozıkê heywanan arts_centre: Merkeze Zagoni atm: ATM bank: Banka @@ -213,6 +305,7 @@ diq: bicycle_parking: Perka Bisiklet bicycle_rental: Bisiklet Ä°car kerden biergarten: Hegay Bira + boat_rental: Bot icar brothel: Kerxane bureau_de_change: Buroye Dovizan bus_station: Otogar @@ -222,8 +315,10 @@ diq: car_wash: Wesayıt Şuwayış casino: Kasino charging_station: Ä°stasyona Pırkerden + childcare: Qeç weynayış cinema: Sinema clinic: Klinik + clock: Saete college: Lise community_centre: Merkezê Cemeati courthouse: Adliye @@ -233,6 +328,7 @@ diq: dormitory: Ware drinking_water: Awa Şımıtışi driving_school: Kursa Ramenan + embassy: Sefirey emergency_phone: Vistren Telefon fast_food: Fast Food ferry_terminal: Terminala Feriboter @@ -241,6 +337,7 @@ diq: food_court: Kerwanseray fountain: Fıskiye fuel: Petrol + gambling: Kumarxane grave_yard: Mezla ser gym: Merkeza Fitnessi / Salona Spori health_centre: Merkeza Weşiney @@ -251,11 +348,14 @@ diq: library: Kıtıbxane market: Market marketplace: Heruna bazari + monastery: Manastır + motorcycle_parking: Motorpiskilet park kerdış nightclub: Kluba Şewer nursery: Kreş nursing_home: Rehatxane office: Ofis parking: Otopark + parking_entrance: Keyberê par kerdışi pharmacy: Eczaxane place_of_worship: Bawerxane police: Pulis @@ -276,6 +376,7 @@ diq: shower: Çımecek social_centre: Merkezo Sosyal social_club: Kluba Sosyal + social_facility: Tesiso sosyal studio: Studyo swimming_pool: Dola Asnawkerdışi taxi: Taksi @@ -288,23 +389,50 @@ diq: veterinary: Veteriner village_hall: Wedey Dewer waste_basket: Tenkey Sıloy + waste_disposal: Cay sıloy youth_centre: Merkezê Gencan boundary: administrative: Sinorê Ä°dari + census: Sinora amora nıfusi national_park: Perka Milli + protected_area: Star biyaye erd bridge: + aqueduct: Kemerê awer + suspension: Pırdo layın swing: Pırde Asnawi + viaduct: Viyaduk "yes": Pırd building: "yes": Bina + craft: + brewery: Fabriqay bira + carpenter: Merengoz + electrician: Ceyranwan + gardener: Bahçıvan + painter: Dawtewan + photographer: Fotrafkar + plumber: Tesisatwan + shoemaker: Postalwan + tailor: Deştoğ + "yes": Dukanê çiy + emergency: + ambulance_station: Ä°stasyona ambulans + defibrillator: Defibrillator ( makinay qelbi) + landing_site: Cay war amyayışi + phone: Vistren Telefon highway: + abandoned: Raya kehan bridleway: Raya Estoran + bus_guideway: Ä°sleg raya otobosan bus_stop: Ä°stasyonê Otobozan + construction: Vıraziyê weziyet de ray cycleway: Raya Bisikleter + elevator: Esansor emergency_access_point: Cayê vistra resnayışi footway: Raya geyrayışi ford: Balan living_street: Kuçey Cıwiyayışi + milestone: Siyê kilometri motorway: Otoray motorway_junction: Kewşaxa Otorayer motorway_link: Raya Otoray @@ -313,30 +441,65 @@ diq: platform: Platform primary: Raya Dewlet primary_link: Raya Dewlet + proposed: Plan bıyayi ray raceway: Raya Vestışi - residential: Kuçe + residential: Are Ray rest_area: Cay solıxgrotışi road: Ray + secondary: Raya wılayeti + secondary_link: Grey raya wılayeti + service: Raya serwisi + services: Tesisê mêli speed_camera: Kemeraya Vıstrın steps: Merwani + street_lamp: Lumbay kuçi tertiary: Raya Dewan + tertiary_link: Raya Dewan track: Raya Herın + traffic_signals: Signalê trafiki trail: Şop + trunk: Letebıyayi ser ray + trunk_link: Lwtebıyayi ser ray + unclassified: Nêrêzbıyayi ray + unsurfaced: Raya xam + "yes": Ray historic: + archaeological_site: Arkeolojik Ca + battlefield: Cay herbi + boundary_stone: Siya sinori + building: Binaya verên + bunker: Stare castle: Qela church: Kılise + city_gate: Keyberê Sûker + citywalls: Dêsê Sûker fort: Qula + heritage: Cayo Miras house: Keye icon: Ikon manor: Kosk memorial: Qub mine: Mahden monument: Ziyarık + roman_road: Raya Roma ruins: Pagi + stone: Kemere + tomb: Mezel tower: Kule + wreck: Gemiya Gumbiyayi + junction: + "yes": Çatray landuse: + allotments: Bostan + basin: Dol + brownfield: Erdo bece + cemetery: Mezlaser + commercial: Cayê Ticareti u Xızmeti conservation: Qısekerdış + construction: Ä°nşaat farm: Cıtinin + farmland: Erdê Ziraati + farmyard: Ä°siga çıfligi forest: Mêşe garages: Garac grass: Çim @@ -347,29 +510,88 @@ diq: military: Eskeri Mıntıqa mine: Mahden orchard: Hêga + quarry: Adırgan railway: Rayatiran + recreation_ground: Parka hewin reservoir: Dola Beraci + reservoir_watershed: Merga awer + residential: Heruna Cıwiyayışi + retail: Esnaf + road: Cay ray + village_green: Cayo kıho + vineyard: Rez + "yes": Karıyayışa erdi leisure: + beach_resort: Dewa plajın + bird_hide: Cay mıriçık weynayışi + club: Klüb + common: Umumi erd + dog_park: Parka kutıkan + fishing: Heruna masan + fitness_centre: Fitness Merkezi + fitness_station: Spor Merkezi garden: Hega + golf_course: Sağay golfi + horse_riding: Bergir cınayış + ice_rink: Patena cemedi marina: Marina + miniature_golf: Minyatür Golf + nature_reserve: Cay gem starnayışi park: Perk + pitch: Seğay spori + playground: Parka qeçkan + recreation_ground: Parka hewin + resort: Resort + sauna: Sauna + slipway: Raya xızxızoki + sports_centre: Merkezê Spori stadium: Stadyum + swimming_pool: Dola Asnawkerdışi + track: Raya remayışi + water_park: Aquapark + "yes": Xoser zeman + man_made: + lighthouse: Parka awer + pipeline: Xeta boriyer + tower: Kule + works: Fabırqe + "yes": Vıraştena insanan military: + airfield: Hewaraya Aspariye + barracks: Kışla bunker: Stare + mountain_pass: + "yes": Ravêreka Koy natural: + bay: Delhiz beach: Plac + cape: Pırnık + cave_entrance: Dekewtena Laner + cliff: Pereten crater: Krater dune: Kımıl fell: Gedugo wışk + fjord: Fiord forest: Mêşe geyser: Gayzer glacier: Cemeden + grassland: Çere + heath: Merä hill: Gedug island: Ade land: Wer + marsh: Lınce + moor: Lıncane + mud: Dawte peak: Gıl /sersıq + point: Pırn reef: Resif + ridge: Sud + rock: Qere + saddle: Cıl + sand: Qum scree: Heyelan + scrub: Bırık spring: Ênêk stone: Kemere strait: Balan @@ -381,11 +603,25 @@ diq: wood: Meşe office: accountant: Muhasebedar + administrative: Ä°dare architect: Mimar company: Şirket + employment_agency: Ä°dareya kar vinayışi + estate_agent: Emlakwan + government: Dairey Dewlet + insurance: Ofisê sigorta lawyer: Abuqat + ngo: Ofisa Sivil cemaati + telecommunication: Ofisa Telekomunikasyoni + travel_agent: Acentaya Seyahati + "yes": Ofis place: + allotments: Bostan + block: Blok + airport: Meydanê hewayi city: Suk + country: Dewlete + county: Welat farm: Erdo Bec hamlet: Mezra house: Keye @@ -393,14 +629,48 @@ diq: island: Ada islet: Adeqeq locality: Wereyin + moor: Lıncane + municipality: Belediya + neighbourhood: Mehla + postcode: Kodê posteyi region: Mıntıqa + sea: Derya state: wılayet + subdivision: Qısımo bınên + suburb: Mahle / Banliyö town: bacar + unincorporated_area: Wareyo Yewnêbiyaye village: Dew + "yes": Ca railway: + abandoned: Asınraya Terkkerdiye halt: Ä°stasyonaTiran + monorail: Tekasınxete + narrow_gauge: Teng xet asınray + platform: Peron + preserved: Staryaye asınray + proposed: Planbıyayi asınray + station: Ä°stasyona Tiran + stop: Vındeneka Tiran + subway: Metro + subway_entrance: Dekewtena metro + switch: Meqesê asınray + tram: Tramvay + tram_stop: Vınderdeka Tramvay shop: + alcohol: Cay Cığara u Alkoler + antiques: Kehanwan + art: Dukanê zagoni + bakery: Fırun + boutique: Butik butcher: Kesab + car: Dukanê Ereban + car_parts: Letey Ereben + car_repair: Oto tamir + carpet: Dukanê Xaliya + chemist: Eczanewan + deli: Şarkuteri + department_store: Meğaza florist: Çiçekdar furniture: Mobilya gallery: Galeri @@ -453,7 +723,7 @@ diq: outbox: Rışteyan from: Kêra subject: Mewzu - date: Deme + date: Dem message_summary: reply_button: Cewab bıde delete_button: Bestere @@ -467,10 +737,10 @@ diq: outbox: Rışteyan to: Kêrê subject: Mewzu - date: Deme + date: Dem read: subject: Mewzu - date: Deme + date: Dem reply_button: Cewab bıde to: Kêrê sent_message_summary: @@ -487,7 +757,6 @@ diq: table: entry: track: Raya Herın - byway: Raya Bınêk bridleway: Raya Ancınıştan cycleway: Raya Bisiklet apron: @@ -523,7 +792,7 @@ diq: url: GRE trace: edit: - filename: 'Nameyê dosya:' + filename: 'Namey dosya:' download: ron uploaded_at: 'Bar biyo:' points: 'Dawte:' @@ -544,7 +813,7 @@ diq: title: Rêça %{name} mocnêyêna heading: Rêça %{name} mocnêyêna pending: PAWEDEYO - filename: 'Nameyê dosya:' + filename: 'Namey dosya:' download: ron uploaded: 'Bar biyo:' points: 'Dawte:' @@ -625,7 +894,7 @@ diq: display name: 'Nameyo ke Aseno:' password: 'Parola:' confirm password: 'Parolay tesdiq ke:' - continue: Dewam ke + continue: Qeyd be terms: consider_pd_why: no çıko? agree: Qebul kena @@ -637,22 +906,22 @@ diq: title: Karbero do wuna çıniyo heading: '%{user} name dı karber çıniyo' view: - my diary: rocekê mı + my diary: Rocekê mı new diary entry: Roceko newe defi - my edits: pêştenê mı + my edits: Iştirakê mı my traces: GPS rêçê mı my settings: Eyarê Mı - my comments: Mışewreyê mı + my comments: Mışewrey mı oauth settings: sazê OAuthi - blocks on me: bloqeyê mı + blocks on me: Bloqeyê mı blocks by me: Bloqe kerdışê mı send message: mesac bırışê - diary: rocek - edits: vurnayışi - traces: rêçi + diary: Rocek + edits: Vurnayışi + traces: Rêçi remove as friend: Embazan ra vec - add as friend: Xo rê embaz ke - mapper since: 'Demê Xeritoğiney:' + add as friend: Embaz bı + mapper since: 'Demê herdnigarwaniye:' ago: (%{time_in_words_ago} veror) ct undecided: Darıdeyo ct declined: Red kerd @@ -682,8 +951,8 @@ diq: moderator: Hesabê moderatori terkne block_history: kılitkerdışê gırewtey moderator_history: Bloqanê cı bıgi re - comments: vatışi - create_block: Ena karber blok bike + comments: Mışewreyi + create_block: nê karberi kılit ke activate_user: Nê karberi aktiv ke deactivate_user: Nê karberi aktiv meke confirm_user: nê karberi tesdiq ke @@ -750,8 +1019,8 @@ diq: confirm: Tesdiq ke user_block: new: - title: '%{name} i bloqe vırazeno' - heading: '%{name} i bloqe vırazeno' + title: '%{name}i rê blok vırazeno.' + heading: '%{name}i ro blok vırazeno.' submit: Bloqe vırazê back: Bloqan pêron bıvin edit: @@ -770,7 +1039,7 @@ diq: one: 1 seate other: '%{count} seati' partial: - show: Bımocne + show: Bımotne edit: Bıvurne revoke: Terkne! confirm: Vac welay? @@ -790,18 +1059,21 @@ diq: heading: Blokeyê ke %{name} kerdê listey ênan blocks_by: title: Blokeyê ke %{name} kerdê - heading: Blokeyê ke %{name} kerdê listey ênan + heading: '%{name} ra lista blokan' show: title: Karber %{block_by} karber %{block_on} ke bloqe heading: Karber %{block_by} karber %{block_on} ke bloqe time_future: '%{time} dı bıqediyo' time_past: Verdê %{time} qedya status: Weziyet - show: Bımocne + show: Bımotne edit: Bıvurne revoke: Terkne! confirm: Vac welay? revoker: 'Terkner:' + note: + entry: + comment: Mışewre javascripts: map: base: @@ -810,6 +1082,13 @@ diq: transport_map: Xeritay Resnayışi site: edit_tooltip: Xeriti timar ke + changesets: + show: + comment: Mışewre + hide_comment: bınımne + notes: + show: + comment: Mışewre redaction: edit: description: Şınasnayış diff --git a/config/locales/dsb.yml b/config/locales/dsb.yml index 764381ddb..948147f06 100644 --- a/config/locales/dsb.yml +++ b/config/locales/dsb.yml @@ -2,6 +2,7 @@ # Exported from translatewiki.net # Export driver: phpyaml # Author: Derbeth +# Author: Macofe # Author: Michawiki # Author: Shirayuki --- @@ -1312,9 +1313,7 @@ dsb: primary: Zwězkowa droga secondary: Nakrajna droga unclassified: Njeklasificěrowana droga - unsurfaced: Njewobtwarźona droga track: Cera - byway: Bocna droga bridleway: Rejtarska drožka cycleway: Sćažka za kolesowarjow footway: Drožka @@ -1338,7 +1337,6 @@ dsb: golf: Golfowišćo park: Park resident: Bydleński wobcerk - tourist: Turistowa atrakcija common: - PowÅ¡ykny - łuka @@ -1368,7 +1366,6 @@ dsb: tunnel: Smužkowane wobcerjenje = tunel bridge: Carne wobcerjenje = móst private: Priwatny pśistup - permissive: Dowólony pśistup destination: Jano za pśigranicujucych construction: Drogi w twari richtext_area: @@ -1651,9 +1648,9 @@ dsb: new: title: Registrěrowaś no_auto_account_create: Bóžko njamóžomy tuchylu za tebje konto awtomatiski załožyś. - contact_webmaster: PÅ¡osym staj so z <a href="mailto:webmaster@openstreetmap.org">webmasterom</a> - do zwiska, aby se śi konto załožyło - buźomy napÅ¡aÅ¡owanje tak spěšnje ako - móžno wobźěłowaś. + contact_webmaster: PÅ¡osym staj so z <a href="%{webmaster}">webmasterom</a> do + zwiska, aby se śi konto załožyło - buźomy napÅ¡aÅ¡owanje tak spěšnje ako móžno + wobźěłowaś. about: header: Lichy a wobźěłujobny html: |- @@ -1843,7 +1840,7 @@ dsb: confirm_resend: success: Smy nowu wobkÅ¡uśeński e-mail na %{email} póslali a gaž wobkÅ¡uśijoÅ¡ swójo konto, móžoÅ¡ kartěrowanje zachopiś.<br /><br />Jolic wužywaÅ¡ pśeśiwospamowy - system, kótaryž sćelo wobkÅ¡uśeńske napÅ¡aÅ¡owanja, pśewzij adresu webmaster@openstreetmap.org + system, kótaryž sćelo wobkÅ¡uśeńske napÅ¡aÅ¡owanja, pśewzij adresu %{sender} do swójeje běłeje lisćiny, dokulaž njamóžomy na wobkÅ¡uśeńske napÅ¡aÅ¡owanja wótegroniś. failure: Wuzywaŕ %{name} njejo se namakał. @@ -2083,7 +2080,6 @@ dsb: standard: Standard cycle_map: Kórta za kolesowarjow transport_map: Wobchadowa kórta - mapquest: MapQuest Open hot: Sobustatkowace humanitarneje pomocy layers: header: Kórtowe rowniny diff --git a/config/locales/el.yml b/config/locales/el.yml index 6afb3f2c5..b7b89dcc8 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -12,52 +12,58 @@ # Author: Kiriakos # Author: Kongr43gpen # Author: Logictheo +# Author: Macofe # Author: Omnipaedista # Author: Protnet # Author: Ruila # Author: Shirayuki +# Author: SkarmoutsosV +# Author: Stam.nikos +# Author: SucreRouge # Author: Zserdx # Author: 아라 --- el: + html: + dir: ltr time: formats: friendly: '%e %B %Y στις %H:%M' activerecord: models: - acl: Πρόσβαση στη Λίστα Ελέγχου - changeset: Ομάδα Αλλαγών - changeset_tag: Χαρακτηριστικό Ομάδας Αλλαγών + acl: Λίστα ελέγχου πρόσβασης + changeset: Ομάδα αλλαγών + changeset_tag: Ετικέτα ομάδας αλλαγών country: Χώρα - diary_comment: Σχόλιο Ημερολογίου - diary_entry: Καταχώρηση Ημερολογίου + diary_comment: Σχόλιο ημερολογίου + diary_entry: Καταχώριση ημερολογίου friend: Φίλος language: Γλώσσα message: Μήνυμα node: Κόμβος - node_tag: Χαρακτηριστικό Κόμβου + node_tag: Ετικέτα κόμβου notifier: Ειδοποιητής - old_node: Παλιός Κόμβος - old_node_tag: Παλιά Χαρακτηριστικό Κόμβου - old_relation: Παλιά Σχέση - old_relation_member: Παλιό Μέλος της Σχέσης - old_relation_tag: Παλιό Χαρακτηριστικό Σχέσης - old_way: Παλιά Διαδρομή - old_way_node: Κόμβος Παλιάς Διαδρομής - old_way_tag: Χαρακτηριστικό Παλιάς Διαδρομής + old_node: Παλιός κόμβος + old_node_tag: Παλιά ετικέτα κόμβου + old_relation: Παλιά σχέση + old_relation_member: Παλιό μέλος της σχέσης + old_relation_tag: Παλιά ετικέτα της σχέσης + old_way: Παλιά διαδρομή + old_way_node: Κόμβος παλιάς διαδρομής + old_way_tag: Ετικέτα παλιάς διαδρομής relation: Σχέση - relation_member: Μέλος της Σχέσης - relation_tag: Χαρακτηριστικό Σχέσης + relation_member: Μέλος της σχέσης + relation_tag: Ετικέτα της σχέσης session: Συνεδρία trace: Ίχνος - tracepoint: Σημείο Ίχνους - tracetag: Χαρακτηριστικό Ίχνους + tracepoint: Σημείο ίχνους + tracetag: Ετικέτα ίχνους user: Χρήστης - user_preference: Προτιμήσεις Χρήστη - user_token: Διακριτικό Χρήστη + user_preference: Προτιμήσεις χρήστη + user_token: Διακριτικό χρήστη way: Διαδρομή - way_node: Κόμβος Διαδρομής - way_tag: Χαρακτηριστικό Διαδρομής + way_node: Κόμβος διαδρομής + way_tag: Ετικέτα διαδρομής attributes: diary_comment: body: Σώμα @@ -85,9 +91,9 @@ el: body: Σώμα recipient: Παραλήπτης user: - email: Διεύθυνση Ηλ. Ταχυδρομείου + email: Διεύθυνση ηλ. ταχυδρομείου active: Ενεργό - display_name: Εμφανιζόμενο Όνομα + display_name: Εμφανιζόμενο όνομα description: Περιγραφή languages: Γλώσσες pass_crypt: Κωδικός @@ -106,28 +112,28 @@ el: description: Potlatch 2 (επεξεργαστής εντός του περιηγητή) remote: name: Εξωτερικό πρόγραμμα - description: εξωτερικό πρόγραμμα (JOSM ή Merkaartor) + description: Εξωτερικό πρόγραμμα (JOSM ή Merkaartor) browse: created: Δημιουργήθηκε closed: Έκλεισε created_html: Δημιουργήθηκε <abbr title='%{title}'>πριν από %{time}</abbr> closed_html: Κλείστηκε <abbr title='%{title}'>πριν από %{time}</abbr> created_by_html: Δημιουργήθηκε <abbr title='%{title}'>πριν από %{time}</abbr> - από χρήστη %{user} - deleted_by_html: Διεγράφη <abbr title='%{title}'>πριν από %{time}</abbr> από χρήστη - %{user} - edited_by_html: Επεξεργάστηκε <abbr title='%{title}'>πριν από %{time}</abbr> από + από τον χρήστη %{user} + deleted_by_html: Διεγράφη <abbr title='%{title}'>πριν από %{time}</abbr> από τον + χρήστη %{user} + edited_by_html: Άλλαξε <abbr title='%{title}'>πριν από %{time}</abbr> από τον + χρήστη %{user} + closed_by_html: Κλείστηκε <abbr title='%{title}'>πριν από %{time}</abbr> από τον χρήστη %{user} - closed_by_html: Κλείστηκε <abbr title='%{title}'>πριν από %{time}</abbr> από χρήστη - %{user} version: Έκδοση in_changeset: Ομάδα αλλαγών anonymous: ανώνυμος no_comment: (χωρίς σχόλιο) part_of: Μέρος του download_xml: Λήψη XML - view_history: Προβολή Ιστορικού - view_details: Προβολή Λεπτομερειών + view_history: Προβολή ιστορικού + view_details: Προβολή λεπτομερειών location: 'Τοποθεσία:' changeset: title: 'Ομάδα αλλαγών: %{id}' @@ -139,8 +145,10 @@ el: relation: Σχέσεις (%{count}) relation_paginated: Σχέσεις (%{x}-%{y} από %{count}) comment: Σχόλια (%{count}) - commented_by: Σχόλιο από χρήστη %{user} <abbr title='%{exact_time}'>πριν από - %{when}</abbr> + hidden_commented_by: Κρυμμένο σχόλιο του %{user} <abbr title='%{exact_time}'>%{when} + πριν</abbr> + commented_by: Σχόλιο από τον χρήστη %{user} <abbr title='%{exact_time}'>πριν + από %{when}</abbr> changesetxml: Ομάδας αλλαγών XML osmchangexml: osmChange XML feed: @@ -150,17 +158,17 @@ el: discussion: Συζήτηση node: title: 'Κόμβος: %{name}' - history_title: 'Ιστορικό Κόμβου: %{name}' + history_title: 'Ιστορικό κόμβου: %{name}' way: title: 'Διαδρομή: %{name}' - history_title: 'Ιστορικό Διαδρομής: %{name}' + history_title: 'Ιστορικό διαδρομής: %{name}' nodes: Κόμβοι also_part_of: one: τμήμα της διαδρομής %{related_ways} other: τμήμα των διαδρομών %{related_ways} relation: title: 'Σχέση: %{name}' - history_title: 'Ιστορικό Σχέσης: %{name}' + history_title: 'Ιστορικό σχέσης: %{name}' members: Μέλη relation_member: entry: '%{type} %{name}' @@ -179,14 +187,16 @@ el: way: διαδρομή relation: σχέση changeset: ομάδα αλλαγών + note: σημείωση timeout: - sorry: Λυπάμαι, τα δεδομένα για το/τη %{type} με αναγνωριστικό %{id}, χρειάστηκε - πολύ χρόνο για να ανακτηθεί. + sorry: Λυπάμαι, τα δεδομένα για το %{type} με αναγνωριστικό %{id}, χρειάστηκαν + πολύ χρόνο για να ανακτηθούν. type: node: κόμβος way: διαδρομή relation: σχέση changeset: ομάδα αλλαγών + note: σημείωση redacted: redaction: Αναθεώρηση %{id} message_html: Η έκδοση %{version} του %{type} δε μπορεί να εμφανιστεί, δεδομένου @@ -196,22 +206,22 @@ el: way: διαδρομή relation: σχέση start_rjs: - feature_warning: Φορτώνουν %{num_features} χαρακτηριστικά. Αυτή η ενέργεια ενδέχεται - να προκαλέσει τον περιηγητή σας να γίνει αργός ή να μην αντιδρά. Σίγουρα θέλετε - να εμφανίσετε αυτά τα δεδομένα; - load_data: Φόρτωση Δεδομένων + feature_warning: Η φόρτωση %{num_features} χαρακτηριστικών ενδέχεται να καταστήσει + τον περιηγητή σας αργό ή να μην αντιδρά. Σίγουρα θέλετε να εμφανίσετε αυτά + τα δεδομένα; + load_data: Φόρτωση δεδομένων loading: Φόρτωση σε εξέλιξη... tag_details: - tags: Χαρακτηριστικά + tags: Ετικέτες wiki_link: - key: Η σελίδα περιγραφής για το χαρακτηριστικό %{key} - tag: Η σελίδα περιγραφής για το χαρακτηριστικό %{key}=%{value} + key: Η σελίδα περιγραφής για την ετικέτα %{key} + tag: Η σελίδα περιγραφής για την ετικέτα %{key}=%{value} wikidata_link: Το αντικείμενο %{page} στο Wikidata wikipedia_link: Το άρθρο %{page} στη Βικιπαίδεια telephone_link: Καλέστε %{phone_number} note: title: 'Σημείωση: %{id}' - new_note: Νέα Σημείωση + new_note: Νέα σημείωση description: Περιγραφή open_title: 'Ανοικτή σημείωση #%{note_name}' closed_title: 'Επιλυμένη σημείωση: #%{note_name}' @@ -233,9 +243,10 @@ el: hidden_by: Έγινε κρυφή από τον %{user} <abbr title='%{exact_time}'>πριν από %{when}</abbr> query: - title: Πληροφορίες Χαρακτηριστικών + title: Πληροφορίες χαρακτηριστικών introduction: Κάντε κλικ στον χάρτη για να βρείτε κοντινά χαρακτηριστικά. nearby: Κοντινά χαρακτηριστικά + enclosing: Περικλείει τα χαρακτηριστικά changeset: changeset_paging_nav: showing_page: Σελίδα %{page} @@ -267,26 +278,30 @@ el: sorry: Λυπάμαι, ο κατάλογος των ομάδων αλλαγών που ζήτησες χρειάστηκε πολύ χρόνο για να ανακτηθεί. rss: + title_all: OpenStreetMap συζήτηση ομάδας αλλαγών + title_particular: 'OpenStreetMap συζήτηση ομάδας αλλαγών #%{changeset_id}' + comment: 'Νέο σχόλιο σχετικά με την ομάδα αλλαγών #%{changeset_id} από τον %{author}' commented_at_html: Ενημερώθηκε %{when} πριν commented_at_by_html: Ενημερώθηκε %{when} πριν από τον %{user} full: Πλήρης συζήτηση diary_entry: new: - title: Νέα Καταχώρηση Ημερολογίου + title: Νέα καταχώρηση ημερολογίου + publish_button: Δημοσίευση list: title: Ημερολόγια χρηστών title_friends: Ημερολόγια φίλων - title_nearby: Ημερολόγια Κοντινών Χρηστών + title_nearby: Ημερολόγια κοντινών χρηστών user_title: ημερολόγιο του %{user} - in_language_title: Καταχωρήσεις Ημερολογίων στα %{language} - new: Νέα Καταχώρηση Ημερολογίου - new_title: Συνθέστε μια νέα καταχώρηση στο ημερολόγιο χρήστη σας + in_language_title: Καταχωρήσεις ημερολογίων στα %{language} + new: Νέα καταχώρηση ημερολογίου + new_title: Συντάξτε μια νέα καταχώρηση στο ημερολόγιο χρήστη σας no_entries: Δεν βρέθηκαν καταχωρήσεις στο ημερολόγιο recent_entries: Πρόσφατες καταχωρίσεις ημερολογίου - older_entries: Παλιότερες Καταχωρήσεις - newer_entries: Νεότερες Καταχωρήσεις + older_entries: Παλιότερες καταχωρήσεις + newer_entries: Νεότερες καταχωρήσεις edit: - title: Επεξεργασία καταχώρησης ημερολογίου + title: Επεξεργασία καταχώρισης ημερολογίου subject: 'Θέμα:' body: 'Κείμενο:' language: 'Γλώσσα:' @@ -308,7 +323,7 @@ el: heading: 'Καμία καταχώρηση με τη ταυτότητα: %{id}' body: Συγγνώμη, δεν υπάρχει καταχώρηση ημερολογίου ή σχόλιο με τη ταυτότητα %{id}. Είναι πιθανό να υπάρχουν ορθογραφικά λάθη ή να είναι λάθος ο σύνδεσμος - μέσο του οπίου φτάσατε σε αυτήν την σελίδα. + μέσω του οποίου φτάσατε σε αυτήν την σελίδα. diary_entry: posted_by: Γράφτηκε από το χρήστη %{link_user} στις %{created} στα %{language_link} comment_link: Σχολιάστε την καταχώρηση @@ -342,7 +357,7 @@ el: comments: has_commented_on: Ο %{display_name} έχει σχολιάσει στις ακόλουθες καταχωρήσεις στο ημερολόγιο - post: Καταχώρηση + post: Καταχώριση when: Πότε comment: Σχόλιο ago: πριν από %{ago} @@ -351,11 +366,11 @@ el: export: title: Εξαγωγή start: - area_to_export: Περιοχή προς Εξαγωγή + area_to_export: Περιοχή προς εξαγωγή manually_select: Χειροκίνητη επιλογή διαφορετικής περιοχής - format_to_export: Μορφή προς Εξαγωγή + format_to_export: Μορφή προς εξαγωγή osm_xml_data: Δεδομένα OpenStreetMap σε μορφή XML - map_image: Εικόνα Χάρτη (δείχνει τυπικό στρώμα) + map_image: Εικόνα χάρτη (δείχνει τυπικό στρώμα) embeddable_html: Ενσωματούμενη HTML licence: Άδεια export_details: Τα δεδομένα του OpenStreetMap είναι αδειοδοτημένα υπό την <a @@ -373,6 +388,8 @@ el: OpenStreetMap overpass: title: Overpass API + description: Λήψη αυτού του πλαισίου οριοθέτησης από ένα καθρέφτη της βάσης + δεδομένων του OpenStreetMap geofabrik: title: Λήψεις Geofabrik description: Τακτικά-ενημερωμένες εξαγωγές ηπείρων, χωρών και επιλεγμένων @@ -381,13 +398,13 @@ el: title: Εξαγωγές Metro description: Χάρτες για τις μεγάλες πόλεις του κόσμου και της γύρω περιοχές other: - title: Άλλες Πηγές + title: Άλλες πηγές description: Επιπλέον πηγές απαριθμούνται στο wiki του OpenStreetMap options: Επιλογές format: Μορφοποίηση scale: Κλίμακα max: μεγ - image_size: Μέγεθος Εικόνας + image_size: Μέγεθος εικόνας zoom: Εστίαση add_marker: Προσθέστε ένα δείκτη στο χάρτη latitude: 'Γεω. Πλ:' @@ -401,8 +418,8 @@ el: latlon: Αποτελέσματα από την <a href="http://openstreetmap.org/">εσωτερική</a> βάση δεδομένων us_postcode: Αποτελέσματα από <a href="http://geocoder.us/">Geocoder.us</a> - uk_postcode: Αποτέλεσμα από <a href="http://www.npemap.org.uk/">NPEMap / FreeThe - Postcode</a> + uk_postcode: Αποτελέσματα από <a href="http://www.npemap.org.uk/">NPEMap / + FreeThe Postcode</a> ca_postcode: Αποτελέσματα από <a href="http://geocoder.ca/">Geocoder.CA</a> osm_nominatim: Αποτελέσματα από το <a href="http://nominatim.openstreetmap.org/">OpenStreetMap Nominatim</a> @@ -414,63 +431,68 @@ el: prefix_format: '%{name}' prefix: aerialway: - chair_lift: τελεφερίκ με καθίσματα + cable_car: Τελεφερίκ + chair_lift: Αναβατήρας με κάθισμα + drag_lift: Συρόμενος αναβατήρας + gondola: Τελεφερίκ-Γόνδολα + station: Σταθμός εναέριου δρόμου aeroway: aerodrome: Αεροδρόμιο - apron: Χώρος Ελιγμών + apron: Χώρος ελιγμών gate: Πύλη helipad: Ελικοδρόμιο runway: Διάδρομος taxiway: Τροχιόδρομος - terminal: Τερματικός Σταθμός + terminal: Τερματικός σταθμός amenity: - animal_shelter: Καταφύγιο Ζώων - arts_centre: Κέντρο Τεχνών + animal_shelter: Καταφύγιο ζώων + arts_centre: Κέντρο τεχνών atm: ΑΤΜ bank: Τράπεζα bar: Μπαρ bbq: Ψησταριά bench: Πάγκος - bicycle_parking: Στάθμευση Ποδηλάτων - bicycle_rental: Ενοικίαση Ποδηλάτων - biergarten: Υπαίθρια Μπυραρία - boat_rental: Ενοικίαση Σκαφών - brothel: Οίκος Ανοχής - bureau_de_change: Ανταλλακτήριο Συναλλάγματος - bus_station: Σταθμός Λεωφορείου + bicycle_parking: Στάθμευση ποδηλάτων + bicycle_rental: Ενοικίαση ποδηλάτων + biergarten: Υπαίθρια μπυραρία + boat_rental: Ενοικίαση σκαφών + brothel: Οίκος ανοχής + bureau_de_change: Ανταλλακτήριο συναλλάγματος + bus_station: Σταθμός λεωφορείου cafe: Καφετέρια - car_rental: Ενοικίαση Αυτοκινήτου - car_sharing: Κοινή Χρήση Αυτοκινήτων - car_wash: Πλύσιμο Αυτοκινήτων + car_rental: Ενοικίαση αυτοκινήτων + car_sharing: Συνεπιβατισμός + car_wash: Πλυντήριο αυτοκινήτων casino: Καζίνο charging_station: Σταθμός Φόρτισης + childcare: Φροντίδα παιδιών cinema: Κινηματογράφος clinic: Κλινική clock: Ρολόι college: Κολέγιο - community_centre: Κοινοτικό Κέντρο + community_centre: Κοινοτικό κέντρο courthouse: Δικαστήριο crematorium: Κρεματόριο dentist: Οδοντίατρος doctors: Ιατροί dormitory: Κοιτώνας - drinking_water: Πόσιμο Νερό - driving_school: Σχολή Οδηγών + drinking_water: Πόσιμο νερό + driving_school: Σχολή οδηγών embassy: Πρεσβεία - emergency_phone: Τηλέφωνο Έκτακτης Ανάγκης + emergency_phone: Τηλέφωνο έκτακτης ανάγκης fast_food: Ταχυφαγείο - ferry_terminal: Σταθμός Πορθμείων - fire_hydrant: Κρουνός Πυροσβεστικής - fire_station: Πυροσβεστικός Σταθμός - food_court: Προαύλιο Φαγητού + ferry_terminal: Σταθμός πορθμείων + fire_hydrant: Κρουνός πυροσβεστικής + fire_station: Πυροσβεστικός σταθμός + food_court: Προαύλιο φαγητού fountain: Συντριβάνι fuel: Καύσιμα gambling: Τυχερά παιχνίδια grave_yard: Νεκροταφείο gym: Γυμναστήριο - health_centre: Κέντρο Υγείας + health_centre: Κέντρο υγείας hospital: Νοσοκομείο - hunting_stand: Κυνηγητικό Κιόσκι + hunting_stand: Κυνηγητικό κιόσκι ice_cream: Παγωτό kindergarten: Νηπιαγωγείο library: Βιβλιοθήκη @@ -478,23 +500,23 @@ el: marketplace: Αγορά monastery: Μοναστήρι motorcycle_parking: Χώρος στάθμευσης μοτοσικλετών - nightclub: Νυχτερινό Κέντρο - nursery: Παιδικός Σταθμός - nursing_home: Οίκος Ευγηρίας + nightclub: Νυχτερινό κέντρο + nursery: Παιδικός σταθμός + nursing_home: Οίκος ευγηρίας office: Γραφείο - parking: Χώρος Στάθμευσης - parking_entrance: Είσοδος Για Το Χώρο Στάθμευσης + parking: Χώρος στάθμευσης + parking_entrance: Είσοδος χώρου στάθμευσης pharmacy: Φαρμακείο - place_of_worship: Τόπος Λατρείας + place_of_worship: Τόπος λατρείας police: Αστυνομία - post_box: Ταχυδρομική Θυρίδα + post_box: Ταχυδρομική θυρίδα post_office: Ταχυδρομείο - preschool: Προσχολική Εκπαίδευση + preschool: Προσχολική εκπαίδευση prison: Φυλακή pub: Παμπ - public_building: Δημόσιο Κτίριο - reception_area: Χώρος Υποδοχής - recycling: Σημείο Ανακύκλωσης + public_building: Δημόσιο κτίριο + reception_area: Χώρος υποδοχής + recycling: Σημείο ανακύκλωσης restaurant: Εστιατόριο retirement_home: Γηροκομείο sauna: Σάουνα @@ -502,28 +524,28 @@ el: shelter: Καταφύγιο shop: Κατάστημα shower: Ντους - social_centre: Κοινωνικό Κέντρο - social_club: Κοινωνική Λέσχη - social_facility: Κοινωνική Εγκατάσταση + social_centre: Κοινωνικό κέντρο + social_club: Κοινωνική λέσχη + social_facility: Κοινωνική εγκατάσταση studio: Στούντιο swimming_pool: Πισίνα taxi: Ταξί - telephone: Δημόσιο Τηλέφωνο + telephone: Δημόσιο τηλέφωνο theatre: Θέατρο toilets: Τουαλέτες townhall: Δημαρχείο university: Πανεπιστήμιο vending_machine: Μηχάνημα Αυτόματης Πώλησης veterinary: Κτηνιατρική Χειρουργική - village_hall: Αίθουσα Χωριού - waste_basket: Καλάθι Απορριμμάτων - waste_disposal: Διάθεση Αποβλήτων - youth_centre: Κέντρο Νεολαίας + village_hall: Αίθουσα χωριού + waste_basket: Καλάθι απορριμμάτων + waste_disposal: Διάθεση αποβλήτων + youth_centre: Κέντρο νεολαίας boundary: - administrative: Διοικητικό Όριο - census: Όριο Απογραφής - national_park: Εθνικό Πάρκο - protected_area: Προστατευόμενη Περιοχή + administrative: Διοικητικό όριο + census: Όριο απογραφής + national_park: Εθνικό πάρκο + protected_area: Προστατευόμενη περιοχή bridge: aqueduct: Υδραγωγείο suspension: Κρεμαστή Γέφυρα @@ -542,144 +564,161 @@ el: plumber: Υδραυλικός shoemaker: Τσαγκάρης tailor: Ράφτης + "yes": Κατάστημα τεχνών emergency: + ambulance_station: Σταθμός ασθενοφόρων defibrillator: Απινιδωτής - phone: Τηλέφωνο Έκτακτης Ανάγκης + landing_site: Τοποθεσία έκτακτης προσγείωσης + phone: Τηλέφωνο έκτακτης ανάγκης highway: + abandoned: Εγκαταλελειμμένος αυτοκινητόδρομος bridleway: Μονοπάτι για άλογα - bus_guideway: Καθορισμένη Λωρίδα Λεωφορείου - bus_stop: Στάση Λεωφορείου - construction: Δρόμος υπό Κατασκευή + bus_guideway: Καθορισμένη λωρίδα λεωφορείου + bus_stop: Στάση λεωφορείου + construction: Δρόμος υπό κατασκευή cycleway: Ποδηλατόδρομος elevator: Ανελκυστήρας - emergency_access_point: Σημείο Πρόσβασης Έκτακτης Ανάγκης + emergency_access_point: Σημείο πρόσβασης έκτακτης ανάγκης footway: Μονοπάτι ford: Κοιτόστρωση - living_street: Μεικτός Δρόμος + living_street: Μεικτός δρόμος milestone: Ορόσημο motorway: Αυτοκινητόδρομος - motorway_junction: Διασταύρωση Αυτοκινητόδρομου + motorway_junction: Διασταύρωση αυτοκινητόδρομου motorway_link: Αυτοκινητόδρομος path: Διαδρομή pedestrian: Πεζόδρομος platform: Πλατφόρμα - primary: Κύρια Οδός - primary_link: Κύρια Οδός - proposed: Προτεινόμενος Δρόμος + primary: Κύρια οδός + primary_link: Κύρια οδός + proposed: Προτεινόμενος δρόμος raceway: Αυτοκινητοδρόμιο residential: Δρόμος σε κατοικημένη περιοχή - rest_area: Περιοχή Ανάπαυσης + rest_area: Περιοχή ανάπαυσης road: Δρόμος - secondary: Δευτερεύουσα Οδός - secondary_link: Δευτερεύουσα Οδός - service: Δρόμος Εξυπηρέτησης - services: Υπηρεσίες Αυτοκινητοδρόμου - speed_camera: Κάμερα Ταχύτητας + secondary: Δευτερεύουσα οδός + secondary_link: Δευτερεύουσα οδός + service: Δρόμος εξυπηρέτησης + services: Υπηρεσίες αυτοκινητοδρόμου + speed_camera: Κάμερα ταχύτητας steps: Σκαλοπάτια - street_lamp: Λάμπα του Δρόμου - tertiary: Τριτεύων Δρόμος - tertiary_link: Τριτεύων Δρόμος + street_lamp: Λάμπα δρόμου + tertiary: Τριτεύων δρόμος + tertiary_link: Τριτεύων δρόμος track: Χωματόδρομος - traffic_signals: Σήματα Κυκλοφορίας + traffic_signals: Σήματα κυκλοφορίας trail: Μονοπάτι - trunk: Εθνική Οδός - trunk_link: Εθνική Οδός - unclassified: Αταξινόμητη Οδός - unsurfaced: Δρόμος χωρίς Επίστρωση + trunk: Εθνική οδός + trunk_link: Εθνική οδός + unclassified: Αταξινόμητη οδός + unsurfaced: Δρόμος χωρίς επίστρωση "yes": Δρόμος historic: - archaeological_site: Αρχαιολογικός Χώρος - battlefield: Πεδίο Μάχης - boundary_stone: Συνοριακή Στήλη - building: Ιστορικό Κτίριο + archaeological_site: Αρχαιολογικός χώρος + battlefield: Πεδίο μάχης + boundary_stone: Συνοριακή στήλη + building: Ιστορικό κτίριο + bunker: Οχυρό castle: Κάστρο church: Εκκλησία - citywalls: Τείχη της Πόλης + city_gate: Είσοδος της πόλης + citywalls: Τείχη της πόλης fort: Οχυρό + heritage: Μνημείο πολιτιστικής κληρονομιάς house: Σπίτι icon: Εικονίδιο manor: Έπαυλη memorial: Μνημείο mine: Ορυχείο monument: Μνημείο - roman_road: Ρωμαϊκός Δρόμος + roman_road: Ρωμαϊκός δρόμος ruins: Ερείπιο stone: Πέτρα tomb: Τάφος tower: Πύργος - wayside_shrine: Εικονοστάσιο + wayside_cross: Σταυρός στην άκρη του δρόμου + wayside_shrine: Εικονοστάσιο στην άκρη του δρόμου wreck: Ναυάγιο + junction: + "yes": Διασταύρωση landuse: allotments: Λαχανόκηποι basin: Λεκανοπέδιο - brownfield: Πρώην Βιομηχανική Περιοχή + brownfield: Πρώην βιομηχανική περιοχή cemetery: Κοιμητήριο - commercial: Εμπορική Περιοχή + commercial: Εμπορική περιοχή conservation: Διατήρηση construction: Κατασκευές farm: Αγρόκτημα - farmland: Γεωργική Γη + farmland: Γεωργική γη farmyard: Αγρόκτημα forest: Δάσος - garages: Κλειστοί Χώροι Στάθμευσης + garages: Κλειστοί χώροι στάθμευσης grass: Γρασίδι - greenfield: Παρθένα Περιοχή - industrial: Βιομηχανική Περιοχή + greenfield: Παρθένα περιοχή + industrial: Βιομηχανική περιοχή landfill: Χωματερή meadow: Λιβάδι - military: Στρατιωτική Περιοχή + military: Στρατιωτική περιοχή mine: Ορυχείο orchard: Περιβόλι quarry: Λατομείο railway: Σιδηρόδρομος - recreation_ground: Χώρος Αναψυχής + recreation_ground: Χώρος αναψυχής reservoir: Ταμιευτήρας - reservoir_watershed: Δεξαμενή Απορροής Υδάτων - residential: Κατοικημένη Περιοχή - retail: Κατάστημα Λιανικής - road: Περιοχή Δρόμων - village_green: Πράσινο Χωριό - vineyard: Αμπέλι + reservoir_watershed: Δεξαμενή απορροής υδάτων + residential: Κατοικημένη περιοχή + retail: Κατάστημα λιανικής + road: Περιοχή δρόμων + village_green: Πράσινο χωριό + vineyard: Αμπελώνας + "yes": Χρήση γης leisure: - beach_resort: Παραθαλάσσιο Θέρετρο - bird_hide: Καταφύγιο Πουλιών - common: Κοινόχρηστη Γη - fishing: Αλιευτική Περιοχή + beach_resort: Παραθαλάσσιο θέρετρο + bird_hide: Καταφύγιο πουλιών + club: Κλαμπ + common: Κοινόχρηστη γη + dog_park: Πάρκο σκύλων + fishing: Αλιευτική περιοχή + fitness_centre: Κέντρο αδυνατίσματος fitness_station: Γυμναστήριο garden: Κήπος - golf_course: Γήπεδο Γκολφ + golf_course: Γήπεδο γκολφ horse_riding: Ιππασία ice_rink: Παγοδρόμιο marina: Μαρίνα - miniature_golf: Μίνι Γκολφ - nature_reserve: Φυσικό Καταφύγιο + miniature_golf: Μίνι γκολφ + nature_reserve: Καταφύγιο της φύσης park: Πάρκο - pitch: Γήπεδο Αθλητισμού - playground: Παιδική Χαρά - recreation_ground: Χώρος Αναψυχής + pitch: Γήπεδο αθλητισμού + playground: Παιδική χαρά + recreation_ground: Χώρος αναψυχής + resort: Θέρετρο sauna: Σάουνα slipway: Γλίστρα - sports_centre: Αθλητικό Κέντρο + sports_centre: Αθλητικό κέντρο stadium: Στάδιο swimming_pool: Πισίνα track: Στίβος - water_park: Υδάτινο Πάρκο + water_park: Υδάτινο πάρκο "yes": Ψυχαγωγία man_made: lighthouse: Φάρος + pipeline: Αγωγός tower: Πύργος works: Εργοστάσιο + "yes": Τεχνητό military: - airfield: Στρατιωτικό Αεροδρόμιο + airfield: Στρατιωτικό αεροδρόμιο barracks: Στρατώνας bunker: Οχυρό mountain_pass: - "yes": Ορεινό Πέρασμα + "yes": Ορεινό πέρασμα natural: bay: Κόλπος beach: Παραλία cape: Ακρωτήριο - cave_entrance: Είσοδος Σπηλιάς + cave_entrance: Είσοδος σπηλιάς cliff: Γκρεμός crater: Κρατήρας dune: Αμμόλοφος @@ -689,7 +728,7 @@ el: geyser: Θερμοπίδακας glacier: Παγετώνας grassland: Λιβάδι - heath: Ρείκι + heath: Ακαλλιέργητη γη hill: Λόφος island: Νησί land: Ξηρά @@ -701,7 +740,9 @@ el: reef: Ύφαλος ridge: Σκόπελος rock: Βράχος + saddle: Σέλα sand: Άμμος + scree: Σάρα scrub: Θαμνότοπος spring: Πηγή stone: Πέτρα @@ -717,16 +758,18 @@ el: administrative: Διαχείριση architect: Αρχιτέκτονας company: Εταιρεία - employment_agency: Οργανισμός Απασχόλησης - estate_agent: Κτηματομεσιτικό Γραφείο - government: Κυβερνητικό Γραφείο - insurance: Ασφαλιστικό Γραφείο + employment_agency: Οργανισμός απασχόλησης + estate_agent: Κτηματομεσιτικό γραφείο + government: Κυβερνητικό γραφείο + insurance: Ασφαλιστικό γραφείο lawyer: Δικηγόρος ngo: Γραφείο ΜΚΟ - telecommunication: Γραφείο Τηλεπικοινωνιών - travel_agent: Ταξιδιωτικό Πρακτορείο + telecommunication: Γραφείο τηλεπικοινωνιών + travel_agent: Ταξιδιωτικό πρακτορείο "yes": Γραφείο place: + allotments: Λαχανόκηποι + block: Φραγή airport: Αεροδρόμιο city: Πόλη country: Χώρα @@ -737,152 +780,156 @@ el: houses: Σπίτια island: Νησί islet: Νησίδα - isolated_dwelling: Απομονωμένη Οικία + isolated_dwelling: Απομονωμένη κατοικία locality: Τοποθεσία moor: Δέστρα municipality: Δήμος neighbourhood: Γειτονιά - postcode: Ταχυδρομικός Κώδικας + postcode: Ταχυδρομικός κώδικας region: Περιοχή sea: Θάλασσα state: Πολιτεία subdivision: Υποδιαίρεση suburb: Προάστιο town: Κωμόπολη - unincorporated_area: Μη-ενσωματωμένη Περιοχή + unincorporated_area: Μη-ενσωματωμένη περιοχή village: Χωριό + "yes": Μέρος railway: - abandoned: Εγκαταλελειμμένος Σιδηρόδρομος - construction: Σιδηρόδρομος υπό Κατασκευή - disused: Σιδηρόδρομος Εκτός Χρήσης - disused_station: Σιδηροδρομικός Σταθμός Εκτός Χρήσης - funicular: Τελεφερίκ - halt: Σταθμός Τραίνου - historic_station: Ιστορικός Σιδηροδρομικός Σταθμός - junction: Σιδηροδρομικός Κόμβος - level_crossing: Ισόπεδη Διάβαση - light_rail: Ελαφρύ Τρένο - miniature: Μινιατούρα Σιδηρόδρομος + abandoned: Εγκαταλελειμμένος σιδηρόδρομος + construction: Σιδηρόδρομος υπό κατασκευή + disused: Σιδηρόδρομος εκτός χρήσης + disused_station: Σιδηροδρομικός σταθμός εκτός χρήσης + funicular: Τελεφερίκ σε ράγες + halt: Σταθμός τραίνου + historic_station: Ιστορικός σιδηροδρομικός σταθμός + junction: Σιδηροδρομικός κόμβος + level_crossing: Ισόπεδη διάβαση + light_rail: Ελαφρύ τρένο + miniature: Σιδηρόδρομος μινιατούρα monorail: Μονοτρόχιος σιδηρόδρομος - narrow_gauge: Σιδηρόδρομος Στενής Τροχιάς - platform: Πλατφόρμα Σιδηροδρόμου - preserved: Διατηρητέος Σιδηρόδρομος - proposed: Προτεινόμενος Σιδηρόδρομος - station: Σιδηροδρομικός Σταθμός - stop: Σιδηροδρομική Στάση - subway: Σταθμός Μετρό - subway_entrance: Είσοδος στο Μετρό - switch: Σιδηροδρομικά Σημεία - tram: Τραμ - tram_stop: Στάση Τραμ + narrow_gauge: Σιδηρόδρομος στενής τροχιάς + platform: Πλατφόρμα σιδηροδρόμου + preserved: Διατηρητέος σιδηρόδρομος + proposed: Προτεινόμενος σιδηρόδρομος + spur: Παρακλάδι σιδηροδρόμου + station: Σιδηροδρομικός σταθμός + stop: Σιδηροδρομική στάση + subway: Mετρό + subway_entrance: Είσοδος μετρό + switch: Σιδηροδρομικά σημεία + tram: Γραμμή τραμ + tram_stop: Στάση τραμ shop: alcohol: Ψιλικατζίδικο antiques: Αντίκες - art: Κατάστημα Τέχνης + art: Κατάστημα τέχνης bakery: Φούρνος - beauty: Σαλόνι Ομορφιάς - beverages: Κατάστημα Ποτών - bicycle: Κατάστημα Ποδηλάτων + beauty: Σαλόνι ομορφιάς + beverages: Κατάστημα ποτών + bicycle: Κατάστημα ποδηλάτων books: Βιβλιοπωλείο boutique: Μπουτίκ butcher: Κρεοπωλείο - car: Κατάστημα Αυτοκινήτων - car_parts: Εξαρτήματα Αυτοκινήτου - car_repair: Επισκευή Αυτοκινήτων - carpet: Κατάστημα Χαλιών - charity: Φιλανθρωπικό Κατάστημα + car: Κατάστημα αυτοκινήτων + car_parts: Εξαρτήματα αυτοκινήτων + car_repair: Επισκευή αυτοκινήτων + carpet: Κατάστημα χαλιών + charity: Φιλανθρωπικό κατάστημα chemist: Φαρμακοποιός - clothes: Κατάστημα Ρούχων - computer: Κατάστημα Υπολογιστών + clothes: Κατάστημα ρούχων + computer: Κατάστημα υπολογιστών confectionery: Ζαχαροπλαστική convenience: Παντοπωλείο - copyshop: Κατάστημα Φωτοαντιγράφων - cosmetics: Κατάστημα Καλλυντικών + copyshop: Κατάστημα φωτοαντιγράφων + cosmetics: Κατάστημα καλλυντικών deli: Ντελικατέσεν department_store: Πολυκατάστημα - discount: Εκπτωτικό Κατάστημα + discount: Εκπτωτικό κατάστημα doityourself: Ιδιοκατασκευές - dry_cleaning: Στεγνό Καθάρισμα - electronics: Κατάστημα Ηλεκτρονικών + dry_cleaning: Στεγνό καθάρισμα + electronics: Κατάστημα ηλεκτρονικών estate_agent: Κτηματομεσίτης farm: Γεωργικά εφόδια - fashion: Κατάστημα Μόδας + fashion: Κατάστημα μόδας fish: Ιχθυοπωλείο florist: Ανθοπώλης - food: Κατάστημα Τροφίμων - funeral_directors: Γραφείο Τελετών + food: Κατάστημα τροφίμων + funeral_directors: Γραφείο κηδειών furniture: Έπιπλα gallery: Γκαλερί - garden_centre: Κέντρο Κήπου + garden_centre: Κέντρο κήπου general: Παντοπωλείο - gift: Κατάστημα Δώρων + gift: Κατάστημα δώρων greengrocer: Μανάβης grocery: Οπωροπωλείο hairdresser: Κομμωτήριο - hardware: Κατάστημα Σιδηρικών + hardware: Κατάστημα με χρώματα-σιδηρικά hifi: Hi-Fi insurance: Ασφαλιστική jewelry: Κοσμηματοπωλείο kiosk: Περίπτερο laundry: Πλυντήριο - mall: Εμπορικό Κέντρο + mall: Εμπορικό κέντρο market: Αγορά - mobile_phone: Κατάστημα Κινητής Τηλεφωνίας - motorcycle: Κατάστημα Μοτοσικλετών - music: Κατάστημα Μουσικής - newsagent: Πρακτορείο Εφημερίδων + mobile_phone: Κατάστημα κινητής τηλεφωνίας + motorcycle: Κατάστημα μοτοσικλετών + music: Κατάστημα μουσικής + newsagent: Πρακτορείο εφημερίδων optician: Οπτικός - organic: Κατάστημα Οργανικών Τροφίμων - outdoor: Υπαίθριο Κατάστημα - pet: Κατάστημα Κατοικίδιων + organic: Κατάστημα οργανικών τροφίμων + outdoor: Υπαίθριο κατάστημα + pet: Κατάστημα κατοικίδιων pharmacy: Φαρμακείο photo: Φωτογραφείο salon: Σαλόνι - second_hand: Παλαιοπωλείο - shoes: Κατάστημα Υποδημάτων - shopping_centre: Εμπορικό Κέντρο - sports: Κατάστημα Αθλητικών - stationery: Κατάστημα Γραφικής Ύλης + second_hand: Κατάστημα μεταχειρισμένων + shoes: Κατάστημα υποδημάτων + shopping_centre: Εμπορικό κέντρο + sports: Κατάστημα αθλητικών + stationery: Κατάστημα χαρτικών/ειδών γραφείου supermarket: Σουπερμάρκετ tailor: Ράφτης - toys: Κατάστημα Παιγνιδιών - travel_agency: Ταξιδιωτικό Πρακτορείο - video: Βίντεο Κατάστημα + toys: Κατάστημα παιχνιδιών + travel_agency: Ταξιδιωτικό πρακτορείο + video: Κατάστημα βίντεο wine: Ψιλικατζίδικο "yes": Κατάστημα tourism: - alpine_hut: Αλπικό Καταφύγιο - artwork: Έργο Τέχνης + alpine_hut: Αλπικό καταφύγιο + apartment: Διαμέρισμα + artwork: Έργο τέχνης attraction: Αξιοθέατο - bed_and_breakfast: Ενοικιαζόμενα Δωμάτια + bed_and_breakfast: Ενοικιαζόμενα δωμάτια cabin: Καμπίνα - camp_site: Χώρος Κατασκήνωσης - caravan_site: Χώρος Τροχόσπιτων + camp_site: Χώρος κατασκήνωσης + caravan_site: Χώρος τροχόσπιτων chalet: Σαλέ + gallery: Γκαλερί guest_house: Ξενώνας hostel: Ξενώνας hotel: Ξενοδοχείο information: Πληροφορίες motel: Μοτέλ museum: Μουσείο - picnic_site: Τοποθεσία για Πικ-Νικ - theme_park: Πάρκο Ψυχαγωγίας - viewpoint: Έποψη - zoo: Ζωολογικός Κήπος + picnic_site: Τοποθεσία αναψυχής-φαγητού + theme_park: Πάρκο ψυχαγωγίας + viewpoint: Σημείο θέας + zoo: Ζωολογικός κήπος tunnel: culvert: Οχετός "yes": Σήραγγα waterway: - artificial: Τεχνητή Yδατοδιαδρομή + artificial: Τεχνητή υδατοδιαδρομή boatyard: Ναυπηγείο canal: Κανάλι dam: Φράγμα - derelict_canal: Εγκαταλελειμμένο Κανάλι + derelict_canal: Εγκαταλελειμμένο κανάλι ditch: Χαντάκι dock: Αποβάθρα drain: Υπόνομος lock: Κλειδαριά - lock_gate: Κλειδαριά Πύλης + lock_gate: Πύλη κλειδαριάς mooring: Αγκυροβόλι rapids: Χείμαρροι river: Ποτάμι @@ -890,14 +937,15 @@ el: wadi: Wadi waterfall: Καταρράκτης weir: Υδατοφράκτης + "yes": Κανάλι admin_levels: - level2: Σύνορο Χώρας - level4: Σύνορο Πολιτείας - level5: Σύνορο Περιοχής - level6: Σύνορο Κομητείας - level8: Σύνορο Πόλης - level9: Σύνορο Χωριού - level10: Σύνορο Προαστίου + level2: Σύνορο χώρας + level4: Σύνορο πολιτείας + level5: Σύνορο περιοχής + level6: Σύνορο κομητείας + level8: Σύνορο πόλης + level9: Σύνορο χωριού + level10: Σύνορο προαστίου description: title: osm_nominatim: Τοποθεσία από το <a href="http://nominatim.openstreetmap.org/">OpenStreetMap @@ -911,26 +959,29 @@ el: no_results: Δεν βρέθηκε κανένα αποτέλεσμα more_results: Περισσότερα αποτελέσματα layouts: + project_name: + title: OpenStreetMap + h1: OpenStreetMap logo: alt_text: Λογότυπο OpenStreetMap - home: Μετάβαση στην Τοποθεσία Σπιτιού - logout: Έξοδος - log_in: Είσοδος - log_in_tooltip: Σύνδεση με έναν υπάρχοντα λογαριασμό + home: Μετάβαση στην αρχική τοποθεσία + logout: Αποσύνδεση + log_in: Σύνδεση + log_in_tooltip: Σύνδεση με υπάρχοντα λογαριασμό sign_up: Εγγραφή - start_mapping: Ξεκινήστε Τη Χαρτογράφηση + start_mapping: Ξεκινήστε την χαρτογράφηση sign_up_tooltip: Δημιουργήστε λογαριασμό για επεξεργασία edit: Επεξεργασία history: Ιστορικό export: Εξαγωγή data: Δεδομένα - export_data: Εξαγωγή Δεδομένων + export_data: Εξαγωγή δεδομένων gps_traces: Ίχνη GPS gps_traces_tooltip: Διαχείριση ιχνών GPS - user_diaries: Ημερολόγια Χρηστών + user_diaries: Ημερολόγια χρηστών user_diaries_tooltip: Προβολή ημερολογίων χρηστών edit_with: Επεξεργασία με %{editor} - tag_line: O Ελεύθερος Wiki Χάρτης του Κόσμου + tag_line: Ο ελεύθερος παγκόσμιος χάρτης Wiki intro_header: Καλώς ήρθατε στο OpenStreetMap! intro_text: Το OpenStreetMap είναι χάρτης του κόσμου, που δημιουργήθηκε από ανθρώπους σαν κι εσάς και είναι δωρεάν, υπό άδεια ελεύθερης χρήσης. @@ -941,23 +992,24 @@ el: partners_ic: Imperial College του Λονδίνου partners_bytemark: Bytemark Hosting partners_partners: συνεργάτες + partners_url: http://wiki.openstreetmap.org/wiki/Partners osm_offline: Η βάση δεδομένων του OpenStreetMap είναι προσωρινά εκτός λειτουργίας λόγω εργασιών συντήρησης της βάσης δεδομένων. osm_read_only: Η βάση δεδομένων του OpenStreetMap έχει τεθεί προσωρινά σε λειτουργία «μόνο για ανάγνωση» λόγω εργασιών συντήρησης στη βάση δεδομένων. - donate: Υποστηρίξτε το OpenStreetMap %{link} στον Έρανο Αναβάθμισης Υλικού. + donate: Υποστηρίξτε το OpenStreetMap %{link} στον έρανο αναβάθμισης υλικού. help: Βοήθεια about: Σχετικά - copyright: Πνευματικά Δικαιώματα + copyright: Πνευματικά δικαιώματα community: Κοινότητα - community_blogs: Ιστολόγια της Κοινότητας + community_blogs: Ιστολόγια της κοινότητας community_blogs_title: Blogs από τα μέλη της κοινότητας του OpenStreetMap foundation: Ίδρυμα foundation_title: Το Ίδρυμα OpenStreetMap make_a_donation: title: Υποστήριξε το OpenStreetMap με δωρεά χρημάτων text: Κάντε μια δωρεά - learn_more: Μάθετε Περισσότερα + learn_more: Μάθετε περισσότερα more: Περισσότερα license_page: foreign: @@ -973,19 +1025,19 @@ el: native_link: ελληνική έκδοση mapping_link: αρχίστε τη χαρτογράφηση legal_babble: - title_html: Πνευματικά Δικαιώματα και Άδεια Χρήσης - intro_1_html: Το OpenStreetMap είναι βάση <i>ανοικτών δεδομένων</i> αδειοδοτημένα - υπό την <a href="http://opendatacommons.org/licenses/odbl/">Open Data Commons - Open Database License</a> (ODbL). + title_html: Πνευματικά δικαιώματα και άδεια χρήσης + intro_1_html: |- + Το OpenStreetMap<sup><a href="#trademarks">®</a></sup> είναι βάση <i>ανοικτών δεδομένων</i> αδειοδοτημένα υπό την <a href="http://opendatacommons.org/licenses/odbl/">Open Data Commons Open Database License</a> (ODbL) από το <a + href="http://osmfoundation.org/">Ίδρυμα OpenStreetMap</a> (OSMF). intro_2_html: Είστε ελεύθεροι να αντιγράψετε, να διανείμετε, μεταδώσετε και - προσαρμόσετε τα δεδομένα μας εφόσον μνημονέψετε το OpenStreetMap και τους - συνεισφέροντές του. Εάν αλλοιώσετε ή αξιοποιήσετε τα δεδομένα μας, μπορείτε + προσαρμόσετε τα δεδομένα μας εφόσον κάνετε αναφορά στο OpenStreetMap και στους + συνεισφέροντές του. Εάν τροποποιήσετε ή αξιοποιήσετε τα δεδομένα μας, μπορείτε να διανείμετε το αποτέλεσμα μόνο σύμφωνα με την ίδια άδεια. Ο πλήρης <a href="http://opendatacommons.org/licenses/odbl/1.0/">νομικός κώδικας</a> εξηγεί τα δικαιώματα και τις υποχρεώσεις. intro_3_html: |- Η χαρτογράφηση στα πλακίδια χάρτη, και η τεκμηρίωση μας, είναι αδειοδοτημένες υπο την άδεια <a href="http://creativecommons.org/licenses/by-sa/2.0/">Creative Commons Attribution-ShareAlike 2.0</a> (CC-BY-SA). - credit_title_html: Πως να μνημονέψετε το OpenStreetMap + credit_title_html: Πως να κάνετε αναφορά στο OpenStreetMap credit_1_html: |- Απαιτείται να χρησιμοποιείτε την αναφορά στο “© Συνεισφέροντες του OpenStreetMap”. @@ -1001,14 +1053,14 @@ el: title: Παράδειγμα αναφοράς δημιουργού more_title_html: Μαθαίνοντας περισσότερα more_1_html: |- - Διαβάστε περισσότερα σχετικά με τη χρήση των δεδομένων μας, και πώς να μας μνημονεύσετε στην σελίδα περί <a - href="http://wiki.openstreetmap.org/wiki/Legal_FAQ">συχνές νομικές ερωτήσεις</a>. + Διαβάστε περισσότερα σχετικά με τη χρήση των δεδομένων μας, και πώς να μας μνημονεύσετε στην <a href="http://osmfoundation.org/Licence">σελίδα Άδειας OSMF</a> και τις <a + href="http://wiki.openstreetmap.org/wiki/Legal_FAQ">συχνές νομικές ερωτήσεις</a> της κοινότητας. more_2_html: |- Παρόλο που το OpenStreetMap αποτελείται από ανοικτά δεδομένα, δεν μπορούμε να προσφέρουμε ένα δωρεάν API χαρτών για τρίτους προγραμματιστές. - Δείτε τις πολιτικές χρήσης μας για <a href="http://wiki.openstreetmap.org/wiki/API_usage_policy">το API</a>, - <a href="http://wiki.openstreetmap.org/wiki/Tile_usage_policy">τα πλακίδια </a> - και για <a href="http://wiki.openstreetmap.org/wiki/Nominatim#Usage_Policy">το Nominatim</a>. + Δείτε τις πολιτικές χρήσης μας για <a href="https://operations.osmfoundation.org/policies/api">το API</a>, + <a href="https://operations.osmfoundation.org/policies/tiles">τα πλακίδια </a> + και για <a href="https://operations.osmfoundation.org/policies/nominatim">το Nominatim</a>. contributors_title_html: Οι συνεισφέροντές μας contributors_intro_html: 'Οι συνεισφέροντες μας είναι χιλιάδες άτομα. Επίσης έχουμε περιλάβει δεδομένα ανοικτής άδειας από εθνικές υπηρεσίες χαρτογράφησης @@ -1018,6 +1070,12 @@ el: <a href="http://data.wien.gv.at/">Stadt Wien</a> (υπό <a href="http://creativecommons.org/licenses/by/3.0/at/deed.de">CC BY</a>), <a href="http://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm">Land Vorarlberg</a> και Land Tirol (υπό <a href="http://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/">CC BY AT με τροποποιήσεις</a>). + contributors_ca_html: |- + <strong>Καναδάς</strong>: Περιέχει δεδομένα από τα + GeoBase®, GeoGratis (© Τμήμα Φυσικών + Πόρων Καναδά), CanVec (© Τμήμα Φυσικών + Πόρων Καναδά) και StatCan (Γεωγραφική Διαίρεση, + Στατιστική Υπηρεσία Καναδά). contributors_fi_html: "<strong>Φινλανδία</strong>: Περιέχει δεδομένα από το National Land Survey of Finland's Topographic Database\nκαι άλλα datasets, υπό την \n<a href=\"http://www.maanmittauslaitos.fi/en/NLS_open_data_licence_version1_20120501\">NLSFI @@ -1026,13 +1084,27 @@ el: από το Direction Générale des Impôts.' contributors_nl_html: '<strong>Ολλανδία</strong>: Περιέχει δεδομένα που προέρχονται από το AND © 2007 (<a href="http://www.and.com">www.and.com</a>)' + contributors_nz_html: '<strong>Νέα Ζηλανδία</strong>: Περιέχει δεδομένα που + πηγάζουν από την Υπηρεσία Πληροφοριών Γης Νέας Ζηλανδίας. Τα Πνευματικά Δικαιώματα + Crown είναι κατωχυρωμένα.' + contributors_si_html: |- + <strong>Σλοβενία</strong>: Περιέχει δεδομένα από την + <a href="http://www.gu.gov.si/en/">Αρχή Τοπογραφίας και Χαρτογράφησης</a> και το <a href="http://www.mkgp.gov.si/en/">Υπουργείο Γεωργίας, Δασών και Τροφίμων</a> + (δημόσιες πληροφορίες της Σλοβενίας). contributors_za_html: |- <strong>Νότια Αφρική</strong>: Περιεχέι δεδομένα που προέρχονται από το <a href="http://www.ngi.gov.za/">Chief Directorate: National Geo-Spatial Information</a>, Πνευματικό δικαίωμα χώρας κατοχυρωμένο. + contributors_gb_html: |- + <strong>Ηνωμένο Βασίλειο</strong>: Περιέχει δεδομένα + της Ordnance Survey © Crown πνευματικά δικαιώματα και δικαιώματα βάσης δεδομένων + 2010-12. contributors_footer_1_html: |- Για περισσότερες λεπτομέρειες σχετικά με αυτές, και άλλες πηγές που χρησιμοποιήθηκαν για να βελτιώσουν το OpenStreetMap, παρακαλούμε δείτε τη σελίδα <a href="http://wiki.openstreetmap.org/wiki/Contributors">Συνεισφέροντες</a> στο OpenStreetMap Wiki. + contributors_footer_2_html: Η συμπερίληψη δεδομένων στο OpenStreetMap δεν συνεπάγεται + ότι ο αρχικός πάροχος δεδομένων εγκρίνει το OpenStreetMap, παρέχει οποιαδήποτε + εγγύηση ή αποδέχεται καμία ευθύνη. infringement_title_html: Παραβιάσεις πνευματικών δικαιωμάτων infringement_1_html: Υπενθυμίζουμε στους συνεισφέροντες του OSM να μην προσθέτουν δεδομένα από πηγές με πνευματικά δικαιώματα (π.χ. Google Maps η έντυπους χάρτες) @@ -1042,6 +1114,12 @@ el: τον ιστότοπο, παρακαλούμε απευθυνθείτε στη <a href="http://www.osmfoundation.org/wiki/License/Takedown_procedure"> διαδικασία απομάκρυνσης </a> ή καταθέστε άμεσα μια αίτηση στην <a href="http://dmca.openstreetmap.org/">on-line σελίδα αιτήσεων</a>. + trademarks_title_html: <span id="trademarks"></span>Εμπορικά σήματα + trademarks_1_html: Το OpenStreetMap, το λογότυπο με το μεγεθυντικό φακό και + το «State of the Map» είναι σήματα κατατεθέντα του Ιδρύματος OpenStreetMap. + Αν έχετε ερωτήσεις σχετικά με τη χρήση των σημάτων, στείλτε τις ερωτήσεις + σας στην <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">Ομάδα + Εργασίας Αδειών Χρήσης</a>. welcome_page: title: Καλώς ήρθατε! introduction_html: Σας καλωσορίζουμε στο OpenStreetMap, τον ελεύθερο και επεξεργάσιμο @@ -1070,11 +1148,19 @@ el: tag_html: Τα <strong>χαρακτηριστικά</strong> είναι δεδομένα που σχετίζονται με κόμβους ή διαδρομές, όπως τα ονόματα εστιατορίως ή τα όριο ταχύτητας διάφορων δρόμων. + rules: + title: Κανόνες! + paragraph_1_html: Το OpenStreetMap έχει λίγους επίσημους κανόνες, αλλά αναμένουμε + από όλους τους συμμετέχοντες να συνεργαστούν και να επικοινωνούν με την κοινότητα. + Αν σκέφτεστε άλλες δραστηριότητες εκτός από την επεξεργασία με το χέρι, παρακαλούμε + διαβάστε και ακολουθήστε τις οδηγίες στις <a href='http://wiki.openstreetmap.org/wiki/Import/Guidelines'>Εισαγωγές</a> + και στις <a href='http://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct'>Αυτόματες + Επεξεργασίες</a>. questions: title: Ερωτήσεις; paragraph_1_html: |- - Το OpenStreetMap έχει πολλαπλούς πόρους για να μάθετε σχετικά με το έργο, να κάνετε - ερωτήματα, και να λάβετε μέρος σε συλλογικές συζητήσεις και να βρείτε τεκμηρίωση για θέματα χαρτογράφησης. + Το OpenStreetMap έχει πολλαπλούς πόρους για να μάθετε για το εγχείρημα, να κάνετε + ερωτήσεις και να συζητάτε και να τεκμηριώνετε θέματα χαρτογράφησης συνεργατικά. <a href='%{help_url}'>Λάβετε βοήθεια εδώ</a>. start_mapping: Ξεκινήστε τη Χαρτογράφηση add_a_note: @@ -1102,23 +1188,46 @@ el: Προσθέστε το μήνυμά σας και, στη συνέχεια, κάντε κλικ στο κουμπί αποθήκευσης, ώστε να μπορούν άλλοι χαρτογράφοι να ερευνήσουν το πρόβλημα. other_concerns: title: Άλλες ανησυχίες + explanation_html: Αν ανησυχείτε για το πώς χρησιμοποιούνται τα δεδομένα μας + ή σχετικά με τα περιεχόμενα, παρακαλούμε συμβουλευτείτε τη <a href='/copyright'>σελίδα + πνευματικών δικαιωμάτων</a> μας για περισσότερες νομικές πληροφορίες ή επικοινωνήστε + με την κατάλληλη <a href='http://wiki.osmfoundation.org/wiki/Working_Groups'>ομάδα + εργασίας του OSMF</a>. help_page: - title: Βρίσκοντας Βοήθεια - introduction: |- - Το OpenStreetMap έχει πολλαπλούς πόρους για να μάθετε σχετικά με το έργο, να κάνετε και να απαντήσετε σε - ερωτήματα, και για να συζητήσετε και τεκμηριώσετε θέματα χαρτογράφησης συνεργατικά. + title: Βοήθεια + introduction: Το OpenStreetMap έχει πολλαπλούς πόρους για να μάθετε για το εγχείρημα, + να κάνετε ερωτήσεις, να απαντήσετε σε ερωτήσεις άλλων και να συζητήσετε και + να τεκμηριώσετε θέματα χαρτογράφησης συνεργατικά. welcome: url: /welcome title: Καλώς ήλθατε στο OSM - description: Ξεκινήστε με αυτές τις γρήγορες οδηγίες που καλύπτουν τα βασικά - OpenStreetMap. + description: Ξεκινήστε με αυτές τις σύντομες οδηγίες που καλύπτουν τα βασικά + του OpenStreetMap. beginners_guide: url: http://wiki.openstreetmap.org/wiki/El:Beginners%27_guide + title: Οδηγός Αρχαρίων + description: Οδηγός αρχαρίων διατηρούμενος από την κοινότητα. help: url: https://help.openstreetmap.org/ title: help.openstreetmap.org - description: Κάνετε ένα ερώτημα ή αναζητήσετε απαντήσεις στην ιστοσελίδα ερωτήσεων + description: Κάντε μία ερώτηση ή αναζητήσετε απαντήσεις στην ιστοσελίδα ερωτήσεων και απαντήσεων του OSM. + mailing_lists: + title: Λίστες Αλληλογραφίας + description: Κάντε μία ερώτηση ή συζητήστε ενδιαφέροντα θέματα σε ένα ευρύ φάσμα + τοπικών ή περιφερειακών λιστών αλληλογραφίας. + forums: + title: Φόρουμ + description: Ερωτήσεις και συζητήσεις για όσους προτιμούν μία διεπαφή με στιλ + διάρθρωσης κουκκίδων. + irc: + title: IRC + description: Διαδραστική συνομιλία σε πολλές διαφορετικές γλώσσες και για πολλά + θέματα. + switch2osm: + title: switch2osm + description: Βοήθεια για εταιρείες και οργανισμούς για μετάβαση σε χάρτες που + βασίζονται στο OpenStreetMap και άλλες υπηρεσίες. wiki: url: http://wiki.openstreetmap.org/ title: wiki.openstreetmap.org @@ -1126,7 +1235,7 @@ el: about_page: next: Επόμενη copyright_html: <span>©</span>Συνεισφέροντες<br> του OpenStreetMap - used_by: Το %{name} προσφέρει δεδομένα χάρτη σε εκατοντάδες ιστοσελίδες, εφαρμογές + used_by: Το %{name} προσφέρει δεδομένα χάρτη σε χιλιάδες ιστότοπους, εφαρμογές κινητού και συσκευές υλικού lede_text: |- Το OpenStreetMap αναπτύσσεται από μια κοινότητα χαρτογράφων που συνεισφέρουν και διατηρούν δεδομένα @@ -1136,6 +1245,14 @@ el: Το OpenStreetMap υπογραμμίζει την τοπική γνώση. Οι συνεισφέροντες χρησιμοποιούν αεροφωτογραφίες, συσκευές GPS, και τοπικούς χάρτες χαμηλής τεχνολογίας για να σιγουρευτούν πως το OSM είναι ακριβής και ενημερωμένο. community_driven_title: Βασίζεται Στην Κοινότητα + community_driven_html: |- + Η κοινότητα του OpenStreetMap είναι ποικίλη, παθιασμένη, και μεγαλώνει κάθε μέρα. + Στους συνεισφέροντές μας περιλαμβάνονται ενθουσιώδεις χαρτογράφοι, επαγγελματίες GIS, μηχανικοί + που τρέχουν τους εξυπηρετητές OSM, ανθρωπιστές που χαρτογραφούν κατεστραμμένες-πληγείσες περιοχές, + και πολλούς περισσότερους. + Για να μάθετε περισσότερα για την κοινότητα, ανατρέξτε στα <a href="%{diary_path}">ημερολόγια χρηστών</a>, τα + <a href="http://blogs.openstreetmap.org/">ιστολόγια της κοινότητας</a>και + την ιστοσελίδα του <a href="http://www.osmfoundation.org/">Ιδρύματος OSM</a>. open_data_title: Ανοικτά Δεδομένα open_data_html: 'Το OpenStreetMap είναι βάση <i>ανοικτών δεδομένων</i>: είστε ελεύθεροι να την χρησιμοποιήστε για οποιονδήποτε σκοπό, εφόσον μνημονεύετε το @@ -1143,14 +1260,18 @@ el: τα δεδομένα με συγκεκριμένους τρόπους, πρέπει να διανείμετε το αποτέλεσμα μόνο υπό την ίδια άδεια χρήσης. Δείτε τη σελίδα <a href=''%{copyright_path}''>Πνευματικά Δικαιώματα και Άδεια Χρήσης</a> για λεπτομέρειες.' + legal_title: Νομικό + legal_html: |- + Αυτός ο ιστότοπος και πολλές άλλες σχετικές υπηρεσίες λειτουργούν επίσημα από το <a href='http://osmfoundation.org/'>Ίδρυμα OpenStreetMap</a> (OSMF) εκ μέρους της κοινότητας. Η χρήση όλων των υπηρεσιών του OSMF υπόκειται στην <a href="http://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy">Πολιτική Αποδεκτής Χρήσης</a> μας και στην <a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy">Πολιτική Απορρήτου</a> μας. + <br> + Παρακαλούμε <a href='http://osmfoundation.org/Contact'>επικοινωνήστε με το OSMF</a> αν έχετε ερωτήματα για άδειες χρήσης, πνευματικά δικαιώματα ή άλλα νομικά θέματα. partners_title: Συνεργάτες notifier: diary_comment_notification: - subject: '[OpenStreetMap] Ο χρήστης %{user} σχολίασε την καταχώριση ημερολογίου - σας' + subject: '[OpenStreetMap] Ο χρήστης %{user} σχολίασε μια καταχώριση ημερολογίου' hi: Γεια σας %{to_user}, - header: 'Ο χρήστης %{from_user} έχει σχολιάσει τη πρόσφατη καταχώρηση ημερολογίου - σας στο OpenStreetMap με θέμα %{subject}:' + header: 'Ο %{from_user} έχει σχολιάσει την καταχώριση ημερολογίου στο OpenStreetMap + με θέμα %{subject}:' footer: Μπορείτε επίσης να διαβάσετε το σχόλιο στο %{readurl} και μπορείτε να σχολιάσετε στο %{commenturl} ή να απαντήσετε στο %{replyurl} message_notification: @@ -1178,6 +1299,8 @@ el: more_info_2: 'μπορούν να βρεθούν στο:' success: subject: '[OpenStreetMap] Η εισαγωγή GPX πέτυχε' + loaded_successfully: φόρτωσε επιτυχώς με %{trace_points} από %{possible_points} + πιθανά σημεία. signup_confirm: subject: '[OpenStreetMap] Καλώς ήλθατε στο OpenStreetMap' greeting: Γεια σου! @@ -1251,8 +1374,19 @@ el: changeset_comment_notification: greeting: Γεια, commented: + subject_own: '[OpenStreetMap] {{GENDER:%{commenter}|Ο|Η}} %{commenter} σχολίασε + μια από τις ομάδες αλλαγών σας.' + subject_other: '[OpenStreetMap] {{GENDER:%{commenter}|Ο|Η}} %{commenter} σχολίασε + μια ομάδα αλλαγών που σας ενδιαφέρει.' + your_changeset: '{{GENDER:%{commenter}|Ο|Η}} %{commenter} άφησε ένα σχόλιο + σε μία από τις ομάδες αλλαγών σας που δημιουργήθηκε στις %{time}.' + commented_changeset: '{{GENDER:%{commenter}|Ο|Η}} %{commenter} άφησε ένα σχόλιο + σε μία ομάδα αλλαγών χάρτη που παρακολουθείτε δημιουργημένη από {{GENDER:%{changeset_author}|τον|την}} + %{changeset_author} στις %{time}.' partial_changeset_with_comment: με το σχόλιο «%{changeset_comment}» partial_changeset_without_comment: χωρίς σχόλιο + details: Περισσότερες λεπτομέρειες για την ομάδα αλλαγών μπορούν να βρεθούν + στο %{url}. message: inbox: title: Εισερχόμενα @@ -1365,6 +1499,8 @@ el: close: Κλείσιμο search: search: Αναζήτηση + get_directions: Λάβετε οδηγίες + get_directions_title: Βρείτε οδηγίες μεταξύ δύο σημείων from: Από to: Προς where_am_i: Πού είμαι; @@ -1374,15 +1510,17 @@ el: table: entry: motorway: Αυτοκινητόδρομος + main_road: Κύρια οδός trunk: Αυτοκινητόδρομος primary: Κύρια Οδός secondary: Δευτερεύουσα Οδός unclassified: Αταξινόμητη Οδός - unsurfaced: Δρόμος χωρίς Επίστρωση track: Χωματόδρομος - byway: Παράδρομος bridleway: Μονοπάτι για Άλογα cycleway: Ποδηλατόδρομος + cycleway_national: Εθνικός ποδηλατόδρομος + cycleway_regional: Περιφερειακός ποδηλατόδρομος + cycleway_local: Τοπικός ποδηλατόδρομος footway: Μονοπάτι rail: Σιδηρόδρομος subway: Υπόγειος Σιδηρόδρομος @@ -1396,14 +1534,14 @@ el: - Διάδρομος Αεροδρομίου - τροχόδρομος apron: - 1: τερματικός σταθμός + - Πίστα προσγείωσης αεροδρομίου + - τερματικός σταθμός admin: Διοικητικό όριο forest: Δάσος wood: Φυσικό δάσος golf: Γήπεδο γκολφ park: Πάρκο resident: Κατοικημένη περιοχή - tourist: Τουριστικό αξιοθέατο common: - Κοινόχρηστο - λιβάδι @@ -1433,14 +1571,16 @@ el: tunnel: Διακεκομμένο περίβλημα = σήραγγα bridge: Μαύρο περίβλημα = γέφυρα private: Ιδιωτική πρόσβαση - permissive: Ανεκτική πρόσβαση destination: Πρόσβαση προορισμού construction: Δρόμοι υπό κατασκευή + bicycle_shop: Κατάστημα ποδηλάτων + bicycle_parking: Χώρος στάθμευσης ποδηλάτων + toilets: Τουαλέτες richtext_area: edit: Επεξεργασία preview: Προεπισκόπηση markdown_help: - title_html: Αναλύθηκε με το <a href="http://daringfireball.net/projects/markdown/">Markdown</a> + title_html: Αναλύεται με το <a href="http://daringfireball.net/projects/markdown/">Markdown</a> headings: Επικεφαλίδες heading: Επικεφαλίδα subheading: Υποκεφαλίδα @@ -1458,9 +1598,12 @@ el: private: Προσωπικό (διαμοιρασμός μόνο σαν ανώνυμος) public: Δημόσιο (εμφανίζεστε στη λίστα ιχνών σαν ανώνυμος, μη χρονοσημασμένα σημεία) - trackable: Ανιχνέυσιμο(κοινοποιείται ανώνυμα, διατάσσονται τα σημεία με χρονοσημάνσεις) + trackable: Ανιχνεύσιμο (κοινοποιείται ως ανώνυμα διατεταγμένα σημεία με χρονοσημάνσεις) create: upload_trace: Αποστολή Ίχνους GPS + trace_uploaded: Το GPX αρχείο σας έχει μεταμορφωθεί και αναμένει την εισαγωγή + στη βάση δεδομένων. Συνήθως αυτό θα συμβεί μέσα σε μισή ώρα, και μετά την + ολοκλήρωση θα σας αποσταλεί ένα email. edit: title: Επεξεργασία ίχνους %{name} heading: Επεξεργασία ίχνους %{name} @@ -1478,6 +1621,7 @@ el: save_button: Αποθήκευση Αλλαγών visibility: 'Ορατότητα:' visibility_help: τι σημαίνει αυτό; + visibility_help_url: http://wiki.openstreetmap.org/wiki/Visibility_of_GPS_traces trace_form: upload_gpx: 'Αποστολή Αρχείου GPX:' description: 'Περιγραφή:' @@ -1491,6 +1635,13 @@ el: upload_trace: Αποστολή ίχνους see_all_traces: Δείτε όλα τα ίχνη see_your_traces: Δείτε τα ίχνη σας + traces_waiting: + one: Έχετε %{count} ίχνος σε αναμονή για ανέβασμα. Παρακαλούμε περιμένετε + να ολοκληρωθεί πριν ανεβάσετε άλλα, ώστε να μην εμποδίσετε τη σειρά αναμονής + για άλλους χρήστες. + other: Έχετε %{count} ίχνη σε αναμονή για ανέβασμα. Παρακαλούμε περιμένετε + να ολοκληρωθούν πριν ανεβάσετε άλλα, ώστε να μην εμποδίσετε τη σειρά αναμονής + για άλλους χρήστες. trace_optionals: tags: Χαρακτηριστικά view: @@ -1538,6 +1689,9 @@ el: public_traces_from: Δημόσια ίχνη GPS από τον %{user} description: Προβολή πρόσφατων μεταφορτώσεων ιχνών GPS tagged_with: χαρακτηρίστηκαν με %{tags} + empty_html: Τίποτα ακόμα εδώ. <a href='%{upload_link}'>Ανεβάστε ένα νέο ίχνος</a> + ή μάθετε περισσότερα για την καταγραφή ιχνών με GPS στη <a href='http://wiki.openstreetmap.org/wiki/El:Beginners_Guide_1.2'>σελίδα + wiki</a>. delete: scheduled_for_deletion: Το ίχνος προγραμματίστηκε για διαγραφή make_public: @@ -1547,6 +1701,9 @@ el: georss: title: OpenStreetMap Ίχνη GPS description: + description_with_count: + one: αρχείο GPX με %{count} σημείο από %{user} + other: αρχείο GPX με %{count} σημεία από %{user} description_without_count: Αρχείο GPX από τον χρήστη %{user} application: require_cookies: @@ -1555,6 +1712,9 @@ el: require_moderator: not_a_moderator: Θα πρέπει να είστε συντονιστής για να εκτελέσετε αυτήν την ενέργεια. + setup_user_auth: + blocked: Η πρόσβασή σας στο API έχει αποκλειστεί. Παρακαλώ συνδεθείτε με τη + διεπαφή του ιστότοπου για να μάθετε περισσότερα. oauth: oauthorize: title: Επιτρέψτε την πρόσβαση στο λογαριασμό σας @@ -1570,11 +1730,16 @@ el: allow_read_gpx: διαβάσει τα ιδιωτικά σας GPS ίχνη. allow_write_gpx: ανεβάσει ίχνη GPS. allow_write_notes: τροποποιήσει σημειώσεις. + grant_access: Παροχή Πρόσβασης oauthorize_success: + allowed: Παραχωρήσατε στην εφαρμογή %{app_name} πρόσβαση στον λογαριασμό σας. verification: Ο κωδικός επαλήθευσης είναι %{code}. oauthorize_failure: title: Η αίτηση επαλήθευσης απέτυχε denied: Απαγορέψατε την εφαρμογή %{app_name} από πρόσβαση στον λογαριασμό σας. + invalid: Το κουπόνι εξουσιοδότησης δεν είναι έγκυρο. + revoke: + flash: Ανακαλέσατε το κουπόνι για το %{application}. oauth_clients: new: title: Καταχώρηση νέας εφαρμογής @@ -1599,6 +1764,7 @@ el: title: Οι λεπτομέρειες του OAuth μου my_tokens: Οι Εξουσιοδοτημένες Εφαρμογές μου application: Όνομα Εφαρμογής + issued_at: Εκδόθηκε Στις revoke: Ανακαλέστε! my_apps: Οι Εφαρμογές Πελάτη Μου registered_apps: 'Έχετε τις παρακάτω εφαρμογές πελάτη καταχωρημένες:' @@ -1632,6 +1798,7 @@ el: register now: Εγγραφείτε τώρα with username: 'Έχετε ήδη λογαριασμό OpenStreetMap; Παρακαλώ συνδεθείτε με το όνομα χρήστη και κωδικό πρόσβασης:' + with external: 'Εναλλακτικά, χρησιμοποιήστε τρίτην υπηρεσία για είσοδο:' new to osm: Νέοι στο OpenStreetMap; to make changes: Για να κάνεις αλλαγές στα δεδομένα του OpenStreetMap, πρέπει να έχεις λογαριασμό. @@ -1645,6 +1812,34 @@ el: εάν θέλετε να το συζητήσετε. auth failure: Λυπάμαι, δεν μπορείτε να συνδεθείτε με αυτές τις λεπτομέρειες. openid_logo_alt: Σύνδεση με ένα OpenID + auth_providers: + openid: + title: Σύνδεση με ένα OpenID + alt: Σύνδεση με ένα OpenID URL + google: + title: Σύνδεση με το Google + alt: Σύνδεση με ένα Google OpenID + facebook: + title: Σύνδεση με το Facebook + alt: Σύνδεση με έναν Λογαριασμό Facebook + windowslive: + title: Σύνδεση με το Windows Live + alt: Σύνδεση με ένα Λογαριασμό Windows Live + github: + title: Σύνδεση με το GitHub + alt: Σύνδεση με λογαριασμό GitHub + wikipedia: + title: Σύνδεση με Wikipedia + alt: Συνδεθείτε με ένα Λογαριασμό Wikipedia + yahoo: + title: Σύνδεση με το Yahoo + alt: Σύνδεση με ένα Yahoo OpenID + wordpress: + title: Σύνδεση με το Wordpress + alt: Σύνδεση με ένα Wordpress OpenID + aol: + title: Σύνδεση με την AOL + alt: Σύνδεση με ένα AOL OpenID logout: title: Αποσύνδεση heading: Αποσύνδεση από το OpenStreetMap @@ -1670,6 +1865,11 @@ el: flash changed: Ο κωδικός σας αλλάχτηκε. new: title: Εγγραφή + no_auto_account_create: Δυστυχώς δεν μπορούμε να δημιουργήσουμε αυτόματα έναν + λογαριασμό για εσάς. + contact_webmaster: Επικοινωνήστε με τον <a href="%{webmaster}">webmaster</a> + για να κανονίσετε για τη δημιουργία ενός λογαριασμού - θα προσπαθήσουμε να + ικανοποιήσουμε το αίτημά σας το συντομότερο δυνατόν. about: header: Ελεύθερος και επεξεργάσιμος html: |- @@ -1681,14 +1881,17 @@ el: συνεισφοράς</a>. email address: 'Διεύθυνση Ηλ. Ταχυδρομείου:' confirm email address: 'Επιβεβαίωση Διεύθυνσης Ηλ. Ταχυδρομείου:' - not displayed publicly: Να μην εμφανίζεται δημόσια (βλέπετε την <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" - title="wiki privacy policy including section on email addresses">πολιτική - απορρήτου</a>) + not displayed publicly: Η διεύθυνση σου δεν εμφανίζεται δημόσια (βλέπετε την + <a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy" title="OSMF privacy + policy including section on email addresses">πολιτική απορρήτου</a> για περισσότερες + πληροφορίες) display name: 'Εμφανιζόμενο όνομα:' display name description: Το δημόσια εμφανιζόμενο όνομα χρήστη. Μπορείτε να το αλλάξετε αργότερα από τις προτιμήσεις. + external auth: 'Ελέγχος Ταυτότητας Τρίτου Μέρους:' password: 'Κωδικός:' confirm password: 'Επιβεβαίωση Κωδικού:' + use external auth: 'Εναλλακτικά, χρησιμοποιήστε τρίτην υπηρεσία για είσοδο:' continue: Εγγραφή terms accepted: Ευχαριστούμε για την αποδοχή των νέων όρων συνεισφοράς! terms declined: Λυπούμαστε για το ότι αποφασίσατε να μην αποδεχθείτε τους νέους @@ -1718,6 +1921,7 @@ el: body: Λυπάμαι, δεν υπάρχει χρήστης με το όνομα %{user}. Είναι πιθανό να υπάρχουν ορθογραφικά λάθη ή να είναι λάθος ο σύνδεσμος μέσω του οποίου φτάσατε σε αυτήν τη σελίδα. + deleted: διεγράφη view: my diary: Το Ημερολόγιό Μου new diary entry: νέα καταχώρηση ημερολογίου @@ -1768,17 +1972,17 @@ el: moderator: Χορήγηση πρόσβασης συντονιστή revoke: administrator: Ανακαλέστε πρόσβαση διαχειριστή - moderator: Ανακαλέστε πρόσβαση συντονιστή - block_history: φραγές που ελήφθησαν - moderator_history: φραγές που επιβλήθηκαν + moderator: Ανάκληση πρόσβασης συντονιστή + block_history: Ενεργές Φραγές + moderator_history: Φραγές που Επιβλήθηκαν comments: Σχόλια - create_block: φραγή αυτού του χρήστη - activate_user: ενεργοποίηση αυτού του χρήστη - deactivate_user: απενεργοποίηση αυτού του χρήστη - confirm_user: επιβεβαίωση αυτού του χρήστη - hide_user: απόκρυψη αυτού του χρήστη - unhide_user: επανεμφάνιση αυτού του χρήστη - delete_user: διαγραφή αυτού του χρήστη + create_block: Φραγή αυτού του Χρήστη + activate_user: Ενεργοποίηση αυτού του λογαριασμού Χρήστη + deactivate_user: Απενεργοποίηση αυτού του λογαριασμού Χρήστη + confirm_user: Επιβεβαίωση αυτού του λογαριασμού Χρήστη + hide_user: Απόκρυψη αυτού του λογαριασμού Χρήστη + unhide_user: Επανεμφάνιση αυτού του λογαριασμού Χρήστη + delete_user: Διαγραφή αυτού του Χρήστη confirm: Επιβεβαίωση friends_changesets: ομάδες αλλαγών φίλων friends_diaries: καταχωρήσεις ημερολογίου φίλων @@ -1794,6 +1998,7 @@ el: current email address: 'Τωρινή Διεύθυνση Ηλεκτρονικού Ταχυδρομείου:' new email address: 'Νέα Διεύθυνση ηλεκτρονικού ταχυδρομείου:' email never displayed publicly: (όχι δημόσια εμφάνιση) + external auth: 'Εξωτερικός Έλεγχος Ταυτότητας:' openid: link: http://wiki.openstreetmap.org/wiki/OpenID link text: τι είναι αυτό; @@ -1833,6 +2038,7 @@ el: gravatar: gravatar: Χρήση Gravatar link text: τι είναι αυτό; + enabled: Εμφάνισης του Gravatar σας έχει ενεργοποιηθεί. new image: Προσθήκη εικόνας keep image: Διατήρηση της τρέχουσας εικόνας delete image: Αφαίρεση της τρέχουσας εικόνας @@ -1865,16 +2071,22 @@ el: reconfirm_html: Εάν θέλετε να σας ξαναστείλουμε το email επιβεβαίωσης <a href="%{reconfirm}">πατήστε εδώ</a>. confirm_resend: + success: Έχουμε στείλει ένα νέο σημείωμα επιβεβαίωσης στο %{email} και μόλις + επιβεβαιώσετε τον λογαριασμό σας, θα μπορείτε να αρχίσετε τη χαρτογράφηση.<br + /><br />Εάν χρησιμοποιείτε ένα σύστημα αποκλεισμού ανεπιθύμητων μηνυμάτων, + το οποίο στέλνει αιτήματα επιβεβαίωσης, βεβαιωθείτε ότι έχετε προσθέσει σε + λίστα επιτρεπόμενων το %{sender} καθώς δεν μπορούμε να απαντάμε σε κανένα + αίτημα επιβεβαίωσης. failure: Ο χρήστης %{name} δεν βρέθηκε. confirm_email: heading: Επιβεβαίωση αλλαγής της διεύθυνσης ηλεκτρονικού ταχυδρομείου press confirm button: Πατήστε το κουμπί «Επιβεβαίωση» παρακάτω για να επιβεβαιώσετε τη νέα διεύθυνση ηλεκτρονικού ταχυδρομείου σας. button: Επιβεβαίωση - success: Επιβεβαιώθηκε η διεύθυνση ηλεκτρονικού ταχυδρομείου σας, σας ευχαριστούμε - για την εγγραφή σας! + success: Επιβεβαιώθηκε η αλλαγή της διεύθυνσης ηλεκτρονικού ταχυδρομείου σας! failure: Μια διεύθυνση ηλεκτρονικού ταχυδρομείου έχει ήδη επιβεβαιωθεί με αυτό το διακριτικό. + unknown_token: Αυτός ο κωδικός επιβεβαίωσης έχει λήξει ή δεν υπάρχει. set_home: flash success: Η τοποθεσία σπιτιού αποθηκεύτηκε επιτυχώς go_public: @@ -1917,8 +2129,20 @@ el: Η παρούσα απόφαση θα εξεταστεί από ένα διαχειριστή σύντομα, ή μπορείτε να επικοινωνήσετε με τον %{webmaster} αν θέλετε να συζητήσετε αυτό το θέμα. </p> + auth_failure: + unknown_signature_algorithm: Άγνωστος αλγόριθμος υπογραφής + auth_association: + heading: Το ID σας δεν σχετίζεται ακόμα με λογαριασμό στο OpenStreetMap. + option_1: |- + Εάν είστε νέοι στο OpenStreetMap, παρακαλούμε να δημιουργήσετε έναν νέο λογαριασμό + χρησιμοποιώντας την παρακάτω φόρμα. + option_2: Αν έχετε ήδη λογαριασμό, μπορείτε να συνδεθείτε στον λογαριασμό σας + χρησιμοποιώντας το όνομα χρήστη και τον κωδικό πρόσβασης και, στη συνέχεια, + να συσχετίσετε τον λογαριασμό με το ID σας στις ρυθμίσεις χρήστη. user_role: filter: + not_an_administrator: Μόνο οι διαχειριστές μπορούν να εκτελέσουν διαχείριση + ρόλων χρηστών και δεν είστε διαχειριστής. not_a_role: Το αλφαριθμητικό `%{role}' δεν είναι ένας έγκυρος ρόλος. already_has_role: Ο χρήστης έχει ήδη ρόλο %{role}. doesnt_have_role: Ο χρήστης δεν έχει ρόλο %{role}. @@ -1935,21 +2159,50 @@ el: «%{name}»; confirm: Επιβεβαίωση user_block: + model: + non_moderator_update: Πρέπει να είστε συντονιστής για να δημιουργήσετε ή να + ενημερώσετε μία φραγή. + non_moderator_revoke: Πρέπει να είστε συντονιστής για να ανακαλέσετε μία φραγή. not_found: + sorry: Συγγνώμη, δε βρέθηκε φραγή χρήστη με ID %{id}. back: Επιστροφή στο ευρετήριο new: title: Δημιουργία φραγής στον %{name} heading: Δημιουργία φραγής στον %{name} + reason: Η αιτία αποκλεισμού του/της %{name}. Παρακαλώ να είστε όσο το δυνατόν + πιο ήρεμος/-η και λογικός/-ή, δίνοντας όσες περισσότερες λεπτομέρειες μπορείτε + για την κατάσταση και σκεπτόμενος/-η ότι το μήνυμα θα είναι δημόσια ορατό. + Να έχετε υπόψη σας ότι δεν κατανοούν όλοι οι χρήστες την ορολογία της κοινότητας, + γι' αυτό προσπαθήστε να χρησιμοποιήσετε εκλαϊκευμένους όρους. + period: Για πόσο καιρό από τώρα θα είναι αποκλεισμένος ο χρήστης από το API. submit: Δημιουργία φραγής tried_contacting: Επικοινώνησα με τον χρήστη και του ζήτησα να σταματήσει. + tried_waiting: Έχω δώσει ένα εύλογο χρονικό διάστημα στον χρήστη να απαντήσει + σε αυτές τις επικοινωνίες. + needs_view: Ο χρήστης πρέπει να συνδεθεί προτού εκκαθαριστεί αυτή η φραγή. back: Προβολή όλων των φραγών edit: title: Επεξεργασία φραγής στον %{name} heading: Επεξεργασία φραγής στον %{name} + reason: Η αιτία αποκλεισμού του/της %{name}. Παρακαλώ να είστε όσο το δυνατόν + πιο ήρεμος/-η και λογικός/-ή, δίνοντας όσες περισσότερες λεπτομέρειες μπορείτε + για την κατάσταση. Να έχετε υπόψη σας ότι δεν κατανοούν όλοι οι χρήστες την + ορολογία της κοινότητας, γι' αυτό προσπαθήστε να χρησιμοποιήσετε εκλαϊκευμένους + όρους. + period: Για πόσο καιρό από τώρα θα είναι αποκλεισμένος ο χρήστης από το API. submit: Ενημέρωση φραγής show: Προβολή αυτής της φραγής back: Προβολή όλων των φραγών + needs_view: Πρέπει ο χρήστης να συνδεθεί προτού εκκαθαριστεί αυτή η φραγή; + filter: + block_expired: Η φραγή έχει ήδη λήξει και δεν μπορεί να αλλάξει. + block_period: Η περίοδος φραγής πρέπει να είναι μία από τις τιμές στην πτυσσόμενη + λίστα. create: + try_contacting: Παρακαλώ προσπαθήστε να επικοινωνήσετε με τον χρήστη πριν από + τον αποκλεισμό του και επιτρέψτε ένα εύλογο χρονικό διάστημα για να απαντήσει. + try_waiting: Παρακαλώ δώστε στο χρήστη ένα εύλογο χρονικό διάστημα για να απαντήσει + πριν από τον αποκλεισμό του. flash: Δημιουργήθηκε φραγή στον χρήστη %{name}. update: only_creator_can_edit: Μόνο ο συντονιστής που δημιούργησε αυτήν τη φραγή μπορεί @@ -1958,7 +2211,13 @@ el: index: title: Φραγές χρήστη heading: Λίστα φραγών του χρήστη + empty: Δεν έχουν γίνει ακόμα φραγές. revoke: + title: Ανάκληση φραγής του/της %{block_on} + heading: Ανάκληση φραγής του/της %{block_on} από τον/την %{block_by} + time_future: Αυτή η φραγή θα λήξει στις %{time}. + past: Αυτή η φραγή τελείωσε πριν από %{time} και δεν μπορεί να ανακληθεί τώρα. + confirm: Είστε σίγουρος πως επιθυμείτε να ανακαλέσετε αυτή τη φραγή; revoke: Ανακαλέστε! flash: Αυτή η φραγή έχει ανακληθεί. period: @@ -1969,7 +2228,7 @@ el: edit: Επεξεργασία revoke: Ανακαλέστε! confirm: Είσαστε σίγουροι; - display_name: Υπό Φραγή Χρήστης + display_name: Αποκλεισμένος Χρήστης creator_name: Δημιουργός reason: Αιτία φραγής status: Κατάσταση @@ -1995,6 +2254,8 @@ el: heading: Ο %{block_on} έχει φραχτεί από τον %{block_by} time_future: Τελειώνει σε %{time} time_past: Τελείωσε %{time} πριν + created: Δημιουργήθηκε + ago: πρίν από %{time} status: Κατάσταση show: Εμφάνιση edit: Επεξεργασία @@ -2003,8 +2264,7 @@ el: reason: 'Αιτία φραγής:' back: Προβολή όλων των φραγών revoker: 'Έκανε την ανάκληση:' - needs_view: Ο χρήστης πρέπει να συνδεθεί πριν γίνεται να εκκαθαριστεί αυτή η - φραγή. + needs_view: Ο χρήστης πρέπει να συνδεθεί προτού εκκαθαριστεί αυτή η φραγή. note: description: opened_at_html: Δημιουργήθηκε %{when} πριν @@ -2046,6 +2306,7 @@ el: link: Σύνδεσμος ή HTML long_link: Σύνδεσμος short_link: Σύντομος Σύνδεσμος + geo_uri: Geo URI embed: HTML custom_dimensions: Ορισμός προσαρμοσμένων διαστάσεων format: 'Μορφή:' @@ -2057,10 +2318,13 @@ el: center_marker: Κεντράρισμα χάρτη στο δείκτη paste_html: Επικόλληση HTML για ενσωμάτωση στην ιστοσελίδα view_larger_map: Προβολή Μεγαλύτερου Χάρτη + only_standard_layer: Μόνο το τυπικό στρώμα μπορεί να εξαχθεί ως εικόνα + embed: + report_problem: Αναφορά προβλήματος key: title: Υπόμνημα tooltip: Υπόμνημα - tooltip_disabled: Το υπόμνημα είναι διαθέσιμο μόνο για το Κανονικό στρώμα + tooltip_disabled: Το υπόμνημα δεν είναι διαθέσιμο σε αυτό το στρώμα map: zoom: in: Μεγέθυνση @@ -2077,6 +2341,7 @@ el: header: Στρώματα Χάρτη notes: Σημειώσεις Χάρτη data: Δεδομένα Χάρτη + gps: Δημόσια ίχνη GPS overlays: Ενεργοποίηση επικαλύψεων για την αντιμετώπιση προβλημάτων του χάρτη title: Στρώματα copyright: © <a href='%{copyright_url}'>Συνεισφέροντες του OpenStreetMap</a> @@ -2125,17 +2390,59 @@ el: mapquest_car: Αυτοκίνητο (MapQuest) mapquest_foot: Με τα πόδια (MapQuest) osrm_car: Αυτοκίνητο (OSRM) + mapzen_bicycle: Ποδήλατο (Mapzen) + mapzen_car: Αυτοκίνητο (Mapzen) + mapzen_foot: Με τα πόδια (Mapzen) + directions: Οδηγίες distance: Απόσταση + errors: + no_route: Δεν βρέθηκε διαδρομή ανάμεσα σε αυτά τα δύο μέρη. + no_place: Συγγνώμη, δεν βρέθηκε αυτό το μέρος. instructions: - roundabout_with_exit: Στην κυκλική διασταύρωση, πάρτε την έξοδο %{exit} προς + continue_without_exit: Συνεχίστε στην %{name} + slight_right_without_exit: Ελαφριά δεξιά στην %{name} + offramp_right_without_exit: Πάρτε τη λωρίδα δεξιά προς %{name} + onramp_right_without_exit: Στρίψτε δεξιά στη λωρίδα προς %{name} + endofroad_right_without_exit: Στο τέλος του δρόμου στρίψτε δεξιά στην %{name} + merge_right_without_exit: Ελαφριά δεξιά προς %{name} + fork_right_without_exit: Στην διχάλα στρίψτε δεξιά στην %{name} + turn_right_without_exit: Στρίψτε δεξιά στην %{name} + sharp_right_without_exit: Κλειστά δεξιά στην %{name} + uturn_without_exit: Αναστροφή στην %{name} + sharp_left_without_exit: Κλειστά αριστερά στην %{name} + turn_left_without_exit: Στρίψτε αριστερά στην %{name} + offramp_left_without_exit: Πάρτε τη λωρίδα αριστερά προς %{name} + onramp_left_without_exit: Στρίψτε αριστερά στη λωρίδα προς %{name} + endofroad_left_without_exit: Στο τέλος του δρόμου στρίψτε αριστερά στην %{name} + merge_left_without_exit: Ελαφριά αριστερά προς %{name} + fork_left_without_exit: Στη διχάλα στρίψτε αριστερά στην %{name} + slight_left_without_exit: Ελαφριά αριστερά στην %{name} + via_point_without_exit: (μέσω σημείου) + follow_without_exit: Ακολουθήστε την %{name} + roundabout_without_exit: Στον κυκλικό κόμβο πάρτε την %{name} + leave_roundabout_without_exit: Βγείτε από τον κυκλικό κόμβο - %{name} + stay_roundabout_without_exit: Μείνετε στον κυκλικό κόμβο - %{name} + start_without_exit: Ξεκινήστε στο τέλος του %{name} + destination_without_exit: Φτάσατε στον προορισμό σας + against_oneway_without_exit: Πηγαίνετε αντίθετα στον μονόδρομο %{name} + end_oneway_without_exit: Τέλος του μονόδρομου %{name} + roundabout_with_exit: Στην κυκλική διασταύρωση, πάρτε την %{exit}η έξοδο προς %{name} + turn_left_with_exit: Στον κυκλικό κόμβο στρίψτε αριστερά προς %{name} + slight_left_with_exit: Στο κυκλικό κόμβο ελαφρά αριστερά προς %{name} + turn_right_with_exit: Στον κυκλικό κόμβο στρίψτε δεξιά προς %{name} + slight_right_with_exit: Στο κυκλικό κόμβο ελαφρά δεξιά προς %{name} + continue_with_exit: Στον κυκλικό κόμβο συνεχίστε ευθεία προς %{name} unnamed: ανώνυμος δρόμος + courtesy: Οι οδηγίες είναι προσφορά του %{link} time: Διάρκεια query: node: Κόμβος way: Διαδρομή relation: Σχέση nothing_found: Δεν βρέθηκαν χαρακτηριστικά + error: 'Σφάλμα επικοινωνίας με τον %{server}: %{error}' + timeout: Έληξε το χρονικό όριο επικοινωνίας με %{server} redaction: edit: description: Περιγραφή diff --git a/config/locales/en-GB.yml b/config/locales/en-GB.yml index feb0c4f2f..4b0ccd15e 100644 --- a/config/locales/en-GB.yml +++ b/config/locales/en-GB.yml @@ -1,12 +1,23 @@ # Messages for British English (British English) # Exported from translatewiki.net # Export driver: phpyaml +# Author: Andibing # Author: Bpfhjquevaps # Author: Bruce89 # Author: Caliburn # Author: Captaindogfish # Author: Chase me ladies, I'm the Cavalry +# Author: E THP +# Author: EdLoach +# Author: Eduard Popov +# Author: IknowJoseph +# Author: Jagwar +# Author: Kosovastar +# Author: Macofe +# Author: Meno25 +# Author: Sampablokuper # Author: Shirayuki +# Author: ديفيد --- en-GB: html: @@ -169,6 +180,7 @@ en-GB: way: way relation: relation changeset: changeset + note: note timeout: sorry: Sorry, the data for the %{type} with the id %{id}, took too long to retrieve. type: @@ -176,6 +188,7 @@ en-GB: way: way relation: relation changeset: changeset + note: note redacted: redaction: Redaction %{id} message_html: Version %{version} of this %{type} cannot be shown as it has been @@ -261,6 +274,7 @@ en-GB: diary_entry: new: title: New Diary Entry + publish_button: Publish list: title: Users' diaries title_friends: Friends' diaries @@ -398,8 +412,10 @@ en-GB: prefix_format: '%{name}' prefix: aerialway: + cable_car: Cable Car chair_lift: Chairlift drag_lift: Drag Lift + gondola: Gondola Lift station: Aerialway Station aeroway: aerodrome: Aerodrome @@ -410,6 +426,7 @@ en-GB: taxiway: Taxiway terminal: Terminal amenity: + animal_shelter: Animal Shelter arts_centre: Arts Centre atm: ATM bank: Bank @@ -419,6 +436,7 @@ en-GB: bicycle_parking: Cycle Parking bicycle_rental: Cycle Rental biergarten: Beer Garden + boat_rental: Boat Rental brothel: Brothel bureau_de_change: Bureau de Change bus_station: Bus Station @@ -428,6 +446,7 @@ en-GB: car_wash: Car Wash casino: Casino charging_station: Charging Station + childcare: Childcare cinema: Cinema clinic: Clinic clock: Clock @@ -449,6 +468,7 @@ en-GB: food_court: Food Court fountain: Fountain fuel: Fuel + gambling: Gambling grave_yard: Graveyard gym: Fitness Centre/Gym health_centre: Health Centre @@ -459,11 +479,14 @@ en-GB: library: Library market: Market marketplace: Marketplace + monastery: Monastery + motorcycle_parking: Motorcycle Parking nightclub: Night Club nursery: Nursery School nursing_home: Nursing Home office: Office parking: Parking + parking_entrance: Parking Entrance pharmacy: Pharmacy place_of_worship: Place of Worship police: Police @@ -497,6 +520,7 @@ en-GB: veterinary: Veterinary Surgery village_hall: Village Hall waste_basket: bin + waste_disposal: Waste Disposal youth_centre: Youth Centre boundary: administrative: Administrative Boundary @@ -511,14 +535,30 @@ en-GB: "yes": Bridge building: "yes": Building + craft: + brewery: Brewery + carpenter: Carpenter + electrician: Electrician + gardener: Gardener + painter: Painter + photographer: Photographer + plumber: Plumber + shoemaker: Shoemaker + tailor: Tailor + "yes": Craft Shop emergency: + ambulance_station: Ambulance Station + defibrillator: Defibrillator + landing_site: Emergency Landing Site phone: Emergency Phone highway: + abandoned: Abandoned Highway bridleway: Bridleway bus_guideway: Guided Bus Lane bus_stop: Bus Stop construction: Highway under construction cycleway: Cycle Path + elevator: Elevator emergency_access_point: Emergency Access Point footway: Footpath ford: Ford @@ -547,32 +587,41 @@ en-GB: tertiary: Tertiary Road tertiary_link: Tertiary Road track: Track + traffic_signals: Traffic Signals trail: Trail trunk: Trunk Road trunk_link: Trunk Road unclassified: Unclassified Road unsurfaced: Unsurfaced Road + "yes": Road historic: archaeological_site: Archaeological Site battlefield: Battlefield boundary_stone: Boundary Stone building: Historic Building + bunker: Bunker castle: Castle church: Church + city_gate: City Gate citywalls: City Walls fort: Fort + heritage: Heritage Site house: House icon: Icon manor: Manor memorial: Memorial mine: Mine monument: Monument + roman_road: Roman Road ruins: Ruins + stone: Stone tomb: Tomb tower: Tower wayside_cross: Wayside Cross wayside_shrine: Wayside Shrine wreck: Wreck + junction: + "yes": Junction landuse: allotments: Allotments basin: Basin @@ -604,14 +653,19 @@ en-GB: road: Road Area village_green: Village Green vineyard: Vineyard + "yes": Landuse leisure: beach_resort: Beach Resort bird_hide: Bird Hide + club: Club common: Common Land + dog_park: Dog Park fishing: Fishing Area + fitness_centre: Fitness Centre fitness_station: Fitness Station garden: Garden golf_course: Golf Course + horse_riding: Horse Riding ice_rink: Ice Rink marina: Marina miniature_golf: Miniature Golf @@ -620,6 +674,7 @@ en-GB: pitch: Sports Pitch playground: Playground recreation_ground: Recreation Ground + resort: Resort sauna: Sauna slipway: Slipway sports_centre: Sports Centre @@ -627,6 +682,13 @@ en-GB: swimming_pool: Swimming Pool track: Running Track water_park: Water Park + "yes": Leisure + man_made: + lighthouse: Lighthouse + pipeline: Pipeline + tower: Tower + works: Factory + "yes": Man-made military: airfield: Military Airfield barracks: Barracks @@ -646,6 +708,7 @@ en-GB: forest: Forest geyser: Geyser glacier: Glacier + grassland: Grassland heath: Heath hill: Hill island: Island @@ -658,6 +721,8 @@ en-GB: reef: Reef ridge: Ridge rock: Rock + saddle: Saddle + sand: Sand scree: Scree scrub: Scrub spring: Spring @@ -671,6 +736,7 @@ en-GB: wood: Wood office: accountant: Accountant + administrative: Administration architect: Architect company: Company employment_agency: Employment Agency @@ -683,6 +749,8 @@ en-GB: travel_agent: Travel Agency "yes": Office place: + allotments: Allotments + block: Block airport: Airport city: City country: Country @@ -707,6 +775,7 @@ en-GB: town: Town unincorporated_area: Unincorporated Area village: Village + "yes": Place railway: abandoned: Abandoned Railway construction: Railway under construction @@ -809,6 +878,7 @@ en-GB: "yes": Shop tourism: alpine_hut: Alpine Hut + apartment: Apartment artwork: Artwork attraction: Attraction bed_and_breakfast: Bed and Breakfast @@ -816,6 +886,7 @@ en-GB: camp_site: Camp Site caravan_site: Caravan Site chalet: Chalet + gallery: Gallery guest_house: Guest House hostel: Hostel hotel: Hotel @@ -847,6 +918,7 @@ en-GB: wadi: Wadi waterfall: Waterfall weir: Weir + "yes": Waterway admin_levels: level2: Country Boundary level4: State Boundary @@ -936,9 +1008,9 @@ en-GB: legal_babble: title_html: Copyright and Licence intro_1_html: |- - OpenStreetMap is <i>open data</i>, licensed under the <a + OpenStreetMap<sup><a href="#trademarks">®</a></sup> is <i>open data</i>, licensed under the <a href="http://opendatacommons.org/licenses/odbl/">Open Data - Commons Open Database Licence</a> (ODbL) by the <a + Commons Open Database License</a> (ODbL) by the <a href="http://osmfoundation.org/">OpenStreetMap Foundation</a> (OSMF). intro_2_html: You are free to copy, distribute, transmit and adapt our data, as long as you credit OpenStreetMap and its contributors. If you alter or @@ -1009,6 +1081,11 @@ en-GB: 2007 (<a href="http://www.and.com">www.and.com</a>)' contributors_nz_html: '<strong>New Zealand</strong>: Contains data sourced from Land Information New Zealand. Crown Copyright reserved.' + contributors_si_html: |- + <strong>Slovenia</strong>: Contains data from the + <a href="http://www.gu.gov.si/en/">Surveying and Mapping Authority</a> and + <a href="http://www.mkgp.gov.si/en/">Ministry of Agriculture, Forestry and Food</a> + (public information of Slovenia). contributors_za_html: '<strong>South Africa</strong>: Contains data sourced from <a href="http://www.ngi.gov.za/">Chief Directorate: National Geo-Spatial Information</a>, State copyright reserved.' @@ -1028,6 +1105,12 @@ en-GB: added to the OpenStreetMap database or this site, please refer to our <a href="http://www.osmfoundation.org/wiki/License/Takedown_procedure">takedown procedure</a> or file directly at our <a href="http://dmca.openstreetmap.org/">on-line filing page</a>. + trademarks_title_html: <span id="trademarks"></span>Trademarks + trademarks_1_html: OpenStreetMap, the magnifying glass logo, and State of the + Map are registered trademarks of the OpenStreetMap Foundation. If you have + questions about your use of the marks, please send your questions to the <a + href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">Licence + Working Group</a>. welcome_page: title: Welcome! introduction_html: Welcome to OpenStreetMap, the free and editable map of the @@ -1054,6 +1137,14 @@ en-GB: or building. tag_html: A <strong>tag</strong> is a bit of data about a node or way, like a restaurant's name or a road's speed limit. + rules: + title: Rules! + paragraph_1_html: "OpenStreetMap has few formal rules but we expect all participants + to collaborate\nwith, and communicate with, the community. If you are considering\nany + activities other than editing by hand, please read and follow the guidelines + on \n<a href='http://wiki.openstreetmap.org/wiki/Import/Guidelines'>Imports</a> + and \n<a href='http://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct'>Automated + Edits</a>." questions: title: Any questions? paragraph_1_html: |- @@ -1096,11 +1187,30 @@ en-GB: url: /welcome title: Welcome to OSM description: Start with this quick guide covering the OpenStreetMap basics. + beginners_guide: + url: http://wiki.openstreetmap.org/wiki/Beginners%27_guide + title: Beginners' Guide + description: Community maintained guide for beginners. help: url: https://help.openstreetmap.org/ title: help.openstreetmap.org description: Ask a question or look up answers on OSM's question-and-answer site. + mailing_lists: + title: Mailing Lists + description: Ask a question or discuss interesting matters on a wide range of + topical or regional mailing lists. + forums: + title: Forums + description: Questions and discussions for those that prefer a bulletin board + style interface. + irc: + title: IRC + description: Interactive chat in many different languages and on many topics. + switch2osm: + title: switch2osm + description: Help for companies and organisations switching to OpenStreetMap + based maps and other services. wiki: url: http://wiki.openstreetmap.org/ title: wiki.openstreetmap.org @@ -1108,8 +1218,8 @@ en-GB: about_page: next: Next copyright_html: <span>©</span>OpenStreetMap<br>contributors - used_by: '%{name} powers map data on hundreds of web sites, mobile apps, and hardware - devices' + used_by: '%{name} powers map data on thousands of web sites, mobile apps, and + hardware devices' lede_text: OpenStreetMap is built by a community of mappers that contribute and maintain data about roads, trails, cafés, railway stations, and much more, all over the world. @@ -1129,6 +1239,12 @@ en-GB: build upon the data in certain ways, you may distribute the result only under the same licence. See the <a href='%{copyright_path}'>Copyright and Licence page</a> for details. + legal_title: Legal + legal_html: "This site and many other related services are formally operated by + the \n<a href='http://osmfoundation.org/'>OpenStreetMap Foundation</a> (OSMF) + \non behalf of the community.\n<br> \nPlease <a href='http://osmfoundation.org/Contact'>contact + the OSMF</a> \nif you have licensing, copyright or other legal questions and + issues." partners_title: Partners notifier: diary_comment_notification: @@ -1349,6 +1465,10 @@ en-GB: close: Close search: search: Search + get_directions: Get directions + get_directions_title: Find directions between two points + from: From + to: To where_am_i: Where am I? where_am_i_title: Describe the current location using the search engine submit_text: Go @@ -1356,15 +1476,17 @@ en-GB: table: entry: motorway: Motorway + main_road: Main road trunk: Trunk road primary: Primary road secondary: Secondary road unclassified: Unclassified road - unsurfaced: Unsurfaced road track: Track - byway: Byway bridleway: Bridleway cycleway: Cycleway + cycleway_national: National cycleway + cycleway_regional: Regional cycleway + cycleway_local: Local cycleway footway: Footway rail: Railway subway: Subway @@ -1386,7 +1508,6 @@ en-GB: golf: Golf course park: Park resident: Residential area - tourist: Tourist attraction common: - Common - meadow @@ -1416,9 +1537,11 @@ en-GB: tunnel: Dashed casing = tunnel bridge: Black casing = bridge private: Private access - permissive: Permissive access destination: Destination access construction: Roads under construction + bicycle_shop: Bicycle shop + bicycle_parking: Bicycle parking + toilets: Toilets richtext_area: edit: Edit preview: Preview @@ -1580,6 +1703,7 @@ en-GB: allow_read_gpx: read your private GPS traces. allow_write_gpx: upload GPS traces. allow_write_notes: modify notes. + grant_access: Grant Access oauthorize_success: title: Authorisation request allowed allowed: You have granted application %{app_name} access to your account. @@ -1665,6 +1789,7 @@ en-GB: register now: Register now with username: 'Already have an OpenStreetMap account? Please login with your username and password:' + with external: 'Alternatively, use a third party to login:' new to osm: New to OpenStreetMap? to make changes: To make changes to the OpenStreetMap data, you must have an account. @@ -1678,6 +1803,31 @@ en-GB: you wish to discuss this. auth failure: Sorry, could not log in with those details. openid_logo_alt: Log in with an OpenID + auth_providers: + openid: + title: Login with OpenID + alt: Login with an OpenID URL + google: + title: Login with Google + alt: Login with a Google OpenID + facebook: + title: Login with Facebook + alt: Login with a Facebook Account + windowslive: + title: Login with Windows Live + alt: Login with a Windows Live Account + github: + title: Login with GitHub + alt: Login with a GitHub Account + yahoo: + title: Login with Yahoo + alt: Login with a Yahoo OpenID + wordpress: + title: Login with Wordpress + alt: Login with a Wordpress OpenID + aol: + title: Login with AOL + alt: Login with an AOL OpenID logout: title: Logout heading: Logout of OpenStreetMap @@ -1704,8 +1854,8 @@ en-GB: title: Sign Up no_auto_account_create: Unfortunately we are not currently able to create an account for you automatically. - contact_webmaster: Please contact the <a href="mailto:webmaster@openstreetmap.org">webmaster</a> - to arrange for an account to be created - we will try and deal with the request + contact_webmaster: Please contact the <a href="%{webmaster}">webmaster</a> to + arrange for an account to be created - we will try and deal with the request as quickly as possible. about: header: Free and editable @@ -1722,8 +1872,12 @@ en-GB: display name: 'Display Name:' display name description: Your publicly displayed username. You can change this later in the preferences. + external auth: 'Third Party Authentication:' password: 'Password:' confirm password: 'Confirm Password:' + use external auth: Alternatively, use a third party to login + auth no password: With third party authentication a password is not required, + but some extra tools or server may still need one. continue: Sign Up terms accepted: Thanks for accepting the new contributor terms! terms declined: We are sorry that you have decided to not accept the new Contributor @@ -1755,6 +1909,7 @@ en-GB: heading: The user %{user} does not exist body: Sorry, there is no user with the name %{user}. Please check your spelling, or maybe the link you clicked is wrong. + deleted: deleted view: my diary: My Diary new diary entry: new diary entry @@ -1806,16 +1961,16 @@ en-GB: revoke: administrator: Revoke administrator access moderator: Revoke moderator access - block_history: blocks received - moderator_history: blocks given + block_history: Active Blocks + moderator_history: Blocks Given comments: Comments - create_block: block this user - activate_user: activate this user - deactivate_user: deactivate this user - confirm_user: confirm this user - hide_user: hide this user - unhide_user: unhide this user - delete_user: delete this user + create_block: Block this User + activate_user: Activate this User + deactivate_user: Deactivate this User + confirm_user: Confirm this user + hide_user: Hide this User + unhide_user: Unhide this User + delete_user: Delete this User confirm: Confirm friends_changesets: friends' changesets friends_diaries: friends' diary entries @@ -1831,6 +1986,7 @@ en-GB: current email address: 'Current Email Address:' new email address: 'New Email Address:' email never displayed publicly: (never displayed publicly) + external auth: 'External Authentication:' openid: link: http://wiki.openstreetmap.org/wiki/OpenID link text: what is this? @@ -1868,6 +2024,8 @@ en-GB: gravatar: Use Gravatar link: http://wiki.openstreetmap.org/wiki/Gravatar link text: what is this? + disabled: Gravatar has been disabled. + enabled: Display of your Gravatar has been enabled. new image: Add an image keep image: Keep the current image delete image: Remove the current image @@ -1891,6 +2049,7 @@ en-GB: you'll be able to start mapping. press confirm button: Press the confirm button below to activate your account. button: Confirm + success: Confirmed your account, thanks for signing up! already active: This account has already been confirmed. unknown token: That confirmation code has expired or does not exist. reconfirm_html: If you need us to resend the confirmation email, <a href="%{reconfirm}">click @@ -1899,8 +2058,7 @@ en-GB: success: We've sent a new confirmation note to %{email} and as soon as you confirm your account you'll be able to get mapping.<br /><br />If you use an antispam system which sends confirmation requests then please make sure you whitelist - webmaster@openstreetmap.org as we are unable to reply to any confirmation - requests. + %{sender} as we are unable to reply to any confirmation requests. failure: User %{name} not found. confirm_email: heading: Confirm a change of e-mail address @@ -1909,6 +2067,7 @@ en-GB: button: Confirm success: Confirmed your change of email address! failure: An e-mail address has already been confirmed with this token. + unknown_token: That confirmation code has expired or does not exist. set_home: flash success: Home location saved successfully go_public: @@ -1948,6 +2107,21 @@ en-GB: <p> This decision will be reviewed by an administrator shortly, or you may contact the %{webmaster} if you wish to discuss this. </p> + auth_failure: + connection_failed: Connection to authentication provider failed + invalid_credentials: Invalid authentication credentials + no_authorization_code: No authorisation code + unknown_signature_algorithm: Unknown signature algorithm + invalid_scope: Invalid scope + auth_association: + heading: Your ID is not associated with a OpenStreetMap account yet. + option_1: |- + If you are new to OpenStreetMap, please create a new account + using the form below. + option_2: |- + If you already have an account, you can login to your account + using your username and password and then associate the account + with your ID in your user settings. user_role: filter: not_an_administrator: Only administrators can perform user role management, @@ -2063,6 +2237,8 @@ en-GB: heading: '%{block_on} blocked by %{block_by}' time_future: Ends in %{time} time_past: Ended %{time} ago + created: Created + ago: '%{time} ago' status: Status show: Show edit: Edit @@ -2113,6 +2289,7 @@ en-GB: link: Link or HTML long_link: Link short_link: Short Link + geo_uri: Geo URI embed: HTML custom_dimensions: Set custom dimensions format: 'Format:' @@ -2124,6 +2301,9 @@ en-GB: center_marker: Centre map on marker paste_html: Paste HTML to embed in website view_larger_map: View Larger Map + only_standard_layer: Only the standard layer can be exported as an image + embed: + report_problem: Report a problem key: title: Map Key tooltip: Legend @@ -2139,7 +2319,6 @@ en-GB: standard: Standard cycle_map: Cycle Map transport_map: Transport Map - mapquest: MapQuest Open hot: Humanitarian layers: header: Map Layers @@ -2183,6 +2362,52 @@ en-GB: edit_help: Move the map and zoom in on a location you want to edit, then click here. directions: + engines: + graphhopper_bicycle: Bicycle (GraphHopper) + graphhopper_foot: Foot (GraphHopper) + mapquest_bicycle: Bicycle (MapQuest) + mapquest_car: Car (MapQuest) + mapquest_foot: Foot (MapQuest) + osrm_car: Car (OSRM) + mapzen_bicycle: Bicycle (Mapzen) + mapzen_car: Car (Mapzen) + mapzen_foot: Foot (Mapzen) + directions: Directions + distance: Distance + errors: + no_route: Couldn't find a route between those two places. + no_place: Sorry - couldn't find that place. + instructions: + continue_without_exit: Continue on %{name} + slight_right_without_exit: Slight right onto %{name} + offramp_right_without_exit: Take the sliproad on the right onto %{name} + onramp_right_without_exit: Turn right on the sliproad onto %{name} + endofroad_right_without_exit: At the end of the road turn right onto %{name} + merge_right_without_exit: Merge right onto %{name} + fork_right_without_exit: At the fork turn right onto %{name} + turn_right_without_exit: Turn right onto %{name} + sharp_right_without_exit: Sharp right onto %{name} + uturn_without_exit: U-turn along %{name} + sharp_left_without_exit: Sharp left onto %{name} + turn_left_without_exit: Turn left onto %{name} + offramp_left_without_exit: Take the sliproad on the left onto %{name} + onramp_left_without_exit: Turn left on the sliproad onto %{name} + endofroad_left_without_exit: At the end of the road turn left onto %{name} + merge_left_without_exit: Merge left onto %{name} + fork_left_without_exit: At the fork turn left onto %{name} + slight_left_without_exit: Slight left onto %{name} + via_point_without_exit: (via point) + follow_without_exit: Follow %{name} + roundabout_without_exit: At roundabout take %{name} + leave_roundabout_without_exit: Leave roundabout - %{name} + stay_roundabout_without_exit: Stay on roundabout - %{name} + start_without_exit: Start at end of %{name} + destination_without_exit: Reach destination + against_oneway_without_exit: Go against one-way on %{name} + end_oneway_without_exit: End of one-way on %{name} + roundabout_with_exit: At roundabout take exit %{exit} onto %{name} + unnamed: unnamed road + courtesy: Directions courtesy of %{link} time: Time query: node: Node diff --git a/config/locales/en.yml b/config/locales/en.yml index e136d50b5..2414fcd1f 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -162,6 +162,7 @@ en: way: way relation: relation changeset: changeset + note: note timeout: sorry: "Sorry, the data for the %{type} with the id %{id}, took too long to retrieve." type: @@ -169,6 +170,7 @@ en: way: way relation: relation changeset: changeset + note: note redacted: redaction: "Redaction %{id}" message_html: "Version %{version} of this %{type} cannot be shown as it has been redacted. Please see %{redaction_link} for details." @@ -248,6 +250,7 @@ en: diary_entry: new: title: New Diary Entry + publish_button: "Publish" list: title: "Users' diaries" title_friends: "Friends' diaries" @@ -779,7 +782,6 @@ en: car_parts: "Car Parts" car_repair: "Car Repair" carpet: "Carpet Shop" - car_repair: "Car Repair" charity: "Charity Shop" chemist: "Chemist" clothes: "Clothes Shop" @@ -1010,10 +1012,10 @@ en: FAQ</a>. more_2_html: | Although OpenStreetMap is open data, we cannot provide a - free-of-charge map API for third-party developers. - See our <a href="http://wiki.openstreetmap.org/wiki/API_usage_policy">API Usage Policy</a>, - <a href="http://wiki.openstreetmap.org/wiki/Tile_usage_policy">Tile Usage Policy</a> - and <a href="http://wiki.openstreetmap.org/wiki/Nominatim#Usage_Policy">Nominatim Usage Policy</a>. + free-of-charge map API for third-parties. + See our <a href="https://operations.osmfoundation.org/policies/api/">API Usage Policy</a>, + <a href="https://operations.osmfoundation.org/policies/tiles/">Tile Usage Policy</a> + and <a href="https://operations.osmfoundation.org/policies/nominatim/">Nominatim Usage Policy</a>. contributors_title_html: Our contributors contributors_intro_html: | Our contributors are thousands of individuals. We also include @@ -1080,7 +1082,7 @@ en: <a href="http://dmca.openstreetmap.org/">on-line filing page</a>. trademarks_title_html: <span id="trademarks"></span>Trademarks trademarks_1_html: | - OpenStreetMap and the looking glass logo are registered trademarks of the OpenStreetMap Foundation. If you have questions about your use of the marks, please send your questions to the <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">Licence Working Group</a>. + OpenStreetMap, the magnifying glass logo and State of the Map are registered trademarks of the OpenStreetMap Foundation. If you have questions about your use of the marks, please send your questions to the <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">Licence Working Group</a>. welcome_page: title: Welcome! introduction_html: | @@ -1194,7 +1196,7 @@ en: about_page: next: Next copyright_html: <span>©</span>OpenStreetMap<br>contributors - used_by: "%{name} powers map data on hundreds of web sites, mobile apps, and hardware devices" + used_by: "%{name} powers map data on thousands of web sites, mobile apps, and hardware devices" lede_text: | OpenStreetMap is built by a community of mappers that contribute and maintain data about roads, trails, cafés, railway stations, and much more, all over the world. @@ -1223,16 +1225,18 @@ en: legal_html: | This site and many other related services are formally operated by the <a href='http://osmfoundation.org/'>OpenStreetMap Foundation</a> (OSMF) - on behalf of the community. + on behalf of the community. Use of all OSMF operated services is subject + to our <a href="http://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy"> + Acceptable Use Policies</a> and our <a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy">Privacy Policy</a> <br> Please <a href='http://osmfoundation.org/Contact'>contact the OSMF</a> if you have licensing, copyright or other legal questions and issues. partners_title: Partners notifier: diary_comment_notification: - subject: "[OpenStreetMap] %{user} commented on your diary entry" + subject: "[OpenStreetMap] %{user} commented on a diary entry" hi: "Hi %{to_user}," - header: "%{from_user} has commented on your recent OpenStreetMap diary entry with the subject %{subject}:" + header: "%{from_user} has commented on the OpenStreetMap diary entry with the subject %{subject}:" footer: "You can also read the comment at %{readurl} and you can comment at %{commenturl} or reply at %{replyurl}" message_notification: subject_header: "[OpenStreetMap] %{subject}" @@ -1305,6 +1309,7 @@ en: commented_note: "%{commenter} has reactivated a map note you have commented on. The note is near %{place}." details: "More details about the note can be found at %{url}." changeset_comment_notification: + hi: "Hi %{to_user}," greeting: "Hi," commented: subject_own: "[OpenStreetMap] %{commenter} has commented on one of your changesets" @@ -1314,6 +1319,7 @@ en: partial_changeset_with_comment: "with comment '%{changeset_comment}'" partial_changeset_without_comment: "without comment" details: "More details about the changeset can be found at %{url}." + unsubscribe: 'To unsubscribe from updates to this changeset, visit %{url} and click "Unsubscribe".' message: inbox: title: "Inbox" @@ -1422,6 +1428,7 @@ en: table: entry: motorway: "Motorway" + main_road: "Main road" trunk: "Trunk road" primary: "Primary road" secondary: "Secondary road" @@ -1429,6 +1436,9 @@ en: track: "Track" bridleway: "Bridleway" cycleway: "Cycleway" + cycleway_national: "National cycleway" + cycleway_regional: "Regional cycleway" + cycleway_local: "Local cycleway" footway: "Footway" rail: "Railway" subway: "Subway" @@ -1481,6 +1491,9 @@ en: private: "Private access" destination: "Destination access" construction: "Roads under construction" + bicycle_shop: "Bicycle shop" + bicycle_parking: "Bicycle parking" + toilets: "Toilets" richtext_area: edit: Edit preview: Preview @@ -1627,6 +1640,7 @@ en: allow_read_gpx: "read your private GPS traces." allow_write_gpx: "upload GPS traces." allow_write_notes: "modify notes." + grant_access: "Grant Access" oauthorize_success: title: "Authorization request allowed" allowed: "You have granted application %{app_name} access to your account." @@ -1730,6 +1744,12 @@ en: windowslive: title: Login with Windows Live alt: Login with a Windows Live Account + github: + title: Login with GitHub + alt: Login with a GitHub Account + wikipedia: + title: Login with Wikipedia + alt: Login with a Wikipedia Account yahoo: title: Login with Yahoo alt: Login with a Yahoo OpenID @@ -1762,7 +1782,7 @@ en: new: title: "Sign Up" no_auto_account_create: "Unfortunately we are not currently able to create an account for you automatically." - contact_webmaster: 'Please contact the <a href="mailto:webmaster@openstreetmap.org">webmaster</a> to arrange for an account to be created - we will try and deal with the request as quickly as possible.' + contact_webmaster: 'Please contact the <a href="%{webmaster}">webmaster</a> to arrange for an account to be created - we will try and deal with the request as quickly as possible.' about: header: Free and editable html: | @@ -1772,7 +1792,7 @@ en: license_agreement: 'When you confirm your account you will need to agree to the <a href="http://www.osmfoundation.org/wiki/License/Contributor_Terms">contributor terms</a>.' email address: "Email Address:" confirm email address: "Confirm Email Address:" - not displayed publicly: 'Not displayed publicly (see <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" title="wiki privacy policy including section on email addresses">privacy policy</a>)' + not displayed publicly: 'Your address is not displayed publicly, see our <a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy" title="OSMF privacy policy including section on email addresses">privacy policy</a> for more information' display name: "Display Name:" display name description: "Your publicly displayed username. You can change this later in the preferences." external auth: "Third Party Authentication:" @@ -1780,16 +1800,6 @@ en: confirm password: "Confirm Password:" use external auth: "Alternatively, use a third party to login" auth no password: "With third party authentication a password is not required, but some extra tools or server may still need one." - auth association: | - <p>Your ID is not associated with a OpenStreetMap account yet.</p> - <ul> - <li>If you are new to OpenStreetMap, please create a new account using the form below.</li> - <li> - If you already have an account, you can login to your account - using your username and password and then associate the account - with your ID in your user settings. - </li> - </ul> continue: Sign Up terms accepted: "Thanks for accepting the new contributor terms!" terms declined: "We are sorry that you have decided to not accept the new Contributor Terms. For more information, please see <a href=\"%{url}\">this wiki page</a>." @@ -1815,6 +1825,7 @@ en: title: "No such user" heading: "The user %{user} does not exist" body: "Sorry, there is no user with the name %{user}. Please check your spelling, or maybe the link you clicked is wrong." + deleted: "deleted" view: my diary: My Diary new diary entry: new diary entry @@ -1865,16 +1876,16 @@ en: revoke: administrator: "Revoke administrator access" moderator: "Revoke moderator access" - block_history: "blocks received" - moderator_history: "blocks given" + block_history: "Active Blocks" + moderator_history: "Blocks Given" comments: "Comments" - create_block: "block this user" - activate_user: "activate this user" - deactivate_user: "deactivate this user" - confirm_user: "confirm this user" - hide_user: "hide this user" - unhide_user: "unhide this user" - delete_user: "delete this user" + create_block: "Block this User" + activate_user: "Activate this User" + deactivate_user: "Deactivate this User" + confirm_user: "Confirm this User" + hide_user: "Hide this User" + unhide_user: "Unhide this User" + delete_user: "Delete this User" confirm: "Confirm" friends_changesets: "friends' changesets" friends_diaries: "friends' diary entries" @@ -1920,6 +1931,8 @@ en: gravatar: "Use Gravatar" link: "http://wiki.openstreetmap.org/wiki/Gravatar" link text: "what is this?" + disabled: "Gravatar has been disabled." + enabled: "Display of your Gravatar has been enabled." new image: "Add an image" keep image: "Keep the current image" delete image: "Remove the current image" @@ -1948,7 +1961,7 @@ en: unknown token: "That confirmation code has expired or does not exist." reconfirm_html: "If you need us to resend the confirmation email, <a href=\"%{reconfirm}\">click here</a>." confirm_resend: - success: "We've sent a new confirmation note to %{email} and as soon as you confirm your account you'll be able to get mapping.<br /><br />If you use an antispam system which sends confirmation requests then please make sure you whitelist webmaster@openstreetmap.org as we are unable to reply to any confirmation requests." + success: "We've sent a new confirmation note to %{email} and as soon as you confirm your account you'll be able to get mapping.<br /><br />If you use an antispam system which sends confirmation requests then please make sure you whitelist %{sender} as we are unable to reply to any confirmation requests." failure: "User %{name} not found." confirm_email: heading: Confirm a change of email address @@ -2004,6 +2017,15 @@ en: no_authorization_code: No authorization code unknown_signature_algorithm: Unknown signature algorithm invalid_scope: Invalid scope + auth_association: + heading: Your ID is not associated with a OpenStreetMap account yet. + option_1: | + If you are new to OpenStreetMap, please create a new account + using the form below. + option_2: | + If you already have an account, you can login to your account + using your username and password and then associate the account + with your ID in your user settings. user_role: filter: not_an_administrator: "Only administrators can perform user role management, and you are not an administrator." @@ -2167,10 +2189,13 @@ en: center_marker: "Center map on marker" paste_html: "Paste HTML to embed in website" view_larger_map: "View Larger Map" + only_standard_layer: "Only the standard layer can be exported as an image" + embed: + report_problem: "Report a problem" key: title: "Map Key" tooltip: "Map Key" - tooltip_disabled: "Map Key available only for Standard layer" + tooltip_disabled: "Map Key not available for this layer" map: zoom: in: Zoom In @@ -2182,12 +2207,12 @@ en: standard: Standard cycle_map: Cycle Map transport_map: Transport Map - mapquest: MapQuest Open hot: Humanitarian layers: header: Map Layers notes: Map Notes data: Map Data + gps: Public GPS Traces overlays: Enable overlays for troubleshooting the map title: "Layers" copyright: "© <a href='%{copyright_url}'>OpenStreetMap contributors</a>" @@ -2228,6 +2253,9 @@ en: mapquest_car: "Car (MapQuest)" mapquest_foot: "Foot (MapQuest)" osrm_car: "Car (OSRM)" + mapzen_bicycle: "Bicycle (Mapzen)" + mapzen_car: "Car (Mapzen)" + mapzen_foot: "Foot (Mapzen)" directions: "Directions" distance: "Distance" errors: @@ -2236,11 +2264,21 @@ en: instructions: continue_without_exit: Continue on %{name} slight_right_without_exit: Slight right onto %{name} + offramp_right_without_exit: Take the ramp on the right onto %{name} + onramp_right_without_exit: Turn right on the ramp onto %{name} + endofroad_right_without_exit: At the end of the road turn right onto %{name} + merge_right_without_exit: Merge right onto %{name} + fork_right_without_exit: At the fork turn right onto %{name} turn_right_without_exit: Turn right onto %{name} sharp_right_without_exit: Sharp right onto %{name} uturn_without_exit: U-turn along %{name} sharp_left_without_exit: Sharp left onto %{name} turn_left_without_exit: Turn left onto %{name} + offramp_left_without_exit: Take the ramp on the left onto %{name} + onramp_left_without_exit: Turn left on the ramp onto %{name} + endofroad_left_without_exit: At the end of the road turn left onto %{name} + merge_left_without_exit: Merge left onto %{name} + fork_left_without_exit: At the fork turn left onto %{name} slight_left_without_exit: Slight left onto %{name} via_point_without_exit: (via point) follow_without_exit: Follow %{name} @@ -2252,6 +2290,11 @@ en: against_oneway_without_exit: Go against one-way on %{name} end_oneway_without_exit: End of one-way on %{name} roundabout_with_exit: At roundabout take exit %{exit} onto %{name} + turn_left_with_exit: At roundabout turn left onto %{name} + slight_left_with_exit: At roundabout slight left onto %{name} + turn_right_with_exit: At roundabout turn right onto %{name} + slight_right_with_exit: At roundabout slight right onto %{name} + continue_with_exit: At roundabout continue straight onto %{name} unnamed: "unnamed road" courtesy: "Directions courtesy of %{link}" time: "Time" diff --git a/config/locales/eo.yml b/config/locales/eo.yml index bcee5648c..62034ca63 100644 --- a/config/locales/eo.yml +++ b/config/locales/eo.yml @@ -2,7 +2,9 @@ # Exported from translatewiki.net # Export driver: phpyaml # Author: Airon90 +# Author: Bwildenhain.BO # Author: Cfoucher +# Author: Kastanoto # Author: KuboF # Author: Lucas # Author: Luckas @@ -10,6 +12,8 @@ # Author: Michawiki # Author: Objectivesea # Author: Petrus Adamus +# Author: Rafaneta +# Author: Robin van der Vliet # Author: Timsk # Author: Tradukisto # Author: Umbert' @@ -25,8 +29,8 @@ eo: changeset: Ŝanĝaro changeset_tag: Etikedo de ŝanĝaro country: Lando - diary_comment: Ä´urnala komento - diary_entry: Ä´urnala ero + diary_comment: Taglibra komento + diary_entry: Taglibra skribaĵo friend: Amiko language: Lingvo message: Mesaĝo @@ -36,22 +40,30 @@ eo: old_node: Malnova nodo old_node_tag: Etikedo de malnova nodo old_relation: Malnova rilato - old_way: Malnova vojo + old_relation_member: Ano de malnova rilato + old_relation_tag: Etikedo de malnova rilato + old_way: Malnova linio + old_way_node: Nodo de malnova linio + old_way_tag: Etikedo de malnova linio relation: Rilato - relation_tag: Rilatetikedo + relation_member: Ano de rilato + relation_tag: Etikedo de rilato session: Seanco trace: Spuro - tracepoint: Spurpunkto - tracetag: Spuretikedo + tracepoint: Spur-punkto + tracetag: Spur-etikedo user: Uzanto - user_preference: Uzantprefero - way: Vojo - way_node: Vojnodo - way_tag: Vojetikedo + user_preference: Agordoj de uzanto + user_token: Ä´etono de uzanto + way: Linio + way_node: Nodo de linio + way_tag: Etikedo de linio attributes: + diary_comment: + body: Enhavo diary_entry: user: Uzanto - title: Titolo + title: Temo latitude: Latitudo longitude: Longitudo language: Lingvo @@ -62,14 +74,15 @@ eo: user: Uzanto visible: Videbla name: Nomo - size: Grandeco + size: Grando latitude: Latitudo longitude: Longitudo public: Publika description: Priskribo message: sender: Sendinto - title: Titolo + title: Temo + body: Enhavo recipient: Ricevonto user: email: Retpoŝto @@ -79,132 +92,300 @@ eo: languages: Lingvoj pass_crypt: Pasvorto editor: + default: Implicita (nune %{name}) potlatch: name: Potlatch 1 - description: Potlatch 1 (redaktilo en TTT-legilo) + description: Potlatch 1 (en-foliumila redaktilo) + id: + name: iD + description: iD (en-foliumila redaktilo) potlatch2: name: Potlatch 2 - description: Potlatch 2 (redaktilo en TTT-legilo) + description: Potlatch 2 (en-foliumila redaktilo) remote: - name: Teleregilo + name: ekstera redaktilo + description: ekstera redaktilo (JOSM aÅ­ Merkaartor) browse: + created: Kreita + closed: Fermita + created_html: Kreita <abbr title='%{title}'>antaÅ­ %{time}</abbr> + closed_html: Fermita <abbr title='%{title}'>antaÅ­ %{time}</abbr> + created_by_html: Kreita <abbr title='%{title}'>antaÅ­ %{time}</abbr> de %{user} + deleted_by_html: Forigita <abbr title='%{title}'>antaÅ­ %{time}</abbr> de %{user} + edited_by_html: Ŝanĝita <abbr title='%{title}'>antaÅ­ %{time}</abbr> de %{user} + closed_by_html: Fermita <abbr title='%{title}'>antaÅ­ %{time}</abbr> de %{user} + version: Versio + in_changeset: Ŝanĝaro + anonymous: anonimulo + no_comment: (nenia komento) + part_of: Parto de + download_xml: Elŝuti XML + view_history: Vidi historion + view_details: Montri detalojn + location: 'Pozicio:' changeset: - title: Ŝanĝaro + title: 'Ŝanĝaro: %{id}' + belongs_to: AÅ­toro + node: Nodoj (%{count}) + node_paginated: Nodoj (%{x}-%{y} el %{count}) + way: Linioj (%{count}) + way_paginated: Linioj (%{x}-%{y} el %{count}) + relation: Rilatoj (%{count}) + relation_paginated: Rilatoj (%{x}-%{y} el %{count}) + comment: Komentoj (%{count}) + hidden_commented_by: Kaŝita komento de %{user} <abbr title='%{exact_time}'>deantaÅ­ + %{when}</abbr> + commented_by: Komento de %{user} <abbr title='%{exact_time}'>deantaÅ­ %{when}</abbr> changesetxml: Ŝanĝaro XML osmchangexml: osmŜanĝo XML feed: title: Ŝanĝaro %{id} title_comment: Ŝanĝaro %{id} - %{comment} + join_discussion: Ensalutu por diskuti + discussion: Diskuto + node: + title: 'Nodo: %{name}' + history_title: 'Historio de nodo: %{name}' + way: + title: 'Linio: %{name}' + history_title: 'Historio de linio: %{name}' + nodes: Nodoj + also_part_of: + one: parto de linio %{related_ways} + other: parto de linioj %{related_ways} + relation: + title: 'Rilato: %{name}' + history_title: 'Historio de rilato: %{name}' + members: Anoj relation_member: entry_role: '%{type} %{name} kiel %{role}' type: node: Nodo - way: Vojo + way: Linio relation: Rilato containing_relation: entry: Rilato %{relation_name} entry_role: Rilato %{relation_name} (kiel %{relation_role}) not_found: - sorry: BedaÅ­rinde, la %{type} kun id %{id}, ne troveblas. + sorry: BedaÅ­rinde, la %{type} kun id %{id} ne troveblas. type: node: nodo - way: vojo + way: linio relation: rilato changeset: ŝanĝaro + note: rimarko timeout: sorry: BedaÅ­rinde, la datumoj por la %{type} kun la identigilo %{id} alvenis tro malrapide. type: node: nodo - way: vojo + way: linio relation: rilato changeset: ŝanĝaro + note: rimarko redacted: redaction: Redakto %{id} - message_html: Ne eblas montri la version %{version} de tiu ĉi %{type} ĉar ĝi - estas redaktita. Vidu %{redaction_link} por pli da detaloj. + message_html: La versio %{version} de ĉi tiu %{type} ne montreblas, ĉar ĝi estis + redaktita. Vidu %{redaction_link} por pli da detaloj. type: node: nodo - way: vojo + way: linio relation: rilato start_rjs: + feature_warning: Ŝarĝanta %{num_features} objektojn, kiuj povas igi vian foliumilon + malrapida aÅ­ nerespondebla. Ĉu vi certe volas montri ĉi tiujn datumojn? load_data: Elŝuti datumojn - loading: Ŝarĝante... + loading: Ŝargado... tag_details: - tags: 'Etikedoj:' + tags: Etikedoj + wiki_link: + key: La viki-paĝo priskribanta la etikedon '%{key}' + tag: La viki-paĝo priskribanta la etikedon '%{key}=%{value}' + wikidata_link: La %{page} elemento en Vikidatumoj wikipedia_link: La artikolo %{page} en Vikipedio + telephone_link: Telefoni %{phone_number} note: - title: Noto - description: 'Priskribo:' + title: 'Rimarko: %{id}' + new_note: Nova rimarko + description: Priskribo + open_title: 'Nesolvita rimarko #%{note_name}' + closed_title: 'Solvita rimarko #%{note_name}' + hidden_title: 'Kaŝita rimarko #%{note_name}' + open_by: Kreita de %{user} <abbr title='%{exact_time}'>antaÅ­ %{when}</abbr> + open_by_anonymous: Kreita de anonimulo <abbr title='%{exact_time}'>antaÅ­ %{when}</abbr> + commented_by: Komento de %{user} <abbr title='%{exact_time}'>deantaÅ­ %{when}</abbr> + commented_by_anonymous: Komenta anonima <abbr title='%{exact_time}'>deantaÅ­ + %{when}</abbr> + closed_by: Solvita de %{user} <abbr title='%{exact_time}'>antaÅ­ %{when}</abbr> + closed_by_anonymous: Solvita de anonimulo <abbr title='%{exact_time}'>antaÅ­ + %{when}</abbr> + reopened_by: Re-malfermita de %{user} <abbr title='%{exact_time}'>antaÅ­ %{when}</abbr> + reopened_by_anonymous: Re-malfermita de anonimulo <abbr title='%{exact_time}'>antaÅ­ + %{when}</abbr> + hidden_by: Kaŝita de %{user} <abbr title='%{exact_time}'>antaÅ­ %{when}</abbr> + query: + title: Informoj pri objektoj + introduction: Alklaku la mapon por trovi proksimajn objektojn. + nearby: Proksimaj objektoj + enclosing: ĈirkaÅ­aj objektoj changeset: changeset_paging_nav: showing_page: Paĝo %{page} - next: Sekvanta » + next: Sekva » previous: « AntaÅ­a changeset: - anonymous: Anonima + anonymous: Anonimulo no_edits: (neniaj redaktoj) + view_changeset_details: Vidi detaloj pri ŝanĝaro changesets: id: ID - saved_at: Konservita la + saved_at: Konservita je user: Uzanto comment: Komento area: Areo list: + title: Ŝanĝaroj + title_user: Ŝanĝaroj de %{user} title_friend: Ŝanĝaroj de viaj amikoj - title_nearby: Ŝanĝaroj de proksimaj uzuloj + title_nearby: Ŝanĝaroj de proksimaj uzantoj + empty: Neniaj ŝanĝaroj trovitaj. + empty_area: Neniaj ŝanĝaroj en ĉi tiu areo. + empty_user: Neniaj ŝanĝaroj de ĉi tiu uzanto. + no_more: Neniaj pliaj ŝanĝaroj trovitaj. + no_more_area: Neniaj pliaj ŝanĝaroj en ĉi tiu areo. + no_more_user: Neniaj pliaj ŝanĝaroj de ĉi tiu uzanto. + load_more: Legi pli timeout: - sorry: Pardonu; daÅ­ris tro longe kompili la petitan liston de ŝanĝaroj. + sorry: BedaÅ­rinde, daÅ­ris tro longe kompili la petitan liston de ŝanĝaroj. + rss: + title_all: Diskuto pri OpenStreetMap ŝanĝaro + title_particular: 'Diskuto pri ŝanĝaro #%{changeset_id}' + comment: 'Nova komento de %{author} al ŝanĝaro #%{changeset_id}' + commented_at_html: Ĝisdatiga antaÅ­ %{when} + commented_at_by_html: Ĝisdatigita antaÅ­ %{when} de %{user} + full: Tuta diskuto diary_entry: new: - title: Nova taglibra ero + title: Nova taglibra afiŝo + publish_button: Publiki list: - title: Uzantĵurnaloj + title: Taglibroj de uzantoj title_friends: Taglibroj de amikoj - user_title: Ä´urnalo de %{user} - older_entries: Pli malnovaj enskriboj - newer_entries: Pli novaj enskriboj + title_nearby: Taglibroj de proksimaj uzantoj + user_title: Taglibro de %{user} + in_language_title: Taglibraj afiŝoj en %{language} + new: Nova taglibra afiŝo + new_title: Kreu novan afiŝon en vian uzant-taglibro + no_entries: Neniuj taglibraj afiŝoj + recent_entries: Lastaj taglibraj afiŝoj + older_entries: Pli malnovaj afiŝoj + newer_entries: Pli novaj afiŝoj edit: + title: Redakti taglibran afiŝon + subject: 'Temo:' + body: 'Enhavo:' language: 'Lingvo:' location: 'Loko:' latitude: 'Latitudo:' longitude: 'Longitudo:' use_map_link: uzi mapon save_button: Konservi + marker_text: Kie krei la afiŝon view: - title: Uzantĵurnaloj | %{user} - user_title: Ä´urnalo de %{user} + title: Taglibro de %{user} | %{title} + user_title: Taglibro de %{user} leave_a_comment: Komenti + login_to_leave_a_comment: '%{login_link} por aldoni komenton' login: Ensaluti save_button: Konservi + no_such_entry: + title: Ĉi tiu taglibra afiŝo ne ekzistas + heading: 'Nenia afiŝo kun la identigilo: %{id}' + body: BedaÅ­rinde, ne ekzistas taglibra afiŝo kun la identigilo %{id}. Bonvolu + kontroli pri liter-eraroj, aÅ­ eble vi alklakis mis-ligilon. diary_entry: + posted_by: Publikigita de %{link_user} je %{created} en %{language_link} + comment_link: Komenti pri ĉi tiu afiŝo + reply_link: Respondi al ĉi tiu afiŝo comment_count: one: '%{count} komento' zero: Sen komentoj other: '%{count} komentoj' edit_link: Redakti ĉi tiun enskribon + hide_link: Kaŝi ĉi tiu afiŝon confirm: Konfirmi diary_comment: - hide_link: KaÅ¡i ĉi tiun komenton + comment_from: Komento de %{link_user} je %{comment_created_at} + hide_link: Kaŝi ĉi tiun komenton confirm: Konfirmi + location: + location: 'Loko:' + view: Montri + edit: Redakti + feed: + user: + title: OpenStreetMap taglibraj afiŝoj de %{user} + description: Lastaj OpenStreetMap taglibraj afiŝoj de %{user} + language: + title: OpenStreetMap-aj taglibraj afiŝoj en %{language_name} + description: Lastaj taglibraj afiŝoj de OpenStreetMap-uzantoj en %{language_name} + all: + title: OpenStreetMap taglibraj afiŝoj + description: Lastaj taglibraj afiŝoj de OpenStreetMap-uzantoj + comments: + has_commented_on: '%{display_name} komentis pri la jenaj taglibraj afiŝoj' + post: Afiŝi + when: Kiam + comment: Komento + ago: antaÅ­ %{ago} + newer_comments: Novaj komentoj + older_comments: Malnovaj komentoj export: + title: Elporti start: - area_to_export: Eksportonta areo - manually_select: Mane elekti alian aeron. - format_to_export: Formato por Eksportado + area_to_export: Elportonta areo + manually_select: Permane elektu alian areon. + format_to_export: Elport-formo osm_xml_data: XML datumoj de OpenStreetMap + map_image: Bildo de mapo (norma tavolo) + embeddable_html: Enkorpigebla HTML licence: Permesilo - options: Opcioj - format: Formato + export_details: OpenStreetMap-datumoj estas disponeblaj laÅ­ la permesilo <a + href="http://opendatacommons.org/licenses/odbl/1.0/">Open Data Commons Open + Database License</a> (ODbL). + too_large: + advice: 'Se la elportado malsukcesis, bonvolu uzi unu el jenaj fontoj:' + body: La elektita areo estas tro granda por esti elportita kiel XML-datumojn + de OpenStreetMap. Bonvolu pligrandigi aÅ­ elekti malpli grandan areon, aÅ­ + uzi unu el sekvaj fontoj por amasa datum-elportado. + planet: + title: Planedo OSM + description: Ofte-ĝisdatigataj kopioj de plena OpenStreetMap datumbazo + overpass: + title: Overpass API + description: Elŝutas ĉi tiun areon de spegulkopio de OpenStreetMap datumbazo + geofabrik: + title: Elŝuti el Geofabrik + description: Ofte-ĝisdatigataj eltiraĵoj de kontinentoj, landoj, kaj elektitaj + urboj + metro: + title: Metro-eltiraĵoj + description: Eltiraĵoj de ĉefaj mondaj urboj kaj iliaj ĉirkaÅ­aĵoj + other: + title: Aliaj fontoj + description: Aliaj fontoj enlistigitaj ĉe OpenStreetMap-vikio + options: Elektebloj + format: Formo scale: Skalo max: maks image_size: Bildamplekso - zoom: Zomi + zoom: Pligrandigi add_marker: Aldoni markon al la mapo latitude: 'Lat:' longitude: 'Lon:' output: Eliro - export_button: Eksporti + paste_html: Engluu HTML-kodon al via retpaĝo + export_button: Elporti geocoder: search: title: @@ -216,244 +397,1103 @@ eo: osm_nominatim: Rezultoj el <a href="http://nominatim.openstreetmap.org/">OpenStreetMap Nominatim</a> geonames: Rezultoj el <a href="http://www.geonames.org/">GeoNames</a> + osm_nominatim_reverse: Rezultoj el <a href="http://nominatim.openstreetmap.org/">OpenStreetMap + Nominatim</a> + geonames_reverse: Rezultoj el <a href="http://www.geonames.org/">GeoNames</a> search_osm_nominatim: prefix: + aerialway: + cable_car: Telfero unu-vagoneta + chair_lift: Telfero seĝa + drag_lift: Skitelfero + gondola: Telfero plur-vagoneta + station: Kablovoja stacio + aeroway: + aerodrome: Aerodromo + apron: Aviadil-parkumejo + gate: Pordego + helipad: Surteriĝejo helikoptera + runway: Avia dromo + taxiway: AÅ­tokur-strato + terminal: Flugstacio amenity: - bank: Banko - bar: Bufedo - bus_station: Bus-stacio + animal_shelter: Azilo por bestoj + arts_centre: Belart-centro + atm: BankaÅ­tomato + bank: Bankejo + bar: Drinkejo + bbq: Rostilo + bench: Benko + bicycle_parking: Parkumejo bicikla + bicycle_rental: Bicikl-pruntejo + biergarten: Bierĝardeno + boat_rental: Boat-pruntejo + brothel: Putinejo + bureau_de_change: Monŝanĝejo + bus_station: AÅ­tobus-stacio cafe: Kafejo car_rental: AÅ­tomobil-pruntejo + car_sharing: AÅ­to-pruntejo komunuma (organizita kunveturado) car_wash: AÅ­topurigejo casino: Kazino + charging_station: Ŝargstacio + childcare: Prizorgejo pri infanoj cinema: Kinejo - clinic: Kliniko - club: Klubo - dentist: Dentisto - embassy: Ambasadorejo + clinic: Kuracistejo + clock: Horloĝo + college: Kolegio + community_centre: Komunuma centro + courthouse: Juĝdomo + crematorium: Kadavro-bruligejo + dentist: Dentistejo + doctors: Kabineto de kuracisto + dormitory: Studenthejmo + drinking_water: Trinkakvejo + driving_school: Stirlernejo + embassy: Ambasadejo + emergency_phone: Alarma telefono + fast_food: Rapidmanĝejo + ferry_terminal: Pramstacio + fire_hydrant: Hidranto + fire_station: Fajrobribadejo + food_court: Manĝo-bazaro fountain: Fontano - hospital: Hostpitalo - hotel: Hotelo - library: Libraro + fuel: Benzinejo + gambling: Hazardludejo + grave_yard: Tombejo ĉirkaÅ­preĝeja + gym: Ripoz-gimnastika centro + health_centre: Medicina centro + hospital: Malsanulejo + hunting_stand: Altembusko ĉasada + ice_cream: Glaciaĵejo + kindergarten: Infanĝardeno + library: Biblioteko market: Bazaro - nightclub: Nokta klubo - park: Parko + marketplace: Bazaro + monastery: MonaÄ¥ejo + motorcycle_parking: Parkumejo motorcikla + nightclub: Noktoklubejo + nursery: Infanejo + nursing_home: Domo de permanenta zorgado + office: Oficejo + parking: Parkumejo + parking_entrance: Enveturejo al parkumejo pharmacy: Apoteko - police: Polico + place_of_worship: Preĝejo + police: Policejo + post_box: Poŝtkesto + post_office: Poŝtoficejo + preschool: Infanejo prison: Malliberejo + pub: Taverno + public_building: Konstruaĵo publika + reception_area: Atendejo + recycling: Recikligejo restaurant: Restoracio + retirement_home: Maljunulejo + sauna: Ŝvitbanejo school: Lernejo + shelter: Ŝirmejo shop: Vendejo - supermarket: Superbazaro + shower: Duŝejo + social_centre: Centro de socio + social_club: Socia klubejo + social_facility: Socia servejo + studio: Studio + swimming_pool: Naĝejo + taxi: Taksistacio telephone: Publika telefono theatre: Teatro + toilets: Necesejo + townhall: Urbodomo university: Universitato - wifi: WiFi-atingo + vending_machine: Vendilo + veterinary: Bestokuracistejo + village_hall: Komunuma centro (vilaĝo) + waste_basket: Rubujo + waste_disposal: Rubujego + youth_centre: Junulara centro boundary: + administrative: Administra limo + census: Popolnombrada limo national_park: Nacia parko + protected_area: Naturprotektejo bridge: aqueduct: Akvedukto + suspension: Pendoponto + swing: Ponto turnebla viaduct: Viadukto "yes": Ponto building: "yes": Konstruaĵo + craft: + brewery: Bierfarejo + carpenter: Ĉarpentistejo + electrician: Elektristejo + gardener: Ĝardenistejo + painter: Farbistejo + photographer: Fotistejo + plumber: Tubistejo + shoemaker: Ŝuistejo + tailor: Tajlorejo + "yes": Metiejo + emergency: + ambulance_station: Ambulanca stacio + defibrillator: Defibrililo + landing_site: Surteriĝejo en urĝo + phone: Alarma telefono highway: - bus_stop: Bus-haltejo - path: Vojo - primary_link: Strato de unua ordo + abandoned: Forlasita vojo + bridleway: Ĉevalvojo + bus_guideway: AÅ­tobus-trako + bus_stop: Haltejo aÅ­tobusa + construction: Vojo konstruata + cycleway: Bicikovojo + elevator: Lifto + emergency_access_point: Vivsava rekonebla signo + footway: Piedvojeto + ford: Travadejo + living_street: Ĉedoma strato + milestone: Mejloŝtono + motorway: AÅ­tovojo + motorway_junction: Elveturejo el aÅ­tovojo + motorway_link: Ligilo al aÅ­tovojo + path: Vojeto + pedestrian: Piedirada strato + platform: Haltejo + primary: Vojo unua-ranga + primary_link: Ligilo al vojo unua-ranga + proposed: Vojo proponita + raceway: Vojo por aÅ­tokonkursado + residential: Vojo loka + rest_area: Servejo de vojaĝantoj road: Vojo + secondary: Vojo dua-ranga + secondary_link: Ligilo al vojo dua-ranga + service: Vojo alira + services: Servejo de vojaĝantoj + speed_camera: Rapid-kontrolilo + steps: Ŝtuparo + street_lamp: Stratlampo + tertiary: Vojo tria-ranga + tertiary_link: Ligilo al vojo tria-ranga + track: Vojo kampa + traffic_signals: Trafiklumoj + trail: Kurso + trunk: Vojo ekspresa + trunk_link: Ligilo al vojo ekspresa + unclassified: Vojo kvara-ranga + unsurfaced: Ligilo al vojo kvara-ranga + "yes": Vojo historic: + archaeological_site: ArÄ¥eologia ejo + battlefield: Batalejo historia + boundary_stone: Limŝtono + building: Konstruaĵo historia + bunker: Bunkro armea + castle: Kastelo + church: Kirko + city_gate: Pordego urba + citywalls: Muro urba + fort: Fortikaĵo + heritage: Heredaĵa objekto/ejo house: Domo + icon: Ikono + manor: Palaceto historia + memorial: Memorigaĵo (eta monumento) + mine: Minejo monument: Monumento - museum: Muzeo + roman_road: Romia ŝoseo + ruins: Ruinoj historiaj + stone: Ŝtonego historia + tomb: Tombo tower: Turo + wayside_cross: Krucifikso apudvoja + wayside_shrine: Adorejo apudvoja + wreck: Ruinoj de ŝipo + junction: + "yes": Vojkruciĝo landuse: + allotments: Familiaj ĝardenoj + basin: Baseno + brownfield: AntaÅ­-konstruejo (post-malkonstruado) + cemetery: Tombejo + commercial: Oficeja tereno + conservation: Natur-konservejo + construction: Konstruejo + farm: Farmejo + farmland: Agrokultura tereno + farmyard: Farmkorto + forest: Kultiv-arbaro + garages: Garaĝaro + grass: Herbotapiŝo + greenfield: AntaÅ­-konstruejo (virga) + industrial: Industria tereno + landfill: Rubodeponejo + meadow: Kultiv-herbejo + military: Armea tereno mine: Minejo - park: Parko + orchard: Fruktoĝardeno + quarry: Minejo subĉiela railway: Fervojo - wood: Arbaro + recreation_ground: Ripoza tereno + reservoir: Lago artefarita + reservoir_watershed: Baseno artefarita + residential: Privatdoma tereno + retail: Komercejo + road: Tereno de vojoj + village_green: Verda tereno + vineyard: Vinberĝardeno + "yes": Utilkampo + leisure: + beach_resort: Apudmara ripoz-centro + bird_hide: Bird-observejo + club: Klubejo + common: Publika ripoza tereno + dog_park: Hund-parko + fishing: Fiŝkaptadejo + fitness_centre: Ripoz-gimnastika centro + fitness_station: Ekzerco-parko + garden: Ĝardeno + golf_course: Golfludejo + horse_riding: Rajdadejo + ice_rink: Glitkurejo + marina: JaÄ¥t-haveno + miniature_golf: Minigolfludejo + nature_reserve: Naturrezervejo + park: Parko + pitch: Ludkampo + playground: Infana ludejo + recreation_ground: Ripoza tereno + resort: Turisma centro + sauna: Ŝvitbanejo + slipway: Ŝipglitejo + sports_centre: Sporta centro + stadium: Stadiono + swimming_pool: Naĝejo + track: Kurejo + water_park: Akvoparko + "yes": Ripozejo + man_made: + lighthouse: Lumturo + pipeline: Tubolinio + tower: Turo + works: Fabriko + "yes": Artefarita objekto + military: + airfield: Aerbazo armea + barracks: Soldatejo + bunker: Bunkro armea + mountain_pass: + "yes": Montpasejo natural: + bay: Golfo + beach: Sablobordo + cape: Promontoro + cave_entrance: Enirejo al kaverno + cliff: Klifo + crater: Kratero + dune: Sablomonto + fell: Alpo fjord: Fjordo forest: Arbaro + geyser: Gejsero + glacier: Glacirivero + grassland: Herbejo + heath: Erikejo hill: Monteto island: Insulo - land: Lando - river: Rivero + land: Tero + marsh: Aluvia grundo + moor: Arbustetaro + mud: Kotejo + peak: Montpinto + point: Punkto + reef: Rifo + ridge: Montokresto + rock: Roko + saddle: Sela punkto (intermonto) + sand: Sabla tereno + scree: Rokfalaĵo + scrub: Arbustaro + spring: Akvofonto + stone: Roko + strait: Markolo tree: Arbo + valley: Valo volcano: Vulkano - water: Akvo + water: Akvujo + wetland: Malsekejo + wood: Arbaro + office: + accountant: Oficejo de kontisto + administrative: Administra oficejo + architect: Oficejo de arÄ¥itekturisto + company: Oficejo de firmao + employment_agency: Dungoficejo + estate_agent: Oficejo de nemoveblaĵisto + government: Registara oficejo + insurance: Asekurkompaniejo + lawyer: Oficejo de leĝisto + ngo: Oficejo de ne-registara organizaĵo + telecommunication: Telekomunikada oficejo + travel_agent: Vojaĝ-oficejo + "yes": Oficejo place: + allotments: Familiaj ĝardenoj + block: Bloko + airport: Flughaveno city: Urbego country: Lando + county: Distrikto farm: Farmobieno + hamlet: Vilaĝeto house: Domo houses: Domoj + island: Insulo + islet: Insuleto + isolated_dwelling: Solstaranta domo + locality: Ejo + moor: Arbustetaro + municipality: Municipo + neighbourhood: Najbaraĵo + postcode: Poŝtkodo region: Regiono sea: Maro - state: Ŝtato + state: Provinco + subdivision: Kvartalo + suburb: Suburbo town: Urbo + unincorporated_area: Ekstermunicipa tereno + village: Vilaĝo + "yes": Ejo railway: + abandoned: Eksa fervojlinio + construction: Fervojlinio konstruata + disused: Forlasita fervojlinio + disused_station: Forlasita stacio fervoja + funicular: Funikularo + halt: Haltejo fervoja + historic_station: Fervoja stacidomo historia + junction: Fervojnodo + level_crossing: Traknivela pasejo (vojo) + light_rail: Fervojo malpeza + miniature: Miniatura fervojo + monorail: Fervojo unurela + narrow_gauge: Fervojo etŝpura + platform: Kajo fervoja + preserved: Fervojo historia + proposed: Fervojo proponita + spur: Branĉtrako + station: Stacidomo fervoja + stop: Haltejo fervoja + subway: Metroo + subway_entrance: Metro-enirejo + switch: Trakforko tram: Tramlinio - tram_stop: Tram-haltejo + tram_stop: Haltejo trama shop: + alcohol: Alkohol-vendejo + antiques: Antikvaĵ-vendejo + art: Artaĵ-vendejo + bakery: Panejo + beauty: Beligejo + beverages: Trinkaĵ-vendejo + bicycle: Bicikl-vendejo books: Libro-vendejo + boutique: Galanterio + butcher: Viand-vendejo + car: AÅ­tomobil-vendejo + car_parts: AÅ­tomobil-parta vendejo + car_repair: AÅ­toriparejo + carpet: Tapiŝ-vendejo + charity: Almoza vendejo + chemist: Drogejo + clothes: Vesto-vendejo computer: Komputil-vendejo - hifi: Hi-Fi + confectionery: Sukeraĵejo + convenience: Butiko oportuna + copyshop: Fotokopiilejo + cosmetics: Kosmetikaĵ-vendejo + deli: Delikataĵ-vendejo + department_store: Ĉiovendejo + discount: Vendejo kun rabatitaj artikoloj + doityourself: Memfaradil-vendejo + dry_cleaning: Vestaĵ-lavejo (nepolara solvilo) + electronics: Elektronik-vendejo + estate_agent: Oficejo de nemoveblaĵisto + farm: Terfrukt-vendejo + fashion: Mod-butiko + fish: Marfrukt-vendejo + florist: Florvendejo + food: Manĝovendejo + funeral_directors: Tombistejo + furniture: Mebl-vendejo + gallery: Artaĵ-vendejo + garden_centre: Ĝarden-vendejaro + general: Ĝeneral-vendejo + gift: Suvenir-vendejo + greengrocer: Legom-butiko + grocery: Manĝovendejo + hairdresser: Frizejo + hardware: Il-vendejo + hifi: Altfidel-son-vendejo + insurance: Asekurkompaniejo + jewelry: Juvel-vendejo + kiosk: Kiosko + laundry: Vestaĵ-lavejo (akvo) + mall: Vendejaro + market: Bazaro + mobile_phone: Poŝtelefon-vendejo + motorcycle: Motorcikl-vendejo music: Muzik-vendejo + newsagent: Gazet-vendejo + optician: Optikbutiko + organic: Ekologi-manĝaĵa vendejo + outdoor: Vojaĝil-vendejo + pet: Dombest-vendejo + pharmacy: Apoteko + photo: Fotovendejo + salon: Beligejo + second_hand: Brokantejo + shoes: Ŝuo-vendejo + shopping_centre: Vendejaro + sports: Sportovendejo + stationery: Papervaro-vendejo + supermarket: Superbazaro + tailor: Tajlorejo + toys: Ludil-vendejo + travel_agency: Vojaĝ-oficejo + video: Filmovendejo + wine: Alkohol-vendejo + "yes": Vendejo tourism: + alpine_hut: Montara kabano + apartment: Apartamento feria + artwork: Artverko + attraction: Atrakcio + bed_and_breakfast: Pensiono 'tranokti k matenmanĝi' + cabin: Kabano + camp_site: Kampadejo + caravan_site: Kampadveturil-parkumejo + chalet: Dometo feria + gallery: Artgalerio + guest_house: Pensiono + hostel: Gastejo + hotel: Hotelo + information: Informejo + motel: AÅ­tohotelo museum: Muzeo + picnic_site: Piknika ejo + theme_park: Amuzparko + viewpoint: Belvidejo + zoo: Bestoĝardeno + tunnel: + culvert: Subvoja konduktilo + "yes": Tunelo + waterway: + artificial: Akvovojo artefarita + boatyard: Ŝipkonstruejo + canal: Akvovojo + dam: Akvobaraĵo + derelict_canal: Akvovojo neuzata + ditch: Fosaĵeto defluiga + dock: Doko + drain: Fosaĵo defluiga + lock: Kluzo (baseno) + lock_gate: Kluzo (pordego) + mooring: Ŝipaligejo (konstruaĵo) + rapids: Rivero rapida + river: Rivero + stream: Rivereto + wadi: Rivero sezona + waterfall: Akvofalo + weir: Riversojlo + "yes": Akvovojo + admin_levels: + level2: Limo de lando (niv.2) + level4: Limo de provinco (niv.4) + level5: Limo de regiono (niv.5) + level6: Limo de distrikto (niv.6) + level8: Limo de urbo (niv.8) + level9: Limo de kvartalo (niv.9) + level10: Limo de subkvartalo (niv.10) description: title: osm_nominatim: Loko el <a href="http://nominatim.openstreetmap.org/">OpenStreetMap Nominatim</a> geonames: Loko el <a href="http://www.geonames.org/">GeoNames</a> types: - cities: Grandurboj + cities: Urbegoj towns: Urboj places: Lokoj results: no_results: Neniu rezulto trovita - distance: - one: ĉirkaÅ­ 1km - zero: malpi ol 1km - other: ĉirkaÅ­ %{count}km - direction: - south_west: sudokcidento - south: sudo - south_east: sudoriento - east: oriento - north_east: nordoriento - north: nordo - north_west: nordokcidento - west: okcidento + more_results: Pliaj rezultoj layouts: logo: alt_text: Emblemo de OpenStreetMap - home: hejmo - logout: elsaluti - log_in: ensaluti + home: Iri al la hejmloko + logout: Elsaluti + log_in: Ensaluti log_in_tooltip: Ensaluti kun ekzistanta konto - sign_up: aliĝi + sign_up: Registriĝi + start_mapping: Ekigi mapigadon sign_up_tooltip: Krei konton por redaktado edit: Redakti history: Historio - export: Eksporti - gps_traces: GPS spuroj + export: Elporti + data: Datumoj + export_data: Elporti datumojn + gps_traces: GPS-spuroj gps_traces_tooltip: Manipuli la GPS-spurojn - user_diaries: Uzantĵurnaloj - user_diaries_tooltip: Vidi uzantĵurnalojn - tag_line: La libera vikia mondmapo - donate: Subtenu OpenStreetMap %{link} al Fonduso de Ĝisdatigo de Aparataro. + user_diaries: Taglibroj de uzantoj + user_diaries_tooltip: Esplori taglibrojn de uzantoj + edit_with: Redakti per %{editor} + tag_line: La libera viki-mondmapo + intro_header: Bonvenon al OpenStreetMap! + intro_text: OpenStreetMap estas mapo de la mondo, kreata de homoj kiel vi, kaj + libere uzebla laÅ­ malferma permesilo. + intro_2_create_account: Krei konton + partners_html: Retgastigo estas liverata de %{ucl}, %{ic}, %{bytemark} kaj aliaj + %{partners}. + partners_ucl: la centro UCL VR + partners_ic: Imperial College London + partners_bytemark: Bytemark Hosting + partners_partners: kunlaborantoj + osm_offline: La OpenStreetMap-datumbazo estas nuntempe nealireabla pro necesaj + laboroj de prizorgado. + osm_read_only: La OpenStreetMap-datumbazo estas nuntempe nurlega pro necesaj laboroj + de prizorgado. + donate: Subteni OpenStreetMap %{link} al fonduso por modernigi aparataron. + help: Helpo + about: Pri + copyright: Kopirajto + community: Komunumo + community_blogs: Taglibroj de komunumo + community_blogs_title: Taglibroj de anoj de OpenStreetMap-komunumo + foundation: Fondaĵo + foundation_title: La OpenStreetMap Fondaĵo make_a_donation: title: Subteni OpenStreetMap per mondonaco text: Donaci + learn_more: Lerni pli + more: Pli license_page: foreign: title: Pri ĉi tiu traduko + text: Se okazus konflikto inter ĉi tiu tradukita paĝo kaj %{english_original_link}, + la angla paĝo estas preferata. + english_link: la originalo en la angla + native: + title: Pri ĉi tiu paĝo + text: Vi legas la anglan version de paĝo pri kopirajto. Vi povas reveni al la + %{native_link} de ĉi tiu paĝo aÅ­ vi povas ĉesi legi pri kopirajto kaj %{mapping_link}. + native_link: Esperanta versio + mapping_link: ekigi mapigadon + legal_babble: + title_html: Kopirajto kaj permesilo + intro_1_html: |- + OpenStreetMap<sup><a href="#trademarks">®</a></sup> estas projekto de <i>malfermaj datumoj</i> eldonita sub la permesilo <a + href="http://opendatacommons.org/licenses/odbl/">Open Data + Commons Open Database License</a> (ODbL) de la <a + href="http://osmfoundation.org/">OpenStreetMap Fondaĵo</a> (OSMF). + intro_2_html: Vi rajtas kopii, disdoni, transdoni kaj modifi niajn datumojn, + nur se vi atribuos aÅ­torecon al OpenStreetMap kaj ĝiaj kontribuintoj. Se vi + modifos aÅ­ uzos niajn datumojn, vi povos distribui la verkon laÅ­ la sama permesilo. + La plena <a href="http://opendatacommons.org/licenses/odbl/1.0/">interkonsento + de uzado</a> klarigas viajn rajtojn kaj devojn. + intro_3_html: |- + La kartografio de niaj map-kaheloj kaj nia dokumentaro estas disponeblaj laÅ­ la permesilo <a href="https://creativecommons.org/licenses/by-sa/2.0/deed.eo">Creative + Commons Atribuite-Samkondiĉe 2.0</a> (CC BY-SA). + credit_title_html: Kiel atribui aÅ­torecon + credit_1_html: 'Ni postulas, ke vi markos: “© Kontribuintoj de OpenStreetMap”.' + credit_2_html: Vi ankaÅ­ devas klarigi, ke datumoj estas disponeblaj laÅ­ la permesilo + Open Database License, kaj kartografio de map-kaheloj laÅ­ la permesilo CC + BY-SA. Vi povas indiki tion per fari ligilon al <a href="http://www.openstreetmap.org/copyright">ĉi + tiu paĝo pri permesilo</a>. Alimaniere, se vi distribuas OSM en datuma formo, + vi povas mencii nomo(j)n kaj ligilo(j)n al la permesilo(j). Se ne estas eble + meti ligilojn (ekz. en paperaj mapoj), ni sugestas direkti viajn legantojn + al openstreetmap.org (eble meti plenan retadreson), al opendatacommons.org + kaj (se necesas) al creativecommons.org. + credit_3_html: |- + En esploreblaj elektronikaj mapoj, la aÅ­torecon povas esti montrata ĉe la angulo de mapo. + Ekzemplo: + attribution_example: + alt: Ekzemplo kiel atribui OpenStreetMap sur retpaĝo + title: Ekzemplo de aÅ­torec-atribuado + more_title_html: Sciigi pli + more_1_html: |- + Legu pli pri uzado de niaj datumoj kaj kiel atribui aÅ­torecon je la <a + href="http://osmfoundation.org/Licence">retpaĝo de OSMF permesilo</a> kaj je la <a + href="https://wiki.openstreetmap.org/wiki/Eo:Legal_FAQ">paĝo de oftaj demandoj pri leĝo</a>. + more_2_html: Kvankam la datumoj de OpenStreetMap estas liberaj, ni ne povas + liveri senpagan API-on por eksteraj programistoj. Legu nian <a href="https://operations.osmfoundation.org/policies/api/">politikon + pri uzado de API</a>, <a href="https://operations.osmfoundation.org/policies/tiles/">politikon + pri uzado de kaheloj</a> kaj <a href="https://operations.osmfoundation.org/policies/nominatim/">poltikon + pri uzado de Nominatim</a>. + contributors_title_html: Kunlaborantoj + contributors_intro_html: 'Niaj kunlaborantoj estas miloj da homoj. Ni ankaÅ­ + inkludas datumoj laÅ­ malferma permesilo el landaj kartografiaj organizaĵoj + kaj el aliaj fontoj, inter ili:' + contributors_at_html: |- + <strong>AÅ­strujo</strong>: enhavas datumojn el <a href="http://data.wien.gv.at/">Stadt Wien</a> (sub <a href="http://creativecommons.org/licenses/by/3.0/at/deed.eo">CC BY</a>), + <a href="http://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm">Land Vorarlberg</a> kaj + Land Tirol (sub <a href="http://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/">CC BY AT kun postaj ŝanĝoj</a>). + contributors_ca_html: |- + <strong>Kanado</strong>: enhavas datumojn el + GeoBase®, GeoGratis (© Department of Natural + Resources Canada), CanVec (© Department of Natural + Resources Canada), kaj StatCan (Geography Division, + Statistics Canada). + contributors_fi_html: |- + <strong>Suomujo</strong>: enhavas datumojn el + National Land Survey of Finland's Topographic Database kaj aliaj fontoj, laÅ­ la <a href="http://www.maanmittauslaitos.fi/en/NLS_open_data_licence_version1_20120501">NLSFI permesilo</a>. + contributors_fr_html: '<strong>Francujo</strong>: enhavas datumojn ricevitajn + el ''Direction Générale des Impôts''.' + contributors_nl_html: |- + <strong>Nederlando</strong>: enhavas datumojn el © AND, 2007 + (<a href="http://www.and.com">www.and.com</a>). + contributors_nz_html: '<strong>Nov-Zelando</strong>: enhavas datumojn ricevitajn + el ''Land Information New Zealand''. Crown Copyright reserved.' + contributors_si_html: |- + <strong>Slovenujo</strong>: enhavas datumojn el <a href="http://www.gu.gov.si/">Ofico de Termezurado kaj Kartografio</a> kaj + <a href="http://www.mkgp.gov.si/">Ministerio pri Terkulturo, Arbarkulturo kaj Proviantado</a> + (publikaj informoj de Slovenujo). + contributors_za_html: |- + <strong>Sud-Afriko</strong>: enhavas datumojn ricevitajn el <a href="http://www.ngi.gov.za/">Chief Directorate: + National Geo-Spatial Information</a>, landaj kopirajtoj rezervitaj. + contributors_gb_html: |- + <strong>Unuiĝinta Reĝlando</strong>: enhavas datumojn el 'Ordnance + Survey' © Crown copyright and database right + 2010-12. + contributors_footer_1_html: |- + Por pli da detaloj pri ĉi tiuj kaj aliaj fontoj uzitaj por plibonigi OpenStreetMap, bonvolu viziti la <a + href="http://wiki.openstreetmap.org/wiki/Contributors">paĝon pri kontribuintoj</a> en la OpenStreetMap-vikio. + contributors_footer_2_html: Inkludo de datumoj en OpenStreetMap ne indikas, + ke la provizanto de datumoj apogas OpenStreetMap, garantias por iu aÅ­ respondumas + por iu. + infringement_title_html: Rompo de kopirajtoj + infringement_1_html: OSM-kunlaborantoj memoru, por ke neniam aldonu datumojn + el iuj ajn fontoj protektataj de kopirajto (ekz. Google Maps aÅ­ paperaj mapoj) + sen klara permeso de posedanto de kopirajtoj. + infringement_2_html: Se ve pensas, ke datumoj protektataj per kopirajto estas + misaldonitaj al OpenStreetMap-datumbazo aÅ­ al ĉi tiu retejo, bonvolu legi + pri <a href="http://www.osmfoundation.org/wiki/License/Takedown_procedure">proceduro + de forigado de datumoj</a> aÅ­ plenigi la <a href="http://dmca.openstreetmap.org/">enretan + formularon</a>. + trademarks_title_html: <span id="trademarks"></span>Registritaj markoj + trademarks_1_html: OpenStreetMap, la piktogramo de grandiga lenso kaj 'State + of the Map' estas registritaj markoj de OpenStreetMap Fondaĵo. Se vi havas + iujn demandojn pri uzado de niaj markoj, bonvolu sendi viajn demandojn al + la <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">grupo + de laboro pri permesilo</a>. + welcome_page: + title: Bonvenon! + introduction_html: Bonvenon al OpenStreetMap, la libera kaj redaktebla mapo de + la mondo. Nun kiam vi registriĝis, vi povas ekigi mapigadon. Jen estas mallonga + manlibreto kun la plej gravaj aĵoj kiuj vi povas scii. + whats_on_the_map: + title: Kio estas sur la mapo + on_html: OpenStreetMap estas loko por mapigi objektojn, kiuj estas <em>kaj realaj + kaj aktualaj</em> - tiu estas milionoj da konstruaĵoj, vojoj kaj aliaj detalaĵoj + pri lokoj. Vi povas mapigi ĉiujn elementojn de reala mondo kiuj interesas + vin. + off_html: Ni <em>ne povas</em> inkludi personajn taksojn, eksajn aÅ­ malcertajn + objektojn, kaj datumoj de kopirajtataj fontoj. Escepte se vi estas permesita, + ne kopiu datumoj el aliaj interretaj aÅ­ paperaj mapoj. + basic_terms: + title: Fundamentaj terminoj pri mapigado + paragraph_1_html: OpenStreetMap havas sian propran ĵargonon. Jen estas kelkaj + utilaj vorotoj. + editor_html: <strong>Redaktilo</strong> estas programo aÅ­ retpaĝo, kiun vi povas + uzi por modifi mapon. + node_html: <strong>Nodo</strong> (ang. 'node') estas punkto sur la mapo, kiel + restoracio aÅ­ arbo. + way_html: <strong>Linio</strong> (ang. 'way') estas linio aÅ­ areo, kiel vojo, + rivereto, lago aÅ­ konstruaĵo. + tag_html: <strong>Etikedo</strong> (ang. 'tag') estas kolekto de datumoj priskribanta + nodon aÅ­ linion, kiel nomo de restoracio aÅ­ rapidlimo de vojo. + rules: + title: Reguloj! + paragraph_1_html: "OpenStreetMap havas malmultajn formalajn regulojn, tamen + ni esperas, ke ĉiuj kunlaboros kaj interparolos en la komunumo. Se vi planas + iujn agadojn aliajn ol permanajn redaktojn, bonvolu legi la sekvajn rekomendojn + pri <a href='http://wiki.openstreetmap.org/wiki/Import/Guidelines'>enportadoj</a> + kaj \n<a href='http://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct'>aÅ­tomataj + redaktoj</a>." + questions: + title: Iaj demandoj? + paragraph_1_html: OpenStreetMap havas kelkajn ejojn por lerni pri la projekto, + por demandi pri ion ajn kaj kune diskuti kaj dokumenti pri mapigado. <a href='%{help_url}'>Alklaku + por ricevi helpon</a>. + start_mapping: Ekigi mapigadon + add_a_note: + title: Ĉu mankas al vi tempo por ridaktado? Aldonu rimarkon! + paragraph_1_html: Se vi volas nur korekti iun etan kaj vi ne havas tempon por + registriĝi kaj lerni redaktadon, vi povas facile aldoni rimarkon. + paragraph_2_html: Simple iru al <a href='%{map_url}'>la mapo</a> kaj alklaku + la piktogramon <span class='icon note'></span>. Tio aldonos treneblan markon + al la mapo. Entajpu vian mesaĝon, konservu ĝin kaj aliaj mapigistoj okupiĝos + pri via rimarko. + fixthemap: + title: Raporti problemon / Korekti mapon + how_to_help: + title: Kiel helpi + join_the_community: + title: Aliĝi al la komunumo + explanation_html: Se vi rimarkis iun problemon kun niaj map-datumoj, ekzemple + strato aÅ­ adreso mankas, la plej bona rimedo estas aniĝi OpenStreetMap-komunumo + kaj redakti kaj ripari datumojn mem. + add_a_note: + instructions_html: Simple alklaku <a class='icon note'></a> aÅ­ la saman piktogramon + sur la mapo. Ĉi tio aldonos moveblan markon, aldonu vian mesaĝon, konservu + ĝin, kaj aliaj mapigistoj okupiĝos pri via rimarko. + other_concerns: + title: Aliaj aferoj + explanation_html: Se vi havas demandojn pri kial niaj datumoj aÅ­ enhavo estas + uzataj, bonvolu ekkoni <a href='/copyright'>paĝon pri kopirajto</a> por pliaj + leĝaj informoj, aÅ­ kontaktu la <a href='http://wiki.osmfoundation.org/wiki/Working_Groups'>OSMF-laborgrupon</a>. + help_page: + title: Akiri helpon + introduction: OpenStreetMap havas kelkajn ejojn por lerni pri la projekto, por + demandi pri ion ajn kaj kune diskuti kaj dokumenti pri mapigado. + welcome: + url: /welcome + title: Bonvenon al OSM + description: Komencu ekde ĉi tiu manlibreto ampleksanta fundamentojn de OpenStreetMap. + beginners_guide: + url: http://wiki.openstreetmap.org/wiki/Beginners%27_guide + title: Manlibro por komencantoj + description: Manlibro por komencantoj kreata de la komunumo (en la angla). + help: + url: https://help.openstreetmap.org/ + title: OpenStreetMap-helppaĝo + description: Demandu aÅ­ serĉu respondojn je retpaĝo de demandoj-kaj-respondoj + pri OSM. + mailing_lists: + title: Dissendolistoj + description: Demandu aÅ­ diskutu pri interesaj temoj en multaj pritemaj aÅ­ regionaj + dissendolistoj. + forums: + title: Forumoj + description: Demandoj kaj diskutoj por tiuj, kiuj preferas kutimaj diskutforumoj. + irc: + title: IRC + description: Interaga babilejo en multaj diversaj lingvoj kaj pri multaj temoj. + switch2osm: + title: switch2osm + description: Helpas firmaojn kaj organizaĵojn ŝanĝi al mapoj kaj aliaj servoj + de OpenStreetMap. + wiki: + url: https://wiki.openstreetmap.org/wiki/Eo:Main_Page + title: OpenStreetMap-vikio + description: Esploru la vikion por akiri detalan dokumentaron de OSM. + about_page: + next: Sekva + copyright_html: <span>©</span>OpenStreetMap<br>kontribuintoj + used_by: '%{name} liveras map-datumojn por miloj da retejoj, poŝtelefonaj aplikaĵoj + kaj aparatoj' + lede_text: OpenStreetMap estas kreata de komunumo de mapigistoj kiuj aldonas kaj + prizorgas datumojn pri vojoj, kursoj, kafejoj, stacidomoj kaj pli da aliaj, + en la tuta mondo. + local_knowledge_title: Loka scio + local_knowledge_html: OpenStreetMap emfazas lokan scion. Kontribuantoj uzas aerfotojn, + GPS-aparatojn kaj normajn mapojn por verigi ĉu datumoj de OSM estas akurataj + kaj ĝisdatigaj. + community_driven_title: Kondukata de komunumo + community_driven_html: |- + La komunumo de OpenStreetMap estas diversa, pasia kaj kreskas tagon post tago. Inter niaj kontribuantoj estas ŝatantoj de mapoj, profesiuloj de GIS, inĝenieroj prizorgantaj OSM-servilojn, helpistoj kiuj mapas areojn tuŝitajn de katastrofoj kaj multaj aliaj. Por lerni pli pri la komunumo, vidu <a href='%{diary_path}'>taglibrojn de uzantoj</a>, + <a href='http://blogs.openstreetmap.org/'>komunumajn taglibrojn</a> kaj la retpaĝon de <a href='http://www.osmfoundation.org/'>OSM Fondaĵo</a>. + open_data_title: Malfermaj datumoj + open_data_html: 'OpenStreetMap estas <i>malfermaj datumoj</i>: vi povas uzi ĝin + kiamaniere vi volas sub la kondiĉo de vi atribuos aÅ­torecon al OpenStreetMap + kaj ĝiaj kontribuintoj. Se vi modifos aÅ­ uzos niajn datumojn, vi povos distribui + la verkon nur laÅ­ la sama permesilo. Vidu la <a href=''%{copyright_path}''>paĝon + pri kopirajto kaj permesilo</a> por pli da detaloj.' + legal_title: Leĝaj demandoj + legal_html: Ĉi tiu retejo kaj aliaj servoj estas formale administrataj de la <a + href='http://osmfoundation.org/'>OpenStreetMap Fondaĵo</a> (OSMF) komisie de + la komunumo. Uzado de ĉiuj OSMF-servoj estas regulata per <a href="http://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy">Politiko + de uzado</a> kaj nia <a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy">Politiko + de privateco</a>. Bonvolu <a href='http://osmfoundation.org/Contact'>kontakti + kun OSMF</a>, se vi havas iun demandon pri permesilo, kopirajto aÅ­ leĝo. + partners_title: Kunlaborantoj notifier: diary_comment_notification: + subject: '[OpenStreetMap] %{user} komentis pri taglibra afiŝo' hi: Saluton %{to_user}, + header: '%{from_user} komentis pri la OpenStreetMap-taglibra afiŝo kun la temo + %{subject}:' + footer: Vi ankaÅ­ povas legi la komenton ĉe %{readurl} kaj komenti ĝin ĉe %{commenturl} + aÅ­ responde ĉe %{replyurl} message_notification: hi: Saluton %{to_user}, + header: '%{from_user} sendis al vi mesaĝon tra OpenStreetMap kun la temo %{subject}:' + footer_html: Vi ankaÅ­ povas legi la mesaĝon ĉe %{readurl} kaj respondi ĉe %{replyurl} friend_notification: subject: '[OpenStreetMap] %{user} aldonis vin kiel amikon' + had_added_you: '%{user} aldonis vin kiel amikon je OpenStreetMap.' + see_their_profile: Vi povas vidi lian profilon ĉe %{userurl}. + befriend_them: Vi ankaÅ­ povas aldoni vin kiel amikon ĉe %{befriendurl}. gpx_notification: greeting: Saluton, + your_gpx_file: Ŝajnas, ke via GPX-dosiero with_description: kun la priskribo + and_the_tags: 'kaj kun la sekvaj etikedoj:' + and_no_tags: kaj kun neniu etikedo. + failure: + subject: '[OpenStreetMap] Eraro dum enportado de GPX-dosiero' + failed_to_import: 'ne estas enportita sukcese. Eraro:' + more_info_1: Pli da informoj pri malsukceso de enportado de GPX-dosieroj kaj + kiel eviti + more_info_2: 'ilin vi povas trovi je:' + success: + subject: '[OpenStreetMap] GPX-dosiero enportita sukcese' + loaded_successfully: estas sukcese ŝargita kun %{trace_points} el %{possible_points} + punktoj. + signup_confirm: + subject: '[OpenStreetMap] Bonvenon al OpenStreetMap' + greeting: Saluton! + created: Iu (espereble vi) ĵus kreis konton je %{site_url}. + confirm: Unue devas konfirmi, ke tiu ĉi peto devenas de vi, do bonvolu alklaki + la ligilon sube por konfirmi vian konton. + welcome: Post konfirmo de konto, ni liveros al vi pliajn informojn kiel komenci. email_confirm: - subject: '[OpenStreetMap] Konfirmi vian retpoŝtadreson' + subject: '[OpenStreetMap] Konfirmado de retpoŝtadreso' email_confirm_plain: greeting: Saluton, + hopefully_you: Iu (espereble vi) volas ŝanĝi vian retpoŝtadreson je %{server_url} + al %{new_address}. + click_the_link: Se tiu estas vi, bonvolu alklaku la ligilon sube por konfirmi + ŝanĝon de adreso. email_confirm_html: greeting: Saluton, + hopefully_you: Iu (espereble vi) volas ŝanĝi vian retpoŝtadreson je %{server_url} + al %{new_address}. + click_the_link: Se tiu estas vi, bonvolu alklaku la ligilon sube por konfirmi + ŝanĝon de adreso. + lost_password: + subject: '[OpenStreetMap] Peto pri restarigo de pasvorto' lost_password_plain: greeting: Saluton, + hopefully_you: Iu (espereble vi) volas restarigi la pasvorton por konto je openstreetmap.org + por tiu ĉi retpoŝtadreso. + click_the_link: Se tiu estas vi, bonvolu alklaki la ligilon sube por restarigi + la pasvorton. lost_password_html: greeting: Saluton, + hopefully_you: Iu (espereble vi) volas restarigi la pasvorton por konto je openstreetmap.org + por tiu ĉi retpoŝtadreso. + click_the_link: Se tiu estas vi, bonvolu alklaki la ligilon sube por restarigi + la pasvorton. + note_comment_notification: + anonymous: Anonimulo + greeting: Saluton, + commented: + subject_own: '[OpenStreetMap] %{commenter} komentis vian rimarkon' + subject_other: '[OpenStreetMap] %{commenter} komentis rimarkon pri kiu vi + interesiĝas' + your_note: '%{commenter} komentis vian rimarkon sur mapo ĉe %{place}.' + commented_note: '%{commenter} komentis rimarkon sur mapo pri kiu vi interesiĝas. + La rimarko troviĝas ĉe %{place}.' + closed: + subject_own: '[OpenStreetMap] %{commenter} solvis vian rimarkon' + subject_other: '[OpenStreetMap] %{commenter} solvis rimarkon pri kiu vi interesiĝas' + your_note: '%{commenter} solvis vian rimarkon sur mapo ĉe %{place}.' + commented_note: '%{commenter} solvis rimarkon sur mapo pri kiu vi interesiĝas. + La rimarko troviĝis ĉe %{place}.' + reopened: + subject_own: '[OpenStreetMap] %{commenter} remalfermis vian rimarkon' + subject_other: '[OpenStreetMap] %{commenter} remalfermis rimarkon pri kiu + vi interesiĝis' + your_note: '%{commenter} remalfermis vian rimarkon sur mapo ĉe %{place}.' + commented_note: '%{commenter} remalfermis rimarkon sur mapo pri kiu vi interesiĝis. + La rimarko troviĝis ĉe %{place}.' + details: Pli da detaloj pri la rimarko, vi povas trovi je %{url}. + changeset_comment_notification: + hi: Saluton %{to_user}, + greeting: Saluton, + commented: + subject_own: '[OpenStreetMap] %{commenter} komentis vian ŝanĝaron' + subject_other: '[OpenStreetMap] %{commenter} komentis ŝanĝaron pri kiu vi + interesiĝas' + your_changeset: '%{commenter} komentis vian ŝanĝaron kreitan je %{time}' + commented_changeset: '%{commenter} komentis ŝanĝaron observatan de vi, kreitan + de %{changeset_author} je %{time}' + partial_changeset_with_comment: kun komento '%{changeset_comment}' + partial_changeset_without_comment: sen komento + details: Pli da detaloj pri la ŝanĝaro povas esti trovita ĉe %{url}. + unsubscribe: Por malaboni el ĝisdatigoj pri ĉi tiu ŝanĝaro, vizitu %{url} kaj + klaku "Malobservi". message: inbox: title: Alvenkesto - my_inbox: Mia leterkesto + my_inbox: Mia alvenkesto + outbox: elirkesto + messages: Vi havas %{new_messages} kaj %{old_messages} + new_messages: + one: '%{count} novan mesaĝon' + other: '%{count} novajn mesaĝojn' + old_messages: + one: '%{count} malnovan mesaĝon' + other: '%{count} malnovajn mesaĝojn' from: De + subject: Temo date: Dato + no_messages_yet: Vi ankoraÅ­ ne havas iun mesaĝon. Eble kontaktu kun iu el %{people_mapping_nearby_link}? + people_mapping_nearby: proksimaj mapigistoj message_summary: - unread_button: Marki kiel nelegita - read_button: Marki kiel legita + unread_button: Marki kiel nelegitan + read_button: Marki kiel legitan reply_button: Respondi delete_button: Forigi new: title: Sendi mesaĝon send_message_to: Sendi novan mesaĝon al %{name} + subject: Temo + body: Enhavo send_button: Sendi - back_to_inbox: Reen al mesaĝejo + back_to_inbox: Reen al alvenkesto message_sent: Mesaĝo sendita + limit_exceeded: Vi antaÅ­nelonge sendis multajn mesaĝojn. Bonvolu atendi iom + da tempo antaÅ­ vi sendos pliajn. + no_such_message: + title: Neekzistanta mesaĝo + heading: Tiu ĉi mesaĝo ne ekzistas + body: BedaÅ­rinde ne ekzistas mesaĝo kun tiu ĉi identigilo. outbox: + title: Elirkesto my_inbox: Mia %{inbox_link} - inbox: Alvenkesto + inbox: alvenkesto + outbox: elirkesto + messages: + one: Vi havas %{count} senditan mesaĝon + other: Vi havas %{count} senditajn mesaĝojn to: Al subject: Temo date: Dato + no_sent_messages: Vi ankoraÅ­ ne sendis iun mesaĝon. Eble kontaktu kun iu el + %{people_mapping_nearby_link}? + people_mapping_nearby: proksimaj mapigistoj + reply: + wrong_user: Vi estas ensalutita kiel '%{user}', sed la mesaĝo, kiun vi volas + respondi, ne estas sendita al tiu uzanto. Bonvolu ensaluti kiel propra uzanto + por respondi ĝin. read: title: Legi mesaĝon from: De subject: Temo date: Dato reply_button: Respondi - unread_button: Marki kiel nelegita + unread_button: Marki kiel nelegitan + back: Reen to: Al + wrong_user: Vi estas ensalutita kiel '%{user}', sed la mesaĝo, kiun vi volas + legi estas sendita al tiu uzanto. Bonvolu ensaluti kiel propra uzanto por + legi ĝin. sent_message_summary: delete_button: Forigi mark: - as_read: Mesaĝo markita kiel legita - as_unread: Mesaĝo markita kiel nelegita + as_read: Mesaĝo markita kiel legitan + as_unread: Mesaĝo markita kiel nelegitan delete: deleted: Mesaĝo forigita site: + index: + js_1: Vi aÅ­ uzas foliumilon, kiu ne subtenas Ĝavoskripton, aÅ­ vi havas ĝin malaktivan. + js_2: OpensStreetMap uzas Ĝavoskripton por montri ŝoveblan mapon. + permalink: Konstanta ligilo + shortlink: Mallonga ligilo + createnote: Aldoni rimarkon + license: + copyright: Kopirajto de OpenStreetMap kaj kontribuintoj, laÅ­ malferma permesilo + remote_failed: Redaktado malsukcesis - certigu ĉu JOSM aÅ­ Merkaartor estas startigita + kaj ĉu defora aliro estas aktiva edit: + not_public: Vi ne agordis por viaj redaktoj estu publikaj. + not_public_description: Vi ne povas plu redakti la mapon. Vi povas agordi ilin + kiel publikan ĉe via %{user_page}. user_page_link: uzantpaĝo + anon_edits_link_text: Tie ĉi vi sciigis kiel. + flash_player_required: Por uzi laOpenStreetMap-redaktilon 'Potlatch', vi bezonas + la kromprogramon Flash. Vi povas <a href="http://www.adobe.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash">elŝuti + Flash Player el Adobe.com retpaĝo</a>. <a href="http://wiki.openstreetmap.org/wiki/Editing">Kelkaj + aliaj redaktiloj</a> estas disponeblaj por redakti OpenStreetMap. + potlatch_unsaved_changes: Vi havas nekonservitajn ŝanĝojn. (Por konservi ŝanĝojn + en Potlatch, malelektu nune elektitan linion aÅ­ punkton se vi redaktas en + 'rekta reĝimo', aÅ­ alklaku butonon 'konservi', se ĝi videblas.) + potlatch2_not_configured: Potlatch 2 ne estas agordita - vidu http://wiki.openstreetmap.org/wiki/The_Rails_Port#Potlatch_2 + por pli da informoj + potlatch2_unsaved_changes: Vi havas nekonservitajn ŝanĝojn. (Por konservi ilin + en Potlatch 2, alklaku 'konservi'.) + id_not_configured: iD ne estas agordita + no_iframe_support: Via foliumilo ne subtenas 'HTML iframes', ili estas bezonataj + por tiu ĉi eblo. sidebar: search_results: Serĉrezultoj close: Fermi search: search: Serĉi + get_directions: Difini la kurson + get_directions_title: Difinas la kurson inter du punktoj + from: El + to: Al where_am_i: Kie mi estas? + where_am_i_title: Trovas la nunan pozicion per la foliumilo submit_text: Ek key: table: entry: motorway: AÅ­tovojo - primary: Strato de unua ordo - secondary: Strato de dua ordo - track: Spuro - byway: Flanka strato + main_road: Ĉefa vojo + trunk: Vojo ekspresa + primary: Vojo unua-ranga + secondary: Vojo dua-ranga + unclassified: Vojo kvara-ranga + track: Vojo kampa + bridleway: Ĉevalvojo cycleway: Bicikla vojo + cycleway_national: Bicikla vojo nacia + cycleway_regional: Bicikla vojo regiona + cycleway_local: Bicikla vojo loka footway: Trotuaro rail: Fervojo - subway: Subtera fervojo + subway: Metroo tram: - - tramo + - Fervojo malpeza - tramo cable: - 1: seĝtelfero + - Kablovojo + - seĝtelfero + runway: + - Avia dromo + - aÅ­tokur-strato + apron: + - Aviadil-parkumejo + - flugstacio admin: Administra limo - forest: Forsto + forest: Kultiv-arbaro wood: Arbaro golf: Golfejo park: Parko - resident: Loĝkvartalo - tourist: Turista atrakcio + resident: Privatdoma tereno common: + - Publika ripoza tereno - herbejo - - herbejo - retail: Butikcentro + retail: Komercejo industrial: Industria areo + commercial: Oficeja tereno heathland: Erikejo lake: - Lago - akvorezervujo farm: Farmobieno + brownfield: AntaÅ­-konstruejo (post-malkonstruado) cemetery: Tombejo - allotments: Publikaj ĝardenoj + allotments: Familiaj ĝardenoj + pitch: Ludkampo + centre: Sporta centro reserve: Naturrezervejo military: Milita areo school: @@ -464,24 +1504,45 @@ eo: summit: - Montosupro - montopinto - destination: Nur por lokaj loĝantoj + tunnel: Strekumita konturo - tunelo + bridge: Nigra konturo - ponto + private: Privata aliro + destination: Aliro nur al celo + construction: Vojoj konstruataj + bicycle_shop: Bicikl-vendejo + bicycle_parking: Parkumejo bicikla + toilets: Necesejo + richtext_area: + edit: Redakti + preview: AntaÅ­vidi markdown_help: + title_html: Sintakse analizita per <a href="http://daringfireball.net/projects/markdown/">Markdown</a> + headings: Titoloj + heading: Titolo + subheading: Subtitolo + unordered: Malordigita listo + ordered: Ordigita listo + first: Unua elemento + second: Dua elemento + link: Ligilo text: Teksto image: Bildo + alt: Alternativa teksto + url: Retadreso trace: visibility: - private: Privata (nur partigita kiel sennomaj, neordigitaj punktoj) + private: Privata (kunhavigita nur kiel sennomaj, malordigitaj punktoj) public: Publika (montrata en spurlisto kaj kiel sennomaj, neordigitaj punktoj) - trackable: Spurebla (nur partigita kiel sennomaj, ordigitaj punktoj kun tempstampoj) + trackable: Spurebla (kunhavigita nur kiel sennomaj, ordigitaj punktoj kun tempstampoj) identifiable: Identigebla (montrata en spurlisto kaj kiel identigeblaj, ordigitaj punktoj kun tempstampo) create: - upload_trace: Alŝuti GPS spuron - trace_uploaded: Via GPX dosiero estis alŝutita kaj atendas enkonduko en la datumbason. - Tiu ĝenerale okazas antaÅ­ duonhoro, kaj retletero estos sendita al vi je finaĵo. + upload_trace: Alŝuti GPS-spuron + trace_uploaded: Via GPX-dosiero estas alŝutita kaj atendas enkonduko en la datumbazon. + Tio probable okazos ĝis duonhoro, kaj retletero estos sendita al vi je finaĵo. edit: - title: Redaktante spuron %{name} - heading: Redaktanta spuron %{name} + title: Redaktado de spuro %{name} + heading: Redaktado de spuro %{name} filename: 'Dosiernomo:' download: elŝuti uploaded_at: 'Alŝutita je:' @@ -492,31 +1553,35 @@ eo: owner: 'Posedanto:' description: 'Priskribo:' tags: 'Etikedoj:' - tags_help: dislimataj de komoj - save_button: Konservi Ŝanĝojn + tags_help: disigitaj per komoj + save_button: Konservi ŝanĝojn visibility: 'Videbleco:' - visibility_help: Kion tio signifas ? + visibility_help: kion tio signifas? trace_form: - upload_gpx: 'Alŝuti GPX dosieron:' + upload_gpx: 'Alŝuti GPX-dosieron:' description: 'Priskribo:' tags: 'Etikedoj:' - tags_help: dislimataj de komoj + tags_help: disigitaj per komoj visibility: 'Videbleco:' - visibility_help: Kion tio signifas ? + visibility_help: kion tio signifas? upload_button: Alŝuti help: Helpo trace_header: + upload_trace: Alŝuti spuron see_all_traces: Vidi ĉiujn spurojn see_your_traces: Vidi ĉiujn viajn spurojn - traces_waiting: Vi havas %{count} spurojn atendanta alŝutado. Bonvolu konsideri - atendi ke ili terminas alŝuti antaÅ­ alŝuti aliajn. Tiel vi ne blokus la atendovicon - por aliaj uzantoj. + traces_waiting: + one: Vi havas %{count} spuron atendanta alŝutado. Bonvolu atendi ĝis ĝi estos + alŝutita, antaÅ­ alŝuti aliajn, do vi ne blokos atendovicon por aliaj uzantoj. + other: Vi havas %{count} spurojn atendantaj alŝutado. Bonvolu atendi ĝis ili + estos alŝutitaj, antaÅ­ alŝuti aliajn, do vi ne blokos atendovicon por aliaj + uzantoj. trace_optionals: tags: Etikedoj view: - title: Montrante spuron %{name} - heading: Montrante spuron %{name} - pending: OKAZANTA + title: Montrado de spuro %{name} + heading: Montrado de spuro %{name} + pending: OKAZONTA filename: 'Dosiernomo:' download: elŝuti uploaded: 'Alŝutita je:' @@ -528,131 +1593,367 @@ eo: description: 'Priskribo:' tags: 'Etikedoj:' none: Neniu - edit_track: Redakti tiun spuron - delete_track: Forviŝi tiun spuron + edit_track: Redakti ĉi tiun spuron + delete_track: Forviŝi ĉi tiun spuron trace_not_found: Spuro ne trovebla! visibility: 'Videbleco:' + trace_paging_nav: + showing_page: Paĝo %{page} + older: AntaÅ­aj spuroj + newer: Postaj spuroj trace: - pending: OKAZANTA + pending: OKAZONTA count_points: '%{count} punktoj' ago: AntaÅ­ %{time_in_words_ago} more: pli trace_details: Vidi detalojn de spuro - view_map: Vidi Mapon + view_map: Vidi mapon edit: redakti - edit_map: Redakti Mapon + edit_map: Redakti mapon public: PUBLIKA + identifiable: IDENTIGEBLA private: PRIVATA + trackable: SPUREBLA by: de in: en map: mapo list: - public_traces: Publikaj GPS spuroj - your_traces: Viaj GPS spuroj - public_traces_from: Publikaj GPS spuroj el %{user} - tagged_with: ' etikedata kun %{tags}' + public_traces: Publikaj GPS-spuroj + your_traces: Viaj GPS-spuroj + public_traces_from: Publikaj GPS-spuroj de %{user} + description: Montri lastajn GPS-spurojn + tagged_with: etikedita kun %{tags} + empty_html: AnkoraÅ­ neniu estas tie ĉi.. <a href='%{upload_link}'>Alŝutu novan + spuron</a> aÅ­ lernu pli pri GPS-spurado ĉe la <a href='http://wiki.openstreetmap.org/wiki/Beginners_Guide_1.2'>viki-paĝo</a>. delete: scheduled_for_deletion: Spuro forviŝota make_public: made_public: Publikigita spuro + offline_warning: + message: La sistemo por alŝutado de GPX-dosieroj estas nune nedisponebla + offline: + heading: GPX-konservejo malaktiva + message: La sistemo por alŝutado kaj konservado de GPX-dosieroj estas nune nedisponebla. + georss: + title: OpenStreetMap GPS-spuroj + description: + description_with_count: + one: GPX-dosiero kun %{count} punkto de %{user} + other: GPX-dosiero kun %{count} punktoj de %{user} + description_without_count: GPX-dosiero de %{user} + application: + require_cookies: + cookies_needed: Ŝajnas, ke vi malaktivigis 'kuketojn' - bonvolu aktivigi 'kuketojn' + en via foliumilo por pluigi. + require_moderator: + not_a_moderator: Vi devas esti kontrolanto por fari ĉi tiun agon. + setup_user_auth: + blocked: Via aliro al API estas blokita. Bonvolu ensaluti al reta interfaco + por sciigi pli. + need_to_see_terms: Via aliro al API estas dumtempe provizore haltigita. Bonvolu + ensaluti al reta fasado por legi interkonsenton pri kontribuado. Vi ne devas + akcepti ĝin, sed vi devas legi ĝin. + oauth: + oauthorize: + title: Rajtigi aliron al via konto + request_access: La aplikaĵo %{app_name} petas pri aliro al la konto de %{user}. + Bonvolu kontroli rajtojn, kiujn vi donas al aplikaĵo. Vi povas elekti rajtojn + laÅ­vole. + allow_to: 'Permesi al porklienta aplikaĵo:' + allow_read_prefs: legi agordojn de uzanto. + allow_write_prefs: modifi viajn agordojn de uzanto. + allow_write_diary: afiŝi en taglibro, komenti kaj amikiĝi. + allow_write_api: redakti la mapon. + allow_read_gpx: legi viajn privatajn GPS-spurojn. + allow_write_gpx: alŝuti GPS-spurojn. + allow_write_notes: modifi rimarkojn. + grant_access: Permesi aliron + oauthorize_success: + title: Peto pri permeso permesita + allowed: Vi permesis al aplikaĵo %{app_name} aliron al via konto. + verification: La kontrol-kodon estas %{code}. + oauthorize_failure: + title: Peto pri permeso malsukcesis + denied: Vi malpermesis al aplikaĵo %{app_name} aliron al via konto + invalid: La atingoĵetono ne plu validas. + revoke: + flash: Vi malvalidigis la ĵetonon por %{application} oauth_clients: new: title: Registri novan aplikaĵon submit: Registri edit: - title: Redakti vian aplikaĵon - submit: Redakti + title: Modifi vian aplikaĵon + submit: Modifi show: title: OAuth-detaloj por %{app_name} + key: 'Klienta ŝlosilo:' + secret: 'Klienta sekreto:' + url: 'Retadreso de petoĵetono:' + access_url: 'Retadreso de atingoĵetono:' + authorize_url: 'Retadreso de rajtigado:' + support_notice: Ni subtenas subskribojn HMAC-SHA1 (konsilinda) kaj RSA-SHA1. edit: Redakti detalojn + delete: Forigi klienton + confirm: Ĉu vi certas? + requests: 'Petado pri la jenaj permesoj de la uzanto:' + allow_read_prefs: legi agordojn de uzanto. + allow_write_prefs: modifi agordojn de uzanto. + allow_write_diary: skribi en taglibro, komenti kaj amikigi aliajn. + allow_write_api: redakti la mapon. + allow_read_gpx: legi privatajn GPS-spurojn. + allow_write_gpx: alŝuti GPS-spurojn. + allow_write_notes: modifi rimarkojn. index: - title: Miaj detaloj OAuth + title: Miaj OAuth-detaloj + my_tokens: Miaj permesataj aplikaĵoj + list_tokens: 'La jenaj ĵetonoj estas aldonitaj al aplikaĵoj komisie de vi:' application: Aplikaĵa nomo - issued_at: Eldonita la + issued_at: Eldonita je + revoke: Malvalidigi! + my_apps: Miaj porklientaj aplikaĵoj + no_apps: Ĉu vi havas iun aplikaĵon, kiun vi volas registri per %{oauth} normo? + Vi devas registri vian retaplikaĵon, antaÅ­ ĝi eblos fari OAuth-petojn al ĉi + tiu servo. + registered_apps: 'Vi havas la jenajn porklientajn aplikaĵojn registritajn:' register_new: Registri vian aplikaĵon form: name: Nomo - required: Necesa - url: URL de ĉefaplikaĵo - support_url: Subtena URL + required: nepra + url: Retadreso de ĉefaplikaĵo + callback_url: Revoka retadreso + support_url: Subtena retadreso + requests: 'Peti pri la jenajn permesojn de la uzanto:' + allow_read_prefs: legi agordojn de uzanto. + allow_write_prefs: modifi agordojn de uzanto. + allow_write_diary: skribi en taglibro, komenti kaj amikigi aliajn. + allow_write_api: redakti la mapon. + allow_read_gpx: legi privatajn GPS-spurojn. + allow_write_gpx: alŝuti GPS-spurojn. + allow_write_notes: modifi rimarkojn. + not_found: + sorry: BedaÅ­rinde %{type} ne trovita. + create: + flash: Sukcese registrita la informon + update: + flash: Informoj pri kliento estas ĝisdatigitaj sukcese + destroy: + flash: La porklienta aplikaĵo forigita user: login: title: Ensaluti heading: Ensaluti - email or username: 'Retpoŝtadreso aÅ­ Salutnomo:' + email or username: 'Retpoŝtadreso aÅ­ salutnomo:' password: 'Pasvorto:' - remember: 'Memori min:' - lost password link: Ĉu vi forgesis vian pasvorton ? + openid: '%{logo} OpenID:' + remember: Memori min + lost password link: Ĉu vi forgesis vian pasvorton? login_button: Ensaluti + register now: Registriĝi + with username: 'Ĉu vi jam havas OpenStreetMap-konton? Bonvolu ensaluti per vian + salutnomon kaj pasvorton:' + with external: 'Alimaniere, ensalutu uzante:' + new to osm: Ĉu vi estas nova al OpenStreetMap? + to make changes: Por fari ŝanĝojn al datumoj de OpenStreetMap, vi devas havi + konton. + create account minute: Kreu konton. Tio ĉi daÅ­ros nur minuton. + no account: Ĉu vi ne havas konton? + account not active: BedaÅ­rinde via konto ne estas ankoraÅ­ aktiva. Bonvolu malfermi + la ligilon en konfirmada retletero por aktivigi vian konton, aÅ­ <a href="%{reconfirm}">petu + pri sendo de nova mesaĝo</a>. + account is suspended: Ho ve, via konto estas haltigita pro suspektinda agado. + Bonvolu kontaktu kun la <a href="%{webmaster}">administranto</a>, se vi volas + pridiskuti pri blokon. + auth failure: BedaÅ­rinde ne povas ensaluti kun ĉi tiuj informoj. + openid_logo_alt: Ensaluti per OpenID + auth_providers: + openid: + title: Ensaluti per OpenID + alt: Ensaluti per OpenID URL + google: + title: Ensaluti per Google + alt: Ensaluti per Google OpenID + facebook: + title: Ensaluti per Fejsbuko + alt: Ensaluti per konto je Fejsbuko + windowslive: + title: Ensaluti per Windows Live + alt: Ensaluti per konto je Windows Live + github: + title: Ensaluti per GitHub + alt: Ensaluti per konto je GitHub + wikipedia: + title: Ensaluti per Vikipedio + alt: Ensaluti per Vikipedia konto + yahoo: + title: Ensaluti per Yahoo + alt: Ensaluti per Yahoo OpenID + wordpress: + title: Ensaluti per Wordpress + alt: Ensaluti per Wordpress OpenID + aol: + title: Ensaluti per AOL + alt: Ensaluti per AOL OpenID + logout: + title: Elsaluti + heading: Elsaluti el OpenStreetMap + logout_button: Elsaluti lost_password: title: Perdita pasvorto heading: Forgesis vian pasvorton ? email address: 'Retpoŝtadreso:' new password button: Nuligi pasvorton + help_text: Entajpu la retpoŝtan adreson kiun vi uzis por ensaluto, ni sendos + al vi ligilon, kiun vi povos uzi por restarigi vian pasvorton. + notice email on way: BedaÅ­ras, ke vi perdis ĝin :-( sed baldaÅ­ vi ricevos retleteron, + kiun vi uzos por restarigi ĝin. notice email cannot find: BedaÅ­rinde, tiu retadreso ne troveblas. reset_password: title: Nuligi pasvorton heading: Nuligi Pasvorton por %{user} password: 'Pasvorto:' - confirm password: 'Konfirmi Pasvorton:' - reset: Nuligi Pasvorton + confirm password: 'Konfirmi pasvorton:' + reset: Nuligi pasvorton flash changed: Via pasvorto estis ŝanĝita. flash token bad: Netrovebla ĵetono, bonvolu kontroli la URLon. new: - title: Krei konton + title: Registriĝi no_auto_account_create: BedaÅ­rinde ni nun ne povas aÅ­tomate krei konton por vi. + contact_webmaster: Bonvolu kontaktu la <a href="%{webmaster}">administranton</a> + por krei konton - ni klopodos pri via peto senprokraste. + about: + header: Libera kaj redaktebla + html: <p>Kontraste kun aliaj mapoj, OpenStreetMap estas tute kreata de homoj + kiel vi, kaj iu ajn povas korekti, ĝisdatigi, elŝuti kaj uzi ĝin.</p> <p>Registriĝu + por komenci kontribuadon. Ni sendos al vi retleteron por konfirmi vian konton.</p> + license_agreement: Kiam vi konfirmos vian konton, vi devos akcepti la <a href="http://www.osmfoundation.org/wiki/License/Contributor_Terms">interkonsenton + pri kontribuado</a>. email address: 'Retpoŝtadreso:' confirm email address: 'Konfirmi retpoŝtadreson:' - display name: 'Montrita Nomo:' + not displayed publicly: Via adreso ne estos montrata publike, vidu nian <a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy" + title="OSMF-a politiko pri privateco enhavanta sekcio pri retpoŝta adreso">politikon + pri privateco</a> por pli da informoj. + display name: 'Montrata nomo:' + display name description: Via publike montrata salutnomo. Vi povas ŝanĝi ĝin + poste per la agordoj. + external auth: 'Ensaluti per ekstera servo:' password: 'Pasvorto:' - confirm password: 'Konfirmi Pasvorton:' - continue: Pli... + confirm password: 'Konfirmi pasvorton:' + use external auth: Alternative, ensaluti uzante eksteran servon + auth no password: Kun ensalutado per ekstera servo, pasvorto ne endas, sed kelkaj + iloj aÅ­ servilo krom tio povas bezoni ĝin. + continue: Registriĝi + terms accepted: Dankon por akcepto de nova interkonsento pri kontribuado! + terms declined: Ni bedaÅ­ras, ke vi ne akceptis la novan interkonsenton pri kontribuado. + Por pli da informoj, bonvolu vidi <a href="%{url}">ĉi tiu viki-paĝo</a>. + terms: + title: Interkonsento pri kontribuado + heading: Interkonsento pri kontribuado + read and accept: Bonvolu legi la interkonsenton kaj alklaku la butonon 'Akcepti' + por konfirmi, ke vi akceptas tiun ĉi interkonsenton por viaj estantaj kaj + estontaj kontribuaĵoj. + consider_pd: Krom la supra interkonsento, mi konfirmas, ke miaj kontribuaĵoj + apartenas al la publika havaĵo + consider_pd_why: kio estas tio? + guidance: 'Informoj por helpi kompreni ĉi tiun interkonsenton: <a href="%{summary}">simpla + mallongigo</a> kaj kelkaj <a href="%{translations}">neoficialaj tradukoj</a>' + agree: Akcepti + decline: Malakcepti + you need to accept or decline: Bonvolu legi kaj aÅ­ akcepti aÅ­ malakcepti la + novan interkonsenton pri uzado por pluigi. + legale_select: 'Loĝlando:' + legale_names: + france: Francujo + italy: Italujo + rest_of_world: Resto de la mondo no_such_user: title: Neniu tiel uzanto heading: La uzanto %{user} ne ekzistas + body: BedaÅ­rinde, ne ekzistas uzanto kun la nomo %{user}. Bonvolu kontroli pri + liter-eraroj, aÅ­ eble vi alklakis mis-ligilon. + deleted: forigita view: - my diary: mia ĵurnalo - new diary entry: nova ĵurnalrikordo - my edits: miaj redaktoj - my traces: miaj spuroj - my settings: miaj agordoj - blocks on me: blokas min - send message: sendi mesaĝon - diary: ĵurnalo - edits: redaktoj - traces: spuroj - remove as friend: eksamikigi - add as friend: aldoni kiel amikon - mapper since: 'Mapisto ekde:' + my diary: Mia taglibro + new diary entry: nova taglibra afiŝo + my edits: Miaj redaktoj + my traces: Miaj spuroj + my notes: Miaj rimarkoj + my messages: Mesaĝoj + my profile: Profilo + my settings: Agordoj + my comments: Miaj komentoj + oauth settings: oauth-agordoj + blocks on me: Blokas min + blocks by me: Blokitaj de mi + send message: Sendi mesaĝon + diary: Taglibro + edits: Redaktoj + traces: Spuroj + notes: Map-rimarkoj + remove as friend: Eksamikigi + add as friend: Aldoni kiel amikon + mapper since: 'Mapigisto ekde:' ago: (antaÅ­ %{time_in_words_ago}) + ct status: 'Interkonsento pri kontribuado:' + ct undecided: ne decidita + ct declined: malakceptita + ct accepted: akceptita antaÅ­ %{ago} + latest edit: Lasta redakto %{ago} email address: 'Retpoŝtadreso:' created from: 'Kreita de:' + status: 'Stato:' + spam score: 'Trudmesaĝa poentaro:' description: Priskribo user location: Loko de uzanto + if set location: Agordu vian hejmlokon ĉe la paĝo de %{settings_link} por vidi + proksimajn mapigistojn. settings_link_text: agordoj your friends: Viaj amikoj - no friends: Vi jam ne aldonis neniun amikon. + no friends: Vi ne aldonis iun amikon ankoraÅ­. km away: '%{count} km for' m away: '%{count} m for' - nearby users: 'Pliaj proksimaj uzantoj:' + nearby users: Plej proksimaj uzantoj + no nearby users: Neniuj aliaj uzantoj ekzistas, kiuj jam deklaris mapigadon + en proksimaĵo. role: administrator: Ĉi tiu uzanto estas administranto moderator: Ĉi tiu uzanto estas kontrolanto - create_block: Bloki la uzanton - activate_user: ebligi tiun uzanto - deactivate_user: malebligi tiun uzanto - hide_user: kaŝi tiun uzanto - unhide_user: aperigi tiun uzanto - delete_user: forviŝi ĉi tiun uzanton + grant: + administrator: Permesi aliron de administranto + moderator: Permesi aliron de kontrolanto + revoke: + administrator: Nuligi aliron de administranto + moderator: Nuligi aliron de kontrolanto + block_history: Blokadoj aktivaj + moderator_history: Blokadoj eldonitaj + comments: Komentoj + create_block: Bloki ĉi tiun uzanton + activate_user: Aktivigi tiun ĉi uzanton + deactivate_user: Malaktivigi tiun ĉi uzanton + confirm_user: Konfirmi ĉi tiun uzanton + hide_user: Kaŝi ĉi tiun uzanton + unhide_user: Malkaŝi ĉi tiun uzanton + delete_user: Forigi ĉi tiun uzanton confirm: Konfirmi + friends_changesets: ŝanĝaroj de amikoj + friends_diaries: afiŝoj en taglibroj de amikoj + nearby_changesets: ŝanĝaroj de proksimuloj + nearby_diaries: afiŝoj en taglibroj de proksimuloj popup: your location: Via loko nearby mapper: Proksima uzanto + friend: Amiko account: title: Redakti konton - my settings: Miaj agordoj + my settings: Agordoj + current email address: 'Aktuala retpoŝta adreso:' + new email address: 'Nova retpoŝta adreso:' email never displayed publicly: (neniam publike montrita) + external auth: 'Ekstera aÅ­tentigo:' + openid: + link: http://wiki.openstreetmap.org/wiki/OpenID + link text: kio estas tio? public editing: heading: 'Publika redaktado:' enabled: Ebligita. Ne anonima kaj rajtas redakti. @@ -663,80 +1964,451 @@ eo: disabled link text: kial mi ne povas redakti? public editing note: heading: Publika redaktado + text: Nuntempe viaj redaktoj estas anonimaj kaj aliuloj ne povas sendi mesaĝojn + al vi kaj vidi vian lokon. Por montri kion vi redaktis kaj ebligi al aliuloj + kontakti vin per la retejo, alklaku la butonon sube. <b>Ekde la versio 0.6 + de API, nur publikaj uzantoj povas redakti map-datumojn.</b> (<a href="http://wiki.openstreetmap.org/wiki/Anonymous_edits">sciigi + kial</a>).<ul><li>Via retpoŝta adreso ne estos publikigita.</li><li>Ĉi tio + ago ne povos esti malfarita kaj ĉiuj novaj uzantoj estas publikaj implicite.</li></ul> + contributor terms: + heading: 'Interkonsento pri kontribuado:' + agreed: Vi konsentis la novan interkonsenton pri kontribuado. + not yet agreed: Vi ankoraÅ­ ne konsentis la novan interkonsenton pri kontribuado. + review link text: Bonvolu sekvi ĉi tiun ligilon por legi kaj akcepti la novan + interkonsenton pri uzado. + agreed_with_pd: Vi ankaÅ­ deklaris, ke viaj kontribuaĵoj estas en la publika + havaĵo. + link text: kio estas tio? profile description: 'Priskribo de profilo:' preferred languages: 'Preferataj Lingvoj:' - home location: 'Hejma Loko:' + preferred editor: 'Preferata redaktilo:' + image: 'Bildo:' + gravatar: + gravatar: Uzi 'Gravataron' + link text: kio estas tio? + disabled: '''Gravataro'' estas malaktiva.' + enabled: Montrado de via 'Gravataro' estas malaktivigita. + new image: Aldoni bildon + keep image: Konservi la aktualan bildon + delete image: Forigi la aktualan bildon + replace image: AnstataÅ­igi la aktualan bildon + image size hint: (kvadrataj bildoj kun grando pli ol 100x100 taÅ­gas) + home location: 'Hejma pozicio:' no home location: Vi ne enigis vian hejmlokon. latitude: 'Latitudo:' longitude: 'Longitudo:' update home location on click: Freŝigi la hejmlokon kiam mi klikas sur la mapo ? - save changes button: Konservi Ŝanĝojn + save changes button: Konservi ŝanĝojn make edits public button: Publikigu ĉiujn miajn redaktojn. return to profile: Reen al profilo flash update success confirm needed: Uzantinformoj sukcese freŝigitaj. Kontrolu vian retpoŝtilon por iu mesaĝo kiu konfirmos vian novan retadreso. flash update success: Uzantinformoj sukcese freŝigitaj. confirm: - heading: Konfirmi uzantan konton + heading: Kontrolu vian retpoŝtkeston! + introduction_1: Ni sendis al vi retleteron de konfirmo. + introduction_2: Konfirmu vian konton alklakante la ligilon en la retletero kaj + poste vi povos komenci mapigadon. press confirm button: Premu la konfirmbutonon sube por aktivigi vian konton. button: Konfirmi + success: Via konto estas konfirmita, multan dankon por vi registrado! + already active: Ĉi tiu konto jam estas konfirmita. + unknown token: Ĉi tiu konfirma kodo malvalidiĝis aÅ­ ne ekzistas. + reconfirm_html: Por resendi la konfirman kodon, <a href="%{reconfirm}">alklaku + ĉi tie</a>. + confirm_resend: + success: Ni sendis novan konfirman kodon al %{email}, kaj tiel frue vi konfirmos + vian konton, vi povos mapigi.<br /><br />Se vi uzas kontraÅ­-trud-mesaĝan sistemon, + certigu ke vi aldonis %{sender} al via blanka listo, do tiel ni eblos kontakti + vin senprobleme. + failure: Uzanto %{name} ne trovita. confirm_email: heading: Konfirmi ŝanĝon de retadreso. press confirm button: Premu la butonon sube por konfirmi vian novan retadreson. button: Konfirmi - success: Via retadreso estis konfirmita, dankon pro registriĝo. + success: Ŝanĝo de via retpoŝta adreso konfirmita! failure: Retadreso jam estis konfirmita per tiu ĵetono. + unknown_token: Ĉi tiu konfirma kodo malvalidiĝis aÅ­ ne ekzistas. set_home: - flash success: Hejma loko sukcese konservita + flash success: Pozicio de hejmo sukcese konservita go_public: flash success: Ĉiuj viaj redaktoj naÅ­ estas publikaj, kaj vi naÅ­ rajtas redakti. make_friend: + heading: Ĉu aldoni %{user} al amikoj? + button: Aldoni kiel amikon success: '%{name} nun estas via amiko.' failed: BedaÅ­rinde, malsukcesis aldoni %{name} kiel amiko. already_a_friend: Vi jam estas amiko de %{name}. remove_friend: + heading: Ĉu eksamikigi %{user}? + button: Eksamikigi success: '%{name} estis forviŝita el viaj amikoj.' not_a_friend: '%{name} ne estas amiko via.' filter: not_an_administrator: Vi devas esti administristo por fari tion. + list: + title: Uzantoj + heading: Uzantoj + showing: + one: Paĝo %{page} (%{first_item} el %{items}) + other: Paĝo %{page} (%{first_item}-%{last_item} el %{items}) + summary: '%{name} kreita de %{ip_address} je %{date}' + summary_no_ip: '%{name} kreita je %{date}' + confirm: Konfirmi elektitajn uzantojn + hide: Kaŝi elektitajn uzantojn + empty: Kongruaj uzantoj ne trovitaj + suspended: + title: Konto haltigita + heading: Konto haltigita + webmaster: administranto + body: |- + <p> + Ho ve, via konto estas aÅ­tomate haltigita pro suspekta agado. + </p> + <p> + Ĉi tiu decido estos reviziita de administranto baldaÅ­, aÅ­ vi povas kontakti kun la %{webmaster}, se vi volas diskuti tion. + </p> + auth_failure: + connection_failed: Konektado al aÅ­tentiga servo malsukcesis + invalid_credentials: Malkorektaj ensalutiloj + no_authorization_code: Rajtigada kodo mankas + unknown_signature_algorithm: Nekonata algoritmo de subskribo + invalid_scope: Malkorekta amplekso + auth_association: + heading: Via identigilo ne estas ankoraÅ­ kunligita kun OpenStreetMap-konto. + option_1: Se vi estas unuafoje je OpenStreetMap, bonvolu krei novan konton per + la jena formularo. + option_2: Se vi jam havas konton, vi povas ensaluti per via salutnomo kaj pasvorto, + kaj poste kunligi la konton kun via identigilo en agordoj de uzanto. user_role: filter: - not_an_administrator: Nur administrantoj eblas ŝanĝi uzantrolojn, kaj vi ne + not_an_administrator: Nur administrantoj povas ŝanĝi uzant-rolojn, sed vi ne estas administranto. not_a_role: La ĉeno `%{role}' ne estas valida rolo. already_has_role: La uzanto jam rolas %{role}. doesnt_have_role: La uzanto ne rolas %{role}. grant: + title: Konfirmi donadon de rolo + heading: Konfirmi donadon de rolo + are_you_sure: Ĉu vi certe volas doni la rolon '%{role}' al la uzanto '%{name}'? confirm: Konfirmi + fail: Ne povas doni rolon '%{role}' al la uzanto '%{name}'. Bonvolu kontroli, + ĉu kaj uzanto kaj rolo estas korektaj. revoke: + title: Konfirmi nuligo de rolo + heading: Konfirmi nuligon de rolo + are_you_sure: Ĉu vi certe volas nuligi la rolon '%{role}' de la uzanto '%{name}'? confirm: Konfirmi + fail: Ne povas nuligi la rolon '%{role}' de la uzanto '%{name}'. Bonvolu kontroli, + ĉu kaj uzanto kaj rolo estas korektaj. user_block: + model: + non_moderator_update: Vi devas esti kontrolanto por doni aÅ­ ĝisdatigi blokadon. + non_moderator_revoke: Vi devas esti kontrolanto por nuligi blokadon. + not_found: + sorry: BedaÅ­rinde, ne povas trovi blokadon de uzanto kun identigilo %{id}. + back: Reen al indekso + new: + title: Kreado de blokado de %{name} + heading: Kreado de blokado de %{name} + reason: La kaÅ­zo kial %{name} estas blokita. Bonvolu esti kiel eble plej trankvila + kaj prudenta, donu kiel eble plej multe da detaloj pri la situacio, memoru, + ke la mesaĝo estos videbla publike. Memoru, ke ne ĉiuj uzantoj komprenas la + komunuman ĵargonon, do bonvolu uzi simplajn vortojn. + period: Por kiom da tempo, ekde nun, la uzanto estos blokita por aliro al API. + submit: Krei blokadon + tried_contacting: Mi kontaktis la uzanton kaj petis lin pri ĉesigo. + tried_waiting: Mi donis al la uzanto konvenan kvanton da tempo por respondi + al miaj sciigoj. + needs_view: Uzanto devas ensaluti antaÅ­ ĉi tiu blokado nuligos + back: Montri ĉiujn blokadojn + edit: + title: Redaktado de blokado por %{name} + heading: Redaktado de blokado por %{name} + reason: La kaÅ­zo kial %{name} estas blokita. Bonvolu esti kiel eble plej trankvila + kaj prudenta, donu kiel eble plej multe da detaloj pri la situacio. Memoru, + ke ne ĉiuj uzantoj komprenas la komunuman ĵargonon, do bonvolu uzi simplajn + vortojn. + period: Por kiom da tempo, ekde nun, la uzanto estos blokita por aliro al API. + submit: Ĝisdatigi blokadon + show: Montri ĉi tiun blokadon + back: Montri ĉiujn blokadojn + needs_view: Ĉu la uzanto devas ensaluti antaÅ­ ĉi tiu blokado nuligos? + filter: + block_expired: Ĉi tiu blokado malvalidiĝis kaj neredakteblas. + block_period: La periodo de blokado estu unu el la valoroj elektitaj el la fallisto. + create: + try_contacting: Bonvolu provi kontakti la uzanton antaÅ­ vi blokos vin kaj donu + al li konvenan kvanton da tempo por respondi. + try_waiting: Bonvolu doni al la uzanto konvenan kvanton da tempo por respondi + antaÅ­ blokado. + flash: Kreis blokon por uzanto %{name}. + update: + only_creator_can_edit: Nur la kontrolanto kiu kreis ĉi tiun blokadon, povas + redakti ĝin. + success: Blokado ĝisdatigita. + index: + title: Blokadoj de uzanto + heading: Listo de blokadoj de uzanto + empty: Neniuj blokadoj kreitaj ankoraÅ­. + revoke: + title: Nuligado de blokado por %{block_on} + heading: Nuligado de blokado por %{block_on} kreitaj de %{block_by} + time_future: Ĉi tiu blokado finiĝos je %{time}. + past: La blokado finiĝis antaÅ­ %{time} kaj ĝi ne povas esti nuligita nun. + confirm: Ĉu vi certe volas nuligi ĉi tiun blokadon? + revoke: Malbloki! + flash: Ĉi tiu blokado estas nuligita. period: one: 1 horo other: '%{count} horoj' partial: show: Montri edit: Redakti + revoke: Malbloki! + confirm: Ĉu vi certas? + display_name: Blokita uzanto creator_name: Kreinto + reason: Kialo de blokado status: Stato + revoker_name: Nuligita de + not_revoked: (ne nuligita) + showing_page: Paĝo %{page} + next: Sekva » + previous: « AntaÅ­a helper: time_future: Finiĝos %{time}. + until_login: Aktiva ĝis la uzanto ensalutos. time_past: Finiĝis antaÅ­ %{time} + blocks_on: + title: Blokadoj por %{name} + heading: Listo de blokadoj por %{name} + empty: '%{name} ne estas ankoraÅ­ blokita.' + blocks_by: + title: Blokadoj de %{name} + heading: Listo de blokadoj de %{name} + empty: '%{name} ankoraÅ­ faris neniun blokadon.' show: + title: '%{block_on} blokita de %{block_by}' + heading: '%{block_on} blokita de %{block_by}' time_future: Finiĝas %{time} time_past: Finiĝis antaÅ­ %{time} + created: Kreita + ago: antaÅ­ %{time} status: Stato show: Montri edit: Redakti + revoke: Malbloki! + confirm: Ĉu vi certas? + reason: 'Kialo de blokado:' + back: Montri ĉiujn blokadojn + revoker: 'Malblokanto:' + needs_view: La uzanto devas ensaluti antaÅ­ ĉi tiu blokado nuligos. note: + description: + opened_at_html: Kreita antaÅ­ %{when} + opened_at_by_html: Kreita antaÅ­ %{when} de %{user} + commented_at_html: Ĝisdatigita antaÅ­ %{when} + commented_at_by_html: Ĝisdatigita antaÅ­ %{when} de %{user} + closed_at_html: Solvita antaÅ­ %{when} + closed_at_by_html: Solvita antaÅ­ %{when} de %{user} + reopened_at_html: Remalfermita antaÅ­ %{when} + reopened_at_by_html: Remalfermita antaÅ­ %{when} de %{user} + rss: + title: OpenStreetMap-rimarkoj + description_area: Listo de rimarkoj raportitaj, komentitaj aÅ­ fermitaj en via + najbaraĵo [(%{min_lat}|%{min_lon}) -- (%{max_lat}|%{max_lon})] + description_item: RSS-fluo por rimarko %{id} + opened: nova rimarko (proksime de %{place}) + commented: nova komento (proksime de %{place}) + closed: fermita rimarko (proksime de %{place}) + reopened: remalfermita rimarko (proksime de %{place}) + entry: + comment: Komento + full: Tuta rimarko mine: + title: Rimarkoj kreitaj aÅ­ komentitaj de %{user} + heading: Rimarkoj de %{user} + subheading: Rimarkoj kreitaj aÅ­ komentitaj de %{user} + id: Identigilo + creator: AÅ­toro description: Priskribo + created_at: Kreita je + last_changed: Laste ŝanĝita + ago_html: antaÅ­ %{when} + javascripts: + close: Fermi + share: + title: Kunhavigi + cancel: Nuligi + image: Bildo + link: Ligilo aÅ­ HTML + long_link: Ligilo + short_link: Ligileto + geo_uri: Geo-URI + embed: HTML + custom_dimensions: Agordi proprajn dimensiojn + format: 'Dosiertipo:' + scale: 'Skalo:' + image_size: Bildo montros norman tavolon en dimensio + download: Elŝuti + short_url: Mallonga retadreso + include_marker: Inkludi markon + center_marker: Centrigi mapon al marko + paste_html: Engluu HTML-kodon al via retpaĝo + view_larger_map: Vidi pli grandan mapon + only_standard_layer: Nur la norma tavolo de mapo elporteblas kiel bildon + embed: + report_problem: Raporti problemon + key: + title: Mapklarigo + tooltip: Mapklarigo + tooltip_disabled: Mapklarigo estas ne disponeblas por ĉi tiu tavolo + map: + zoom: + in: Pligrandigi + out: Malgrandigi + locate: + title: Montri mian pozicion + popup: Vi estas {distance} {unit} de ĉi tiu punkto + base: + standard: Norma mapo + cycle_map: Biciklada mapo + transport_map: Transporta mapo + hot: Hom-helpa mapo + layers: + header: Tavoloj de mapo + notes: Notoj pri mapo + data: Map-datumoj + gps: Publikaj GPS-spuroj + overlays: Aktivigu surtavolojn por solvi problemojn kun la mapo + title: Tavoloj + copyright: © <a href='%{copyright_url}'>Kontribuintoj de OpenStreetMap</a> + donate_link_text: <a class='donate-attr' href='%{donate_url}'>Donaci</a> + site: + edit_tooltip: Redakti la mapon + edit_disabled_tooltip: Pligrandigu por redakti la mapon + createnote_tooltip: Aldoni rimarkon al la mapo + createnote_disabled_tooltip: Pligrandigu por aldoni noton al la mapo + map_notes_zoom_in_tooltip: Pligrandigu por vidi map-rimarkoj + map_data_zoom_in_tooltip: Pligrandigu por vidi map-datumoj + queryfeature_tooltip: Montri informoj pri objekto + queryfeature_disabled_tooltip: Pligrandigu por montri informojn pri objektoj + changesets: + show: + comment: Komento + subscribe: Observi + unsubscribe: Malobservi + hide_comment: kaŝi + unhide_comment: malkaŝi + notes: + new: + intro: Vi rimarkis eraron aÅ­ iu mankas? Sciigu aliajn mapigistojn, por ili + povos ripari tion. Movu la markon al la respektivan pozicion kaj enmetu + la noton priskribantan la problemon. (Bonvolu ne enmeti personajn informojn + aÅ­ informojn el kopirajtaj mapoj aÅ­ fontoj.) + add: Aldoni rimarkon + show: + anonymous_warning: Ĉi tiu rimarko enhavas komentojn de anonimuloj, kiuj devas + esti kontrolitaj sendepende. + hide: Kaŝi + resolve: Solvi + reactivate: Remalfermi + comment_and_resolve: Komenti kaj solvi + comment: Komenti + edit_help: Movu la mapon kaj pligrandigu al loko kiun vi volas redakti, kaj poste + alklaku tie ĉi. + directions: + engines: + graphhopper_bicycle: Bicikle (GraphHopper) + graphhopper_foot: Piede (GraphHopper) + mapquest_bicycle: Bicikle (MapQuest) + mapquest_car: AÅ­te (MapQuest) + mapquest_foot: Piede (MapQuest) + osrm_car: AÅ­te (OSRM) + mapzen_bicycle: Bicikle (Mapzen) + mapzen_car: AÅ­te (Mapzen) + mapzen_foot: Piede (Mapzen) + directions: Kurso + distance: Distanco + errors: + no_route: Ne povis trovi kurson inter tiuj du punktoj. + no_place: Ho ve - ne povas trovi tiun lokon. + instructions: + continue_without_exit: AntaÅ­en al %{name} + slight_right_without_exit: Ete dekstren al %{name} + offramp_right_without_exit: Veturu la elveturejon dekstre al %{name} + onramp_right_without_exit: Turnu dekstren al la elveturejo al %{name} + endofroad_right_without_exit: Ĉe la fino de la vojo turnu dekstren al %{name} + merge_right_without_exit: Turnu dekstren al %{name} + fork_right_without_exit: Ĉe la vojforko turnu dekstren al %{name} + turn_right_without_exit: Turnu dekstren al %{name} + sharp_right_without_exit: Akute dekstren al %{name} + uturn_without_exit: U-forma ĝirado laÅ­ %{name} + sharp_left_without_exit: Akute maldekstren al %{name} + turn_left_without_exit: Turnu maldekstren al %{name} + offramp_left_without_exit: Veturu la elveturejon maldekstre al %{name} + onramp_left_without_exit: Turnu maldekstren al la elveturejo al %{name} + endofroad_left_without_exit: Ĉe la fino de la vojo turnu maldekstren al %{name} + merge_left_without_exit: Turnu maldekstren al %{name} + fork_left_without_exit: Ĉe la vojforko turnu maldekstren al %{name} + slight_left_without_exit: Ete maldekstren al %{name} + via_point_without_exit: (tra punkto) + follow_without_exit: Sekvu %{name} + roundabout_without_exit: Ĉe trafikcirklo al %{name} + leave_roundabout_without_exit: Elveturu el trafikcirklo - %{name} + stay_roundabout_without_exit: Sekvu la trafikcirklon - %{name} + start_without_exit: Komencu ĉe la fino de %{name} + destination_without_exit: Celo atingita + against_oneway_without_exit: Iru kontraÅ­-direkte al %{name} + end_oneway_without_exit: Fino de unuflanka vojo ĉe %{name} + roundabout_with_exit: Ĉe trafikcirklo prenu %{exit}-an elveturejon al %{name} + turn_left_with_exit: En trafikcirklo turnu maldekstren al %{name} + slight_left_with_exit: En trafikcirklo turnetu maldekstren al %{name} + turn_right_with_exit: En trafikcirklo turnu dekstren al %{name} + slight_right_with_exit: En trafikcirklo turnetu dekstren al %{name} + continue_with_exit: En trafikcirklo veturi rekten al %{name} + unnamed: sennoma vojo + courtesy: Kalkulado de kurso danke al %{link} + time: Tempo + query: + node: Nodo + way: Linio + relation: Rilato + nothing_found: Neniuj objektoj trovitaj + error: 'Eraro dum komunikado kun %{server}: %{error}' + timeout: Atingis tempolimon dum kontakto kun %{server} redaction: edit: description: Priskribo + heading: Redakti korekton + submit: Konservi korekton + title: Redakti korekton + index: + empty: Neniu korekto por montri. + heading: Listo de korektoj + title: Listo de korektoj new: description: Priskribo + heading: Entajpu informojn pri novan korekton + submit: Krei korekton + title: Kreado de nova korekto show: description: 'Priskribo:' + heading: Montrado de korekto "%{title}" + title: Montrado de korekto + user: 'AÅ­toro:' + edit: Redakti ĉu tiun korekton + destroy: Forigi ĉi tiun korekton + confirm: Ĉu vi certas? + create: + flash: Korekto kreita. + update: + flash: Ŝanĝoj konservitaj. + destroy: + not_empty: La korekto ne estas malplena. Bonvolu malfari ĉiujn versiojnm kiuj + apartenas al ĉi tiu korekto, antaÅ­ vi forigos ĝin. + flash: Korekto forigita. + error: Okazis eraro dum forigado de ĉi tiu korekto. ... diff --git a/config/locales/es.yml b/config/locales/es.yml index 3c697a26c..2a982c93b 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -1,6 +1,8 @@ # Messages for Spanish (español) # Exported from translatewiki.net # Export driver: phpyaml +# Author: Aguslr +# Author: Alberto Chung # Author: Armando-Martin # Author: Carlosz22 # Author: Crazymadlover @@ -10,6 +12,8 @@ # Author: Fortega # Author: Guillembb # Author: Hereñu +# Author: Idontknow +# Author: Indiralena # Author: Invadinado # Author: Johnarupire # Author: Jynus @@ -32,6 +36,7 @@ # Author: VegaDark # Author: Vivaelcelta # Author: Xuacu +# Author: Yllelder --- es: time: @@ -101,7 +106,7 @@ es: user: email: Correo electrónico active: Activo - display_name: Nombre para mostrar + display_name: Nombre a mostrar description: Descripción languages: Idiomas pass_crypt: Contraseña @@ -189,6 +194,7 @@ es: way: vía relation: relación changeset: conjunto de cambios + note: nota timeout: sorry: Lo sentimos, los datos para %{type} con el identificador %{id} han tardado demasiado tiempo en obtenerse. @@ -197,6 +203,7 @@ es: way: vía relation: relación changeset: conjunto de cambios + note: nota redacted: redaction: Redacción %{id} message_html: La versión %{version} de este %{type} no se puede mostrar tal @@ -283,6 +290,7 @@ es: diary_entry: new: title: Nueva entrada en el diario + publish_button: Publicar list: title: Diarios de usuarios title_friends: Diarios de amigos @@ -294,7 +302,7 @@ es: no_entries: No hay entradas en el diario recent_entries: Entradas recientes en el diario older_entries: Entradas más antiguas - newer_entries: Entradas más modernas + newer_entries: Entradas más recientes edit: title: Editar entrada del diario subject: 'Asunto:' @@ -351,7 +359,7 @@ es: comments: has_commented_on: '%{display_name} dejó un comentario en las siguientes entradas de diario' - post: Publicar + post: Publicación when: Cuando comment: Comentario ago: hace %{ago} @@ -953,7 +961,7 @@ es: logo: alt_text: Logo de OpenStreetMap home: Inicio - logout: Cerrar sesión + logout: Salir log_in: Iniciar sesión log_in_tooltip: Identificarse con una cuenta existente sign_up: Registrarse @@ -1045,10 +1053,10 @@ es: Encontrarás más información acerca de cómo utilizar nuestros datos, y cómo citarnos como fuente, en la <a href="http://osmfoundation.org/Licence">página de licencia de OSMF</a> y en las <a href="http://wiki.openstreetmap.org/wiki/Legal_FAQ">preguntas legales más frecuentes</a> de la comunidad. more_2_html: |- - A pesar de que OpenStreetMap es contenido abierto, no podemos suminstrar una API de mapas gratuita para desarrolladores de aplicaciones para terceros. + A pesar de que OpenStreetMap es contenido abierto, no podemos suminstrar una API de mapas gratuita para terceros. - Por favor, lea nuestra <a href="http://wiki.openstreetmap.org/wiki/API_usage_policy">Política de uso del API</a>, - <a href="http://wiki.openstreetmap.org/wiki/Tile_usage_policy">Política de uso de <i>mosaicos de mapas</i></a> y <a href="http://wiki.openstreetmap.org/wiki/Nominatim#Usage_Policy">Políticas de uso de Nominatim</a>. + Consulta nuestra <a href="https://operations.osmfoundation.org/policies/api/">Política de uso del API</a>, + <a href="https://operations.osmfoundation.org/policies/tiles/">Política de uso de <i>mosaicos de mapas</i></a> y <a href="https://operations.osmfoundation.org/policies/nominatim/">Política de uso de Nominatim</a>. contributors_title_html: Nuestros colaboradores contributors_intro_html: 'Nuestros colaboradores son miles de personas. Incluimos también datos con licencia abierta de organismos cartográficos nacionales @@ -1100,9 +1108,9 @@ es: de descolgado</a> o preséntelo directamente en nuestra <a href="http://dmca.openstreetmap.org/">página de presentación en línea</a>. trademarks_title_html: <span id="trademarks"></span>Marcas registradas - trademarks_1_html: OpenStreetMap y el logotipo de la lupa son marcas registradas - de la Fundación OpenStreetMap. Si tienes preguntas sobre su uso, envíalas - al <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">grupo + trademarks_1_html: OpenStreetMap, el logotipo de la lupa y el estado del mapa + son marcas registradas de la Fundación OpenStreetMap. Si tienes preguntas + sobre su uso, envíalas al <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">grupo de trabajo sobre licencias</a>. welcome_page: title: ¡Bienvenido! @@ -1214,7 +1222,7 @@ es: about_page: next: Siguiente copyright_html: <span>©</span>Colaboradores de<br>OpenStreetMap - used_by: '%{name} impulsa mediante geodatos a cientos de sitios web, aplicaciones + used_by: '%{name} impulsa mediante geodatos a miles de sitios web, aplicaciones móviles y dispositivos de hardware.' lede_text: OpenStreetMap lo crea una gran comunidad de colaboradores que con sus contribuciones al mapa añaden y mantienen datos sobre caminos, senderos, cafeterías, @@ -1236,16 +1244,19 @@ es: legal_title: Legal legal_html: "Este sitio y muchos otros servicios relacionados son manejados por la \n<a href='http://osmfoundation.org/'>Fundación OpenStreetMap</a> (OSMF) - \nen nombre de la comunidad.\n<br> \n<a href='http://osmfoundation.org/Contact'>Contacta + \nen nombre de la comunidad. El uso de todos los servicios manejados por la + OSMF están sujetos \na nuestra <a href=\"http://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy\">\npolítica + de uso aceptable</a> y nuestra <a href=\"http://wiki.osmfoundation.org/wiki/Privacy_Policy\">política + de privacidad</a>\n<br> \n<a href='http://osmfoundation.org/Contact'>Contacta a la OSMF</a> \nsi tienes preguntas o problemas sobre licencias, derechos de autor u otro tema legal." partners_title: Socios notifier: diary_comment_notification: - subject: '[OpenStreetMap] %{user} ha comentado en tu entrada de diario' + subject: '[OpenStreetMap] %{user} ha comentado en una entrada de diario' hi: Hola %{to_user}, - header: '%{from_user} ha comentado sobre tu reciente entrada en el diario con - el asunto %{subject}:' + header: '%{from_user} ha comentado sobre en la entrada de diario con el asunto + %{subject}:' footer: También puede leer el comentario en %{readurl} y puedes comentar en %{commenturl} o responder en %{replyurl} message_notification: @@ -1340,6 +1351,7 @@ es: ha comentado. La nota está cerca de %{place}.' details: Más detalles acerca de la nota pueden encontrarse en %{url}. changeset_comment_notification: + hi: Hola %{to_user}, greeting: Hola, commented: subject_own: '[OpenStreetMap] %{commenter} ha comentado en uno de tus conjuntos @@ -1354,6 +1366,8 @@ es: partial_changeset_with_comment: con el comentario '%{changeset_comment}' partial_changeset_without_comment: sin comentarios details: Más detalles acerca del conjunto de cambios pueden encontrarse en %{url}. + unsubscribe: Para darte de baja de las actualizaciones de este conjunto de cambios, + visita %{url} y haz clic en "darse de baja". message: inbox: title: Buzón de entrada @@ -1475,15 +1489,17 @@ es: table: entry: motorway: Autopista + main_road: Carretera principal trunk: Carretera principal primary: Vía primaria secondary: Vía secundaria unclassified: Carretera sin clasificar - unsurfaced: Carretera sin asfaltar track: Pista - byway: Camino bridleway: Vía ecuestre cycleway: Bicisenda + cycleway_national: Ciclovía nacional + cycleway_regional: Ciclovía regional + cycleway_local: Ciclovía local footway: Vía peatonal rail: Ferrocarril subway: Metro @@ -1505,7 +1521,6 @@ es: golf: Campo de golf park: Parque resident: Zona residencial - tourist: Atracción turística common: - Común - pradera @@ -1535,9 +1550,11 @@ es: tunnel: Borde a rayas = túnel bridge: Borde negro = puente private: Acceso privado - permissive: Acceso permisivo destination: Acceso a destino construction: Vías en construcción + bicycle_shop: Tienda de bicicletas + bicycle_parking: Aparcamiento de bicicletas + toilets: Baños richtext_area: edit: Editar preview: Vista previa @@ -1699,6 +1716,7 @@ es: allow_read_gpx: leer sus trazas GPS privadas. allow_write_gpx: subir trazas GPS. allow_write_notes: cambiar notas. + grant_access: Otorgar acceso oauthorize_success: title: Solicitud de autorización permitida allowed: Usted ha concedido el acceso a la aplicación %{app_name} a su cuenta. @@ -1789,8 +1807,8 @@ es: una cuenta. create account minute: Cree una cuenta. Sólo se tarda un minuto. no account: ¿No está registrado? - account not active: Lo sentimos, tu cuenta aun no está activa.<br />Por favor - usa el enlace que hay en el correo de confirmación para activarla, o <a href="%{reconfirm}">solicita + account not active: Lo sentimos, tu cuenta aún no está activa.<br />Usa el enlace + que hay en el correo de confirmación para activarla, o <a href="%{reconfirm}">solicita un nuevo correo de confirmación</a>. account is suspended: Lo sentimos, su cuenta se ha suspendido debido a actividad sospechosa.<br>Póngase en contacto con el <a href="%{webmaster}">webmaster</a> @@ -1810,6 +1828,12 @@ es: windowslive: title: Inicia sesión con Windows Live alt: Inicia sesión con una cuenta de Windows Live + github: + title: Accede con GitHub + alt: Accede con una cuenta de GitHub + wikipedia: + title: Iniciar sesión con Wikipedia + alt: Iniciar sesión con una cuenta de Wikipedia yahoo: title: Iniciar sesión con Yahoo alt: Iniciar sesión con una OpenID de Yahoo @@ -1820,9 +1844,9 @@ es: title: Iniciar sesión con AOL alt: Iniciar sesión con una OpenID de AOL logout: - title: Cerrar sesión + title: Salir heading: Salir de OpenStreetMap - logout_button: Cerrar sesión + logout_button: Salir lost_password: title: Contraseña perdida heading: ¿Contraseña olvidada? @@ -1847,9 +1871,9 @@ es: title: Registrarse no_auto_account_create: Desafortunadamente no estamos actualmente habilitados para crear una cuenta para ti automáticamente. - contact_webmaster: Por favor, contacta al webmaster <a href="mailto:webmaster@openstreetmap.org">webmaster</a> - para organizar la creación de una cuenta. Intentaremos gestionar la solicitud - lo más pronto posible. + contact_webmaster: Contacta al <a href="%{webmaster}">webmaster</a> para gestionar + la creación de una cuenta. Intentaremos gestionar la solicitud lo más pronto + posible. about: header: Libre y editable html: <p>A diferencia de otros mapas, OpenStreetMap está creado completamente @@ -1860,9 +1884,10 @@ es: del contribuyente</a>. email address: 'Dirección de correo electrónico:' confirm email address: 'Confirmar la dirección de correo electrónico:' - not displayed publicly: No se muestra de forma pública (vea la <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" - title="wiki privacy policy including section on email addresses">política - de privacidad</a>) + not displayed publicly: Tu dirección no se muestra de forma pública (consulta + la <a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy" title="OSMF + privacy policy including section on email addresses">política de privacidad</a> + para más información) display name: 'Nombre en pantalla:' display name description: Tu nombre de usuario público. Puedes cambiarlo más tarde en "preferencias". @@ -1872,14 +1897,6 @@ es: use external auth: O bien, utilice un servicio de terceros para acceder auth no password: Con la autenticación de terceros no se necesita una contraseña, aunque hay algunas herramientas y servidores que aún la solicitan. - auth association: |- - <p>Tu ID todavía no está asociada con una cuenta de OpenStreetMap.</p> - <ul> - <li>Si eres nuevo en OpenStreetMap, por favor crea una cuenta mediante el siguiente formulario.</li> - <li> - Si ya tienes una cuenta, puedes iniciar sesión en tu cuenta usando tu nombre de usuario y contraseña y luego asociar la cuenta con tu ID en la configuración de usuario. - </li> - </ul> continue: Registrarse terms accepted: ¡Gracias por aceptar los nuevos términos de colaborador! terms declined: Lamentamos que haya decidido no aceptar los nuevos Términos @@ -1900,7 +1917,7 @@ es: decline: Declinar you need to accept or decline: Por favor lea y, a continuación, acepte o rechace los nuevos Términos de contribución para continuar. - legale_select: 'Por favor, seleccione su país de residencia:' + legale_select: 'País de residencia:' legale_names: france: Francia italy: Italia @@ -1910,6 +1927,7 @@ es: heading: El usuario %{user} no existe body: Lo sentimos, no existe ningún usuario con el nombre %{user}. Por favor, verifica las letras, o tal vez el vínculo en el que has hecho click está equivocado. + deleted: borrado view: my diary: Mi diario new diary entry: nueva entrada de diario @@ -1961,16 +1979,16 @@ es: revoke: administrator: Revocar acceso de administrador moderator: Revocar acceso de moderador - block_history: bloqueos recibidos + block_history: Bloqueos activos moderator_history: Bloqueos impuestos comments: Comentarios - create_block: bloquear a este usuario - activate_user: activar este usuario - deactivate_user: desactivar este usuario - confirm_user: confirmar este usuario - hide_user: esconder este usuario - unhide_user: descubrir este usuario - delete_user: borrar este usuario + create_block: Bloquear a este usuario + activate_user: Activar este usuario + deactivate_user: Desactivar este usuario + confirm_user: Confirmar este usuario + hide_user: Ocultar este usuario + unhide_user: Mostrar este usuario + delete_user: Eliminar este usuario confirm: Confirmar friends_changesets: conjuntos de cambios realizados por amigos friends_diaries: entradas de diarios de amigos @@ -2011,7 +2029,7 @@ es: contributor terms: heading: 'Términos de Colaborador:' agreed: Has aceptado los nuevos Términos de Colaborador. - not yet agreed: Aun no has aceptado los nuevos Términos de Colaborador. + not yet agreed: Aún no has aceptado los nuevos Términos de Colaborador. review link text: Por favor, haz clic sobre este vínculo para revisar y aceptar los nuevos Términos de Colaborador. agreed_with_pd: También has declarado que consideras tus modificaciones como @@ -2025,6 +2043,8 @@ es: gravatar: Usa Gravatar link: http://wiki.openstreetmap.org/wiki/Gravatar link text: ¿Qué es esto? + disabled: Gravatar se ha deshabilitado. + enabled: Se ha habilitado la visualización de tu Gravatar. new image: Añadir una imagen keep image: Mantener la imagen actual delete image: Eliminar la imagen actual @@ -2057,10 +2077,10 @@ es: <a href="%{reconfirm}">haga clic aquí</a>. confirm_resend: success: Te hemos enviado un nuevo aviso de confirmación a %{email} y tan pronto - confirmes tu cuenta podrás comenzar a crear mapas<br /><br />Si usas un sistema - de antispam que envía solicitudes de confirmación, asegúrate, por favor, de - incluir en tu lista blanca a webmaster@openstreetmap.org ya que no podemos - responder a ninguna solicitud de confirmación. + confirmes tu cuenta podrás comenzar a crear mapas.<br /><br />Si usas un sistema + antispam que envía solicitudes de confirmación, asegúrate de incluir en tu + lista blanca a %{sender} ya que no podemos responder a ninguna solicitud de + confirmación. failure: No se ha encontrado el usuario %{name} confirm_email: heading: Confirmar el cambio de dirección de correo electrónico @@ -2068,8 +2088,8 @@ es: su nueva dirección de correo electrónico. button: Confirmar success: Se confirmó el cambio de dirección de correo electrónico. - failure: La dirección de correo electrónico ha sido confirmada mediante esta - credencial de autentificación. + failure: Ya se ha confirmado una dirección de correo electrónico con esta credencial + de autenticación. unknown_token: Ese código de confirmación ha caducado o no existe. set_home: flash success: Localización guardada con éxito @@ -2117,6 +2137,13 @@ es: no_authorization_code: Sin código de autorización unknown_signature_algorithm: Algoritmo de firma desconocido invalid_scope: Ámbito no válido + auth_association: + heading: Tu identificador aún no está asociado con una cuenta de OpenStreetMap. + option_1: Si eres nuevo en OpenStreetMap, crea cuenta nueva usando el formulario + a continuación. + option_2: Si ya tienes una cuenta, puedes acceder a ella con tu nombre de usuario + y contraseña, y luego asociar la cuenta con tu identificador en tus preferencias + de usuario. user_role: filter: not_an_administrator: Sólo los administradores pueden realizar la administración @@ -2301,10 +2328,13 @@ es: center_marker: Centrar mapa en el marcador paste_html: Pegar código HTML para incrustar en el sitio web view_larger_map: Ver mapa más grande + only_standard_layer: Sólo la capa estándar se puede exportar como una imagen + embed: + report_problem: Reportar problemas key: title: Leyenda del mapa tooltip: Leyenda del mapa - tooltip_disabled: Leyenda del mapa disponible sólo para la capa Estándar + tooltip_disabled: Leyenda del mapa no disponible en esta capa map: zoom: in: Acercar @@ -2316,12 +2346,12 @@ es: standard: Estándar cycle_map: Mapa ciclista transport_map: Mapa de transporte - mapquest: MapQuest Open hot: Humanitario layers: header: Capas del mapa notes: Notas del mapa data: Datos del mapa + gps: Trazas GPS públicas overlays: Activar superposiciones para solucionar problemas en el mapa title: Capas copyright: © <a href='%{copyright_url}'>Colaboradores de OpenStreetMap</a> @@ -2367,6 +2397,9 @@ es: mapquest_car: En coche (MapQuest) mapquest_foot: A pie (MapQuest) osrm_car: En coche (OSRM) + mapzen_bicycle: En bicicleta (Mapzen) + mapzen_car: En coche (Mapzen) + mapzen_foot: A pie (Mapzen) directions: Indicaciones distance: Distancia errors: @@ -2375,19 +2408,41 @@ es: instructions: continue_without_exit: Continuar en %{name} slight_right_without_exit: Gire un poco a la derecha hacia %{name} + offramp_right_without_exit: Tome la salida a la derecha hacia %{name} + onramp_right_without_exit: Gire a la izquierda en la salida hacia %{name} + endofroad_right_without_exit: Al final de la calle gire a la derecha hacia + %{name} + merge_right_without_exit: Incorpórese a la derecha hacia %{name} + fork_right_without_exit: En la bifurcación, gire a la derecha hacia %{name} turn_right_without_exit: Gire a la derecha hacia %{name} sharp_right_without_exit: Giro brusco a la derecha hacia %{name} + uturn_without_exit: Vuelta en U a lo largo de %{name} sharp_left_without_exit: Giro brusco a la izquierda hacia %{name} turn_left_without_exit: Gire a la izquierda hacia %{name} + offramp_left_without_exit: Tome la salida a la izquierda hacia %{name} + onramp_left_without_exit: Gire a la izquierda en la salida hacia %{name} + endofroad_left_without_exit: Al final de la calle gire a la derecha hacia + %{name} + merge_left_without_exit: Incorpórese a la izquierda hacia %{name} + fork_left_without_exit: En la bifurcación, gire a la izquierda hacia %{name} slight_left_without_exit: Gire un poco a la izquierda hacia %{name} via_point_without_exit: (punto intermedio) follow_without_exit: Siga %{name} roundabout_without_exit: En la rotonda, tomar %{name} leave_roundabout_without_exit: Salir de la rotonda - %{name} stay_roundabout_without_exit: Permanecer en la rotonda - %{name} + start_without_exit: Iniciar al final de %{name} destination_without_exit: Llegue a su destino + against_oneway_without_exit: Ir en contra de una vía de un solo sentido en + %{name} end_oneway_without_exit: Final de un solo sentido en %{name} roundabout_with_exit: En la rotonda, tomar la salida %{exit} hacia %{name} + turn_left_with_exit: En la rotonda girar a la izquierda hacia %{name} + slight_left_with_exit: En la rotonda girar levemente a la izquierda hacia + %{name} + turn_right_with_exit: En la rotonda girar a la derecha hacia %{name} + slight_right_with_exit: En la rotonda girar levemente a la derecha hacia%{name} + continue_with_exit: En la rotonda continuar recto hacia %{name} unnamed: sin nombre courtesy: Indicaciones cortesía de %{link} time: Hora diff --git a/config/locales/et.yml b/config/locales/et.yml index 3298f7327..8d329b892 100644 --- a/config/locales/et.yml +++ b/config/locales/et.yml @@ -5,6 +5,8 @@ # Author: Avjoska # Author: Kanne # Author: Luckas +# Author: Macofe +# Author: Pikne # Author: RM87 # Author: WikedKentaur --- @@ -15,8 +17,8 @@ et: activerecord: models: acl: Pääsuloend - changeset: Muutuskogum - changeset_tag: Muutuskogumi silt + changeset: Muudatuskogum + changeset_tag: Muudatuskogumi silt country: Riik diary_comment: Päeviku kommentaar diary_entry: Päeviku sissekanne @@ -52,8 +54,8 @@ et: diary_entry: user: Kasutaja title: Teema - latitude: Laiuskraad - longitude: Pikkuskraad + latitude: Laius + longitude: Pikkus language: Keel friend: user: Kasutaja @@ -63,8 +65,8 @@ et: visible: Nähtav name: Nimi size: Suurus - latitude: Laiuskraadid - longitude: Pikkuskraadid + latitude: Laius + longitude: Pikkus public: Avalik description: Kirjeldus message: @@ -75,7 +77,7 @@ et: user: email: E-posti aadress active: Aktiivne - display_name: Näita nime + display_name: Kuvatav nimi description: Kirjeldus languages: Keeled pass_crypt: Parool @@ -98,12 +100,12 @@ et: closed: Suletud created_html: Loodud <abbr title='%{title}'>%{time} tagasi</abbr> closed_html: Suletud <abbr title='%{title}'>%{time} tagasi</abbr> - created_by_html: Loodud %{user} poolt <abbr title='%{title}'>%{time} tagasi</abbr> - deleted_by_html: Kustutatud %{user} poolt <abbr title='%{title}'>%{time} tagasi</abbr> - edited_by_html: Muudetud %{user} poolt <abbr title='%{title}'>%{time} tagasi</abbr> - closed_by_html: Suletud %{user} poolt <abbr title='%{title}'>%{time} tagasi</abbr> + created_by_html: Loonud %{user} <abbr title='%{title}'>%{time} tagasi</abbr> + deleted_by_html: Kustutanud %{user} <abbr title='%{title}'>%{time} tagasi</abbr> + edited_by_html: Muutnud %{user} <abbr title='%{title}'>%{time} tagasi</abbr> + closed_by_html: Sulgenud %{user} <abbr title='%{title}'>%{time} tagasi</abbr> version: Versioon - in_changeset: Muutuskogum + in_changeset: Muudatuskogum anonymous: anonüümne no_comment: (kommentaare pole) part_of: Osa @@ -112,7 +114,7 @@ et: view_details: Vaata üksikasju location: 'Asukoht:' changeset: - title: 'Muutuskogum: %{id}' + title: 'Muudatuskogum: %{id}' belongs_to: Autor node: Sõlmed (%{count}) node_paginated: Sõlmed (%{x}-%{y}/%{count}) @@ -125,11 +127,11 @@ et: tagasi</abbr> commented_by: Kommentaar kasutajalt %{user} <abbr title='%{exact_time}'>%{when} tagasi</abbr> - changesetxml: Muutuskogumi XML + changesetxml: Muudatuskogumi XML osmchangexml: osmChange XML feed: - title: Muutuskogum %{id} - title_comment: Muutuskogum %{id} - %{comment} + title: Muudatuskogum %{id} + title_comment: Muudatuskogum %{id} – %{comment} join_discussion: Logi sisse, kui soovid arutelus osaleda discussion: Arutelu node: @@ -163,22 +165,24 @@ et: node: sõlme way: joont relation: relatsiooni - changeset: muutuskogumit + changeset: muudatuskogumit + note: märkuse timeout: sorry: Kahjuks võttis andmete (%{type} id-ga %{id}) laadimine liiga kaua aega. type: node: sõlme way: joone relation: relatsiooni - changeset: muutuskogumi + changeset: muudatuskogumi + note: märkuse redacted: redaction: Redaktsioon %{id} message_html: Selle %{type} versiooni %{version} ei saa kuvada, sest seda on muudetud. Palun vaata üksikasju %{redaction_link}. type: - node: sõlm - way: joon - relation: relatsioon + node: sõlme + way: joone + relation: relatsiooni start_rjs: feature_warning: Laaditakse %{num_features} objekti, mis võib muuta su veebilehitseja aeglaseks. Kas oled kindel, et soovid neid andmeid kuvada? @@ -199,23 +203,20 @@ et: open_title: 'Lahendamata märkus: #%{note_name}' closed_title: 'Lahendatud märkus: #%{note_name}' hidden_title: 'Peidetud märkus #%{note_name}' - open_by: Loodud %{user} poolt <abbr title='%{exact_time}'>%{when} tagasi</abbr> + open_by: Loonud %{user} <abbr title='%{exact_time}'>%{when} tagasi</abbr> open_by_anonymous: Loodud anonüümse kasutaja poolt <abbr title='%{exact_time}'>%{when} tagasi</abbr> commented_by: Kommentaar kasutajalt %{user} <abbr title='%{exact_time}'>%{when} tagasi</abbr> commented_by_anonymous: Kommentaar anonüümselt kasutajalt <abbr title='%{exact_time}'>%{when} tagasi</abbr> - closed_by: Lahendatud kasutaja %{user} poolt <abbr title='%{exact_time}'>%{when} - tagasi</abbr> + closed_by: Lahendanud %{user} <abbr title='%{exact_time}'>%{when} tagasi</abbr> closed_by_anonymous: Lahendatud anonüümse kasutaja poolt <abbr title='%{exact_time}'>%{when} tagasi</abbr> - reopened_by: Taasavatud kasutaja %{user} poolt <abbr title='%{exact_time}'>%{when} - tagasi</abbr> + reopened_by: Taasavanud %{user} <abbr title='%{exact_time}'>%{when} tagasi</abbr> reopened_by_anonymous: Taasavatud anonüümse kasutaja poolt <abbr title='%{exact_time}'>%{when} tagasi</abbr> - hidden_by: Peidetud kasutaja %{user} poolt <abbr title='%{exact_time}'>%{when} - tagasi</abbr> + hidden_by: Peitnud %{user} <abbr title='%{exact_time}'>%{when} tagasi</abbr> changeset: changeset_paging_nav: showing_page: Leht %{page} @@ -224,7 +225,7 @@ et: changeset: anonymous: Anonüümne no_edits: (muudatused puuduvad) - view_changeset_details: Vaata muutuskogumi üksikasju + view_changeset_details: Vaata muudatuskogumi üksikasju changesets: id: ID saved_at: Salvestatud @@ -232,25 +233,25 @@ et: comment: Kommentaar area: Ala list: - title: Muutuskogumid - title_user: Kasutaja %{user} muutuskogumid - title_friend: Sõprade muutuskogumid - title_nearby: Läheduses asuvate kasutajate muutuskogumid - empty: Muutuskogumeid ei leitud. - empty_area: Selles alas ei ole muutuskogumeid. - empty_user: Selle kasutaja tehtud muutuskogumeid ei ole. - no_more: Rohkem muutuskogumeid ei leitud. - no_more_area: Sellest alast ei leitud rohkem muutuskogumeid. - no_more_user: Sellelt kasutajalt ei leitud rohkem muutuskogumeid. + title: Muudatuskogumid + title_user: Kasutaja %{user} muudatuskogumid + title_friend: Sõprade muudatuskogumid + title_nearby: Läheduses asuvate kasutajate muudatuskogumid + empty: Muudatuskogumeid ei leitud. + empty_area: Selles alas ei ole muudatuskogumeid. + empty_user: Selle kasutaja tehtud muudatuskogumeid ei ole. + no_more: Rohkem muudatuskogumeid ei leitud. + no_more_area: Sellest alast ei leitud rohkem muudatuskogumeid. + no_more_user: Sellelt kasutajalt ei leitud rohkem muudatuskogumeid. load_more: Laadi veel timeout: - sorry: Kahjuks võttis taotletud muutuskogumite laadimine liiga kaua aega. + sorry: Kahjuks võttis taotletud muudatuskogumite laadimine liiga kaua aega. rss: - title_all: OpenStreetMap muutuskogumi arutelu - title_particular: 'OpenStreetMap muutuskogumi #%{changeset_id} arutelu' - comment: 'Uus kommentaar muutuskogumis #%{changeset_id} kasutajalt %{author}' + title_all: OpenStreetMapi muudatuskogumi arutelu + title_particular: 'OpenStreetMapi muudatuskogumi #%{changeset_id} arutelu' + comment: 'Uus kommentaar muudatuskogumis #%{changeset_id} kasutajalt %{author}' commented_at_html: Uuendatud %{when} tagasi - commented_at_by_html: Uuendatud %{when} tagasi kasutaja %{user} poolt + commented_at_by_html: Uuendanud %{user} %{when} tagasi full: Kogu arutelu diary_entry: new: @@ -273,8 +274,8 @@ et: body: 'Tekst:' language: 'Keel:' location: 'Asukoht:' - latitude: 'Laiuskraad:' - longitude: 'Pikkuskraad:' + latitude: 'Laius:' + longitude: 'Pikkus:' use_map_link: kasuta kaarti save_button: Salvesta marker_text: Päeviku sissekande tegemise asukoht @@ -283,7 +284,7 @@ et: user_title: Kasutaja %{user} päevik leave_a_comment: Kommenteeri login_to_leave_a_comment: kommenteerimiseks %{login_link} - login: Logi sisse + login: logi sisse save_button: Salvesta no_such_entry: title: Sellist päeviku sissekannet pole olemas @@ -291,8 +292,8 @@ et: body: Kahjuks ei leidu päeviku sissekannet või kommentaari id-ga %{id}. Kontrolli sisestatud lingi õigekirja. Võimalik, et link millele sa vajutasid on vigane. diary_entry: - posted_by: Postitas %{link_user} %{created} %{language_link} - comment_link: Kommenteeri seda päeviku sissekannet + posted_by: Postitas %{link_user} kuupäeval %{created} – %{language_link} + comment_link: Kommenteeri seda sissekannet reply_link: Vasta sellele sissekandele comment_count: one: '%{count} kommentaar' @@ -311,15 +312,15 @@ et: edit: muuda feed: user: - title: Kasutaja %{user} OpenStreetMap päeviku sissekanded - description: Kasutaja %{user} hiljutised OpenStreetMap päeviku sissekanded + title: Kasutaja %{user} OpenStreetMapi päeviku sissekanded + description: Kasutaja %{user} hiljutised OpenStreetMapi päeviku sissekanded language: - title: OpenStreetMap päeviku sissekanded keeles %{language_name} - description: Hiljutised OpenStreetMap kasutajate päeviku sissekanded keeles + title: OpenStreetMapi päevikusissekanded keeles %{language_name} + description: Hiljutised OpenStreetMapi kasutajate päevikusissekanded keeles %{language_name} all: - title: OpenStreetMap päeviku sissekanded - description: Hiljutised OpenStreetMap kasutajate päeviku sissekanded + title: OpenStreetMapi päevikusissekanded + description: Hiljutised OpenStreetMapi kasutajate päevikusissekanded comments: has_commented_on: '%{display_name} on kommenteerinud järgnevaid päeviku sissekandeid' post: Postitus @@ -348,12 +349,12 @@ et: allalaadimiseks. planet: title: Planet OSM - description: Regulaarselt uuendatavad koopiad tervest OpenStreetMap andmebaasist + description: Regulaarselt uuendatavad koopiad tervest OpenStreetMapi andmebaasist overpass: title: Overpass API - description: Laadi alla piiritletud ala OpenStreetMap andmebaasi peegelserverist + description: Laadi alla piiritletud ala OpenStreetMapi andmebaasi peegelserverist geofabrik: - title: Geofabrik allalaadimised + title: Geofabriki allalaadimised description: Regulaarselt uuendatavad tõmmised kontinentidest, riikidest ja valikulistest linnadest metro: @@ -361,7 +362,7 @@ et: description: Tõmmised maailma suurematest linnadest ja nende ümbruskondadest other: title: Muud allikad - description: Täiendavad allikad on välja toodud OpenStreetMapi wikis + description: Täiendavad allikad on välja toodud OpenStreetMapi vikis options: Sätted format: 'Vorming:' scale: Mõõtkava @@ -386,8 +387,8 @@ et: Nominatim</a>i tulemused geonames: <a href="http://www.geonames.org/">GeoNames</a>i tulemused osm_nominatim_reverse: <a href="http://nominatim.openstreetmap.org/">OpenStreetMap - Nominatim</a> tulemused - geonames_reverse: <a href="http://www.geonames.org/">GeoNames</a> tulemused + Nominatimi</a> tulemused + geonames_reverse: <a href="http://www.geonames.org/">GeoNamesi</a> tulemused search_osm_nominatim: prefix: aeroway: @@ -403,6 +404,8 @@ et: bench: Pink bicycle_parking: Jalgrattaparkla bicycle_rental: Jalgrattarent + biergarten: Õlleaed + boat_rental: Paadilaenutus brothel: Lõbumaja bureau_de_change: Rahavahetus bus_station: Bussijaam @@ -413,6 +416,7 @@ et: charging_station: Laadimisjaam cinema: Kino clinic: Kliinik + clock: Kell courthouse: Kohtuhoone crematorium: Krematoorium dentist: Hambaarst @@ -437,6 +441,7 @@ et: library: Raamatukogu market: Turg marketplace: Turg + monastery: Klooster nightclub: Ööklubi nursing_home: Hooldekodu office: Kontor @@ -479,12 +484,27 @@ et: "yes": Sild building: "yes": Hoone + craft: + brewery: Pruulikoda + carpenter: Puusepp + electrician: Elektrik + gardener: Aednik + painter: Maaler + photographer: Fotograaf + plumber: Torulukksepp + shoemaker: Kingsepp + tailor: Rätsep + "yes": Käsitööpood emergency: + ambulance_station: Kiirabijaam + defibrillator: Defibrillaator phone: Hädaabi telefon highway: bridleway: Ratsatee bus_stop: Bussipeatus + construction: Ehitusjärgus tee cycleway: Jalgrattatee + elevator: Elevaator emergency_access_point: Hädaabi punkt footway: Jalgrada ford: Koolmekoht @@ -502,13 +522,17 @@ et: steps: Trepp street_lamp: Tänavavalgusti tertiary: Kohalik maantee + traffic_signals: Valgusfoor unsurfaced: Katteta tee + "yes": Tee historic: battlefield: Lahinguväli boundary_stone: Piirikivi building: Ajalooline hoone + bunker: Punker castle: Kindlus church: Kirik + city_gate: Linnavärav citywalls: Linnamüürid fort: Kindlus house: Maja @@ -517,7 +541,9 @@ et: memorial: Memoriaal mine: Kaevandus monument: Mälestusmärk + roman_road: Rooma tee ruins: Varemed + stone: Kivi tower: Torn wayside_cross: Teeäärne rist wayside_shrine: Teeäärne altar @@ -530,6 +556,7 @@ et: industrial: Tööstuspiirkond landfill: Prügimägi meadow: Niit + military: Militaarala mine: Kaevandus orchard: Viljapuuaed quarry: Karjäär @@ -538,7 +565,10 @@ et: reservoir: Veehoidla residential: Elamurajoon vineyard: Viinamarjaistandus + "yes": Maakasutus leisure: + club: Klubi + dog_park: Koerapark fishing: Kalapüügipiirkond garden: Aed golf_course: Golfiväljak @@ -556,6 +586,7 @@ et: track: Jooksurada water_park: Veepark man_made: + lighthouse: Tuletorn tower: Torn works: Vabrik military: @@ -576,16 +607,19 @@ et: forest: Mets geyser: Geiser glacier: Liustik + grassland: Rohumaa heath: Nõmm hill: Mägi island: Saar land: Maa + marsh: Soo moor: Raba mud: Muda peak: Mäetipp point: Neem reef: Riff rock: Kivi + sand: Liiv spring: Allikas stone: Kivi strait: Väin @@ -598,7 +632,13 @@ et: office: accountant: Raamatupidaja architect: Arhitekt + company: Ettevõte + employment_agency: Tööbüroo + insurance: Kindlustusbüroo + lawyer: Jurist + travel_agent: Reisibüroo place: + allotments: Suvilad airport: Lennujaam city: Linn country: Riik @@ -640,6 +680,7 @@ et: tram_stop: Trammipeatus shop: antiques: Antikvariaat + art: Kunstipood bakery: Pagariäri bicycle: Rattapood books: Raamatupood @@ -680,6 +721,7 @@ et: music: Muusikapood newsagent: Ajalehekiosk optician: Prillipood + outdoor: Matkatarbed pet: Lemmikloomapood pharmacy: Apteek photo: Fotopood @@ -696,10 +738,12 @@ et: "yes": Pood tourism: alpine_hut: Alpimaja + apartment: Korter artwork: Kunstiteos attraction: Turismiatraktsioon bed_and_breakfast: Kodumajutus camp_site: Laagriplats + gallery: Galerii guest_house: Külalistemaja hostel: Hostel hotel: Hotell @@ -711,18 +755,19 @@ et: viewpoint: Vaatepunkt zoo: Loomaaed tunnel: + culvert: Truup "yes": Tunnel waterway: boatyard: Verf canal: Kanal - dam: Tamm + dam: Pais ditch: Kraav rapids: Kärestik river: Jõgi stream: Oja wadi: Vadi waterfall: Kosk - weir: Pais + weir: Ülevool admin_levels: level2: Riigipiir level4: Osariigi piir @@ -737,8 +782,8 @@ et: Nominatimist</a> geonames: Asukoht teenusest <a href="http://www.geonames.org/">GeoNames</a> types: - cities: Linnad - towns: Külad + cities: Suurlinnad + towns: Linnad places: Kohad results: no_results: Ei leidnud midagi @@ -758,13 +803,13 @@ et: export: Eksport data: Andmed export_data: Andmete eksportimine - gps_traces: GPS rajad - gps_traces_tooltip: Halda GPS radasid + gps_traces: GPS-rajad + gps_traces_tooltip: Halda GPS-radasid user_diaries: Kasutajate päevikud user_diaries_tooltip: Vaata kasutajate päevikuid - edit_with: Redigeeri %{editor}-ga + edit_with: Redigeeri rakendusega %{editor} tag_line: Vaba viki-maailmakaart - intro_header: Tere tulemast OpenStreetMappi! + intro_header: Tere tulemast OpenStreetMapi! intro_text: OpenStreetMap on maailma kaart, mille on loonud inimesed nagu sina ja seda võib vabalt kasutada avatud litsentsi tingimustel. intro_2_create_account: loo oma konto @@ -807,9 +852,10 @@ et: legal_babble: title_html: Autoriõigused ja litsents intro_1_html: |- - OpenStreetMap on <i>avatud andmed</i>, mis on litsentseeritud <a + OpenStreetMap<sup><a href="#trademarks">®</a></sup> on <i>avatud andmed</i>, mis on litsentseeritud <a href="http://opendatacommons.org/licenses/odbl/">Open Data - Commons Open Database License</a> (ODbL) tingimustel. + Commons Open Database License</a> (ODbL) tingimustel <a + href="http://osmfoundation.org/">OpenStreetMap Foundation</a> (OSMF) poolt. intro_2_html: |- Sa võid vabalt kopeerida, levitada, edastada ja kohandada meie andmeid seni kuni sa tunnustad OpenStreetMapi ja selle @@ -844,9 +890,9 @@ et: title: Tunnustamise näide more_title_html: Lisateave more_1_html: |- - Rohkem infot, kuidas kasutada meie andmeid ja kuidas meid tunnustada leiab lehelt <a - href="http://wiki.openstreetmap.org/wiki/Legal_FAQ">Legal - FAQ</a>. + Rohkem infot, kuidas kasutada meie andmeid ja kuidas meid tunnustada leiab <a + href="http://osmfoundation.org/Licence">OSMF litsentsi leheküljelt</a> ja kogukonna <a + href="http://wiki.openstreetmap.org/wiki/Legal_FAQ">vastustes juriidilistele küsimustele</a>. more_2_html: |- Kuigi OpenStreetMap on vabad andmed, ei saa me pakkuda tasuta kaardi API-t kolmandate osapoolte arendajatele. @@ -880,6 +926,11 @@ et: contributors_nz_html: |- <strong>Uus-Meremaa</strong>: Sisaldab kaardiandmeid Land Information New Zealand. Crown Copyright reserved. + contributors_si_html: |- + <strong>Sloveenia</strong>: Sisaldab + <a href="http://www.gu.gov.si/en/">Maamõõtmis- ja Kartograafiaameti</a> ning + <a href="http://www.mkgp.gov.si/en/">Põllu-, Metsa- ja Toidumajandusministeeriumi</a> kaardiandmeid + (Sloveenia avalik informatsioon). contributors_za_html: |- <strong>LAV</strong>: Sisaldab andmeid allikast <a href="http://www.ngi.gov.za/">Chief Directorate: @@ -907,6 +958,11 @@ et: meie <a href="http://www.osmfoundation.org/wiki/License/Takedown_procedure">eemaldamise protseduuri</a> poole või otse meie <a href="http://dmca.openstreetmap.org/">onlain lehele</a>. + trademarks_title_html: <span id="trademarks"></span>Kaubamärgid + trademarks_1_html: OpenStreetMap, suurendusklaasi logo ja State of the Map on + OpenStreetMap Sihtasutuse registreeritud kaubamärgid. Kui teil on nende märkide + kasutamise kohta küsimusi, siis saatke küsimused <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">Litsentsi + töörühmale</a>. welcome_page: title: Tere tulemast! introduction_html: Tere tulemast OpenStreetMappi, vabasse ja muudetavasse maailmakaarti. @@ -933,6 +989,13 @@ et: järve või hoonet. tag_html: <strong>Silt</strong> sisaldab väikest hulka andmeid sõlme või joone kohta, näiteks restorani nime või tee kiiruspiirangut. + rules: + title: Reeglid! + paragraph_1_html: "OpenStreetMapil on vähe formaalseid reegleid kuid me eeldame, + et kõik osavõtjad teevad koostööd ja suhtlevad kogukonnaga. Kui plaanid tegevusi, + mis ei ole käsitsi redigeerimine, siis loe \n<a href='http://wiki.openstreetmap.org/wiki/Import/Guidelines'>importimise</a> + ja \n<a href='http://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct'>automaatsete + muudatuste</a> juhendeid." questions: title: Tekkis küsimusi? paragraph_1_html: |- @@ -960,7 +1023,7 @@ et: Kliki <a class='icon note'></a> või samale ikoonile kaardivaates. See lisab kaardile markeri, mida sa saad liigutada seda hiirega lohistades. Lisa oma sõnum, seejärel kliki "Salvesta" ja teised kaardistajad näevad seda. other_concerns: - title: Muud probleemid + title: Muud asjad explanation_html: |- Kui sul on küsimusi meie andmete kasutamise või sisu kohta, siis palun pöördu juriidilise info saamiseks meie <a href='/copyright'>autoriõiguste lehele</a> või võta ühendust sobiva <a href='http://wiki.osmfoundation.org/wiki/Working_Groups'>OSMF töögrupiga</a>. @@ -1002,8 +1065,8 @@ et: description: Sirvi vikis põhjalikumat OSM dokumentatsiooni. about_page: next: Edasi - copyright_html: <span>©</span>OpenStreetMap<br>kaastöölised - used_by: '%{name} varustab kaardiandmetega sadu veebisaite, mobiilside rakendusi + copyright_html: <span>©</span>OpenStreetMapi<br>kaastöölised + used_by: '%{name} varustab kaardiandmetega tuhandeid veebisaite, mobiilside rakendusi ja riistvara seadmeid' lede_text: OpenStreetMap on loodud kaardistajate kogukonna poolt, kes täiendavad ja hooldavad andmeid teede, radade, kohvikute, raudteejaamade ja paljude teiste @@ -1026,13 +1089,19 @@ et: seni kuni sa tunnustad OpenStreetMapi ja selle kaastööliseid. Kui sa muudad või või lood midagi nende andmete põhjal, siis võid sa oma tulemust levitada ainult sama litsentsi alusel. Täpsemat infot vaata lehelt <a href='%{copyright_path}'>Autoriõigused ja litsents</a>. + legal_title: Juriidiline teave + legal_html: "Seda saiti ja paljusid teisi seotud teenuseid opereerib formaalselt + \n<a href='http://osmfoundation.org/'>OpenStreetMap Sihtasutus</a> (OSMF) \nkogukonna + nimel.\n<br> \nPalun <a href='http://osmfoundation.org/Contact'>võta ühendust + OSMF-ga</a> \nkui sul tekib küsimusi litsentseerimise, autoriõiguste või juriidika + osas." partners_title: Partnerid notifier: diary_comment_notification: subject: '[OpenStreetMap] %{user} kommenteeris sinu päeviku sissekannet' hi: Tere, %{to_user}! - header: '%{from_user} on kommenteerinud sinu hiljutist OpenStreetMap päeviku - sissekannet pealkirjaga %{subject}:' + header: '%{from_user} kommenteeris hiljutist OpenStreetMapi päevikusissekannet + pealkirjaga %{subject}:' footer: Loe kommentaari lehel %{readurl}. Võid lisada oma kommentaari lehel %{commenturl} või vastata kommentaarile lehel %{replyurl}. message_notification: @@ -1046,7 +1115,7 @@ et: see_their_profile: Tema profiiliga võid tutvuda aadressil %{userurl}. befriend_them: Sa võid ta lisada oma sõbraks aadressil %{befriendurl}. gpx_notification: - greeting: Tere, + greeting: Tere! your_gpx_file: Paistab, et sinu GPX-fail with_description: ', mille kirjeldus on' and_the_tags: 'ja järgmised sildid:' @@ -1061,7 +1130,7 @@ et: loaded_successfully: laaditi üles edukalt %{trace_points} punkti võimalikust %{possible_points} punktist. signup_confirm: - subject: '[OpenStreetMap] Tere tulemast OpenStreetMappi' + subject: '[OpenStreetMap] Tere tulemast OpenStreetMapi' greeting: Tere! created: Keegi (loodetavasti sina) lõi äsja %{site_url} kasutajakonto. confirm: 'Enne kasutajakonto loomist peame saama kinnituse, et see taotlus tuli @@ -1071,13 +1140,13 @@ et: email_confirm: subject: '[OpenStreetMap] Kinnita oma e-posti aadress' email_confirm_plain: - greeting: Tere, + greeting: Tere! hopefully_you: Keegi (loodetavasti sina) soovib muuta oma %{server_url} meiliaadressi kujule %{new_address}. click_the_link: Kui see oled sina, siis palun kliki allolevale lingile muudatuse kinnitamiseks. email_confirm_html: - greeting: Tere, + greeting: Tere! hopefully_you: Keegi (loodetavasti sina) soovib muuta oma %{server_url} meiliaadressi kujule %{new_address}. click_the_link: Kui see oled sina, siis palun kliki allolevale lingile muudatuse @@ -1085,20 +1154,20 @@ et: lost_password: subject: '[OpenStreetMap] Parooli lähtestamise taotlus' lost_password_plain: - greeting: Tere, + greeting: Tere! hopefully_you: Keegi (tõenäoliselt sina) on esitanud taotluse oma parooli lähtestamiseks antud meiliaadressiga openstreetmap.org kasutajakonto alt. click_the_link: Kui see oled sina, siis palun kliki allaolevale lingile oma parooli lähtestamiseks. lost_password_html: - greeting: Tere, + greeting: Tere! hopefully_you: Keegi (tõenäoliselt sina) on esitanud taotluse oma parooli lähtestamiseks antud meiliaadressiga openstreetmap.org kasutajakonto alt. click_the_link: Kui see oled sina, siis palun kliki allaolevale lingile oma parooli lähtestamiseks. note_comment_notification: anonymous: Anonüümne kasutaja - greeting: Tere, + greeting: Tere! commented: subject_own: '[OpenStreetMap] %{commenter} on kommenteerinud ühte sinu märkust' subject_other: '[OpenStreetMap] %{commenter} on kommenteerinud märkust, millest @@ -1123,7 +1192,15 @@ et: Märkus on %{place} lähedal.' details: Märkuse lisateavet leiad %{url}. changeset_comment_notification: - greeting: Tere, + greeting: Tere! + commented: + subject_own: '[OpenStreetMap] %{commenter} on kommenteerinud üht sinu muudatuskogumit' + subject_other: '[OpenStreetMap] %{commenter} on kommenteerinud muudatuskogumit, + millest sa oled huvitunud' + your_changeset: '%{commenter} on jätnud kommentaari ühele sinu muudatuskogumile, + mis on loodud kuupäeval %{time}' + commented_changeset: '%{commenter} on jätnud kommentaari kaardi muudatuskogumile, + mida sa jälgid ja mille on loonud %{changeset_author} kuupäeval %{time}' message: inbox: title: Saabunud kirjad @@ -1248,9 +1325,7 @@ et: primary: Põhimaantee secondary: Tugimaantee unclassified: Klassifitseerimata tee - unsurfaced: Katteta tee track: Rada - byway: Kõrvaltee bridleway: Ratsatee cycleway: Jalgrattatee footway: Jalgtee @@ -1274,7 +1349,6 @@ et: golf: Golfiväljak park: Park resident: Elamurajoon - tourist: Turismimagnet common: - Heinamaa - luht @@ -1304,7 +1378,6 @@ et: tunnel: Katkendlik ümbris = tunnel bridge: Must ümbris = sild private: Üksnes omanikule - permissive: Pääs ainult lubadega destination: Üksnes läbisõiduks construction: Ehitatavad teed richtext_area: @@ -1404,9 +1477,9 @@ et: in: kohas map: asukoht kaardil list: - public_traces: Avalikud GPS rajad - your_traces: Sinu GPS rajad - public_traces_from: Kasutaja %{user} avalikud GPS rajad + public_traces: Avalikud GPS-rajad + your_traces: Sinu GPS-rajad + public_traces_from: Kasutaja %{user} avalikud GPS-rajad description: Sirvi viimati üles laaditud GPS-radasid tagged_with: ', millel on silt %{tags}' application: @@ -1431,7 +1504,7 @@ et: allow_read_prefs: lugeda sinu kasutajaeelistusi. allow_write_prefs: muuta sinu kasutajaeelistusi. allow_write_diary: luua päeviku sissekandeid, kommentaare ja saada sõbraks. - allow_write_api: muuda kaarti. + allow_write_api: muuta kaarti. allow_read_gpx: lugeda sinu privaatseid GPS jälgi. allow_write_gpx: laadida üles GPS jälgi. allow_write_notes: muuta märkuseid. @@ -1453,7 +1526,7 @@ et: title: Redigeeri oma rakendust submit: Redigeeri show: - title: OAuth üksikasjad %{app_name} + title: Rakenduse %{app_name} OAuthi üksikasjad key: 'Tarbija võti:' secret: 'Tarbija saladus:' url: Taotlustõendi URL @@ -1463,7 +1536,7 @@ et: edit: Muuda üksikasju delete: Kustuta klient confirm: Kas oled kindel? - requests: 'Järgnevate õiguste taotlemine kasutajalt:' + requests: 'Kasutajalt taotletakse järgmisi õigusi:' allow_read_prefs: lugeda nende kasutajaeelistusi. allow_write_prefs: muuta nende kasutajaeelistusi. allow_write_diary: luua päeviku sissekandeid, kommenteerida ja saada sõbraks. @@ -1472,16 +1545,16 @@ et: allow_write_gpx: laadida üles GPS-radasid. allow_write_notes: muuta märkuseid. index: - title: Minu OAuth seaded + title: Minu OAuthi üksikasjad my_tokens: Minu autoriseeritud rakendused list_tokens: 'Järgmised turvamärgid on rakendustele väljastatud sinu nime all:' application: Rakenduse nimi issued_at: Väljastatud revoke: Tühista! my_apps: Minu klientrakendused - no_apps: Kas omad rakendust, mida soovid siin kasutamiseks registreerida, kasutades - %{oauth} standardit? Selleks tuleb kõigepealt registreerida oma veebirakendus - enne kui see saab teostada OAuth päringuid antud teenusele. + no_apps: Kas sul on rakendus, mida soovid siin kasutamiseks registreerida, kasutades + standardit %{oauth}? Enne kui see saab antud teenusele OAuthi päringuid saata, + pead oma veebirakenduse registreerima. registered_apps: 'Sul on registreeritud on järgmised klientrakendused:' register_new: Registreeri oma rakendus form: @@ -1513,16 +1586,15 @@ et: email or username: 'E-posti aadress või kasutajanimi:' password: 'Parool:' openid: '%{logo} OpenID:' - remember: 'Jäta mind meelde:' + remember: Jäta mind meelde lost password link: Salasõna ununes? login_button: Logi sisse register now: 'Registreeru:' - with username: Kas omad juba OpenStreetMap kasutajakontot? Palun logi sisse - enda kasutajanime ja salasõnaga. + with username: 'Kas sul on juba OpenStreetMapi konto? Palun logi sisse oma kasutajanime + ja salasõnaga:' with external: 'Teise võimalusena võid sisse logida kolmanda osapoole kaudu:' - new to osm: Oled uus OpenStreetMap kasutaja? - to make changes: Muudatuste tegemiseks OpenStreetMap andmetes peab sul olema - kasutajakonto. + new to osm: Kas OpenStreetMap on sulle uus? + to make changes: Et OpenStreetMapi andmeid muuta, peab sul olema kasutajakonto. create account minute: Loo kasutajakonto. See võtab vaid hetke. no account: Sa ei ole veel registreerinud kasutajaks? account not active: Vabandust, sinu kasutajakonto ei ole veel aktiivne.<br />Aktiveerimiseks @@ -1540,18 +1612,24 @@ et: google: title: Sisene Google'i tunnusega alt: Sisene Google'i OpenID tunnusega + facebook: + title: Sisene Facebooki tunnusega + alt: Sisene Facebooki kontoga + windowslive: + title: Sisene Windows Live'i tunnusega + alt: Sisene Windows Live'i kontoga yahoo: title: Sisene Yahoo tunnusega alt: Sisene Yahoo OpenID tunnusega wordpress: - title: Sisene Wordpress tunnusega - alt: Sisene Wordpress OpenID tunnusega + title: Sisene Wordpressi tunnusega + alt: Sisene Wordpressi OpenID tunnusega aol: - title: Sisene AOL tunnusega - alt: Sisene AOL OpenID tunnusega + title: Sisene AOL-i tunnusega + alt: Sisene AOL-i OpenID tunnusega logout: title: Logi välja - heading: Välju OpenStreetMap -st + heading: Logi OpenStreetMapist välja logout_button: Logi välja lost_password: title: Unustatud salasõna @@ -1565,7 +1643,7 @@ et: notice email cannot find: Seda e-posti aadressi ei leitud. reset_password: title: Lähtesta parool - heading: Lähtesta parool kasutajale %{user} + heading: Kasutaja %{user} parooli lähtestamine password: 'Parool:' confirm password: 'Kinnita parool:' reset: Lähtesta parool @@ -1575,7 +1653,7 @@ et: title: Registreerumine no_auto_account_create: Kahjuks ei ole meil võimalik luua hetkel sinu jaoks automaatselt kontot. - contact_webmaster: Palun võta ühendust <a href="mailto:webmaster@openstreetmap.org">veebimeistriga</a>, + contact_webmaster: Palun võta ühendust <a href="%{webmaster}">veebimeistriga</a>, et kasutajakonto luua - me üritame tegeleda selle taotlusega nii kiiresti kui võimalik. about: @@ -1592,7 +1670,7 @@ et: display name: 'Kuvatav nimi:' display name description: Avalikult kuvatud kasutajanimi. Seda saate muuta hiljem eelistustes. - password: 'Uus parool:' + password: 'Parool:' confirm password: 'Kinnita parool:' use external auth: Teise võimalusena võid sisse logida kolmanda osapoole kaudu continue: Registreeru @@ -1601,7 +1679,7 @@ et: Lisateabe saamiseks vaata <a href="%{url}">seda wiki lehte</a>. terms: title: 'Kaastöötingimused:' - heading: 'Kaastöötingimused:' + heading: Kaastöötingimused read and accept: Palun loe lepingut ja vajuta nuppu "Nõustun" kinnitamaks, et nõustud selle lepingu tingimustega oma olemasoleva ja edaspidise kaastöö jaoks. consider_pd: Eelnevale nõusolekule lisaks leian, et minu kaastöö kuulub avalikku @@ -1633,7 +1711,7 @@ et: my profile: Minu profiil my settings: Minu seadistused my comments: Minu kommentaarid - oauth settings: oauth seaded + oauth settings: OAuthi seaded blocks on me: Saadud blokeeringud blocks by me: Minu antud blokeeringud send message: Saada sõnum @@ -1670,26 +1748,26 @@ et: administrator: See kasutaja on administraator moderator: See kasutaja on moderaator grant: - administrator: Omista administraatori õigused - moderator: Omista moderaatori õigused + administrator: Määra administraatori õigused + moderator: Määra moderaatori õigused revoke: administrator: Eemalda administraatori õigused moderator: Eemalda moderaatori õigused - block_history: saadud blokeeringud - moderator_history: antud blokeeringud + block_history: Aktiivsed blokeeringud + moderator_history: Antud blokeeringud comments: kommentaarid - create_block: blokeeri see kasutaja - activate_user: aktiveeri see kasutaja - deactivate_user: desaktiveeri see kasutaja - confirm_user: kinnita see kasutaja - hide_user: peida see kasutaja - unhide_user: muuda see kasutaja nähtavaks - delete_user: kustuta see kasutaja + create_block: Blokeeri see kasutaja + activate_user: Aktiveeri see kasutaja + deactivate_user: Desaktiveeri see kasutaja + confirm_user: Kinnita see kasutaja + hide_user: Peida see kasutaja + unhide_user: Muuda see kasutaja nähtavaks + delete_user: Kustuta see kasutaja confirm: Kinnita - friends_changesets: Sõprade muutuskogumid - friends_diaries: Sõprade päevikusissekanded - nearby_changesets: Lähedalasuvate kasutajate muutuskogumid - nearby_diaries: Lähedalasuvate kasutajate päevikusissekanded + friends_changesets: sõprade muudatuskogumid + friends_diaries: sõprade päevikusissekanded + nearby_changesets: lähedalasuvate kasutajate muudatuskogumid + nearby_diaries: lähedalasuvate kasutajate päevikusissekanded popup: your location: Sinu asukoht nearby mapper: Lähedaloevad kaardistajad @@ -1723,7 +1801,7 @@ et: on nüüdsest vaikimisi avalikud.</li></ul> contributor terms: heading: 'Kaastöö tingimused:' - agreed: Oled nõustunud uute Kaastöö tingimustega. + agreed: Oled nõustunud uute kaastöötingimustega. not yet agreed: Sa ei ole veel nõustunud uute Kaastöö tingimustega. review link text: Loe ja nõustu uute Kaastöö tingimustega klõpsates endale sobival ajal antud lingil. @@ -1744,9 +1822,9 @@ et: image size hint: (ruudukujuline pilt mõõtudega vähemalt 100x100 on sobiv) home location: 'Kodu asukoht:' no home location: Sa pole oma kodu asukohta märkinud. - latitude: 'Laiuskraadid:' - longitude: 'Pikkuskraadid:' - update home location on click: Kas uuendan kodu asukohta kui ma klõpsan kaardil? + latitude: 'Laius:' + longitude: 'Pikkus:' + update home location on click: Kas uuendan kodu asukohta, kui klõpsan kaardil? save changes button: Salvesta muudatused make edits public button: Tee kõik minu muudatused avalikuks return to profile: Tagasi profiili juurde @@ -1758,8 +1836,7 @@ et: introduction_1: Me saatsime sulle kinnitusmeili. introduction_2: Kinnita oma konto, klikkides meilis lingile ja sa saad alustada kaardistamist. - press confirm button: Vajuta allolevale kinnitamise nupule, et oma kasutajakonto - aktiveerida. + press confirm button: Klõpsa kinnitusnuppu, et konto aktiveerida. button: Kinnita success: Sinu kasutajakonto on kinnitatud, täname registreerimast! already active: See konto on juba kinnitatud. @@ -1770,14 +1847,14 @@ et: success: Me saatsime sulle uue kinnitusmeili aadressile %{email} ja niipea kui oled oma konto kinnitanud saad alustada kaardistamist.<br /><br /> Kui sa kasutad rämpskirjade vastast süsteemi, mis saadab kinnitustaotluse, siis veendu, - et oled kandnud aadressi webmaster@openstreetmap.org valgesse nimekirja, sest - me ei ole võimelised vastama ühelegi kinnitustaotlusele. + et oled kandnud aadressi %{sender} valgesse nimekirja, sest me ei ole võimelised + vastama ühelegi kinnitustaotlusele. failure: Kasutajat %{name} ei leitud. confirm_email: heading: Kinnita e-posti aadressi muutmine - press confirm button: Kliki nupul kinnita oma uue e-posti aadressi kinnitamiseks. + press confirm button: Klõpsa kinnitusnuppu, et kinnitada uus e-posti aadress. button: Kinnita - success: Sinu eposti aadressi muudatus on kinnitatud, täname registreerimast! + success: Sinu e-posti aadressi muutmine on kinnitatud! failure: E-posti aadress on juba antud pääsuloaga kinnitatud. unknown_token: See kinnituskood on aegunud või seda pole olemas. set_home: @@ -1821,6 +1898,16 @@ et: Käesolev otsus vaadatakse administraatori poolt peatselt üle, või võite kontakteeruda %{webmaster} kui soovite seda arutada. </p> + auth_failure: + no_authorization_code: Autoriseerimiskood puudub + auth_association: + heading: Sinu ID ei ole veel seotud OpenStreetMapi kasutajakontoga. + option_1: |- + Kui oled esimest korda OpenStreetMapis, siis loo palun uus kasutajakonto, + täites allpool oleva vormi. + option_2: Kui sul juba on kasutajakonto, saad enda kontole siseneda, kasutades + oma kasutajatunnust ja parooli ning seejärel siduda kasutaja seadetes konto + oma ID-ga. user_role: filter: not_an_administrator: Kasutaja rollide haldamist saavad teostada ainult administraatorid, @@ -1936,6 +2023,8 @@ et: heading: '%{block_on} blokeeritud kasutaja %{block_by} poolt' time_future: Lõpeb %{time} time_past: Lõppes %{time} tagasi + created: Loodud + ago: '%{time} tagasi' status: Olek show: Näita edit: Redigeeri @@ -1956,7 +2045,7 @@ et: reopened_at_html: Taasaktiveeritud %{when} tagasi reopened_at_by_html: Taasaktiveeritud %{when} tagasi kasutaja %{user} poolt rss: - title: OpenStreetMap märkused + title: OpenStreetMapi märkused description_area: Loetelu märkustest mida teatati, kommenteeriti või suleti sinu piirkonnas [(%{min_lat}|%{min_lon}) -- (%{max_lat}|%{max_lon})] description_item: Märkuse %{id} RSS uudisvoog @@ -1986,6 +2075,7 @@ et: link: Link või HTML long_link: Link short_link: Lühilink + geo_uri: Geo URI embed: HTML custom_dimensions: Vali suurus käsitsi format: 'Vorming:' @@ -1997,6 +2087,9 @@ et: center_marker: Tsentreeri kaart markerile paste_html: Kopeeri HTML-kood oma veebilehele view_larger_map: Vaata suuremat kaarti + only_standard_layer: Ainult tavakaarti saab pildina eksportida + embed: + report_problem: Teata probleemist key: title: Legend tooltip: Legend @@ -2019,7 +2112,7 @@ et: data: Kaardi andmed overlays: Luba kattekihte, et kaarti analüüsida title: Kihid - copyright: © <a href='%{copyright_url}'>OpenStreetMap kaastöölised</a> + copyright: © <a href='%{copyright_url}'>OpenStreetMapi kaastöölised</a> donate_link_text: <a class='donate-attr' href='%{donate_url}'>Tee annetus</a> site: edit_tooltip: Muuda kaarti @@ -2030,7 +2123,7 @@ et: map_data_zoom_in_tooltip: Suumi sisse, et näha kaardi andmeid changesets: show: - comment: Kommentaar + comment: Kommenteeri subscribe: Telli unsubscribe: Lõpeta tellimus hide_comment: peida @@ -2061,6 +2154,8 @@ et: mapquest_car: Autoga (MapQuest) mapquest_foot: Jalgsi (MapQuest) osrm_car: Autoga (OSRM) + mapzen_car: Autoga (Mapzen) + mapzen_foot: Jalgsi (Mapzen) directions: Juhised distance: Vahemaa errors: diff --git a/config/locales/eu.yml b/config/locales/eu.yml index abce1a640..2792dac79 100644 --- a/config/locales/eu.yml +++ b/config/locales/eu.yml @@ -4,6 +4,7 @@ # Author: 9and3r # Author: An13sa # Author: Asieriko +# Author: Gorkaazk # Author: MikelEH # Author: PerroVerd # Author: Subi @@ -16,7 +17,7 @@ eu: friendly: '%e %B %Y %H:%M-ean' activerecord: models: - country: Herrialde + country: Herrialdea friend: Laguna language: Hizkuntza message: Mezua @@ -47,6 +48,7 @@ eu: friend: Lagun trace: user: Erabiltzailea + visible: Ikusgai name: Izena size: Tamaina latitude: Latitude @@ -71,11 +73,18 @@ eu: remote: name: Urrutiko Agintea browse: + created: Sortua + closed: Itxita version: Bertsioa + download_xml: XML deskargatu + view_history: Ikusi historia view_details: Ikusi Xehetasunak location: 'Kokapena:' changeset: belongs_to: Egilea + discussion: Eztabaida + way: + nodes: Nodoak relation: members: Kideak relation_member: @@ -94,11 +103,13 @@ eu: type: relation: erlazio start_rjs: + load_data: Kargatu datuak loading: Kargatzen... tag_details: tags: Etiketak wikidata_link: '%{page} elementua Wikidatan' wikipedia_link: '%{page} artikulua Wikipedian' + telephone_link: Deitu %{phone_number} zenbakira note: title: 'Oharra: %{id}' new_note: Ohar berria @@ -116,10 +127,21 @@ eu: saved_at: Noiz gordeta user: Erabiltzailea comment: Iruzkina + area: Eremua list: load_more: Gehiago kargatu + rss: + commented_at_html: Eguneratua duela %{when} + commented_at_by_html: '%{user}-ek duela %{when} eguneratua' + full: Eztabaida osoa diary_entry: + new: + publish_button: Argitaratu list: + title: Erabiltzaileen egunerokoak + title_friends: Lagunen egunerokoak + title_nearby: Hurbileko erabiltzaileen egunerokoak + user_title: '%{user}(r)en egunerokoa' older_entries: Sarrera zaharragoak newer_entries: Sarrera berriagoak edit: @@ -132,14 +154,18 @@ eu: use_map_link: mapa erabili save_button: Gorde view: + user_title: '%{user}(r)en egunerokoa' leave_a_comment: Iruzkin bat utzi login: Saioa hasi save_button: Gorde diary_entry: + reply_link: Sarrera honi erantzun comment_count: one: iruzkin %{count} zero: Iruzkinik ez other: '%{count} iruzkin' + edit_link: Sarrera hau editatu + hide_link: Sarrera hau ezkutatu confirm: Berretsi diary_comment: hide_link: Iruzkin hau ezkutatu @@ -149,19 +175,31 @@ eu: view: Ikusi edit: Aldatu comments: + when: Noiz + comment: Iruzkina ago: Duela %{ago} newer_comments: Iruzkin berriagoak older_comments: Iruzkin zaharragoak export: + title: Esportatu start: + area_to_export: Esportatzeko eremua + manually_select: Aukeratu eskuz eremu ezberdin bat format_to_export: Esportatzeko formatua osm_xml_data: OpenStreetMap XML Data + embeddable_html: HTML integragarria licence: Lizentzia export_details: OpenStreetMap-eko datuak <a href="http://opendatacommons.org/licenses/odbl/1.0/">Open Data Commons Datu-base Irekiko Lizentzia</a> baimen baten mende daude. too_large: planet: title: OSM Planeta + overpass: + title: Overpass API + geofabrik: + title: Geofabrik Deskargak + other: + title: Bestelako Jatorriak options: Aukerak format: Formatua scale: Eskala @@ -170,10 +208,14 @@ eu: zoom: Zooma latitude: 'Lat:' longitude: 'Lon:' + output: Irteera export_button: Esportatu geocoder: search_osm_nominatim: prefix: + aerialway: + cable_car: Teleferikoa + chair_lift: Teleaulkia aeroway: aerodrome: Aerodromoa apron: Pista @@ -188,16 +230,21 @@ eu: bar: Taberna bbq: Barbakoa bench: Eserleku + bicycle_parking: Txirrinduentzako aparkalekua bicycle_rental: Txirrindu Alokairua - brothel: Putetxe + biergarten: Terraza + boat_rental: Txalupen alokairua + brothel: Putetxea bureau_de_change: Diru-truke Bulegoa bus_station: Autobus-geltoki cafe: Kafetegi car_rental: Ibilgailu-alokairu + car_sharing: Autoa partekatzea car_wash: Auto Garbiketa - casino: Kasino + casino: Kasinoa cinema: Zinema clinic: Klinika + clock: Erlojua college: Kolegioa community_centre: Komunitate Zentroa courthouse: Epaitegia @@ -205,28 +252,35 @@ eu: dentist: Dentista doctors: Medikuak dormitory: Ikasle egoitza - drinking_water: Edateko ur + drinking_water: Edateko ura driving_school: Autoeskola embassy: Enbaxada emergency_phone: Larrialdi Telefonoa fast_food: Janari Azkarra ferry_terminal: Ferry terminal + fire_hydrant: Suteetako ur-hartunea fire_station: Suhiltzaileak + food_court: Jatetxe-eremua fountain: Iturri fuel: Gasolindegia - grave_yard: Hilerri - gym: Osasun Zentroa / Gimnasioa + grave_yard: Hilerria + gym: Fitness Zentroa / Gimnasioa health_centre: Osasun Zentroa hospital: Ospitalea + hunting_stand: Ehiza postua ice_cream: Izozkiak kindergarten: Haurtzaindegi library: Liburutegia market: Merkatu marketplace: Merkatua + monastery: Monastegia + motorcycle_parking: Motorrentzako aparkalekua nightclub: Gau-klub nursery: Haurtzaindegi + nursing_home: Zaharren egoitza office: Bulego parking: Aparkaleku + parking_entrance: Aparkalekuko sarrera pharmacy: Farmazia place_of_worship: Otoitzerako Lekua police: Polizia @@ -235,6 +289,7 @@ eu: preschool: Eskolaurre prison: Espetxe public_building: Eraikin publiko + reception_area: Harrera lekua recycling: Birziklatze gune restaurant: Jatetxe retirement_home: Nagusien etxea @@ -243,6 +298,7 @@ eu: shelter: Aterpea shop: Denda shower: Dutxa + social_centre: Gizarte zentroa studio: Estudio swimming_pool: Igerilekua taxi: Taxi @@ -262,6 +318,9 @@ eu: protected_area: Babestutako Eremua bridge: aqueduct: Akueduktua + suspension: Zubi esekia + swing: Zubi birakaria + viaduct: Bidezubia "yes": Zubia building: "yes": Eraikina @@ -270,10 +329,20 @@ eu: carpenter: Zurgina electrician: Argiketaria gardener: Lorezaina + painter: Margolaria photographer: Argazkilaria plumber: Iturgina shoemaker: Zapatagina + tailor: Jostuna + "yes": Artisau denda + emergency: + ambulance_station: Anbulantzia geralekua + defibrillator: Desfibriladorea + landing_site: Larrialdi lurreratze-gunea + phone: Larrialdi telefonoa highway: + abandoned: Errepide abandonatua + bridleway: Oinezkoen gunea bus_stop: Autobus-geraleku construction: Eraikitze-lanetan dagoen Autopista cycleway: Bidegorria @@ -284,10 +353,14 @@ eu: milestone: Mugarria motorway: Autobide motorway_link: Autobidea + path: Bidea + pedestrian: Oinezkoen gunea platform: Nasa primary: Lehen mailako errepide primary_link: Errepide nagusi - residential: Bizileku + proposed: Proiektatutako errepidea + raceway: Lasterketa pista + residential: Kalea rest_area: Atsedenlekua road: Errepide secondary: Bigarren mailako errepide @@ -296,19 +369,34 @@ eu: services: Autobide Zerbitzuak speed_camera: Radarra steps: Eskailera-mailak + street_lamp: Farola tertiary: Hirugarren mailako errepide + tertiary_link: Hirugarren mailako errepide track: Pista + traffic_signals: Trafiko seinaleak unclassified: Sailkatu gabeko errepidea + unsurfaced: Alfastatu gabeko errepidea "yes": Errepidea historic: archaeological_site: Aztarnategi arkeologiko - building: Eraikina + battlefield: Bataila-eremua + boundary_stone: Mugarria + building: Eraikin historikoa + bunker: Bunkerra castle: Gaztelu church: Eliza + citywalls: Hiriko harresiak + fort: Gotorlekua + heritage: Gizateriaren Ondarea house: Etxea + icon: Ikonoa memorial: Memoriala mine: Meategi monument: Monumentu + roman_road: Erromatar bidea + ruins: Hondakinak + stone: Harria + tomb: Hilobia tower: Dorre landuse: cemetery: Hilerri @@ -317,19 +405,28 @@ eu: farm: Baserria forest: Baso garages: Garajeak + grass: Belardia + industrial: Industrialdea + landfill: Zabortegia meadow: Larre military: Eremu Militarra mine: Meategi quarry: Harrobi railway: Trenbide reservoir: Urtegi + retail: Merkataritza gunea + village_green: Udal parkea + vineyard: Mahastia leisure: beach_resort: Hondartza konplexu common: Lur Komunak + dog_park: Txakurrentzako parkea fishing: Arrantza Lekua + fitness_centre: Ginmasioa fitness_station: Gimnasioa garden: Lorategi golf_course: Golf-zelai + horse_riding: Zalditegia ice_rink: Izotz-pista marina: Kirol-portu miniature_golf: Minigolfa @@ -338,32 +435,45 @@ eu: pitch: Kirolgunea playground: Jolastoki sauna: Sauna - sports_centre: Kiroldegi - stadium: Estadio + slipway: Harmaila + sports_centre: Kiroldegia + stadium: Estadioa swimming_pool: Igerilekua + water_park: Ur jolas-parkea + "yes": Aisialdia man_made: lighthouse: Itsasargia tower: Dorrea + works: Lantegia + military: + airfield: Aireportu militarra + bunker: Bunkerra + mountain_pass: + "yes": Mendatea natural: bay: Badia beach: Hondartza - cape: Lurmutur + cape: Lurmuturra cave_entrance: Kobazulo Sarrera - crater: Crater + crater: Kraterra dune: Duna - fjord: Fiordo + fjord: Fiordoa forest: Basoa - geyser: Geiser - glacier: Glaziar + geyser: Geiserra + glacier: Glaziarra grassland: Belardia hill: Muinoa island: Irla + land: Lurra + marsh: Zingira mud: Lohi peak: Gailur point: Puntu reef: Arrezife rock: Arroka + sand: Hondarra scree: Harritza + stone: Harria strait: Itsasertza tree: Zuhaitza valley: Haran @@ -371,13 +481,17 @@ eu: water: Ura wood: Baso office: + accountant: Kontuhartzailea + administrative: Administrazioa architect: Arkitektoa + company: Enpresa employment_agency: Enplegu agentzia estate_agent: Inmobiliaria government: Gobernuko bulegoa insurance: Aseguruetako bulegoa lawyer: Abokatua ngo: GKE bulegoa + telecommunication: Telekomunikazio Bulegoa travel_agent: Bidaia-agentzia "yes": Bulegoa place: @@ -393,40 +507,56 @@ eu: islet: Uhartea locality: Lokalitate municipality: Udalerri + neighbourhood: Auzoa postcode: Posta-kode region: Eskualde sea: Itsasoa state: Estatua - subdivision: Subdibisio + subdivision: Azpibanaketa suburb: Aldiri town: Herria unincorporated_area: Elkartu Gabeko Gunea village: Herrixka + "yes": Tokia railway: + abandoned: Abandonatutako trenbidea construction: Eraikitze-lanetan dagoen Trenbidea + disused: Trenbide ez-erabilia + disused_station: Tren geltoki ez-erabilia + funicular: Funikularra halt: Tren Geralekua historic_station: Tren Geltoki Historikoa + level_crossing: Trenbide-pasagunea light_rail: Tren Arina monorail: Monoraila + narrow_gauge: Bide Estuko Trenbidea platform: Trenbide Plataforma + proposed: Proposatutako trenbidea station: Tren Geltokia - subway: Metro geltoki + stop: Tren geralekua + subway: Metroa subway_entrance: Metro Sarbidea tram: Tranbia tram_stop: Tranbia geltoki shop: art: Arte-denda bakery: Okindegi + beauty: Edergintza denda beverages: Edari-denda bicycle: Bizikleta-denda books: Liburudenda boutique: Boutique - butcher: Harategi + butcher: Harategia car: Auto-denda + car_parts: Autoaldagaiak + car_repair: Autoen konponketa-lantegia + carpet: Alfonbra-denda chemist: Farmazia clothes: Arropa denda computer: Ordenagailu-denda confectionery: Gozotegi + copyshop: Kopia-denda + cosmetics: Kosmetika-denda electronics: Elektronika-denda estate_agent: Higiezinen agente fish: Arrantza-denda @@ -434,10 +564,12 @@ eu: food: Janari-denda furniture: Altzari gallery: Galeria + general: Denetariko denda gift: Opari-denda greengrocer: Barazki-saltzaile grocery: Janaridenda - hairdresser: Ile-apaindegi + hairdresser: Ileapaindegi + hardware: Burdindegia hifi: Hi-Fi insurance: Aseguruak jewelry: Bitxi-denda @@ -446,16 +578,19 @@ eu: mall: Merkataritza-gunea market: Merkatu mobile_phone: Mugikor-denda + motorcycle: Motozikleta-denda music: Musika-denda newsagent: Kioskoa optician: Optika pet: Animalia-denda pharmacy: Farmazia photo: Argazki-denda + second_hand: Bigarren eskuko denda shoes: Zapatadenda shopping_centre: Merkatal Gunea sports: Kirol denda supermarket: Supermerkatu + tailor: Jostuna toys: Jostailu Denda travel_agency: Bidaia-agentzia "yes": Denda @@ -467,6 +602,7 @@ eu: cabin: Kabina camp_site: Kanpin chalet: Txalet + gallery: Galeria guest_house: Aterpe hostel: Ostatu hotel: Hotel @@ -483,33 +619,49 @@ eu: canal: Kanal dam: Urtegia ditch: Lubakia + dock: Kaia drain: Isurbidea rapids: Ur-lasterrak river: Ibai waterfall: Ur-jauzi weir: Uharka + admin_levels: + level2: Herrialdeko muga + level4: Estatuko muga + level5: Eskualdeko muga + level6: Konderriko muga + level8: Udal muga + level9: Herriko muga + level10: Auzoko muga description: types: cities: Hiriak towns: Herriak places: Lekuak results: + no_results: Ez da emaitzarik aurkitu more_results: Emaitza gehiago layouts: logo: alt_text: OpenStreetMap logoa - home: hasiera - logout: Saioa itxi + home: Hasierara joan + logout: Itxi saioa log_in: Saioa hasi - sign_up: izena eman + sign_up: Eman izena + start_mapping: Hasi mapeatzen edit: Aldatu history: Historia export: Esportatu data: Datuak export_data: Esportatu datuak intro_header: Ongi etorri OpenStreetMapera! + intro_2_create_account: Erabiltzaile kontua sortu + partners_ic: Londresko Imperial College + partners_bytemark: Bytemark Hosting + partners_partners: bazkideak help: Laguntza about: Honi buruz + copyright: Egile-eskubideak community: Komunitatea community_blogs: Komunitateko blogak community_blogs_title: OpenStreetMap komunitateko kideen blogak @@ -522,6 +674,7 @@ eu: license_page: foreign: title: Itzulpen honi buruz + english_link: jatorrizkoa ingelesez native: title: Orrialde honi buruz native_link: Euskara version @@ -543,8 +696,11 @@ eu: gida laburra jakin behar dituzun gauzarik garrantzitsuenak dituena. whats_on_the_map: title: Mapan dagoena + rules: + title: Arauak! questions: title: Galderarik? + start_mapping: Hasi mapeatzen fixthemap: title: Arazo baten berri eman / Mapa zuzendu how_to_help: @@ -552,17 +708,27 @@ eu: other_concerns: title: Bestelako kezkak help_page: + title: Laguntza Lortu welcome: url: /welcome title: Ongi etorri OSM-ra + beginners_guide: + url: http://wiki.openstreetmap.org/wiki/Eu:Beginners%27_guide + title: Hasiberrientzako gida help: url: https://help.openstreetmap.org/ title: help.openstreetmap.org + forums: + title: Foroak + irc: + title: IRC wiki: url: http://wiki.openstreetmap.org/wiki/Eu:Main_Page title: wiki.openstreetmap.org about_page: next: Hurrengoa + local_knowledge_title: Tokiko Ezagutza + open_data_title: Datu Irekiak notifier: diary_comment_notification: hi: Kaixo %{to_user}, @@ -572,6 +738,7 @@ eu: greeting: Kaixo, signup_confirm: subject: '[OpenStreetMap] Ongi etorri OpenStreetMapera' + greeting: Kaixo! email_confirm: subject: '[OpenStreetMap] Baieztatu zure eposta helbidea' email_confirm_plain: @@ -585,10 +752,19 @@ eu: note_comment_notification: anonymous: Erabiltzale anonimoa greeting: Kaixo, + changeset_comment_notification: + greeting: Kaixo, message: inbox: title: Sarrera-ontzia my_inbox: Nire sarrera-ontzia + messages: '%{new_messages} eta %{old_messages} dituzu' + new_messages: + one: '%Mezu berri {count}' + other: '%{count} mezu berri' + old_messages: + one: mezu zahar %{count} + other: '%{count} mezu zahar' from: Igorlea subject: Gaia date: Data @@ -617,39 +793,53 @@ eu: date: Data reply_button: Erantzun unread_button: Markatu irakurri gabekotzat + back: Atzera to: Hartzailea sent_message_summary: delete_button: Ezabatu + mark: + as_read: Mezua irakurrita gisa markatu da + as_unread: Mezua irakurri gabe gisa markatu da delete: deleted: Mezua ezabatuta site: edit: user_page_link: Lankide orria sidebar: + search_results: Bilaketaren emaitzak close: Itxi search: search: Bilatu + from: Abiagunea + to: Helmuga where_am_i: Non nago? submit_text: Joan key: table: entry: motorway: Autobidea + main_road: Errepide nagusia primary: Lehen mailako errepidea secondary: Bigarren mailako errepidea unclassified: Sailkatu gabeko errepidea + track: Pista + bridleway: Oinezkoen gunea + cycleway: Bidegorria + footway: Oinezkoen bidea rail: Trenbidea subway: Metroa tram: 1: tranbia cable: - Funikularra + - teleaulkia runway: - Aireportuko Pista apron: 1: terminala admin: Muga administratiboa forest: Baso + wood: Basoa golf: Golf-zelai park: Parke industrial: Industrialdea @@ -659,6 +849,7 @@ eu: - urtegia farm: Baserria cemetery: Hilerri + pitch: Kirolgunea centre: Kiroldegi reserve: Natura-erreserba military: Eremu militarra @@ -668,6 +859,16 @@ eu: station: Tren geltokia summit: - Tontorra + - gailurra + richtext_area: + edit: Aldatu + preview: Aurrikusi + markdown_help: + link: Lotura + text: Testua + image: Irudia + alt: Testu alternatiboa + url: URLa trace: edit: filename: 'Fitxategi izena:' @@ -694,6 +895,7 @@ eu: trace_optionals: tags: Etiketak view: + pending: EGITEKE filename: 'Fitxategi-izena:' download: jaitsi uploaded: 'Noiz igota:' @@ -719,26 +921,45 @@ eu: oauth: oauthorize: allow_write_api: mapa aldatu. + allow_write_notes: Oharrak aldatu. + grant_access: Baimena Eman oauth_clients: + new: + submit: Erregistratu edit: submit: Aldatu show: confirm: Ziur zaude? allow_write_api: mapa aldatu. + index: + application: Aplikazioaren izena form: name: Izena + required: Nahitaezkoa user: login: title: Saio-hasiera heading: Saio-hasiera email or username: 'Eposta helbidea edo Erabiltzaile izena:' password: 'Pasahitza:' + openid: '%{logo} OpenID:' remember: 'Gogora nazazu:' lost password link: Pasahitza ahaztu duzu? login_button: Saioa hasi register now: Erregistratu orain + new to osm: Berria zara OpenStreetMapen? create account minute: Sortu kontu bat. Minutu bat besterik ez duzu behar. no account: Ez al duzu konturik? + auth_providers: + google: + title: Saioa hasi Googlekin + facebook: + title: Saioa hasi Facebookekin + alt: Saioa hasi Facebookekin + windowslive: + title: Saioa hasi Windows Livekin + yahoo: + title: Saioa hasi Yahoorekin logout: title: Saio-itxiera heading: OpenStreetMap-etik saioa itxi @@ -756,9 +977,14 @@ eu: reset: Pasahitza berrezarri flash changed: Zure pasahitza aldatu da. new: - title: Kontua sortu + title: Eman izena + about: + header: Doakoa eta editagarria email address: 'Eposta Helbidea:' confirm email address: 'Eposta Helbidea baieztatu:' + not displayed publicly: Ez da erakutsiko (ikus, <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" + title="wiki pribatutasun politika, helbide elektronikoei buruzko atala">pribatutasun + politika</a>) display name: 'Erakusteko izena:' password: 'Pasahitza:' confirm password: 'Pasahitza berretsi:' @@ -772,8 +998,8 @@ eu: france: Frantzia italy: Italy view: - my diary: nire egunerokoa - my edits: nire aldaketak + my diary: Nire egunerokoa + my edits: Nire aldaketak my notes: Nire oharrak my messages: Nire mezuak my profile: Nire profila @@ -782,8 +1008,8 @@ eu: send message: Mezua bidali diary: Egunerokoa edits: Aldaketak - remove as friend: lagun bezala kendu - add as friend: lagun bezala gehitu + remove as friend: Lagun bezala kendu + add as friend: Lagun bezala gehitu mapper since: 'Noiztik mapatzaile:' ago: (duela %{time_in_words_ago}) email address: 'Eposta helbidea:' @@ -797,12 +1023,13 @@ eu: role: administrator: Lankide hau administratzailea da moderator: Lankide hau moderatzailea da + comments: Iruzkinak create_block: Blokeatu erabiltzaile hau - activate_user: erabiltzaile hau gaitu - deactivate_user: erabiltzaile hau ezgaitu - confirm_user: erabiltzaile hau baieztatu + activate_user: Erabiltzaile hau gaitu + deactivate_user: Erabiltzaile hau ezgaitu + confirm_user: Erabiltzaile hau baieztatu hide_user: Erabiltzaile hau ezkutatu - delete_user: lankide hau ezabatu + delete_user: Erabiltzaile hau ezabatu confirm: Berretsi popup: your location: Zure kokapena @@ -813,6 +1040,8 @@ eu: my settings: Nire aukerak current email address: 'Egungo eposta helbidea:' new email address: 'E-posta helbide berria:' + openid: + link text: zer da hau? public editing: heading: 'Aldaketa publikoak:' enabled link: http://wiki.openstreetmap.org/wiki/Anonymous_edits @@ -834,7 +1063,7 @@ eu: save changes button: Aldaketak gorde return to profile: Profilera itzuli confirm: - heading: Erabiltzaile kontua baieztatu + heading: Helbide elektronikoa begiratu! button: Berretsi confirm_email: button: Berretsi @@ -878,6 +1107,16 @@ eu: share: title: Partekatu cancel: Utzi + image: Irudia + format: 'Formatua:' + scale: 'Eskala:' + map: + base: + transport_map: Garraio-mapa + layers: + title: Geruzak + site: + edit_tooltip: Editatu mapa changesets: show: subscribe: Harpidetu @@ -890,6 +1129,16 @@ eu: show: hide: Ezkutatu directions: + engines: + graphhopper_bicycle: Bizikletaz (GraphHopper) + graphhopper_foot: Oinez (GraphHopper) + mapquest_bicycle: Bizikletaz (MapQuest) + mapquest_car: Autoz (MapQuest) + mapquest_foot: Oinez (MapQuest) + osrm_car: Autoz (OSRM) + mapzen_bicycle: Bizikletaz (Mapzen) + mapzen_car: Autoz (Mapzen) + mapzen_foot: Oinez (Mapzen) distance: Distantzia instructions: unnamed: izenik gabe diff --git a/config/locales/fa.yml b/config/locales/fa.yml index 1ad045d29..9ba591beb 100644 --- a/config/locales/fa.yml +++ b/config/locales/fa.yml @@ -7,6 +7,7 @@ # Author: Baqeri # Author: Dalba # Author: Danialbehzadi +# Author: Dr jackie # Author: Ebraminio # Author: Fatemi127 # Author: Grille chompa @@ -39,17 +40,17 @@ fa: changeset: تغییرات انجام شده changeset_tag: برچسب تغییرات انجام شده country: کشور - diary_comment: نظر یادداشت روزانه - diary_entry: ورودی یادداشت روزانه + diary_comment: یادداشت روزانه + diary_entry: ورود یادداشت روزانه friend: دوست language: زبان message: پیام - node: گره - node_tag: برچسب گره + node: نقطه + node_tag: برچسب نقطه notifier: اطلاع رسان - old_node: گره‎ قدیمی - old_node_tag: برچسپ گرهٔ قدیمی - old_relation: رابطهٔ قدیمی + old_node: نقطه قدیمی + old_node_tag: برچسپ نقطه فبلی + old_relation: رابطهٔ قبلی old_relation_member: عضو رابطهٔ قدیمی old_relation_tag: برچسپ رابطهٔ قدیمی old_way: راه قدیمی @@ -183,6 +184,7 @@ fa: way: راه relation: ارتباط changeset: تغییر انجام شده + note: یادداشت timeout: sorry: با عرض پوزش ، داده ها برای %{type} با شناسه %{id} ، برای بازیابی زمان خیلی زیادی می برد. @@ -191,6 +193,7 @@ fa: way: راه relation: ارتباط changeset: تغییر انجام شده + note: یادداشت redacted: redaction: ویرایش %{id} message_html: نسخه ی %{version} از این %{type} نمایش داده نمی شود تا وقتی تحریر @@ -268,12 +271,17 @@ fa: sorry: پوزش، فهرست تغییرات انجام شده ی درخواستی شما برای بازیابی بیش از حد زمان میبرد. rss: + title_all: بحث در مورد جعبه تغییر OpenStreetMap + title_particular: 'بحث در مورد جعبه تغییر شماره #% {changeset_id} OpenStreetMap' + comment: 'نظر جدید در مورد جعبه تغییر %{changeset_id}{changeset_id} #% توسط + %{author}' commented_at_html: بروز شده %{when} قبل commented_at_by_html: بروز شده %{when} قبل توسط %{user} full: کل بحث diary_entry: new: title: ورودی یادداشت های روزانه جدید + publish_button: انتشار list: title: یادداشت های روزانه کاربران title_friends: یادداشت های روزانه دوستان @@ -620,12 +628,12 @@ fa: "yes": تقاطع landuse: allotments: تقسیم بندی شده - basin: حوزه رودخانه + basin: حوض brownfield: زمین جهت ساخت cemetery: قبرستان commercial: منطقهٔ تجاری conservation: حفاظت شده - construction: ساخت‌وساز + construction: در دست ساخت farm: مزرعه farmland: زمین های کشاورزی farmyard: محوطه مزرعه @@ -648,12 +656,12 @@ fa: retail: خرده‌فروشی road: جاده منطقه village_green: روستای سبز - vineyard: باغ انگوری + vineyard: تاکستان "yes": کاربری زمین leisure: beach_resort: تفریحگاه ساحلی bird_hide: محل مشاهده ی پرندگان - club: باشگاه + club: کلوپ common: سرزمین مشترک dog_park: پارک سگ fishing: منطقهٔ ماهی‌گیری @@ -663,17 +671,17 @@ fa: golf_course: زمین گلف horse_riding: اسب سواری ice_rink: رینک یخ - marina: تفریح‌گاه ساحلی + marina: لنگرگاه miniature_golf: گلف کوچک nature_reserve: طبیعت حفاظت شده park: پارک pitch: زمین ورزشی playground: زمین بازی recreation_ground: زمین تفریحی - resort: بازمرتب سازی + resort: تفرجگاه sauna: سونا slipway: تعميرگاه دريايي - sports_centre: مرکز ورزشی + sports_centre: مجتمع ورزشی stadium: ورزشگاه swimming_pool: استخر شنا track: مسیر دو میدانی @@ -697,10 +705,10 @@ fa: cape: دماغه cave_entrance: ورودی غار cliff: صخره - crater: دهانه اتش فشان + crater: دهانه آتش فشان dune: تل شنی fell: سقوط گاه - fjord: فلات + fjord: فیورد forest: جنگل geyser: چشمه آب گرم glacier: یخچال طبیعی @@ -760,7 +768,7 @@ fa: isolated_dwelling: خانه پیش ساخته locality: محل moor: دشت - municipality: دارای شهردار + municipality: شهرداری neighbourhood: محله postcode: کدپستی region: منطقه @@ -768,7 +776,7 @@ fa: state: ایالت subdivision: زیربخش suburb: حومه شهر - town: شهر + town: شهرستان unincorporated_area: منطقه گنجانده نشده village: دهکده "yes": Siedlung @@ -950,15 +958,15 @@ fa: export: خارج سازی data: داده‌ها export_data: خارج سازی داده ها - gps_traces: پیگیری های GPS - gps_traces_tooltip: مدیریت پیگیری های GPS + gps_traces: مسیرهای GPS + gps_traces_tooltip: مدیریت مسیرهای GPS user_diaries: یادداشت های روزانه کاربر - user_diaries_tooltip: مشاهده یادداشت های روزانه ی کاربر + user_diaries_tooltip: مشاهده یادداشت های روزانه کاربر edit_with: ویرایش با %{editor} tag_line: ویکی رایگان نقشهٔ جهان intro_header: به OpenStreetMap خوش آمدید! intro_text: OpenStreetMap یک نقشه از جهان است، که توسط افرادی مثل شما ایجاد شده - و برای استفاده رایگان است تحت یک مجوز باز. + و تحت یک مجوز آزاد برای استفاده رایگان همگان است. intro_2_create_account: ایجاد حساب کاربری partners_html: میزبانی وب پشتیبانی شده توسط %{ucl}، %{ic} و %{bytemark}، و سایر %{partners}. @@ -1090,6 +1098,7 @@ fa: پایگاه داده‌های OpenStreetMap یا این سایت اضافه شده‌است، لطفاً به <a href="http://www.osmfoundation.org/wiki/License/Takedown_procedure">رویهٔ حذف</a> ما یا پرونده مستقیم در <a href="http://dmca.openstreetmap.org/">صفحهٔ بایگانی برخط</a> ما مراجعه کنید. + trademarks_title_html: <span id="trademarks"></span>علائم ثبت شده تجاری welcome_page: title: خوش آمدید! introduction_html: به OpenStreetMap خوش آمدید، نقشه‌ای رایگان و قابل ویرایش از @@ -1115,6 +1124,14 @@ fa: ساختمان. tag_html: <strong>برچسب</strong> یک بیت داده درباره ی یک گره یا راه است، شبیه نام یک رستوران یا محدودیت سرعت یک جاده. + rules: + title: قوانین! + paragraph_1_html: OpenStreetMap تنها چند قاعده معمولی دارد اما از همه مشارکت + کنندگان انتظار همکاری و ارتباط با کلیه جامعه را داریم. اگر میخواهید هرگونه + فعالیتی به غیر از آنچه که با دست انجام میشود را انجام دهید، لطفاً متن زیر + و خطوط راهنما را در مورد <a href='http://wiki.openstreetmap.org/wiki/Import/Guidelines'>ایمپورت</a> + و <a href='http://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct'></a> + بخوانید. questions: title: سؤالی هست؟ paragraph_1_html: |- @@ -1165,8 +1182,14 @@ fa: description: یک سؤال بپرسید یا پاسخ ها را ببینید در سایت پرسش و پاسخ OSM. mailing_lists: title: فهرست ایمیل‌ها + description: در لیست های بلند و بالای محلی یا منطقه ای سوالی بپرسید یا در مورد + موضوعات جالب بحث کنید. + forums: + title: انجمنها + description: سوالات و بحث برای کسانی که رابط سبک انجمن را ترجیح می دهند. irc: title: IRC + description: گفتگوی تعاملی به زبانها و در مورد موضوعات مختلف. switch2osm: title: سویچ به OSM wiki: @@ -1209,7 +1232,7 @@ fa: message_notification: hi: سلام %{to_user}, header: '%{from_user} از طریق OpenStreetMap یک پیام با موضوع %{subject} برای - شما فرستاده:' + شما فرستاده است:' footer_html: همپنین میتوانید پیام را در %{readurl} بخوانید و میتوانید در %{replyurl} پاسخ دهید friend_notification: @@ -1300,11 +1323,17 @@ fa: changeset_comment_notification: greeting: سلام ، commented: + your_changeset: '%{commenter} برای جعبه تغییر ایجاد شده توسط شما در %{time} + یک نظر نوشته است' + commented_changeset: '%{commenter} یک نظر برای جعبه تغییری که توسط %{changeset_author} + در %{time} ایجاد شده است نوشته است' + partial_changeset_with_comment: دارای نظر %{changeset_comment} partial_changeset_without_comment: بدون نظر + details: اطلاعات بیشتر درباره جعبه تغییر را میتوان در %{url} دید. message: inbox: title: صندوق دریافت - my_inbox: صندوق دریافتی من + my_inbox: صندوق دریافت من outbox: صندوق خروجی messages: شما %{new_messages} و %{old_messages} دارید new_messages: @@ -1423,15 +1452,17 @@ fa: table: entry: motorway: اتوبان + main_road: جاده اصلی trunk: بزرگراه primary: جادهٔ اصلی secondary: جاده دوم unclassified: جاده طبقه بندی نشده - unsurfaced: جاده ی ظاهر نشده track: پیگیری - byway: Byway bridleway: راه حیوان رو cycleway: راه دوچرخه + cycleway_national: مسیرهای دوچرخه ملی + cycleway_regional: مسیرهای دوچرخه منطقه ای + cycleway_local: مسیرهای دوچرخه محلی footway: راه پیاده rail: راه‌آهن subway: مترو @@ -1453,7 +1484,6 @@ fa: golf: زمین گلف park: پارک resident: منطقه مسکونی - tourist: جاذبه ی توریستی common: - عمومی - علفزار @@ -1483,9 +1513,11 @@ fa: tunnel: پوشش خط چین شده = تونل bridge: پوشش سیاه = پل private: دسترسی شخصی - permissive: دسترسی مجاز destination: دسترسی به مقصد construction: جاده در دست ساخت + bicycle_shop: فروشگاه دوچرخه + bicycle_parking: پارکینگ دوچرخه + toilets: سرویس های بهداشتی richtext_area: edit: ویرایش preview: پیش‌نمایش @@ -1518,19 +1550,19 @@ fa: است. این کار معمولاً نیم ساعت طول می‌کشد و در صورت تکمیل، ایمیلی به شما فرستاده خواهد شد. edit: - title: ویرایش پیگیری %{name} - heading: ویرایش پیگیری %{name} + title: ویرایش مسیر %{name} + heading: ویرایش مسیر %{name} filename: 'نام پرونده:' download: دریافت uploaded_at: 'بارگذاری شد:' points: 'نقاط:' - start_coord: 'شروع مختصات:' + start_coord: 'مختصات شروع:' map: نقشه edit: ویرایش owner: 'مالک:' description: 'شرح:' tags: 'برچسب‌ها:' - tags_help: ویرگول مرزبندی شده + tags_help: جداشده توسط ویرگول save_button: ذخیرهٔ تغییرات visibility: 'پدیداری:' visibility_help: به چه معنی است؟ @@ -1538,17 +1570,17 @@ fa: upload_gpx: 'بارگذاری پرونده ی GPX:' description: 'توضیحات:' tags: 'برچسب‌ها:' - tags_help: ویرگول مرزبندی شده + tags_help: جداشده توسط ویرگول visibility: 'پدیداری:' visibility_help: این به چه معناست؟ upload_button: بارگذاری help: کمک trace_header: - upload_trace: بارگذاری یک پیگیری - see_all_traces: دیدن همه پیگیری ها - see_your_traces: دیدن تمام پیگیری های شما + upload_trace: بارگذاری یک مسیر + see_all_traces: دیدن همه مسیرها + see_your_traces: دیدن تمام مسیرهای شما traces_waiting: - one: شما %{count} پیگیری منتظر بارگذاری دارید. لطفاً برای تمام شدن منتظر بمانید + one: شما %{count} مسیر منتظر بارگذاری دارید. لطفاً برای تمام شدن منتظر بمانید قبل از بارگذاری موارد بیشتر، تا صف برای سایر کاربران بسته نشود. other: شما %{count} پیگیری منتظر بارگذاری دارید. لطفاً برای تمام‌شدن منتظر بمانید قبل از بارگذاری موارد بیشتر، تا صف برای سایر کاربران بسته نشود. @@ -1645,6 +1677,7 @@ fa: allow_read_gpx: خواندن پیگیری های GPS شخصی شما. allow_write_gpx: بارگذاری پیگیری‌های GPS. allow_write_notes: تغییر یادداشت ها. + grant_access: امکان دسترسی oauthorize_success: title: درخواست اجازه دادن مجاز است allowed: شما به برنامه ی %{app_name} اجازه ی دسترسی به حسابتان را دادید. @@ -1730,6 +1763,7 @@ fa: register now: اکنون ثبت نام شود with username: 'از قبل حساب OpenStreetMap دارید؟ لطفاً با نام کاربری و رمز عبورتان وارد شوید:' + with external: روش دیگر، ورود از طریق شخص ثالث new to osm: در OpenStreetMap تازه‌وارد هستید؟ to make changes: برای ایجاد تغییرات در داده های OpenStreetMap، شما باید یک حساب داشته باشید. @@ -1750,6 +1784,15 @@ fa: google: title: ورود با گوگل alt: ورود با OpenID گوگل + facebook: + title: ورود به سیستم با استفاده از فیس بوک + alt: با یک حساب فیس بوک وارد شوید + windowslive: + title: ورود به سایت از طریق Windows Live + alt: با یک حساب Windows Live وارد شوید + github: + title: ورود با GitHub + alt: با یک حساب کاربری در GitHub وارد شوید yahoo: title: ورود با یاهو alt: ورود با OpenID یاهو @@ -1785,9 +1828,9 @@ fa: title: ثبت نام no_auto_account_create: متأسفانه در حال حاضر برای ما امکان ساخت خودکار حساب کاربری شما مقدور نیست. - contact_webmaster: لطفاً با <a href="mailto:webmaster@openstreetmap.org">مدیر - سایت</a> برای ساختن حساب کاربری هماهنگی کنید و تماس بگیرید - ما سعی می‌کنیم - به درخواست ‌ها به سرعت پاسخ دهیم. + contact_webmaster: لطفاً با <a href="%{webmaster}">مدیر سایت</a> برای ساختن + حساب کاربری هماهنگی کنید و تماس بگیرید - ما سعی می‌کنیم به درخواست ‌ها به + سرعت پاسخ دهیم. about: header: رایگان و قابل ویرایش html: |- @@ -1796,10 +1839,10 @@ fa: license_agreement: وقتی ایمیلتان را تأیید کردید نیاز است که با <a href="http://www.osmfoundation.org/wiki/License/Contributor_Terms">شرایط همکاری</a> موافقت کنید. email address: 'آدرس ایمیل:' - confirm email address: 'تأیید آدرس ایمیل:' - not displayed publicly: به عموم نشان داده نمیشود (<a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" - title="wiki privacy policy including section on email addresses">حفظ حریم - خصوصی</a>را ببینید) + confirm email address: 'تأیید نشانی ایمیل:' + not displayed publicly: آدرس شما به عموم نشان داده نمیشود، برای اطلاعات بیشتر + <a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy" title="OSMF privacy + policy including section on email addresses">حریم خصوصی</a> را ببینید display name: 'نام نمایشی:' display name description: ' نام کاربری شما برای عموم نمایش داده شده. شما می توانید بعدا این مورد را در ترجیحات تغییر دهید.' @@ -1838,6 +1881,7 @@ fa: heading: کاربر %{user} وجود ندارد body: با عرض پوزش، هیچ کاربری با نام %{user} وجود ندارد. لطفاً نحوه نوشتن تان را بررسی کنید، یا شاید پیوندی که کلیک کردید اشتباه است. + deleted: حذف شده view: my diary: یادداشت روزانه ی من new diary entry: ورودی یادداشت روزانه تازه @@ -1889,8 +1933,8 @@ fa: revoke: administrator: لغو دسترسی سرپرست moderator: لغو دسترسی مدیر - block_history: بلوک های دریافتی - moderator_history: بلوک های داده شده + block_history: بلوک شده های فعال + moderator_history: بلوک های گرفته شده comments: نظرات create_block: بلوک کردن این کاربر activate_user: فعال کردن این کاربر @@ -1914,6 +1958,7 @@ fa: current email address: 'آدرس ایمیل فعلی:' new email address: 'آدرس ایمیل جدید:' email never displayed publicly: (هرگز به صورت عمومی نمایش داده نمی شود) + external auth: 'تأیید اعتبار از خارج:' openid: link: http://wiki.openstreetmap.org/wiki/OpenID link text: این چیست؟ @@ -1949,7 +1994,9 @@ fa: gravatar: gravatar: استفاده از Gravatar link text: این چیست؟ - new image: افزون یک تصویر + disabled: گرآواتار غیرفعال شده است. + enabled: نمایش گرآواتار شما فعال شد. + new image: افزون تصویر keep image: نگه‌داشتن تصویر فعلی delete image: حذف تصویر فعلی replace image: ' تصویر فعلی را جایگزین کنید' @@ -1978,7 +2025,7 @@ fa: reconfirm_html: اگر نیاز دارید ایمیل تأیید را دوباره بفرستیم، <a href="%{reconfirm}">اینجا کلیک کنید</a>. confirm_resend: - success: ما نکتهٔ تأیید جدیدی به %{email} فرستادیم و به محض اینکه شما حسابتان + success: ما پیام تأیید جدیدی به %{email} فرستادیم و به محض اینکه شما حسابتان را تأیید کنید شما قابلیت نقشه کشی را خواهید داشت.<br /><br />اگر شما از یک سیتم ضد هرزنامه استفاده میکنید که درخواست های تأیید را میفرستد مطمئن شوید webmaster@openstreetmap.org را در لیست سفید گذاشته‌اید که ما قادر به پاسخ @@ -1989,8 +2036,9 @@ fa: press confirm button: برای تأیید آدرس ایمیل جدیدتان دکمهٔ تأیید زیر را فشار دهید. button: تأیید - success: آدرس ایمیلتان تأیید شد، با تشکر از شما برای ثبت نام! - failure: یک آدرس ایمیل در حال حاضر با این نشانه تأیید شده است. + success: تغییر ایمیل شما تأیید شد! + failure: یک آدرس ایمیل با این نشانه قبلاً تأیید شده است. + unknown_token: کد تأیید منقضی شده یا وجود ندارد. set_home: flash success: موقعیت خانه با موفقیت ذخیره شد go_public: @@ -2030,6 +2078,19 @@ fa: <p> این تصمیم به وسیله یک مدیر در مدت کوتاه بازبینی می شود، در صورتی که بخواهید میتوانید با %{webmaster}برای بحث در این زمینه تماس بگیرید. </p> + auth_failure: + connection_failed: اتصال به سرویس دهنده تأیید اعتبار انجام نشد + invalid_credentials: اختیارات تأیید هویت نامعتبر + no_authorization_code: بدون مجوز کد + unknown_signature_algorithm: الگوریتم امضای نامعلوم + invalid_scope: محدوده غیرمعتبر + auth_association: + heading: هنوز شناسه شما با یک حساب کاربری در OpenStreetMap در مرتیط نشده است. + option_1: اگر در OpenStreetMap تازه وارد هستید، لطفاً با استفاده از فرم زیر + یک حساب کاربری جدید بسازید. + option_2: اگر شما دارای حساب کاربری هستید, می توانید با استفاده از نام کاربری + و رمز عبور خود به حسابتان وارد شوید و سپس در قسمت تنظیمات کاربر حسابتان را + با شناسه خود متصل کنید. user_role: filter: not_an_administrator: فقط مدیران می توانند مدیریت نقش کاربران را انجام دهند @@ -2198,6 +2259,7 @@ fa: link: پیوند یا اچ‌تی‌ام‌ال long_link: پیوند short_link: پیوند کوتاه + geo_uri: لینک ژئو embed: HTML custom_dimensions: تنظیم ابعاد سفارشی format: 'قالب:' @@ -2209,10 +2271,13 @@ fa: center_marker: مرکز نقشه در نشانگر paste_html: برای درج در وب سایت HTML را جایگذاری کنید view_larger_map: نمایش نقشه بزرگتر + only_standard_layer: فقط از لایه استاندارد میتوان خروجی تصویری گرفت + embed: + report_problem: گزارش مشکل key: title: کلید نقشه tooltip: کلید نقشه - tooltip_disabled: کلید نقشه تنها برای لایه ی استاندارد در دسترس است + tooltip_disabled: کلید نقشه برای این لایه در دسترس نیست map: zoom: in: بزرگنمایی @@ -2273,18 +2338,48 @@ fa: mapquest_car: اتومبیل (MapQuest) mapquest_foot: پیاده (MapQuest) osrm_car: اتومبیل (OSRM) + mapzen_bicycle: دوچرخه (Mapzen) + mapzen_car: ماشین (Mapzen) + mapzen_foot: پیاده (Mapzen) directions: جهت distance: مسافت errors: no_route: نتوانستیم بین آن دو مکان، مسیری بیابیم. no_place: متاسفیم - محل پیدا نشد. instructions: + continue_without_exit: به مسیر %{name} ادامه دهید + slight_right_without_exit: کمی به راست به %{name} + offramp_right_without_exit: خروجی طرف راست به %{name} را انتخاب کنید + onramp_right_without_exit: از خروجی سمت راست به %{name} بپیچید + endofroad_right_without_exit: در انتهای مسیر به طرف راست به %{name} بپیچید + merge_right_without_exit: کمی به راست به %{name} + fork_right_without_exit: در محل جداشدن به طرف راست به %{name} بپیچید + turn_right_without_exit: به راست به %{name} بپیچید + sharp_right_without_exit: کاملاً به راست به %{name} بپیچید + uturn_without_exit: از دوربرگردان به %{name} دور بزنید + sharp_left_without_exit: کاملاً به چپ به %{name} بپیچید + turn_left_without_exit: به چپ به %{name} بپیچید + offramp_left_without_exit: خروجی طرف چپ به %{name} را انتخاب کنید + onramp_left_without_exit: از خروجی سمت چپ به %{name} بپیچید + endofroad_left_without_exit: در انتهای مسیر به طرف چپ به %{name} بپیچید + merge_left_without_exit: کمی به چپ به %{name} + fork_left_without_exit: در محل جداشدن به طرف چپ به %{name} بپیچید + slight_left_without_exit: کمی به چپ به %{name} + via_point_without_exit: (از نقطه) follow_without_exit: دنبال کن %{name} + roundabout_without_exit: در میدان %{name} را انتخاب کنید + leave_roundabout_without_exit: از میدان خارج شوید - %{name} + stay_roundabout_without_exit: در میدان بمانید - %{name} + start_without_exit: شروع در انتهای %{name} + destination_without_exit: به مقصد رسیدید + against_oneway_without_exit: برخلاف مسیر یکطرفه %{name} بروید + end_oneway_without_exit: انتهای مسیر یطرفه در %{name} + roundabout_with_exit: در میدان، خروجی %{exit} به طرف %{name} را انتخاب کنید unnamed: بی نام courtesy: جهت از %{link} time: مدت query: - node: گره + node: نقطه way: راه relation: ارتباط nothing_found: ویژگی‌ای یافت نشد diff --git a/config/locales/fi.yml b/config/locales/fi.yml index 83d55d93f..d2a4e5912 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -8,43 +8,48 @@ # Author: Espeox # Author: Konstaduck # Author: Lliehu +# Author: Macofe # Author: Markosu # Author: McSalama +# Author: Mikahama # Author: MrTapsa # Author: Nedergard # Author: Nelg # Author: Nemo bis # Author: Nike # Author: Olli +# Author: Pyscowicz # Author: Ramilehti # Author: Ruila +# Author: SMAUG # Author: Samoasambia # Author: Silvonen # Author: Snidata # Author: Str4nd # Author: Susannaanas # Author: Tomi Toivio +# Author: Tumm1 # Author: Usp # Author: ZeiP --- fi: time: formats: - friendly: '%e. %Bta %Y kello %H:%M' + friendly: '%e. %Bta %Y kello %H.%M' activerecord: models: acl: Pääsyoikeuslista changeset: Muutoskokoelma changeset_tag: Muutoskokoelman tagi country: Maa - diary_comment: Päiväkirjan kommentti + diary_comment: Päiväkirjakommentti diary_entry: Päiväkirjamerkintä friend: Kaveri language: Kieli message: Viesti node: Piste node_tag: Pisteen tagi - notifier: Ilmoitus + notifier: Ilmoittaja old_node: Vanha piste old_node_tag: Vanha pisteen tagi old_relation: Vanha relaatio @@ -185,6 +190,7 @@ fi: way: Polkua relation: Relaatiota changeset: muutoskokoelma + note: merkintä timeout: sorry: Tietojen hakeminen (kohde %{type}:%{id}) kesti liian kauan. type: @@ -192,6 +198,7 @@ fi: way: polku relation: relaatio changeset: muutoskokoelma + note: merkintä redacted: redaction: Redaktio %{id} message_html: Tämän %{type}-tyypin versiota ei voi näyttää koska se on laitostettu. @@ -280,6 +287,7 @@ fi: diary_entry: new: title: Uusi päiväkirjamerkintä + publish_button: Julkaise list: title: Käyttäjien päiväkirjamerkinnät title_friends: Kaverien päiväkirjat @@ -348,7 +356,7 @@ fi: comments: has_commented_on: '%{display_name} on kommentoinut seuraavia päiväkirjamerkintöjä' post: Kommentti - when: Milloin + when: Päiväys comment: Kommentti ago: '%{ago} sitten' newer_comments: Uudemmat kommentit @@ -372,9 +380,10 @@ fi: seuraavista:' planet: title: Planet OSM - description: Säännöllisesti päivitettyjä kopioita täydellisestö OpenStreetMap-tietokannasta + description: Säännöllisesti päivitettyjä kopioita täydellisestä OpenStreetMap-tietokannasta overpass: - title: Ylikulku-API + title: Overpass API + description: Lataa kartalle rajattu alue OpenStreetMapin varapalvelimelta geofabrik: title: Geofabrik-lataukset description: Säännöllisesti päivitetyt otteet maanosista, maista ja valituista @@ -391,7 +400,7 @@ fi: scale: Mittakaava max: enintään image_size: Kuvan koko - zoom: Zoom-taso + zoom: Suurennostaso add_marker: Lisää vietävään kartaan kohdemerkki latitude: 'Lev:' longitude: 'Pit:' @@ -415,8 +424,11 @@ fi: search_osm_nominatim: prefix: aerialway: + cable_car: Köysirata chair_lift: Tuolihissi drag_lift: Vetohissi + gondola: Gondolihissi + station: Ilmarata-asema aeroway: aerodrome: Lentokenttä apron: Asemataso @@ -461,7 +473,7 @@ fi: driving_school: Autokoulu embassy: Lähetystö emergency_phone: Hätäpuhelin - fast_food: Pikaruoka + fast_food: Pikaruokaravintola ferry_terminal: Lauttaterminaali fire_hydrant: Paloposti fire_station: Paloasema @@ -520,6 +532,7 @@ fi: veterinary: Eläinlääkäri village_hall: Kyläkoti waste_basket: Roskakori + waste_disposal: Jätehuolto youth_centre: Nuorisokeskus boundary: administrative: Hallinnollinen raja @@ -536,6 +549,8 @@ fi: "yes": Rakennus craft: brewery: Panimo + carpenter: Puuseppä + electrician: Sähköasentaja gardener: Puutarhuri painter: Taidemaalari photographer: Valokuvaaja @@ -599,8 +614,10 @@ fi: bunker: Bunkkeri castle: Linna church: Kirkko + city_gate: Kaupungin portti citywalls: Kaupunginmuurit fort: Linnake + heritage: Perintökohde house: Talo icon: Ikoni manor: Kartano @@ -648,6 +665,7 @@ fi: road: Tiealue village_green: Puisto vineyard: Viinitarha + "yes": Maankäyttö leisure: beach_resort: Rantakohde bird_hide: Linnunpesä @@ -668,6 +686,7 @@ fi: pitch: Urheilukenttä playground: Leikkikenttä recreation_ground: Virkistysalue + resort: Oleskelupaikka sauna: Sauna slipway: Vesillelaskuramppi sports_centre: Urheilukeskus @@ -675,10 +694,13 @@ fi: swimming_pool: Uima-allas track: Juoksurata water_park: Vesipuisto + "yes": Vapaa-aika man_made: lighthouse: Majakka + pipeline: Putkisto tower: Torni works: Tehdas + "yes": ihmisen tekemä military: airfield: Sotilaskenttä barracks: Kasarmi @@ -698,6 +720,7 @@ fi: forest: Metsä geyser: Geysir glacier: Jäätikkö + grassland: Ruohomaa heath: Nummi hill: Mäki island: Saari @@ -725,6 +748,7 @@ fi: wood: Metsä office: accountant: Kirjanpitäjä + administrative: Hallinto architect: Arkkitehti company: Yritys employment_agency: Työnvälitystoimisto @@ -737,6 +761,8 @@ fi: travel_agent: Matkatoimisto "yes": Toimisto place: + allotments: Siirtolapuutarha + block: Este airport: Lentokenttä city: Kaupunki country: Maa @@ -761,13 +787,14 @@ fi: town: Kaupunki unincorporated_area: Ei-liitetty alue village: Kylä + "yes": Paikka railway: abandoned: Hylätty rautatie construction: Rakenteilla oleva rautatie disused: Käyttämätön rautatie disused_station: Käytöstä poistunut rautatieasema funicular: Funikulaari - halt: Junan pysäkki + halt: Seisake historic_station: Historiallinen juna-asema junction: Rautatien risteys level_crossing: Tasoristeys @@ -781,7 +808,7 @@ fi: spur: Pistoraide station: Rautatieasema stop: Rautatieseisake - subway: Metroasema + subway: Metro subway_entrance: Metron sisäänkäynti switch: Ratavaihde tram: Raitiotie @@ -863,6 +890,7 @@ fi: "yes": Kauppa tourism: alpine_hut: Alppimaja + apartment: Huoneisto artwork: Taideteos attraction: Nähtävyys bed_and_breakfast: Aamiaismajoitus @@ -902,6 +930,7 @@ fi: wadi: Vadi waterfall: Vesiputous weir: Pato + "yes": Vesistö admin_levels: level2: Valtion raja level4: Osavaltion raja @@ -920,7 +949,7 @@ fi: towns: Kylät places: Paikat results: - no_results: Mitään ei löytynyt + no_results: Ei hakutuloksia more_results: Lisää tuloksia layouts: logo: @@ -996,15 +1025,15 @@ fi: levittäjän oikeudet ja velvollisuudet." intro_3_html: |- Kartta-aineisto ja dokumentaatio on lisensoitu <a href="http://creativecommons.org/licenses/by-sa/2.0/deed.fi">Creative - Commons Nimeä-Jaa samoin 2.0</a> -lisenssillä. (CC-BY-SA). + Commons Nimeä-Jaa samoin 2.0</a> -lisenssillä (CC-BY-SA). credit_title_html: OpenStreetMapin mainitseminen credit_1_html: OpenStreetMapin sisältöä levitettäessä on mainittava teksti "© OpenStreetMapin tekijät" tai sen englanninkielinen vastine "© OpenStreetMap contributors". credit_2_html: "Levittäjän tulee tehdä selväksi, että aineisto on saatavilla - Open Database Lisenssillä,\nja kartta-aineiston olevan lisensoitu CC-BY-SA-lisenssillä. + Open Database Lisenssillä\nja kartta-aineiston olevan lisensoitu CC-BY-SA-lisenssillä. Tämä voidaan tehdä sijoittamalla sivulle linkki\n<a href=\"http://www.openstreetmap.org/copyright\">tälle - tekijänoikeussivulle</a>. \nJos linkkien käyttö ei ole mahdollisia (esimerkiksi + tekijänoikeussivulle</a>. \nJos linkkien käyttö ei ole mahdollista (esimerkiksi paperille tulostettu aineisto),\nsuosittelemme ohjaamaan lukijat osoitteisiin www.openstreetmap.org, opendatacommons.org ja tarvittaessa myös creativecommons.org." credit_3_html: 'Sähköisen karttaikkunan tulee sisältää tekijän nimi kartan alaosassa:' @@ -1016,9 +1045,9 @@ fi: Lue lisää aineiston käyttämisestä <a href="http://osmfoundation.org/Licence">OSM-säätiön lisensointiohjeesta</a> ja yhteisön keräämistä <a href="http://wiki.openstreetmap.org/wiki/Legal_FAQ">lakiasioiden useimmin kysytyimmistä kysymyksistä</a>. more_2_html: "Vaikka OpenStreetMap on avointa dataa, emme voi tarjota maksutonta - karttarajapintaa (API) kolmannen osapuolen kehittäjille.\n\nTutustu <a href=\"http://wiki.openstreetmap.org/wiki/API_usage_policy\">API:n - käyttöehtoihin</a>,\n<a href=\"http://wiki.openstreetmap.org/wiki/Tile_usage_policy\">kartta-aineiston - käyttöehtoihin</a> ja \n<a href=\"http://wiki.openstreetmap.org/wiki/Nominatim#Usage_Policy\">Nominatimin + karttarajapintaa (API) kolmannen osapuolen kehittäjille.\n\nTutustu <a href=\"https://operations.osmfoundation.org/policies/api/\">karttarajapinnan + käyttöehtoihin</a>,\n<a href=\"https://operations.osmfoundation.org/policies/tiles/\">kartta-aineiston + käyttöehtoihin</a> ja \n<a href=\"https://operations.osmfoundation.org/policies/nominatim/\">Nominatimin käyttöehtoihin</a>." contributors_title_html: Tekijät contributors_intro_html: |- @@ -1027,8 +1056,7 @@ fi: ja muista lähteistä, muun muassa: contributors_at_html: |- <strong>Itävalta</strong>: Sisältää karttatietoja - <a href="http://data.wien.gv.at/">Stadt Wienistä</a> ( - <a href="http://creativecommons.org/licenses/by/3.0/at/deed.de">CC BY -lisenssillä</a>), + <a href="http://data.wien.gv.at/">Stadt Wienistä</a> (<a href="http://creativecommons.org/licenses/by/3.0/at/deed.de">CC BY -lisenssillä</a>), <a href="http://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm">Land Vorarlbergista</a> ja Land Tirolista (<a href="http://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/">CC-BY AT -lisenssillä tietyin muutoksin</a>). contributors_ca_html: |- @@ -1038,7 +1066,7 @@ fi: Resources Canada), ja StatCanista (Geography Division, Statistics Canada). contributors_fi_html: '<strong>Suomi</strong>: Sisältää karttatietoja Maanmittauslaitoksen - maastotietokannasta ja muista lähteistä, <a href="http://www.maanmittauslaitos.fi/avoindata_lisenssi_versio1_20120501">Maanmittauslaitoksen + maastotietokannasta ja muista lähteistä <a href="http://www.maanmittauslaitos.fi/avoindata_lisenssi_versio1_20120501">Maanmittauslaitoksen lisenssin</a> mukaisesti.' contributors_fr_html: |- <strong>Ranska</strong>: Sisältää karttatietoja @@ -1048,13 +1076,17 @@ fi: (<a href="http://www.and.com">www.and.com</a>) contributors_nz_html: '<strong>Uusi-Seelanti</strong>: Sisältää karttatietoja Land Information New Zealandista. Crown Copyright.' + contributors_si_html: "<strong>Slovenia</strong>: Sisältää \n<a href=\"http://www.gu.gov.si/en/\">Maanmittaus- + ja kartoitusviranomaisen</a> sekä\n<a href=\"http://www.mkgp.gov.si/en/\">Maatalous-, + metsä- ja ruokaministeriön</a> tuottamia karttatietoja\n(Slovenian julkista + karttamateriaalia)." contributors_za_html: |- <strong>Etelä-Afrikka</strong>: Sisältää karttatietoja <a href="http://www.ngi.gov.za/">Chief Directorate: National Geo-Spatial Informationista</a>, kaikki oikeudet pidätetään. contributors_gb_html: |- <strong>Iso-Britannia</strong>: Sisältää Ordnance Surveyn - keräämiä karttatietoja © Crown Copyright ja tietokantojen käyttöoikeus 2010-12. + keräämiä karttatietoja © Crown Copyright ja tietokantojen käyttöoikeuden joulukuulta 2010. contributors_footer_1_html: |- Täydellinen lista OpenStreetMapin tukijoista löytyy OpenStreetMapin wikistä <a href="http://wiki.openstreetmap.org/wiki/Contributors">Avustajat-sivulta</a>. @@ -1069,13 +1101,17 @@ fi: karttatietoja on otettu luvattomasta lähteestä OSM:n karttatietoihin tai sivustolle, siitä tulee tehdä <a href="http://www.osmfoundation.org/wiki/License/Takedown_procedure">poistopyyntö</a> tai <a href="http://dmca.openstreetmap.org/">ilmoittaa suoraan</a>. + trademarks_title_html: <span id="trademarks"></span>Tavaramerkit + trademarks_1_html: OpenStreetMap, suurennuslasilogo ja maailmankartta ovat OpenStreetMap-säätiön + rekisteröityjä tavaramerkkejä. <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">Lisensointiryhmämme + (englanniksi)</a> vastaa mielellään kysymyksiin tavaramerkkien käytöstä. welcome_page: title: Tervetuloa! - introduction_html: Tervetuloa OpenStreetMapiin, ilmaiseen ja vapaasti muokattavaan + introduction_html: 'Tervetuloa OpenStreetMapiin: ilmaiseen ja vapaasti muokattavaan maailmankarttaan. Rekisteröityminen on nyt suoritettu, joten olet valmis aloittamaan - kartan muokkaamisen. Tutustu ensin kuitenkin näihin perusasioihin. + kartan muokkaamisen. Tutustu ensin kuitenkin näihin perusasioihin.' whats_on_the_map: - title: Mitä kartalla on + title: Kartan sisältö on_html: OpenStreetMapissä voi kartoittaa asioita, jotka ovat <em>olemassa juuri nyt</em> – se sisältää miljoonia rakennuksia, teitä ja muita tietoja maailmasta. Voit kartoittaa mitä tahansa reaalimaailman piirteitä, jotka sinua kiinnostavat. @@ -1084,8 +1120,8 @@ fi: lähteistä. Ellei sinulla ole erityistä lupaa, älä kopioi verkko- tai paperikarttoja. basic_terms: title: Käsitteitä ja termistöä - paragraph_1_html: OpenStreetMapissa käytetään lukuisia, vain siinä esiintyviä - termejä. Kun nämä termit ovat hallinnassa, olet jo voiton puolella! + paragraph_1_html: OpenStreetMapissa käytetään paljon vain sille omaista termistöä. + Kun nämä sanat ovat hallinnassa, olet jo voiton puolella! editor_html: <strong>Muokkausohjelma</strong> tai <strong>kartanmuokkain</strong> (engl. editor) on ohjelmisto tai verkkosivusto, jolla voi muokata karttaa. node_html: <strong>Piste</strong> (engl. node) on pistemäinen kohde kartalla, @@ -1097,13 +1133,20 @@ fi: tag_html: <strong>Tagi</strong> eli <strong>ominaisuustieto</strong> kuvaa pisteen, viivan tai alueen käyttötarkoitusta. Tällaisia tietoja ovat esimerkiksi ravintolan nimi tai kadun nopeusrajoitus. + rules: + title: Pelisäännöt + paragraph_1_html: "OpenStreetMapilla on joitakin muodollisia säännöksiä, mutta + oletamme kaikkien käyttäjien tekevän yhteistyötä muiden kanssa. Jos harkitset + muita toimintoja kuin perusmuokkausta, lue ohje <a href='http://wiki.openstreetmap.org/wiki/Import/Guidelines'>tietojen + tuonnista</a> ja \n<a href='http://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct'>automaattisista + muokkauksista</a>." questions: title: Kysyttävää? paragraph_1_html: OpenStreetMapin käyttötukea on saatavilla useilla eri tavoilla. Tutustu OpenStreetMapin <a href='%{help_url}'>ohjekeskukseen</a>. start_mapping: Aloita kartan muokkaaminen add_a_note: - title: Eikö muokkaaminen kiinnosta? Ilmoita karttavirheistä! + title: Eikö muokkaaminen innosta? Ilmoita karttavirheistä! paragraph_1_html: Jos huomaat kartalla virheen, muttet halua korjata sitä itse, tee siitä karttavirheilmoitus. paragraph_2_html: 'Se on helppoa! Siirry <a href=''%{map_url}''>kartalle</a> @@ -1140,7 +1183,7 @@ fi: description: Opi OpenStreetMapin perusteet tällä helpolla aloitusoppaalla. beginners_guide: url: http://wiki.openstreetmap.org/wiki/Fi:Beginners%27_guide - title: Vasta-alkajan opas + title: Aloitusopas description: Yhteisön ylläpitämä opas aloittelijoille. help: url: https://help.openstreetmap.org/ @@ -1157,6 +1200,7 @@ fi: title: IRC description: Interaktiivinen chat monilla eri kielillä ja monista eri aiheista. switch2osm: + title: switch2osm (Vaihda OSM:iin) description: Auta yrityksiä ja organisaatioita vaihtamaan OpenStreetMapiin pohjautuviin karttoihin ja muihin palveluihin. wiki: @@ -1167,7 +1211,8 @@ fi: about_page: next: Seuraava copyright_html: <span>©</span>OpenStreetMapin<br>tekijät - used_by: Sadat verkkosivustot, sovellukset ja laitteet käyttävät %{name}-karttaa + used_by: Tuhannet verkkosivustot, mobiilisovellukset ja laitteistot käyttävät + %{name}-karttaa lede_text: OpenStreetMapia rakentavat vapaaehtoiset yhteisön jäsenet, jotka tuottavat ja ylläpitävät karttatietoja teistä, rautateistä, kahviloista, rautatieasemista ja monista muista kohteista kaikkialla maailmassa. @@ -1186,9 +1231,12 @@ fi: tai muuunnellaan, sitä saa levittää eteenpäin vain samalla lisenssillä. Lisätietoja on <a href=''%{copyright_path}''>Tekijänoikeus ja lisenssi</a> -sivulla.' legal_title: Lakitekninen jako - legal_html: |- - Tämä ja monet muut OSM-sivustot ovat muodollisesti <a href='http://osmfoundation.org/'>OpenStreetMap-säätiön</a> (OSMF) hallinnoimia OSM-yhteisön puolesta. - <a href='http://osmfoundation.org/Contact'>Ota yhteys OSMF:ään</a> lisensointi-, tekijänoikeus- ja muissa lakiteknisissä kysymyksissä. + legal_html: "Tämä ja monet muut OSM-sivustot ovat muodollisesti <a href='http://osmfoundation.org/'>OpenStreetMap-säätiön</a> + (OSMF) hallinnoimia OSM-yhteisön puolesta. Kaikkien näiden sivustojen käyttöön + sovelletaan <a href=\"http://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy\">\nhyväksytyn + käytön käytäntöjä</a> ja <a href=\"http://wiki.osmfoundation.org/wiki/Privacy_Policy\">tietosuojakäytäntöä</a> + (molemmat sisällöt saatavilla vain englanniksi).\n<br> \n<a href='http://osmfoundation.org/Contact'>Ota + yhteys OSMF:ään</a> lisensointi-, tekijänoikeus- ja muissa lakiteknisissä kysymyksissä." partners_title: Kumppanit notifier: diary_comment_notification: @@ -1199,7 +1247,7 @@ fi: footer: Lue kommentti sivulla %{readurl}. Jatkokommentin voi lähettää sivulla %{commenturl} tai vastausviestin sivulla %{replyurl}. message_notification: - hi: Hei %{to_user}! + hi: Hei %{to_user}, header: '%{from_user} on lähettänyt sinulle viestin OpenStreetMapissa otsikkolla %{subject}:' footer_html: Lue viesti osoitteessa %{readurl} ja vastaa siihen osoitteessa @@ -1207,7 +1255,7 @@ fi: friend_notification: subject: '[OpenStreetMap] %{user} lisäsi sinut kaverikseen' had_added_you: Käyttäjä %{user} lisäsi sinut kaverikseen OpenStreetMapissa. - see_their_profile: Voit tutustua hänen profiiliinsa osoitteessa %{userurl}. + see_their_profile: Voit tutustua hänen käyttäjäsivuunsa osoitteessa %{userurl}. befriend_them: Voit myös lisätä lähettäjän kaveriksi osoitteessa %{befriendurl}. gpx_notification: greeting: Hei! @@ -1225,7 +1273,7 @@ fi: loaded_successfully: '%{trace_points} pistettä ladattu onnistuneesti mahdollisista %{possible_points} pisteestä.' signup_confirm: - subject: '[OpenStreetMap] Tervetuloa OpenStreetMap-sovellukseen' + subject: '[OpenStreetMap] Tervetuloa OpenStreetMapiin' greeting: Hei! created: Joku (toivottavasti sinä) on luonut käyttäjätunnuksen osoitteessa %{site_url}. confirm: 'Jos olet luonut tämän käyttäjätilin, vahvista se napsauttamalla tätä @@ -1286,6 +1334,7 @@ fi: on lähellä paikkaa %{place}.' details: Lisää tietoja merkinnästä löytyy osoitteesta %{url}. changeset_comment_notification: + hi: Hei %{to_user}, greeting: Hei, commented: partial_changeset_without_comment: ei kommenttia @@ -1409,16 +1458,18 @@ fi: table: entry: motorway: Moottoritie + main_road: Päätie trunk: Valtatie primary: Kantatie secondary: Seututie unclassified: Luokittelematon tie - unsurfaced: Päällystämätön tie track: Metsätie - byway: Sivutie bridleway: Ratsastustie cycleway: Pyörätie - footway: Jalankulkutie + cycleway_national: Kansallinen pyörätie + cycleway_regional: Alueellinen pyörätie + cycleway_local: Paikallinen pyörätie + footway: Jalkakäytävä rail: Junarata subway: Metro tram: @@ -1439,7 +1490,6 @@ fi: golf: Golfkenttä park: Puisto resident: Asuinalue - tourist: Turistikohde common: - Niitty - keto @@ -1469,9 +1519,11 @@ fi: tunnel: Katkoviivallinen kehys = tunneli bridge: Musta kehys = silta private: Yksityinen - permissive: Luvanvarainen pääsy destination: Ei läpikulkua construction: Rakenteilla olevia teitä + bicycle_shop: Pyöräkauppa + bicycle_parking: Pyöräparkki + toilets: Vessat richtext_area: edit: Muokkaa preview: Esikatselu @@ -1557,7 +1609,7 @@ fi: owner: 'Käyttäjä:' description: 'Kuvaus:' tags: Tagit - none: Tyhjä + none: Ei mitään edit_track: Muokkaa jäljen tietoja delete_track: Poista tämä jälki trace_not_found: Jälkeä ei löydy! @@ -1633,6 +1685,7 @@ fi: allow_read_gpx: lukea yksityisiä GPS-jälkiäsi allow_write_gpx: tallenna GPS-jälkiä. allow_write_notes: Muokkaa muistiinpanoja. + grant_access: Myönnä oikeudet oauthorize_success: title: Valtuutuspyyntö hyväksytty allowed: Sovellukselle %{app_name} on myönnetty käyttöoikeus käyttäjätiliisi. @@ -1724,9 +1777,8 @@ fi: account not active: Käyttäjätunnustasi ei ole vielä aktivoitu.<br />Aktivoi käyttäjätunnuksesi napsauttamalla sähköpostitse saamaasi vahvistuslinkkiä, tai <a href="%{reconfirm}">pyydä uusi varmistusviesti</a>. - account is suspended: Valitettavasti käyttäjätilisi on jäädytetty epäilyttävän - toiminnan seurauksena.<br />Ole hyvä ja ota yhteyttä <a href="%{webmaster}">webmasteriin</a> - jos haluat keskustella tästä. + account is suspended: Valitettavasti käyttäjätilisi käyttö on estetty epäilyttävän + toiminnan seurauksena.<br />Saat lisätietoja ottamalla yhteyttä <a href="%{webmaster}">ylläpitoon</a>. auth failure: Kirjautuminen epäonnistui. openid_logo_alt: Kirjaudu sisään OpenID-tunnuksella auth_providers: @@ -1742,11 +1794,17 @@ fi: windowslive: title: Kirjaudu Windows Liven avulla alt: Kirjaudu sisään Windows Live -tililläsi + github: + title: Kirjaudu GitHubin avulla + alt: Kirjaudu käyttämällä GitHub-tiliäsi + wikipedia: + title: Kirjaudu sisään Wikipedialla + alt: Kirjaudu sisään Wikipedia-tunnuksella yahoo: title: Kirjaudu Yahoon avulla alt: Kirjaudu käyttämällä Yahoo OpenID -tunnustasi wordpress: - title: Kirjaudu Wordpressin avulla + title: Kirjaudu WordPressin avulla alt: Kirjaudu käyttämällä Wordpress OpenID -tunnustasi aol: title: Kirjaudu AOL:n avulla @@ -1776,7 +1834,7 @@ fi: title: Rekisteröidy no_auto_account_create: Automaattinen käyttäjätunnuksen luonti ei ole juuri nyt käytössä. - contact_webmaster: Voit ottaa yhteyttä <a href="mailto:webmaster@openstreetmap.org">webmaster</a>iin + contact_webmaster: Voit ottaa yhteyttä <a href="%{webmaster}">webmaster</a>iin (englanniksi) saadaksesi oman käyttäjätunnuksen. Pyrimme vastaamaan pyyntöihin mahdollisimman pikaisesti. about: @@ -1784,11 +1842,10 @@ fi: html: |- <p>Toisin kuin muut karttapalvelut, OpenStreetMap on täysin yhteisön eli vapaaehtoisten ihmisten luoma. Palvelun käyttö ja muokkaaminen on täysin ilmaista ja vapaata.</p> <p>Aloita kartan kehittäminen rekisteröitymällä. Tämän jälkeen vahvista käyttäjätunnus napsauttamalla linkkiä sähköpostitse lähetettävässä aktivointiviestissä.</p> - license_agreement: Kun vahvistat tilisi sinun on sitouduttava <a href="http://www.osmfoundation.org/wiki/License/Contributor_Terms">osallistujan - ehtoihin</a>. + license_agreement: Kun vahvistat tilisi, sinun on sitouduttava <a href="http://www.osmfoundation.org/wiki/License/Contributor_Terms">osallistumisehtoihin</a>. email address: 'Sähköpostiosoite:' confirm email address: 'Sähköpostiosoite uudelleen:' - not displayed publicly: Ei näytetä julkisesti. Lisätietoja <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" + not displayed publicly: Osoitettasi ei esitetä julkisesti. Lisätietoja <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" title="tietosuojakäytäntö wikisivulla, ml. osio sähköpostiosoitteiden käsittelystä">tietosuojakäytännöstä</a> on saatavilla englanniksi. display name: 'Käyttäjätunnus:' @@ -1801,32 +1858,25 @@ fi: auth no password: Mikäli kirjaudut sisään kolmannen osapuolen palveluiden avulla, sinun ei tarvitse luoda itsellesi salasanaa, mutta jotkin ylimääräiset työkalut tai palvelimet voivat silti vaatia sitä. - auth association: |- - <p>ID:täsi ei ole vielä liitetty OpenStreetMap-tunnukseen.</p> - <ul> - <li>Jos olet uusi OpenStreetMapin käyttäjä, luo itsellesi tunnus allaolevan lomakkeen avulla.</li> - <li> - Jos sinulla on jo tunnus, voit kirjautua tunnuksellesi syöttämällä käyttäjänimesi ja salasanasi. Kirjauduttuasi voit liittää tunnuksesi ID:esi käyttäjäasetuksissa. - </li> - </ul> continue: Rekisteröidy terms accepted: Kiitos uusien osallistujaehtojen hyväksymisestä! - terms declined: Olemme pahoillamme, ettet hyväksynyt uusia osallistujaehtoja. - Katso lisätietoja <a href="%{url}">tältä wikisivulta</a>. + terms declined: Harmi, ettet hyväksynyt uusia osallistumisehtoja. Katso lisätietoja + <a href="%{url}">tältä wikisivulta</a>. terms: - title: Osallistujaehdot - heading: Osallistujaehdot - read and accept: Lue alla oleva sopimus ja varmista, että hyväksyt sopimuksen - ehdot nykyisille ja tuleville muokkauksillesi valitsemalla »Hyväksyn». - consider_pd: Edellisen sopimuksen lisäksi katson lisäyksieni olevan Public Domainissa + title: Osallistumisehdot + heading: Osallistumisehdot + read and accept: Lue sopimus ja varmista, että hyväksyt sopimuksen ehdot nykyisille + ja tuleville muokkauksillesi napsauttamalla Hyväksyn. + consider_pd: Edellisen sopimuksen lisäksi katson lisäyksieni olevan tekijänoikeudettomia + Public Domain -lisenssillä consider_pd_why: mikä tämä on? - guidance: 'Tietoa, joka auttaa ymmärtämään nämä käsitteet: a <a href="%{summary}">ihmisluettava - yhteenveto</a> ja joitain <a href="%{translations}">epävirallisia käännöksiä</a>' + guidance: 'Vaihtoehtoisia lukutapoja: <a href="%{summary}">selkokielinen yhteenveto + (englanniksi)</a> ja <a href="%{translations}">epäviralliset käännökset</a>' agree: Hyväksyn decline: En hyväksy - you need to accept or decline: Ennen jatkamista lue läpi Kartoittajan ehdot - ja hyväksy tai hylkää se. - legale_select: 'Ole hyvä ja valitse asuinmaasi:' + you need to accept or decline: Ennen jatkamista lue läpi osallistumisehdot ja + hyväksy tai hylkää se. + legale_select: 'Valitse asuinmaasi:' legale_names: france: Ranska italy: Italia @@ -1835,6 +1885,7 @@ fi: title: Haettua käyttäjää ei ole olemassa heading: Käyttäjää %{user} ei ole olemassa body: Käyttäjää %{user} ei löytynyt. Tarkista oikeikirjoitus. + deleted: poistettu view: my diary: Oma päiväkirja new diary entry: uusi päiväkirjamerkintä @@ -1842,7 +1893,7 @@ fi: my traces: Omat jäljet my notes: Omat karttailmoitukset my messages: Viestit - my profile: Profiili + my profile: Käyttäjäsivu my settings: Asetukset my comments: Omat kommentit oauth settings: oauth-asetukset @@ -1857,7 +1908,7 @@ fi: add as friend: Lisää kaveriksi mapper since: 'Liittyi palveluun:' ago: (%{time_in_words_ago} sitten) - ct status: 'Kartoittajan ehdot:' + ct status: 'Osallistumisehdot:' ct undecided: Ei valittu ct declined: Hylätty ct accepted: Hyväksytty %{ago} sitten @@ -1886,16 +1937,16 @@ fi: revoke: administrator: Poista ylläpitäjän oikeudet moderator: Poista moderaattorin oikeudet - block_history: saadut estot - moderator_history: tehdyt estot + block_history: Saadut estot + moderator_history: Tehdyt estot comments: Kommentit - create_block: estä tämä käyttäjä - activate_user: aktivoi tämä käyttäjä - deactivate_user: poista tämän käyttäjän aktivointi - confirm_user: vahvista tämä käyttäjä - hide_user: piilota käyttäjä - unhide_user: piilota tämä käyttäjä - delete_user: poista käyttäjä + create_block: Estä tämä käyttäjä + activate_user: Aktivoi tämä käyttäjä + deactivate_user: Poista tämän käyttäjän aktivointi + confirm_user: Vahvista tämä käyttäjä + hide_user: Piilota tämä käyttäjä + unhide_user: Poista käyttäjän piilottaminen + delete_user: Poista tämä käyttäjä confirm: Vahvista friends_changesets: kaverien muutoskokoelmat friends_diaries: kaverien päiväkirjamerkinnät @@ -1933,10 +1984,10 @@ fi: toimintoa ei voi perua ja kaikki uudet käyttäjät ovat automaattisesti julkisia.<a href="http://wiki.openstreetmap.org/wiki/Anonymous_edits"></a></li></ul> contributor terms: - heading: 'Kartoittajan ehdot:' - agreed: Olet hyväksynyt Kartoittajan ehdot. - not yet agreed: Et ole vielä hyväksynyt Kartoittajan ehtoja. - review link text: Lue ja hyväksy uudistuneet Kartoittajan ehdot napsauttamalla + heading: 'Osallistumisehdot:' + agreed: Olet hyväksynyt osallistumisehdot. + not yet agreed: Et ole vielä hyväksynyt osallistumisehtoja. + review link text: Lue ja hyväksy uudistuneet osallistumisehdot napsauttamalla tätä linkkiä. agreed_with_pd: Olet myös ilmaissut muokkaustesi olevan tekijänoikeudesta vapaita (Public Domain). @@ -1948,6 +1999,7 @@ fi: gravatar: gravatar: Käytä Gravataria link text: mikä tämä on? + disabled: Gravatar on poistettu käytöstä. new image: Lisää kuva keep image: Säilytä nykyinen kuva delete image: Poista nykyinen kuva @@ -1961,27 +2013,27 @@ fi: update home location on click: Päivitä kotipaikka karttaa napsauttaessa save changes button: Tallenna muutokset make edits public button: Tee muokkauksistani julkisia - return to profile: Palaa profiilisivulle + return to profile: Palaa käyttäjäsivulle flash update success confirm needed: Käyttäjätietojen muutokset on tallennettu. Vahvista uusi sähköpostiosoite siihen lähetettyjen ohjeiden mukaisesti. flash update success: Käyttäjätietojen muutokset on tallennettu. confirm: heading: Tarkista sähköpostisi! introduction_1: Vahvistusviesti lähetetty. - introduction_2: Vahvista tilisi klikkaamalla sähköpostissa olevaa linkkiä ja - voit aloittaa kartoituksen. + introduction_2: Aktivoi tilisi napsauttamalla vahvistustilissä olevaa linkkiä + ja olet valmis aloittamaan kartan muokkaamisen! press confirm button: Aktivoi uusi käyttäjätunnuksesi valitsemalla Vahvista. button: Vahvista success: Käyttäjätunnuksesi on nyt vahvistettu. already active: Tämä tunnus on jo vahvistettu. unknown token: Vahvistuskoodi on vanhentunut tai sitä ei ole. - reconfirm_html: Tarvittaessa voimme lähettää vahvistuksen sähköpostitse, <a - href="%{reconfirm}">klikkaa tästä</a>. + reconfirm_html: Tarvittaessa voimme lähettää uuden vahvistusviestin, <a href="%{reconfirm}">napsauta + tästä</a>. confirm_resend: - success: Olemme lähettäneet vahvistusviestin osoitteeseen %{email}. Vahvistettuasi - käyttäjätunnuksesi voit aloittaa kartoittamisen.<br /><br />Jos käytät roskapostit - suodattavaa ohjelmaa, joka lähettää vahvistusviestejä, laita webmaster@openstreetmap.org - sallittujen osoitteiden listalle, sillä emme voi vastata vahvistusviesteihin. + success: Olemme lähettäneet aktivointilinkin sisältävän viestin osoitteeseen + %{email}. Vahvistettuasi käyttäjätunnuksesi voit aloittaa kartoittamisen.<br + /><br />Jos käytät vahvistusviestejä lähettävää roskapostinesto-ohjelmaa, + lisää %{sender} sallittujen osoitteiden listalle, sillä emme voi vastata vahvistuspyyntöihin. failure: Käyttäjää %{name} ei löytynyt. confirm_email: heading: Vahvista sähköpostiosoitteen muutos @@ -2033,8 +2085,15 @@ fi: </p> auth_failure: connection_failed: Yhdistäminen todennuspalveluntarjoajaan epäonnistui + invalid_credentials: Virheelliset varmennustiedot no_authorization_code: Ei käyttöoikeuskoodia unknown_signature_algorithm: Tunnistamaton allekirjoitusalgoritmi + invalid_scope: Virheellinen ala + auth_association: + heading: Sinun ID:tä ei ole vielä liitetty OpenStreetMap-tiliisi. + option_1: 'Uusi OpenStreetMapin käyttäjä: luo käyttäjätunnus tällä lomakkeella.' + option_2: 'Nykyinen OpenStreetMapin käyttäjä: kirjaudu sisään käyttäjätunnuksella + ja salasanalla ja yhdistä tili käyttäjäasetuksissa.' user_role: filter: not_an_administrator: Vain ylläpitäjät voivat hallita käyttäjärooleja, etkä @@ -2147,6 +2206,8 @@ fi: heading: '%{block_on} estetty käyttäjän %{block_by} toimesta' time_future: Päättymiseen aikaa %{time} time_past: Loppui %{time} sitten + created: Luotu + ago: '%{time} sitten' status: Tila show: Näytä edit: Muokkaa @@ -2208,6 +2269,9 @@ fi: center_marker: Keskitä kartta karttamerkkiin paste_html: Upota karttaikkuna liittämällä tämä koodi verkkosivulle view_larger_map: Näytä isommalla kartalla + only_standard_layer: Vain standardi kerros voidaan viedä kuvana + embed: + report_problem: Ilmoita ongelmasta key: title: Karttamerkinnät tooltip: Merkkien selitykset @@ -2228,13 +2292,14 @@ fi: header: Karttanäkymä notes: Karttailmoitukset data: Kartta-aineisto + gps: Julkiset GPS-jäljet overlays: Nämä toiminnot on tarkoitettu karttavirheiden korjaamiseen title: Karttanäkymä copyright: © <a href='%{copyright_url}'>OpenStreetMapin tekijät</a> donate_link_text: <a class='donate-attr' href='%{donate_url}'>Tee lahjoitus</a> site: edit_tooltip: Muokkaa karttaa - edit_disabled_tooltip: Aloita kartan muokkaaminen suurentamalla karttaa + edit_disabled_tooltip: Lähennä karttaa ennen muokkaamisen aloittamista createnote_tooltip: Ilmoita karttavirheestä createnote_disabled_tooltip: Lähennä karttaa ennen karttavirheestä ilmoittamista. map_notes_zoom_in_tooltip: Näytä karttailmoitukset lähentämällä karttaa @@ -2243,7 +2308,7 @@ fi: queryfeature_disabled_tooltip: Näytä ominaisuusluettelo suurentamalla karttaa changesets: show: - comment: Kommentti + comment: Kommentoi subscribe: Tilaa unsubscribe: Lopeta tilaus hide_comment: piilota @@ -2267,19 +2332,56 @@ fi: directions: engines: graphhopper_bicycle: Pyörällä (GraphHopper) - graphhopper_foot: Jalan (GraphHopper) + graphhopper_foot: Kävellen (GraphHopper) mapquest_bicycle: Pyörällä (MapQuest) mapquest_car: Ajaen (MapQuest) - mapquest_foot: Jalan (MapQuest) + mapquest_foot: Kävellen (MapQuest) osrm_car: Ajaen (OSRM) + mapzen_bicycle: Pyörällä (Mapzen) + mapzen_car: Ajaen (Mapzen) + mapzen_foot: Kävellen (Mapzen) directions: Reittiohjeet distance: Etäisyys errors: no_route: Reittiä näiden paikkojen välille ei löytynyt. no_place: Paikkaa ei löytynyt. instructions: + continue_without_exit: Jatka tiellä %{name} + slight_right_without_exit: Kaarra oikealle tielle %{name} + offramp_right_without_exit: Poistu oikealle liittymään tielle %{name} + onramp_right_without_exit: Käänny oikealle liittymään tielle %{name} + endofroad_right_without_exit: Tienpäässä käänny oikealle tielle %{name} + merge_right_without_exit: Liity oikealle tielle %{name} + fork_right_without_exit: Liittymässä ryhmity oikealle suuntaan %{name} + turn_right_without_exit: Käänny oikealle tielle %{name} + sharp_right_without_exit: Käänny jyrkästi oikealle tielle %{name} + uturn_without_exit: Tee U-käännös tiellä %{name} + sharp_left_without_exit: Käänny jyrkästi vasemmalle tielle %{name} + turn_left_without_exit: Käänny vasemmalle tielle %{name} + offramp_left_without_exit: Poistu vasemmalle liittymään tielle %{name} + onramp_left_without_exit: Käänny vasemmalle liittymään tielle %{name} + endofroad_left_without_exit: Tienpäässä käänny vasemmalle tielle %{name} + merge_left_without_exit: Liity vasemmalle tielle %{name} + fork_left_without_exit: Liittymässä ryhmity vasemmalle suuntaan %{name} + slight_left_without_exit: Kaarra vasemmalle tielle %{name} + via_point_without_exit: (reittipiste) + follow_without_exit: Seuraa tietä %{name} + roundabout_without_exit: Poistu liikenneympyrästä tielle %{name} + leave_roundabout_without_exit: Poistu liikenneympyrästä - %{name} + stay_roundabout_without_exit: Pysy liikenneympyrässä - %{name} + start_without_exit: Aloita tien %{name} päästä + destination_without_exit: Olet saapunut perille + against_oneway_without_exit: Aja yksisuuntaista tietä %{name} väärään suuntaan + end_oneway_without_exit: Yksisuuntaisen tien %{name} pää roundabout_with_exit: Liikenneympyrässä poistu %{exit}. liittymästä tielle %{name} + turn_left_with_exit: Liikenneympyrässä käänny vasemmalle tielle %{name} + slight_left_with_exit: Liikenneympyrässä kaarra loivasti vasemmalle tielle + %{name} + turn_right_with_exit: Liikenneympyrässä käänny oikealle tielle %{name} + slight_right_with_exit: Liikenneympyrässä kaarra loivasti oikealle tielle + %{name} + continue_with_exit: Liikenneympyrässä jatka suoraan tielle %{name} unnamed: nimetön tie courtesy: Reittiohjeet tarjoaa %{link} time: Matka-aika diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 0114f526a..c088db13f 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -8,12 +8,16 @@ # Author: Crochet.david # Author: Damouns # Author: DavidL +# Author: Dereckson +# Author: E THP # Author: Efred # Author: Eruedin # Author: EtienneChove # Author: F.rodrigo # Author: Framafan # Author: Freak2fast4u +# Author: Frigory +# Author: Fylip22 # Author: Gaspard # Author: Gileri # Author: Gomoko @@ -26,6 +30,8 @@ # Author: Litlok # Author: Ljubinka # Author: Lucky +# Author: Macofe +# Author: Manaviko # Author: McDutchie # Author: Metroitendo # Author: Momo50WM @@ -44,16 +50,20 @@ # Author: Ruila # Author: Seb35 # Author: Sherbrooke +# Author: Syl +# Author: The RedBurn +# Author: Tuxxic # Author: Urhixidur # Author: Vcalame # Author: Verdy p +# Author: Wladek92 # Author: Yodaspirine # Author: Yvecai --- fr: time: formats: - friendly: '%e %B %Y à %H:%M' + friendly: '%e %B %Y à %-H h %-M' activerecord: models: acl: Liste de contrôle d’accès @@ -152,7 +162,7 @@ fr: anonymous: anonyme no_comment: (aucun commentaire) part_of: Appartient à - download_xml: Télécharger le XML + download_xml: Télécharger en XML view_history: Afficher l’historique view_details: Afficher les détails location: 'Emplacement :' @@ -173,7 +183,7 @@ fr: osmchangexml: XML osmChange feed: title: Groupe de modifications %{id} - title_comment: Groupe de modifications %{id} – %{comment} + title_comment: Groupe de modifications %{id} — %{comment} join_discussion: Se connecter pour rejoindre la discussion discussion: Discussion node: @@ -206,6 +216,7 @@ fr: way: chemin relation: relation changeset: groupe de modifications + note: note timeout: sorry: Désolé, les données pour le type %{type} avec l’id %{id} prennent trop de temps à être récupérées. @@ -214,6 +225,7 @@ fr: way: chemin relation: relation changeset: groupe de modifications + note: note redacted: redaction: Masquage %{id} message_html: La version %{version} de ce(tte) %{type} ne peut être affichée @@ -301,6 +313,7 @@ fr: diary_entry: new: title: Nouvelle entrée du journal + publish_button: Publier list: title: Journaux des utilisateurs title_friends: Journaux des amis @@ -308,7 +321,7 @@ fr: user_title: Journal de %{user} in_language_title: Entrées du journal en %{language} new: Nouvelle entrée du journal - new_title: Écrire une nouvelle entrée dans votre journal + new_title: Écrire une nouvelle entrée dans votre journal utilisateur no_entries: Aucun article de journal recent_entries: Articles récents du journal older_entries: Entrées plus anciennes @@ -369,7 +382,7 @@ fr: description: Articles récents des journaux d’utilisateurs OpenStreetMap comments: has_commented_on: '%{display_name} a commenté les entrées de journal suivantes' - post: Envoyer + post: Article when: Quand comment: Commentaire ago: il y a %{ago} @@ -400,11 +413,11 @@ fr: overpass: title: API Overpass description: Télécharger ce cadre englobant depuis un miroir de la base - de données d’OpenStreetMap + de données OpenStreetMap geofabrik: title: Téléchargements de Geofabrik - description: Extractions régulièrement mises à jour des continents, pays - et villes sélectionnées + description: Extractions régulièrement mises à jour des continents, des + pays et des villes sélectionnées metro: title: Extractions de Metro description: Extractions des principales villes du monde et de leurs environs @@ -451,7 +464,7 @@ fr: gate: Porte helipad: Héliport runway: Piste - taxiway: Voie de circulation (Taxiway) + taxiway: Piste de circulation d’un aéroport terminal: Terminal amenity: animal_shelter: Refuge pour animaux @@ -474,7 +487,7 @@ fr: car_wash: Lavage de voiture casino: Casino charging_station: Station de recharge - childcare: Garde d'enfants + childcare: Garde d’enfants cinema: Cinéma clinic: Clinique clock: Horloge @@ -496,7 +509,7 @@ fr: food_court: Aire de restauration fountain: Fontaine fuel: Carburant - gambling: Club de jeu + gambling: Jeu d’argent grave_yard: Cimetière gym: Fitness / gymnastique health_centre: Centre de santé / dispensaire @@ -514,7 +527,7 @@ fr: nursing_home: Maison de retraite médicalisée office: Bureau parking: Parking - parking_entrance: Entrée d'un parking + parking_entrance: Entrée d’un parking pharmacy: Pharmacie place_of_worship: Lieu de culte police: Police @@ -573,14 +586,14 @@ fr: plumber: Plombier shoemaker: Cordonnier tailor: Tailleur - "yes": Boutique d'artisanat + "yes": Boutique d’artisanat emergency: - ambulance_station: Dépôt d'ambulances + ambulance_station: Dépôt d’ambulances defibrillator: Défibrillateur - landing_site: Terrain d'atterrissage d'urgence + landing_site: Terrain d’atterrissage d’urgence phone: Borne d’appel d’urgence highway: - abandoned: Voie ferrée abandonnée + abandoned: Autoroute abandonnée bridleway: Chemin pour cavaliers bus_guideway: Voie de bus guidé / trolley bus_stop: Arrêt de bus @@ -593,7 +606,7 @@ fr: living_street: Rue en zone de rencontre milestone: Borne kilométrique motorway: Autoroute - motorway_junction: Jonction d’autoroute + motorway_junction: Bretelle d’autoroute / Sortie motorway_link: Voie autoroutière path: Chemin pedestrian: Chemin piéton @@ -649,7 +662,7 @@ fr: wayside_shrine: Oratoire wreck: Épave junction: - "yes": Intersection / Carrefour + "yes": Intersection / carrefour landuse: allotments: Jardins familiaux basin: Bassin @@ -702,7 +715,7 @@ fr: pitch: Terrain de sport playground: Aire de jeux recreation_ground: Terrain de jeux - resort: Resort + resort: Villégiature sauna: Sauna slipway: Cale de lancement sports_centre: Centre sportif @@ -716,7 +729,7 @@ fr: pipeline: Pipeline tower: Tour works: Usine - "yes": Créé par l'homme + "yes": Créé par l’homme military: airfield: Terrain d’aviation militaire barracks: Caserne @@ -933,7 +946,7 @@ fr: boatyard: Chantier naval canal: Canal dam: Barrage - derelict_canal: Canal de décharge + derelict_canal: Canal d’évacuation ditch: Fossé dock: Dock drain: Drain @@ -946,11 +959,11 @@ fr: wadi: Oued waterfall: Chute d’eau weir: Barrage - "yes": Voie navigable + "yes": Cours d’eau admin_levels: level2: Frontière de pays level4: Limite d’État, province ou région - level5: Frontière de région + level5: Limite de région level6: Limite de département level8: Limite communale level9: Limite de village ou arrondissement municipal @@ -974,7 +987,7 @@ fr: logout: Se déconnecter log_in: Se connecter log_in_tooltip: Se connecter avec un compte existant - sign_up: Créer un compte + sign_up: S’inscrire start_mapping: Commencer à cartographier sign_up_tooltip: Créer un compte pour la modification edit: Modifier @@ -1061,9 +1074,12 @@ fr: Pour obtenir plus d’informations sur la façon de réutiliser nos données et de nous créditer, veuillez lire la <a href="http://osmfoundation.org/Licence"> Licence OSMF</a> et le <a href="http://wiki.openstreetmap.org/wiki/Legal_FAQ">FAQ Légal</a>. - more_2_html: |- - Bien qu’OpenStreetMap soit un jeu de données libres et ouvertes, nous ne pouvons pas nous même fournir une API gratuite et en libre accès pour les développeurs tiers. - Veuillez vous référer à notre <a href="http://wiki.openstreetmap.org/wiki/API_usage_policy">politique d’utilisation de l’API</a>, à notre <a href="http://wiki.openstreetmap.org/wiki/Tile_usage_policy">politique d’utilisation des tuiles</a>, et à la <a href="http://wiki.openstreetmap.org/wiki/Nominatim#Usage_Policy">politique d’utilisation de Nominatim</a>. + more_2_html: "Bien qu’OpenStreetMap soit un jeu de données libres et ouvertes, + nous ne pouvons pas fournir une API gratuite et en libre accès pour les tierces + personnes.\nVeuillez vous référer à notre <a href=\"https://operations.osmfoundation.org/policies/api/\">politique + d’utilisation de l’API</a>, \n à notre <a href=\"https://operations.osmfoundation.org/policies/tiles/\">politique + d’utilisation des tuiles</a>, \net à la <a href=\"https://operations.osmfoundation.org/policies/nominatim/\">politique + d’utilisation de Nominatim</a>." contributors_title_html: Nos contributeurs contributors_intro_html: 'Nos contributeurs sont des milliers de personnes. Nous incluons également des données publiées sous licence ouverte par des @@ -1090,10 +1106,10 @@ fr: contributors_nz_html: '<strong>Nouvelle-Zélande</strong> : contient des données provenant du <em>Land Information New Zealand</em>. Copyright de la Couronne réservé.' - contributors_si_html: |- - <strong>Slovénie</strong> : Contient des données de l’<a href="http://www.gu.gov.si/en/">Autorité de Planification et de Cartographie</a> et du - <a href="http://www.mkgp.gov.si/en/">Ministère de l’Agriculture, de la Forêt et de l’Alimentation</a> - (information publique de la Slovénie). + contributors_si_html: '<strong>Slovénie</strong> : contient des données de l’<a + href="http://www.gu.gov.si/en/">Autorité de Planification et de Cartographie</a> + et du <a href="http://www.mkgp.gov.si/en/">Ministère de l’Agriculture, de + la Forêt et de l’Alimentation</a> (information publique de la Slovénie).' contributors_za_html: |- <strong>Afrique du Sud</strong> : contient des données issues de la <a href="http://www.ngi.gov.za/">Direction principale des Informations Géospatiales Nationales</a>, copyright de l’État réservé. @@ -1118,9 +1134,10 @@ fr: de retrait de données</a> ou notifiez-nous directement à travers notre <a href="http://dmca.openstreetmap.org/">formulaire en ligne</a>. trademarks_title_html: <span id="marques"></span>Marques - trademarks_1_html: OpenStreetMap et le logo loupe sont des marques déposées - de la OpenStreetMap Foundation. Si vous avez des questions à propos de l'utilisation - de ces marques, merci de prendre contact avec le <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">Licence + trademarks_1_html: OpenStreetMap, le logo loupe et State of the Map sont des + marques déposées de l'OpenStreetMap Foundation. Si vous avez des questions + à propos de l’utilisation de ces marques, merci de prendre contact avec le + <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">Licence Working Group</a>. welcome_page: title: Bienvenue ! @@ -1154,12 +1171,12 @@ fr: de vitesse d’une route. rules: title: Règles ! - paragraph_1_html: "OpenStreetMap a quelques règles formelles, mais nous attendons + paragraph_1_html: OpenStreetMap a quelques règles formelles, mais nous attendons de tous les participants une collaboration et une communication avec la communauté. - Si vous envisagez\nd’autres activités que la modification à la main, veuillez - lire et suivre les directives sur \n<a href='http://wiki.openstreetmap.org/wiki/Import/Guidelines'>les - importations</a> et \n<a href='http://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct'>les - modifications automatiques</a>." + Si vous envisagez d’autres activités que la modification à la main, veuillez + lire et suivre les directives sur <a href='http://wiki.openstreetmap.org/wiki/Import/Guidelines'>les + importations</a> et <a href='http://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct'>les + modifications automatiques</a>. questions: title: Des questions ? paragraph_1_html: |- @@ -1205,7 +1222,7 @@ fr: description: Commencer avec ce guide rapide couvrant les bases d’OpenStreetMap. beginners_guide: url: http://wiki.openstreetmap.org/wiki/FR:Guide_du_d%C3%A9butant - title: Guide pour débutants + title: Guide du débutant description: Guide pour les débutants maintenu par la communauté. help: url: https://help.openstreetmap.org/ @@ -1218,24 +1235,24 @@ fr: large éventail de thématiques ou des listes de diffusion régionaux. forums: title: Forums - description: Des questions et des discussions pour ceux qui préfèrent un interface - en style de tableau d'affichage. + description: Des questions et des discussions pour ceux qui préfèrent une interface + sous forme de tableau d’affichage. irc: title: IRC - description: Chat interactif dans de nombreuses langues différentes et sur de - nombreux sujets. + description: Discussion interactive dans de nombreuses langues différentes et + sur de nombreux sujets. switch2osm: title: switch2osm description: Aide pour les entreprises et les organisations de commutation à - OpenStreetMap, en fonction des cartes et d'autres services. + OpenStreetMap, en fonction des cartes et d’autres services. wiki: - url: http://wiki.openstreetmap.org/ + url: https://wiki.openstreetmap.org/wiki/FR:Page_principale title: wiki.openstreetmap.org description: Parcourez le wiki pour la documentation approfondie d’OSM about_page: next: Suivant copyright_html: <span>©</span>Contributeurs<br /> d’OpenStreetMap - used_by: '%{name} fournit des données cartographie sur des centaines de sites + used_by: '%{name} fournit des données cartographiques sur des milliers de sites web, applications mobiles et appareils' lede_text: OpenStreetMap est bâti par une communauté de cartographes bénévoles qui contribuent et maintiennent les données des routes, sentiers, cafés, stations @@ -1247,29 +1264,31 @@ fr: jour. community_driven_title: Conduit par la communauté community_driven_html: |- - La communauté d’OpenStreetMap est diverse, passionée et grossit chaque jour. Nos contributeurs incluent des cartographes enthousiastes, des professionnels du GIS, des ingénieurs qui conduisent les serveurs OSM, des humanitaires cartographiant les zones dévastées par une catastrophe et bien d’autres. + La communauté d’OpenStreetMap est diverse, passionnée et grossit chaque jour. Nos contributeurs incluent des cartographes enthousiastes, des professionnels du SIG, des ingénieurs qui font fonctionner les serveurs d’OSM, des humanitaires cartographiant les zones dévastées par une catastrophe et bien d’autres. Pour en savoir plus sur la communauté, consultez les <a href='%{diary_path}'>annuaires d’utilisateurs</a>, <a href='http://blogs.openstreetmap.org/'>les blogues communautaires</a> et le site web de la <a href='http://www.osmfoundation.org/'>Fondation OSM</a>. open_data_title: Données libres open_data_html: 'OpenStreetMap est en <i>open data</i> : vous êtes libre de l’utiliser pour n’importe quel but tant que vous créditez OpenStreetMap et ses contributeurs. Si vous modifiez ou vous appuyez sur les données d’une façon quelconque, vous - pouvez distribuez le résultat seulement suivant la même licence. Consultez la + pouvez distribuer le résultat seulement suivant la même licence. Consultez la page sur les <a href=''%{copyright_path}''>droits d’auteur et licence</a> pour plus de détails.' legal_title: Juridique legal_html: "Ce site et de nombreux autres services connexes sont formellement exploités par la \n<a href=\"http://osmfoundation.org/\">Fondation OpenStreetMap</a> - (OSMF) \nau nom de la communauté.\n<br> \nVeuillez <a href=\"http://osmfoundation.org/Contact\">contacter - l'OSMF</a> \nsi vous avez les questions à propos des licences, droits d'auteur - ou d'autres questions juridiques." + (OSMF) \nau nom de la communauté. L’utilisation de tous les services offerts + par l’OSMF est sujette\nà notre <a href=\"http://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy\">\nPolitique + des usages acceptés</a> et à notre <a href=\"http://wiki.osmfoundation.org/wiki/Privacy_Policy\">Politique + de confidentialité</a>.\n<br> \nVeuillez <a href=\"http://osmfoundation.org/Contact\">contacter + l’OSMF</a> \nsi vous avez des questions ou problèmes concernant les licences, + les droits d’auteur ou d’autres aspects juridiques." partners_title: Partenaires notifier: diary_comment_notification: - subject: '[OpenStreetMap] %{user} a posté un commentaire sur un article de votre - journal' + subject: '[OpenStreetMap] %{user} a posté un commentaire sur un article de journal' hi: Bonjour %{to_user}, - header: '%{from_user} a posté un commentaire sur un article récent de votre - journal OpenStreetMap avec le sujet %{subject} :' + header: '%{from_user} a posté un commentaire sur un article récent du journal + OpenStreetMap avec le sujet %{subject} :' footer: Vous pouvez également lire le commentaire sur %{readurl}, le commenter sur %{commenturl} ou répondre sur %{replyurl} message_notification: @@ -1361,8 +1380,9 @@ fr: your_note: '%{commenter} a réactivé une de vos notes de carte près de %{place}.' commented_note: '%{commenter} a réactivé une note de carte que vous avez commentée. La note se trouve près de %{place}.' - details: Plus de détail sur la note peut être obtenu à %{url}. + details: Plus de détails concernant la note se trouvent à %{url}. changeset_comment_notification: + hi: Bonjour %{to_user}, greeting: Bonjour, commented: subject_own: '[OpenStreetMap] %{commenter} a commenté un de vos ensembles @@ -1374,14 +1394,16 @@ fr: commented_changeset: '%{commenter} a laissé un commentaire sur un ensemble de changements de carte que vous surveillez créé par %{changeset_author} le %{time}' - partial_changeset_with_comment: avec le commentaire '%{changeset_comment}' + partial_changeset_with_comment: avec le commentaire « %{changeset_comment}' Â» partial_changeset_without_comment: sans commentaire details: Plus de détails sur l’ensemble de modifications à %{url}. + unsubscribe: Pour vous désabonner des mises à jour de cet ensemble de modifications, + visitez %{url} et cliquez sur « Désabonner ». message: inbox: title: Boîte de réception my_inbox: Ma boîte de réception - outbox: boîte d'envoi + outbox: boîte d’envoi messages: Vous avez %{new_messages} et %{old_messages} new_messages: one: '%{count} nouveau message' @@ -1392,7 +1414,7 @@ fr: from: De subject: Objet date: Date - no_messages_yet: Vous n'avez actuellement aucun message. Pourquoi ne pas entrer + no_messages_yet: Vous n’avez actuellement aucun message. Pourquoi ne pas entrer en contact avec quelques %{people_mapping_nearby_link} ? people_mapping_nearby: personnes proche de vous message_summary: @@ -1406,32 +1428,32 @@ fr: subject: Sujet body: Corps send_button: Envoyer - back_to_inbox: Revenir la boîte de réception + back_to_inbox: Revenir à la boîte de réception message_sent: Message envoyé limit_exceeded: Vous avez envoyé trop de messages récemment, attendez un moment - avant d'essayer d'en envoyer de nouveaux. + avant d’essayer d’en envoyer de nouveaux. no_such_message: title: Message introuvable heading: Message introuvable - body: Désolé, il n'y a aucun message avec cet identifiant. + body: Désolé, il n’y a aucun message avec cet identifiant. outbox: - title: Boîte d'envoi + title: Boîte d’envoi my_inbox: Ma %{inbox_link} inbox: boîte de réception - outbox: boîte d'envoi + outbox: boîte d’envoi messages: one: Vous avez %{count} message envoyé other: Vous avez %{count} messages envoyés to: À subject: Objet date: Date - no_sent_messages: Vous n'avez encore envoyé aucun message. Pourquoi ne pas entrez + no_sent_messages: Vous n’avez encore envoyé aucun message. Pourquoi ne pas entrez en contact avec quelques %{people_mapping_nearby_link} ? people_mapping_nearby: personnes proche de vous reply: wrong_user: Vous êtes identifié(e) comme « %{user} » mais le message auquel - vous souhaitez répondre n'a pas été envoyé à cet utilisateur. Veuillez vous - connecter avec l'identifiant correct pour pouvoir répondre. + vous souhaitez répondre n’a pas été envoyé à cet utilisateur. Veuillez vous + connecter avec l’identifiant correct pour pouvoir répondre. read: title: Lire le message from: De @@ -1442,8 +1464,8 @@ fr: back: Retour to: À wrong_user: Vous êtes identifié comme « %{user} » mais le message que vous essayez - de lire n'a été envoyé ni à ni par cet utilisateur. Veuillez vous connecter - avec l'identifiant correct pour pouvoir le lire. + de lire n’a pas été envoyé par cet utilisateur, ni ne lui a été destiné. Veuillez + vous connecter avec l’identifiant correct pour pouvoir le lire. sent_message_summary: delete_button: Supprimer mark: @@ -1453,8 +1475,8 @@ fr: deleted: Message supprimé site: index: - js_1: Vous utilisez soit un navigateur qui ne supporte pas Javascript soit vous - avez désactivé Javascript. + js_1: JavaScript n’est pas pris en charge par le navigateur que vous utilisez, + ou bien vous l’avez désactivé. js_2: OpenStreetMap utilise Javascript pour ses cartes glissantes. permalink: Lien permanent shortlink: Lien court @@ -1462,10 +1484,11 @@ fr: license: copyright: Copyright OpenStreetMap et ses contributeurs, sous une licence ouverte - remote_failed: Échec de la modification - vérifiez que JOSM ou Merkaartor sont - ouverts et que le greffon de contrôle à distance RemoteControl est activé. + remote_failed: Échec de la modification – Vérifiez que l’éditeur externe JOSM + ou Merkaartor est ouvert et que l’option de contrôle à distance de l’application + est activée. edit: - not_public: Vous n'avez pas réglé vos modifications pour qu'elles soient publiques. + not_public: Vous n’avez pas réglé vos modifications pour qu’elles soient publiques. not_public_description: Vous ne pouvez plus modifier la carte à moins que vous ne rendiez vos modifications publiques. Vous pouvez rendre vos modifications publiques à partir de votre %{user_page}. @@ -1475,17 +1498,17 @@ fr: l’éditeur Flash de OpenStreetMap. Vous pouvez <a href='http://www.adobe.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash'>télécharger Flash Player sur le site d’Adobe</a>. <a href='http://wiki.openstreetmap.org/wiki/Editing'>D’autres options</a> sont également disponibles pour modifier OpenStreetMap. - potlatch_unsaved_changes: Vous avez des modifications non sauvegardées. (Pour - sauvegarder dans Potlatch, vous devez dé-sélectionner le way ou le node en - cours si vous modifiez en mode direct, ou cliquer sur sauvegarder si vous - avez un bouton sauvegarder.) - potlatch2_not_configured: Potlatch 2 n’a pas été configuré - veuillez consulter - http://wiki.openstreetmap.org/wiki/The_Rails_Port#Potlatch_2 pour plus d'informations - potlatch2_unsaved_changes: Vous avez des modifications non sauvegardées. (Pour - sauvegarder vos modifications dans Potlach2, cliquer sur save) + potlatch_unsaved_changes: Vous avez des modifications non enregistrées. (Pour + enregistrer dans Potlatch, désélectionnez la ligne ou le nœud actuel lors + d’une modification en direct, ou cliquez sur le bouton Enregistrer s’il est + affiché.) + potlatch2_not_configured: Potlatch 2 n’a pas été configuré – Veuillez consulter + http://wiki.openstreetmap.org/wiki/The_Rails_Port#Potlatch_2 pour plus d’informations. + potlatch2_unsaved_changes: Vous avez des modifications non enregistrées. (Pour + enregistrer vos modifications dans Potlach 2, cliquez sur le bouton Enregistrer) id_not_configured: iD n’a pas été configuré - no_iframe_support: Votre navigateur ne supporte pas les iframes HTML, qui sont - nécessaires pour cette fonctionnalité. + no_iframe_support: Votre navigateur ne prend pas en charge les ''iframes HTML'', + qui sont nécessaires pour cette fonctionnalité. sidebar: search_results: Résultats de la recherche close: Fermer @@ -1493,38 +1516,40 @@ fr: search: Recherche get_directions: Obtenir les directions get_directions_title: Trouvez des itinéraires entre deux points - from: Depuis + from: De to: À where_am_i: Où suis-je ? where_am_i_title: Décrit la position actuelle en utilisant le moteur de recherche - submit_text: Ok + submit_text: Aller key: table: entry: motorway: Autoroute + main_road: Route principale trunk: Voie express primary: Route principale secondary: Route secondaire unclassified: Route non classifiée - unsurfaced: Route non revêtue track: Piste - byway: Chemin - bridleway: Sentier pour chevaux + bridleway: Sentier équestre cycleway: Voie cyclable + cycleway_national: Piste cyclable nationale + cycleway_regional: Piste cyclable régionale + cycleway_local: Piste cyclable locale footway: Voie piétonne rail: Voie de chemin de fer subway: Ligne de métro tram: - Voie ferrée légère - - tram + - tramway cable: - Téléphérique - télésiège runway: - - Piste - - voie de circulation d'aéroport + - Piste d’aéroport + - piste de circulation d’un aéroport apron: - - Stationnement d'avions + - Stationnement d’avions - terminal admin: Limite administrative forest: Forêt @@ -1532,7 +1557,6 @@ fr: golf: Parcours de golf park: Parc resident: Zone résidentielle - tourist: Attraction touristique common: - Espace commun - prairie @@ -1544,7 +1568,7 @@ fr: - Lac - bassin de retenue farm: Zone agricole - brownfield: Zone rasée + brownfield: Zone de démolition cemetery: Cimetière allotments: Jardins familiaux pitch: Terrain de sport @@ -1559,12 +1583,14 @@ fr: summit: - Sommet - pic - tunnel: Bord en pointillés = tunnel + tunnel: Bordure pointillée = tunnel bridge: Bord noir = pont private: Accès privé - permissive: Accès toléré destination: Réservé aux riverains construction: Routes en construction + bicycle_shop: Magasin de vélos + bicycle_parking: Parking à vélos + toilets: Toilettes richtext_area: edit: Modifier preview: Aperçu @@ -1576,11 +1602,11 @@ fr: unordered: Liste non ordonnée ordered: Liste ordonnée first: Premier élément - second: Second élément + second: Deuxième élément link: Lien text: Texte image: Image - alt: Texte Alternatif + alt: Texte alternatif url: URL trace: visibility: @@ -1593,8 +1619,8 @@ fr: create: upload_trace: Envoyer la trace GPS trace_uploaded: Votre fichier GPX a été envoyé et est en attente de son intégration - dans la base de données. Ceci prend en général moins d'une demie heure, et - un email vous sera envoyé lorsque cette tâche sera finie. + dans la base de données. Ceci prend en général moins d’une demie heure et + un courriel vous sera envoyé lorsque cela sera terminé. edit: title: Modifier la trace %{name} heading: Modifier la trace %{name} @@ -1608,17 +1634,17 @@ fr: owner: 'Propriétaire :' description: 'Description :' tags: 'Mots-clés :' - tags_help: séparées par des virgules + tags_help: données séparées par des virgules save_button: Enregistrer les modifications visibility: 'Visibilité :' - visibility_help: que signifie ceci ? + visibility_help: qu’est-ce que cela veut dire ? trace_form: upload_gpx: 'Envoyer un fichier GPX :' description: 'Description :' tags: 'Mots-clés :' - tags_help: séparées par des virgules + tags_help: données séparées par des virgules visibility: 'Visibilité :' - visibility_help: qu'est-ce que cela veut dire ? + visibility_help: qu’est-ce que cela veut dire ? upload_button: Envoyer help: Aide trace_header: @@ -1627,11 +1653,11 @@ fr: see_your_traces: Voir toutes vos traces traces_waiting: one: Vous avez %{count} trace en attente de chargement. Il serait peut-être - préférable d’attendre qu’il soit terminé avant d’en charger d’autres, pour - ne pas bloquer la file d’attente aux autres utilisateurs. + préférable d’attendre qu’elle soit terminée avant d’en charger d’autres, + afin de ne pas bloquer la file d’attente pour les autres utilisateurs. other: Vous avez %{count} traces en attente de chargement. Il serait peut-être - préférable d’attendre qu’il soit terminé avant d’en charger d’autres, pour - ne pas bloquer la file d’attente aux autres utilisateurs. + préférable d’attendre qu’elles soient terminées avant d’en charger d’autres, + afin de ne pas bloquer la file d’attente pour les autres utilisateurs. trace_optionals: tags: Mots-clés view: @@ -1668,7 +1694,7 @@ fr: edit_map: Modifier la carte public: PUBLIQUE identifiable: IDENTIFIABLE - private: PRIVÉ + private: PRIVÉE trackable: PISTABLE by: par in: dans @@ -1678,24 +1704,25 @@ fr: your_traces: Vos traces GPS public_traces_from: Traces GPS publiques de %{user} description: Parcourir les récentes traces GPS téléchargées - tagged_with: ' balisé avec %{tags}' - empty_html: Rien à voir par ici. <a href='%{upload_link}'>Télécharger une nouvelle - trace</a> ou pour en savoir plus sur le traçage GPS, consultez la <a href='http://wiki.openstreetmap.org/wiki/Beginners_Guide_1.2'>page - wiki</a>. + tagged_with: balisée avec %{tags} + empty_html: Il n’y a encore rien ici. <a href='%{upload_link}'>Télécharger une + nouvelle trace</a> ou pour en savoir plus sur le traçage GPS, consultez la + <a href='http://wiki.openstreetmap.org/wiki/FR:Beginners_Guide_1.2'>page wiki</a>. delete: scheduled_for_deletion: Piste prévue pour la suppression make_public: made_public: Trace GPS rendue publique offline_warning: - message: Le système d'envoi GPX est actuellement indisponible + message: Le système d’envoi de fichiers GPX est actuellement indisponible offline: heading: Stockage GPX hors ligne - message: Le système de stockage et d'envoi des GPX est actuellement indisponible. + message: Le système de stockage et d’envoi des fichiers GPX est actuellement + indisponible. georss: title: Traces GPS de OpenStreetMap description: description_with_count: - one: Fichier GPX file avec %{count} point de %{user} + one: Fichier GPX avec %{count} point de %{user} other: Fichier GPX avec %{count} points de %{user} description_without_count: Fichier GPX de %{user} application: @@ -1705,26 +1732,27 @@ fr: require_moderator: not_a_moderator: Vous devez être modérateur pour effectuer cette action. setup_user_auth: - blocked: Votre accès à l'API a été bloqué. Connectez-vous sur l'interface web - pour plus d'informations. + blocked: Votre accès à l’API a été bloqué. Connectez-vous sur l’interface web + pour plus d’informations. need_to_see_terms: Votre accès à l’API est temporairement suspendu. Veuillez vous connecter à l’interface web pour afficher les conditions de contributions. - Vous n'avez pas besoin d’accord, mais vous devez les visualiser. + Vous n’avez pas besoin de les accepter, mais vous devez les visualiser. oauth: oauthorize: title: Autoriser l’accès à votre compte - request_access: L'application %{app_name} demande l'accès à votre compte, %{user}. - Vérifiez si vous désirez que l'application ait les possibilités suivantes. - Vous pouvez en choisir autant ou aussi peu que vous voulez. - allow_to: 'Autoriser l''application client à :' + request_access: L’application %{app_name} demande l’accès à votre compte, %{user}. + Veuillez vérifiez si vous désirez que l’application dispose des droits suivants. + Vous pouvez lui accorder autant ou aussi peu de droits que vous le souhaitez. + allow_to: 'Autoriser l’application client à :' allow_read_prefs: lire vos préférences utilisateur. allow_write_prefs: modifier vos préférences utilisateur. - allow_write_diary: créez des entrées dans le journal, des commentaires et faites-vous + allow_write_diary: créer des entrées dans le journal, des commentaires et ajouter des amis. allow_write_api: modifier la carte. allow_read_gpx: lire vos traces GPS privées. allow_write_gpx: envoyer des traces GPS. allow_write_notes: modifier les notes. + grant_access: Accorder l’accès oauthorize_success: title: La demande d’autorisation a été acceptée allowed: Vous avez accordé à l’application %{app_name} l’accès à votre compte. @@ -1744,46 +1772,47 @@ fr: submit: Modifier show: title: Détails OAuth pour %{app_name} - key: 'Clé de l''utilisateur :' - secret: 'Secret de l''utilisateur :' + key: 'Clé de l’utilisateur :' + secret: 'Secret de l’utilisateur :' url: 'URL du jeton de requête :' - access_url: 'URL du jeton d''accès :' - authorize_url: 'URL d''autorisation :' - support_notice: Nous supportons les signatures HMAC-SHA1 (recommandé) et RSA-SHA1. + access_url: 'URL du jeton d’accès :' + authorize_url: 'URL d’autorisation :' + support_notice: Nous prenons en charge les signatures HMAC-SHA1 (recommandé) + et RSA-SHA1. edit: Modifier les détails delete: Supprimer le client - confirm: Êtes-vous sûr? - requests: 'Demande des permission suivantes de l''utilisateur :' + confirm: Êtes-vous sûr ? + requests: 'Demande les permissions suivantes à l’utilisateur :' allow_read_prefs: consulter ses préférences utilisateur. allow_write_prefs: modifier ses préférences utilisateur. allow_write_diary: créez des entrées dans le journal, des commentaires et faites-vous des amis. allow_write_api: modifier la carte. - allow_read_gpx: lire leurs traces GPS privées. - allow_write_gpx: envoi trace GPS. + allow_read_gpx: lire ses traces GPS privées. + allow_write_gpx: téléverser des traces GPS. allow_write_notes: modifier les notes. index: title: Mes détails OAuth my_tokens: Mes applications enregistrées list_tokens: 'Les jetons suivants ont été émis aux applications en votre nom :' - application: Nom de l'application - issued_at: émis à + application: Nom de l’application + issued_at: émis le revoke: Révoquer ! my_apps: Mes applications clientes - no_apps: Avez-vous une application qui aimerait s'enregistrer pour utiliser + no_apps: Avez-vous une application qui aimerait s’enregistrer pour utiliser le standard %{oauth} ? Vous devez enregistrer votre application web avant - qu'elle ne puisse faire des requêtes OAuth sur ce service. + qu’elle ne puisse faire des requêtes OAuth sur ce service. registered_apps: 'Vous avez les applications clientes suivantes enregistrées :' register_new: Enregistrez votre application form: name: Nom required: Requis - url: URL principale de l'application + url: URL principale de l’application callback_url: URL de rappel - support_url: URL de support - requests: 'Demander les permissions suivantes à l''utilisateur :' + support_url: URL de soutien + requests: 'Demander les permissions suivantes à l’utilisateur :' allow_read_prefs: lire ses préférences utilisateur. allow_write_prefs: modifier ses préférences utilisateur. allow_write_diary: créez des entrées dans le journal, des commentaires et faites-vous @@ -1799,31 +1828,31 @@ fr: update: flash: Informations du client enregistrées avec succès destroy: - flash: Enregistrement de l'application cliente supprimé + flash: Enregistrement de l’application cliente supprimé user: login: title: Se connecter heading: Connexion - email or username: 'Adresse e-mail ou nom d''utilisateur :' + email or username: 'Adresse de courriel ou nom d’utilisateur :' password: 'Mot de passe :' openid: '%{logo} OpenID :' remember: Se souvenir de moi lost password link: Vous avez perdu votre mot de passe ? login_button: Se connecter - register now: S'inscrire maintenant + register now: S’inscrire maintenant with username: 'Vous avez déjà un compte sur OpenStreetMap ? Connectez-vous avec votre identifiant et votre mot de passe :' with external: 'À la place, utilisez un tiers pour vous connecter :' new to osm: Nouveau sur OpenStreetMap ? to make changes: Pour apporter des modifications aux données OpenStreetMap, vous devez posséder un compte. - create account minute: Se créer un compte. Ça ne prend qu'une minute. + create account minute: Créer un compte. Ça ne prend qu’une minute. no account: Vous n’avez pas encore de compte ? - account not active: Désolé, votre compte n'est pas encore actif.<br/>Veuillez + account not active: Désolé, votre compte n’est pas encore actif.<br/> Veuillez cliquer sur le lien dans le courrier électronique de confirmation, pour activer votre compte, ou <a href="%{reconfirm}">demandez un nouveau courrier de confirmation</a>. - account is suspended: Désolé, votre compte a été suspendu en raison d'une activité - suspecte.<br />Veuillez contacter le <a href="%{webmaster}">webmaster</a> + account is suspended: Désolé, votre compte a été suspendu en raison d’une activité + suspecte.<br /> Veuillez contacter le <a href="%{webmaster}">webmaster</a> si vous voulez en discuter. auth failure: Désolé, mais les informations fournies n’ont pas permis de vous identifier. @@ -1841,6 +1870,12 @@ fr: windowslive: title: Connexion avec Windows Live alt: Se connecter avec un compte Windows Live + github: + title: Connexion avec GitHub + alt: Connexion avec un Compte GitHub + wikipedia: + title: Se connecter avec Wikipédia + alt: Se connecter avec un compte de Wikipédia yahoo: title: Se connecter avec Yahoo alt: Se connecter avec l’OpenID de Yahoo @@ -1852,19 +1887,19 @@ fr: alt: Se connecter avec l’OpenID d’AOL logout: title: Déconnexion - heading: Déconnexion d'OpenStreetMap + heading: Déconnexion d’OpenStreetMap logout_button: Déconnexion lost_password: title: Mot de passe perdu heading: Vous avez perdu votre mot de passe ? - email address: 'Adresse e-mail :' + email address: 'Adresse de courriel :' new password button: Envoyer un nouveau mot de passe - help_text: Entrez l'adresse e-mail que vous avez utilisée à votre inscription, - nous enverrons à cette adresse un lien que vous pouvez utiliser pour réinitialiser + help_text: Entrez l’adresse de courriel que vous avez utilisée à votre inscription, + nous enverrons à cette adresse un lien que vous pourrez utiliser pour réinitialiser votre mot de passe. - notice email on way: Un e-mail vous a été envoyé pour réinitialiser votre mot - de passe. - notice email cannot find: Adresse email introuvable, désolé. + notice email on way: Désolé que vous ayez perdu votre mot de passe <code>:-(</code> + Un courriel vous a été envoyé pour que vous puissiez vite le réinitialiser. + notice email cannot find: Cette adresse de courriel est introuvable, désolé. reset_password: title: Réinitialiser le mot de passe heading: Réinitialiser le mot de passe de %{user} @@ -1872,13 +1907,13 @@ fr: confirm password: 'Confirmez le mot de passe :' reset: Réinitialiser le mot de passe flash changed: Votre mot de passe a été modifié. - flash token bad: Vous n'avez pas trouvé ce jeton, avez-vous vérifié l'URL ? + flash token bad: Ce jeton est introuvable, veuillez vérifier l’URL. new: title: S’inscrire - no_auto_account_create: Malheureusement, nous sommes actuellement dans l'impossibilité + no_auto_account_create: Malheureusement, nous sommes actuellement dans l’impossibilité de vous créer un compte automatiquement. - contact_webmaster: Veuillez contacter le <a href='mailto:webmaster@openstreetmap.org'>webmaster</a> - pour qu'il vous crée un compte - nous essaierons de traiter votre demande + contact_webmaster: Veuillez contacter le <a href="%{webmaster}">webmaster</a> + pour qu’il vous crée un compte – nous essaierons de traiter votre demande le plus rapidement possible. about: header: Libre et modifiable @@ -1887,13 +1922,14 @@ fr: <p>Inscrivez-vous pour commencer à participer. Nous vous enverrons un courriel pour confirmer votre compte.</p> license_agreement: En confirmant votre compte, vous devrez accepter les <a href="http://www.osmfoundation.org/wiki/License/Contributor_Terms">termes du contributeur</a>. - email address: 'Adresse e-mail :' - confirm email address: 'Confirmer l''adresse e-mail :' - not displayed publicly: Non affichée publiquement (voir <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" - title="wiki privacy policy including section on email addresses">notre charte - sur la confidentialité</a>) + email address: 'Adresse de courriel :' + confirm email address: 'Confirmez l’adresse de courriel :' + not displayed publicly: Votre adresse n'est pas affichée publiquement, voir + notre <a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy" title="OSMF + privacy policy including section on email addresses">charte sur la confidentialité</a> + pour plus d'information display name: 'Nom affiché :' - display name description: Votre nom d'utilisateur affiché publiquement. Vous + display name description: Votre nom d’utilisateur affiché publiquement. Vous pouvez changer ceci ultérieurement dans les préférences. external auth: 'Authentification tierce :' password: 'Mot de passe :' @@ -1902,16 +1938,6 @@ fr: auth no password: Avec l’authentification par tiers, un mot de passe n’est pas nécessaire, mais des outils supplémentaires ou un serveur peuvent toujours en nécessiter un. - auth association: |- - <p>Votre ID n’est pas encore associé avec un compte de OpenStreetMap.</p> - <ul> - <li>Si vous êtes nouveau sur OpenStreetMap, veuillez créer un nouveau compte avec le formulaire ci-dessous.</li> - <li> - Si vous avez déjà un compte, vous pouvez vous y connecter - en utilisant votre nom d’utilisateur et votre mot de passe, puis associer le compte - à votre ID dans vos préférences utilisateur. - </li> - </ul> continue: S’inscrire terms accepted: Merci d’avoir accepté les nouveaux termes du contributeur ! terms declined: Nous sommes désolés que vous ayez décidé de ne pas accepter @@ -1921,14 +1947,14 @@ fr: title: Termes du contributeur heading: Termes du contributeur read and accept: Veuillez lire le contrat ci-dessous et cliquer sur le bouton - d’acceptation pour confirmer que vous acceptez les termes du contrat pour + d’acceptation pour confirmer que vous acceptez les termes de l’accord concernant vos contributions passées et futures. consider_pd: En plus de l’accord ci-dessus, je considère mes contributions comme étant dans le domaine public consider_pd_why: qu’est-ce que ceci ? guidance: 'Pour plus d''information sur ces termes : un <a href="%{summary}">résumé lisible</a> et quelques <a href="%{translations}">traductions informelles</a>' - agree: J'accepte + agree: J’accepte decline: Décliner you need to accept or decline: Veuillez lire et ensuite soit accepter ou refuser les nouvelles conditions de contributeur pour continuer. @@ -1940,8 +1966,9 @@ fr: no_such_user: title: Utilisateur inexistant heading: L'utilisateur %{user} n'existe pas - body: Désolé, il n'y a pas d'utilisateur avec le nom %{user}. Veuillez vérifier - l'orthographe, ou le lien que vous avez cliqué n'est pas valide. + body: Désolé, il n’y a pas d’utilisateur avec le nom %{user}. Veuillez vérifier + l’orthographe, ou le lien que vous avez cliqué n’est pas valide. + deleted: supprimé view: my diary: Mon journal new diary entry: nouvelle entrée dans le journal @@ -1962,7 +1989,7 @@ fr: notes: Notes de carte remove as friend: Supprimer en tant qu’ami add as friend: Ajouter en tant qu’ami - mapper since: 'Mappeur depuis:' + mapper since: 'Cartographe depuis :' ago: (il y a %{time_in_words_ago}) ct status: 'Conditions du contributeur:' ct undecided: Indécis @@ -1971,39 +1998,39 @@ fr: latest edit: 'Dernière modification %{ago} :' email address: 'Adresse de courriel :' created from: 'Créé depuis :' - status: 'Statut :' - spam score: 'Note pour le spam :' + status: 'État :' + spam score: 'Indice de pollution :' description: Description - user location: Emplacement de l'utilisateur + user location: Emplacement de l’utilisateur if set location: Positionner votre lieu d’habitation sur la page %{settings_link} pour voir les utilisateurs à proximité. settings_link_text: options your friends: Vos amis - no friends: Vous n'avez pas encore ajouté d'ami + no friends: Vous n’avez pas encore ajouté d’ami km away: '%{count} km' m away: distant de %{count} m nearby users: Autres utilisateurs à proximité - no nearby users: Aucun utilisateur n'a encore signalé qu'il cartographiait à + no nearby users: Aucun utilisateur n’a encore signalé qu’il cartographiait à proximité. role: - administrator: Cet utilisateur est un adminstrateur + administrator: Cet utilisateur est un administrateur moderator: Cet utilisateur est un modérateur grant: - administrator: Octroyer l'accès administrateur - moderator: Octroyer l'accès modérateur + administrator: Octroyer l’accès administrateur + moderator: Octroyer l’accès modérateur revoke: - administrator: Révoquer l'accès administrateur - moderator: Révoquer l'accès modérateur - block_history: blocages reçus - moderator_history: blocages fournis + administrator: Révoquer l’accès administrateur + moderator: Révoquer l’accès modérateur + block_history: Blocages actifs + moderator_history: Blocages donnés comments: Commentaires - create_block: bloquer cet utilisateur - activate_user: activer cet utilisateur - deactivate_user: désactiver cet utilisateur - confirm_user: confirmer cet utilisateur - hide_user: masquer cet utilisateur - unhide_user: ré-afficher cet utilisateur - delete_user: supprimer cet utilisateur + create_block: Bloquer cet utilisateur + activate_user: Activer cet utilisateur + deactivate_user: Désactiver cet utilisateur + confirm_user: Confirmer cet utilisateur + hide_user: Masquer cet utilisateur + unhide_user: Réafficher cet utilisateur + delete_user: Supprimer cet utilisateur confirm: Confirmer friends_changesets: Groupes de modifications des amis friends_diaries: Entrées de journal des amis @@ -2011,7 +2038,7 @@ fr: nearby_diaries: Entrées de journal des utilisateurs à proximité popup: your location: Votre emplacement - nearby mapper: Mappeur dans les environs + nearby mapper: Cartographe à proximité friend: Ami account: title: Modifier le compte @@ -2025,25 +2052,24 @@ fr: link text: qu’est-ce que ceci ? public editing: heading: 'Modification publique :' - enabled: Activé. Non anonyme et peut modifier les données. + enabled: Activée. Non anonyme et peut modifier les données. enabled link: http://wiki.openstreetmap.org/wiki/Disabling_anonymous_edits enabled link text: qu’est-ce que ceci ? - disabled: Désactivé et ne peut pas modifier les données ; toutes les précédentes + disabled: Désactivée et ne peut pas modifier les données ; toutes les précédentes modifications sont anonymes. disabled link text: pourquoi ne puis-je pas modifier ? public editing note: heading: Modification publique - text: 'Votre compte est actuellement en mode "modifications anonymes" : il - n''existe pas de lien entre vos modifications et votre compte utilisateur + text: Votre compte est actuellement en mode de « modifications anonymes » et les autres contributeurs ne peuvent pas vous envoyer de message ni connaître - votre localisation géographique. Pour qu''il soit possible de lister vos + votre localisation géographique. Pour qu’il soit possible de lister vos contributions et permettre aux autres personnes de vous contacter via ce - site, cliquez sur le bouton ci-dessous. <b>Depuis le basculement de l''API - en version 0.6, seuls les utilisateurs en mode "modifications publiques" - peuvent modifier les cartes</b> (<a href="http://wiki.openstreetmap.org/wiki/Anonymous_edits">en + site, cliquez sur le bouton ci-dessous. <b>Depuis le basculement de l’API + en version 0.6, seuls les utilisateurs en mode de « modifications publiques + » peuvent modifier les données des cartes</b> (<a href="http://wiki.openstreetmap.org/wiki/Anonymous_edits">en savoir plus</a>).<ul><li>Votre adresse de courriel ne sera pas rendue publique.</li><li>Cette opération ne peut pas être annulée et tous les nouveaux utilisateurs sont - en mode "modifications publiques" par défaut.</li></ul>' + maintenant en mode de « modifications publiques » par défaut.</li></ul> contributor terms: heading: 'Termes du contributeur :' agreed: Vous avez accepté les nouveaux termes du contributeur. @@ -2060,26 +2086,28 @@ fr: gravatar: gravatar: Utiliser Gravatar link: http://wiki.openstreetmap.org/wiki/Gravatar - link text: qu'est-ce que c'est ? + link text: qu’est-ce que ceci ? + disabled: Gravatar a été désactivé. + enabled: L'affichage de votre Gravatar a été activé. new image: Ajouter une image - keep image: Garder l'image actuelle - delete image: Supprimer l'image actuelle - replace image: Remplacer l'image actuelle - image size hint: (les images carrées d'au moins 100×100 pixels fonctionnent + keep image: Garder l’image actuelle + delete image: Supprimer l’image actuelle + replace image: Remplacer l’image actuelle + image size hint: (les images carrées d’au moins 100×100 pixels fonctionnent le mieux) home location: 'Emplacement du domicile :' - no home location: Vous n'avez pas indiqué l'emplacement de votre domicile. + no home location: Vous n’avez pas indiqué l’emplacement de votre domicile. latitude: 'Latitude :' longitude: 'Longitude :' - update home location on click: Mettre a jour l'emplacement de votre domicile + update home location on click: Mettre a jour l’emplacement de votre domicile quand vous cliquez sur la carte ? save changes button: Enregistrer les modifications make edits public button: Rendre toutes mes modifications publiques - return to profile: Retourner au profil - flash update success confirm needed: Informations sur l'utilisateur mises à - jour avec succès. Vérifiez votre boîte mail afin de valider la vérification - de votre nouvelle adresse e-mail. - flash update success: Informations sur l'utilisateur mises à jour avec succès. + return to profile: Retour au profil + flash update success confirm needed: Informations sur l’utilisateur mises à + jour avec succès. Consultez la boîte de réception de votre messagerie pour + confirmer votre nouvelle adresse courriel. + flash update success: Informations sur l’utilisateur mises à jour avec succès. confirm: heading: Vérifiez votre courriel ! introduction_1: Nous vous avons envoyé un courriel de confirmation. @@ -2094,56 +2122,56 @@ fr: reconfirm_html: Si vous avez besoin que nous vous renvoyions un courriel de confirmation, <a href="%{reconfirm}">cliquez ici</a>. confirm_resend: - success: Nous avons envoyé une note de confirmation à %{email}. Dès que vous + success: Nous avons envoyé une nouvelle confirmation à %{email} et dès que vous aurez confirmé votre compte, vous pourrez commencer à cartographier.<br /><br - />Si vous utilisez un logiciel anti-spam qui envoie des requêtes de confirmation, - veuillez mettre webmaster@openstreetmap.org dans votre liste blanche, car - nous sommes incapables de répondre à ces messages. + /> Si vous utilisez un filtre contre les courriels indésirables qui renvoie + à l’expéditeur des demandes de confirmation, veuillez ajouter %{sender} à + votre liste blanche, car nous ne sommes pas en mesure de répondre à aucune + des demandes de confirmation. failure: L’utilisateur %{name} est introuvable. confirm_email: - heading: Confirmer le changement de votre adresse e-mail - press confirm button: Appuyer sur le bouton confirmer pour confirmer votre nouvelle - adresse e-mail. + heading: Confirmer le changement de votre adresse de courriel + press confirm button: Appuyez sur le bouton Confirmer ci-dessous pour confirmer + votre nouvelle adresse de courriel. button: Confirmer success: Modification de votre adresse de courriel confirmée ! - failure: Une adresse email a déjà été confirmée avec ce jeton d'authentification. + failure: Une adresse de courriel a déjà été confirmée avec ce jeton d’authentification. unknown_token: Ce code de confirmation a expiré ou n’existe pas. set_home: - flash success: Emplacement de mon domicile sauvegardé avec succès + flash success: Emplacement du domicile enregistré avec succès go_public: - flash success: Toutes vos modifications sont dorénavant publiques, et vous êtes - autorisé a modifier. + flash success: Toutes vos modifications sont dorénavant publiques et vous êtes + autorisé à modifier. make_friend: - heading: Ajouter %{user} en tant qu'ami? - button: Ajouter en tant qu'ami - success: '%{name} est désormais votre ami!' - failed: Désolé, échec lors de l'ajout de %{name} comme votre ami + heading: Ajouter %{user} en tant qu’ami ? + button: Ajouter en tant qu’ami + success: '%{name} est désormais votre ami !' + failed: Désolé, échec lors de l’ajout de %{name} en tant qu’ami already_a_friend: Vous êtes déjà ami avec %{name}. remove_friend: - heading: Supprimer %{user} en tant qu’ami? + heading: Supprimer %{user} en tant qu’ami ? button: Supprimer en tant qu’ami success: '%{name} a été retiré de vos amis.' - not_a_friend: '%{name} n''est pas parmi vos amis.' + not_a_friend: '%{name} n’est pas parmi vos amis.' filter: not_an_administrator: Vous devez être administrateur pour effectuer cette action. list: title: Utilisateurs heading: Utilisateurs showing: - one: Page %{page} (%{first_item} sur %{items}) - other: Page %{page} (%{first_item}-%{last_item} sur %{items}) + other: Page %{page} (%{first_item}one= sur %{items}) summary: '%{name} créé depuis %{ip_address} le %{date}' summary_no_ip: '%{name} créé le %{date}' confirm: Confirmer les utilisateurs sélectionnés hide: Masquer les utilisateurs sélectionnés - empty: Aucun utilisateur correspondant n'a été trouvé + empty: Aucun utilisateur correspondant n’a été trouvé suspended: title: Compte suspendu heading: Compte suspendu - webmaster: webmaster + webmaster: webmestre body: |- <p> - Désolé, votre compte a été suspendu en raison d'une activité suspecte. + Désolé, votre compte a été suspendu en raison d’une activité suspecte. </p> <p> Cette décision sera vérifiée prochainement par un administrateur. Vous @@ -2152,102 +2180,109 @@ fr: auth_failure: connection_failed: Échec de la connexion au fournisseur d’authentification invalid_credentials: Informations d’authentification non valides - no_authorization_code: Pas de code d'autorisation + no_authorization_code: Pas de code d’autorisation unknown_signature_algorithm: Algorithme de signature inconnu - invalid_scope: Étendue invalide + invalid_scope: Étendue non valide + auth_association: + heading: Votre ID n’est pas encore associé à un compte OpenStreetMap. + option_1: Si vous êtes nouveau sur OpenStreetMap, veuillez créer un nouveau + compte à l’aide du formulaire ci-dessous. + option_2: Si vous avez déjà un compte, vous pouvez vous connecter avec en utilisant + votre nom d’utilisateur et votre mot de passe, puis associer le compte avec + votre ID dans vos préférences utilisateur. user_role: filter: not_an_administrator: Seuls les administrateurs peuvent gérer les rôles mais - vous n'êtes pas administrateur. - not_a_role: La chaîne « %{role} » n'est un rôle valide. - already_has_role: L'utilisateur possède déjà le rôle %{role}. - doesnt_have_role: L'utilisateur n'a pas le rôle %{role}. + vous n’êtes pas administrateur. + not_a_role: La chaîne « %{role} » n’est pas un rôle valide. + already_has_role: L’utilisateur possède déjà le rôle « %{role} ». + doesnt_have_role: L’utilisateur n’a pas le rôle « %{role} ». grant: - title: Confirmer l'octroi du rôle - heading: Confirmer l'octroi du rôle - are_you_sure: Êtes vous sûr de vouloir attribuer le rôle `%{role}' à l'utilisateur - `%{name}'? + title: Confirmer l’octroi du rôle + heading: Confirmer l’octroi du rôle + are_you_sure: Êtes-vous sûr de vouloir octroyer le rôle « %{role} » à l’utilisateur + « %{name} » ? confirm: Confirmer - fail: Impossible d'octroyer le rôle « %{role} » à l'utilisateur « %{name} ». - Vérifiez que l'utilisateur et le rôle sont valides. + fail: Impossible d’octroyer le rôle « %{role} » à l’utilisateur « %{name} ». + Vérifiez que l’utilisateur et le rôle sont valides. revoke: title: Confirmer la révocation du rôle heading: Confirmer la révocation du rôle - are_you_sure: Êtes vous sûr de vouloir supprimer le rôle `%{role}' de l'utilisateur - `%{name}' ? + are_you_sure: Êtes-vous sûr de vouloir révoquer le rôle « %{role} » de l’utilisateur + « %{name} » ? confirm: Confirmer - fail: Impossible de révoquer le rôle « %{role} » de l'utilisateur « %{name} - ». Vérifiez que l'utilisateur et le rôle sont valides. + fail: Impossible de révoquer le rôle « %{role} » de l’utilisateur « %{name} + ». Vérifiez que l’utilisateur et le rôle sont valides. user_block: model: non_moderator_update: Vous devez être modérateur pour créer ou modifier un blocage. non_moderator_revoke: Vous devez être modérateur pour révoquer un blocage. not_found: - sorry: Désolé, le blocage utilisateur numéro %{id} n'a pas été trouvé. - back: Retour à l'index + sorry: Désolé, le blocage d’utilisateur numéro %{id} n’a pas été trouvé. + back: Retour à l’index new: - title: Créé un blocage sur %{name} - heading: Créé un blocage sur %{name} - reason: Raison pour laquelle %{name} est bloqué. Merci d'être aussi calme et - raisonnable que possible, et de donner autant de détails que possible sur - la situation. N'oubliez pas que ce message sera visible par tous. Sachez que - tout le monde ne comprend pas le jargon de la communauté, alors utilisez des - termes simples et précis. - period: Pendant combien de temps, à partir de maintenant, l'utilisateur doit - être bloqué sur l'API ? + title: Création d’un blocage sur « %{name} » + heading: Création d’un blocage sur « %{name} » + reason: Raison pour laquelle « %{name} » est bloqué. Merci de rester aussi calme + et raisonnable que possible et de donner autant de détails que possible sur + la situation, en vous rappelant que ce message sera visible par tous. Sachez + que tout le monde ne comprend pas le jargon de la communauté, alors utilisez + des termes simples et précis. + period: Pendant combien de temps, à partir de maintenant, l’utilisateur doit + être bloqué sur l’API ? submit: Créer un blocage - tried_contacting: J'ai contacté l'utilisateur et lui ai demandé d'arrêter. - tried_waiting: J'ai donné un temps suffisant à l'utilisateur pour répondre au - messages. - needs_view: L'utilisateur doit se connecter avant que ce blocage soit effacé + tried_contacting: J’ai contacté l'utilisateur et lui ai demandé d’arrêter. + tried_waiting: J’ai donné un temps raisonnable à l’utilisateur pour répondre + à ces messages. + needs_view: L’utilisateur doit se connecter avant que ce blocage soit effacé back: Voir tous les blocages edit: - title: Modifie un blocage sur %{name} - heading: Modifie un blocage sur %{name} - reason: Raison pour laquelle %{name} est bloqué. Merci d'être aussi calme et - raisonnable que possible, et de donner autant de détails que possible sur + title: Modification d’un blocage sur « %{name} » + heading: Modification d’un blocage sur « %{name} » + reason: Raison pour laquelle « %{name} » est bloqué. Merci de rester aussi calme + et raisonnable que possible et de donner autant de détails que possible sur la situation. Sachez que tout le monde ne comprend pas le jargon de la communauté, alors utilisez des termes simples et précis. - period: Combien de temps, à partir de maintenant, l'utilisateur doit être bloqué - sur l'API ? + period: Combien de temps, à partir de maintenant, l’utilisateur doit être bloqué + sur l’API ? submit: Modifier le blocage show: Afficher ce blocage back: Voir tous les blocages - needs_view: Est-ce que l'utilisateur doit se connecter avant que le blocage - n'expire ? + needs_view: Est-ce que l’utilisateur doit se connecter avant que ce blocage + n’expire ? filter: block_expired: Le blocage a déjà expiré et ne peut pas être modifié. block_period: La période de blocage doit être choisie dans la liste déroulante. create: - try_contacting: Merci de contacter l'utilisateur avant de le bloquer et de lui + try_contacting: Merci de contacter l’utilisateur avant de le bloquer et de lui donner un temps raisonnable pour répondre. - try_waiting: Merci de donner un temps suffisant à l'utilisateur avant de le + try_waiting: Merci de donner un temps raisonnable à l’utilisateur avant de le bloquer. - flash: Blocage créé sur l'utilisateur %{name}. + flash: Blocage créé sur l’utilisateur « %{name} ». update: only_creator_can_edit: Seul le modérateur qui a créé le blocage peut le modifier. success: Blocage mis à jour. index: title: Blocages utilisateur heading: Liste des blocages - empty: Aucun blocage n'a encore été effectué. + empty: Aucun blocage n’a encore été effectué. revoke: - title: Révoque un blocage sur %{block_on} - heading: Révoque un blocage sur %{block_on} par %{block_by} + title: Révocation d’un blocage sur « %{block_on} » + heading: Révocation d’un blocage sur « %{block_on} » par « %{block_by} » time_future: Ce blocage se terminera dans %{time}. - past: Ce blocage s'est terminé il y a %{time} et ne peut être révoqué maintenant. + past: Ce blocage s’est terminé il y a %{time} et ne peut plus être révoqué. confirm: Êtes-vous sûr de vouloir révoquer ce blocage ? revoke: Révoquer ! flash: Ce blocage a été révoqué. period: - one: 1 heure + one: '%{count} heure' other: '%{count} heures' partial: show: Afficher edit: Modifier revoke: Révoquer ! confirm: Êtes-vous sûr ? - display_name: Utilisateur Bloqué + display_name: Utilisateur bloqué creator_name: Créateur reason: Motif du blocage status: État @@ -2257,25 +2292,25 @@ fr: next: Suivant » previous: « Précédent helper: - time_future: Termine à %{time}. - until_login: Actif jusqu'à ce que l'utilisateur se connecte. + time_future: Prends fin dans %{time}. + until_login: Actif jusqu’à ce que l’utilisateur se connecte. time_past: Terminé il y a %{time}. blocks_on: - title: Blocages de %{name} - heading: Liste des blocages sur %{name} - empty: '%{name} n''a pas encore été bloqué.' + title: Blocages de « %{name} » + heading: Liste des blocages sur « %{name} » + empty: « %{name} » n’a pas encore été bloqué. blocks_by: - title: Blocages par %{name} - heading: Liste des blocages par %{name} - empty: '%{name} n''a pas encore effectué de blocages.' + title: Blocages effectués par « %{name} » + heading: Liste des blocages effectués par « %{name} » + empty: « %{name} » n’a pas encore effectué de blocages. show: - title: '%{block_on} bloqué par %{block_by}' - heading: '%{block_on} bloqué par %{block_by}' - time_future: Se termine dans %{time} - time_past: S'est terminé il y a %{time} + title: « %{block_on} » bloqué par « %{block_by} » + heading: « %{block_on} » bloqué par « %{block_by} » + time_future: Prendra fin dans %{time} + time_past: A pris fin il y a %{time} created: Créé ago: il y a %{time} - status: Statut + status: État show: Afficher edit: Modifier revoke: Révoquer ! @@ -2283,22 +2318,22 @@ fr: reason: 'Raison du blocage :' back: Afficher tous les blocages revoker: 'Révocateur :' - needs_view: L'utilisateur doit se connecter avant que ce blocage soit supprimé. + needs_view: L’utilisateur doit se connecter avant que ce blocage soit supprimé. note: description: opened_at_html: Créé il y a %{when} - opened_at_by_html: Créé il y a %{when} par %{user} + opened_at_by_html: Créé il y a %{when} par « %{user} » commented_at_html: Mis à jour il y a %{when} - commented_at_by_html: Mise à jour il y a %{when} par %{user} + commented_at_by_html: Mis à jour il y a %{when} par « %{user} » closed_at_html: Résolu il y a %{when} - closed_at_by_html: Résolu il y a %{when} par %{user} + closed_at_by_html: Résolu il y a %{when} par « %{user} » reopened_at_html: Réactivé il y a %{when} - reopened_at_by_html: Réactivé il y a %{when} par %{user} + reopened_at_by_html: Réactivé il y a %{when} par « %{user} » rss: title: Notes OpenStreetMap - description_area: Une liste de notes, reportées, commentées ou fermées dans - votre zone [(%{min_lat}|%{min_lon}) -- (%{max_lat}|%{max_lon})] - description_item: Un fil rss pour la note %{id} + description_area: Une liste de notes, signalées, commentées ou fermées dans + votre zone [(%{min_lat}, %{min_lon}) – (%{max_lat}, %{max_lon})] + description_item: Un fil RSS pour la note %{id} opened: nouvelle note (près de %{place}) commented: nouveau commentaire (près de %{place}) closed: note fermée (près de %{place}) @@ -2307,13 +2342,13 @@ fr: comment: Commentaire full: Note complète mine: - title: Notes soumises ou commentées par %{user} - heading: Notes de %{user} - subheading: Notes soumises ou commentées par %{user} + title: Notes soumises ou commentées par « %{user} » + heading: Notes de « %{user} » + subheading: Notes soumises ou commentées par « %{user} » id: Identifiant creator: Créateur description: Description - created_at: Créé le + created_at: Créée le last_changed: Dernière modification ago_html: il y a %{when} javascripts: @@ -2337,10 +2372,13 @@ fr: center_marker: Centrer la carte sur le marqueur paste_html: Coller le HTML à inclure dans le site web view_larger_map: Afficher une carte plus grande + only_standard_layer: Seule la couche standard peut être exportée comme une image + embed: + report_problem: Signaler un problème key: title: Légende tooltip: Légende - tooltip_disabled: La légende n’est disponible que pour la couche standard + tooltip_disabled: La légende n’est pas disponible pour cette couche map: zoom: in: Vue rapprochée @@ -2352,12 +2390,12 @@ fr: standard: Standard cycle_map: Carte cyclable transport_map: Carte de transport - mapquest: MapQuest ouverte hot: Humanitaire layers: header: Couches de carte notes: Notes de carte data: Données de carte + gps: Traces GPS publiques overlays: Autoriser les superpositions pour réparer la carte title: Couches copyright: © <a href='%{copyright_url}'>Contributeurs de OpenStreetMap</a> @@ -2374,17 +2412,17 @@ fr: changesets: show: comment: Commentaire - subscribe: S’inscrire + subscribe: S’abonner unsubscribe: Se désabonner hide_comment: masquer unhide_comment: démasquer notes: new: - intro: Vous avez repéré une erreur ou un manque ? Faites le savoir à d’autres - cartographes afin que nous puissions y remédier. Déplacez le marqueur à - la position exacte et écrivez une note pour expliquer le problème (Veuillez + intro: Vous avez repéré une erreur ou un manque ? Faites-le savoir aux autres + cartographes afin qu’ils puissent y remédier. Déplacez le marqueur à la + position exacte et écrivez une note pour expliquer le problème (Veuillez ne pas entrer ici d’informations personnelles ou provenant de cartes avec - droit d’auteur ou des listes de répertoire). + droit d’auteur ou des listes d’annuaires). add: Ajouter une note show: anonymous_warning: Cette note comprend des commentaires d’utilisateurs anonymes, @@ -2394,48 +2432,66 @@ fr: reactivate: Réactiver comment_and_resolve: Commenter et résoudre comment: Commentaire - edit_help: Déplacez la carte et zoomer sur un emplacement que vous voulez modifier, - puis cliquez là. + edit_help: Déplacez la carte et zoomez sur un emplacement que vous voulez modifier, + puis cliquez dessus. directions: engines: - graphhopper_bicycle: Vélo (GraphHopper) - graphhopper_foot: Pied (GraphHopper) - mapquest_bicycle: Vélo (MapQuest) - mapquest_car: Voiture (MapQuest) - mapquest_foot: Pied (MapQuest) - osrm_car: Voiture (OSRM) + graphhopper_bicycle: À vélo (<i>GraphHopper</i>) + graphhopper_foot: À pied (<i>GraphHopper</i>) + mapquest_bicycle: À vélo (<i>MapQuest</i>) + mapquest_car: En voiture (<i>MapQuest</i>) + mapquest_foot: À pied (<i>MapQuest</i>) + osrm_car: En voiture (<i>OSRM</i>) + mapzen_bicycle: À vélo (<i>Mapzen</i>) + mapzen_car: En voiture (<i>Mapzen</i>) + mapzen_foot: À pied (<i>Mapzen</i>) directions: Itinéraire distance: Distance errors: no_route: Impossible de trouver une route entre ces deux lieux. no_place: Désolé, impossible de trouver ce lieu. instructions: - continue_without_exit: Continuer sur %{name} - slight_right_without_exit: Tourner légèrement à droite sur %{name} - turn_right_without_exit: Tourner à droite sur %{name} + continue_without_exit: Continuez sur %{name} + slight_right_without_exit: Tournez légèrement à droite sur %{name} + offramp_right_without_exit: Prendre la bretelle à droite sur %{name} + onramp_right_without_exit: Tourner à droite sur la bretelle sur %{name} + endofroad_right_without_exit: À la fin de la route, tourner à droite sur %{name} + merge_right_without_exit: Rejoindre à droite sur %{name} + fork_right_without_exit: À la bifurcation, tourner à droite sur %{name} + turn_right_without_exit: Tournez à droite sur %{name} sharp_right_without_exit: Tournez vivement à droite sur %{name} uturn_without_exit: Faites demi-tour sur %{name} sharp_left_without_exit: Tournez vivement à gauche sur %{name} - turn_left_without_exit: Tourner à gauche sur %{name} - slight_left_without_exit: Tourner légèrement à gauche sur %{name} + turn_left_without_exit: Tournez à gauche sur %{name} + offramp_left_without_exit: Prendre la bretelle de gauche jusque %{name} + onramp_left_without_exit: Tourner à gauche sur la bretelle sur %{name} + endofroad_left_without_exit: À la fin de la route, tourner à gauche sur %{name} + merge_left_without_exit: Rejoindre à gauche sur %{name} + fork_left_without_exit: À la bifurcation, tourner à gauche sur %{name} + slight_left_without_exit: Tournez légèrement à gauche sur %{name} via_point_without_exit: (par le point) - follow_without_exit: Suivre %{name} - roundabout_without_exit: Au rond-point, prendre %{name} - leave_roundabout_without_exit: Quitter le rond-point - %{name} - stay_roundabout_without_exit: Rester sur le rond-point - %{name} - start_without_exit: Démarrer à la fin de %{name} + follow_without_exit: Suivez %{name} + roundabout_without_exit: Au rond-point, prenez %{name} + leave_roundabout_without_exit: Quittez le rond-point – %{name} + stay_roundabout_without_exit: Restez sur le rond-point – %{name} + start_without_exit: Démarrez à l’extrémité de %{name} destination_without_exit: Atteignez la destination - against_oneway_without_exit: Remonter le sens unique sur %{name} - end_oneway_without_exit: Fin du passage à sens unique sur %{name} + against_oneway_without_exit: Remontez à contre-sens sur %{name} + end_oneway_without_exit: Fin du sens unique sur %{name} roundabout_with_exit: Au rond-point prendre la sortie %{exit} sur %{name} - unnamed: sans nom - courtesy: Itinéraire de la part de %{link} + turn_left_with_exit: Au rond-point, tourner à gauche sur %{name} + slight_left_with_exit: Au rond-point, tourner légèrement à gauche sur %{name} + turn_right_with_exit: Au rond-point, tourner à droite sur %{name} + slight_right_with_exit: Au rond-point, tourner légèrement à droite sur %{name} + continue_with_exit: Au rond-point, continuer tout droit sur %{name} + unnamed: voie sans nom + courtesy: Itinéraire fourni par %{link} time: Temps query: node: Nœud way: Chemin relation: Relation - nothing_found: Pas d'objets trouvés + nothing_found: Aucun objet trouvé error: 'Erreur en contactant %{server} : %{error}' timeout: Délai dépassé en contactant %{server} redaction: @@ -2452,10 +2508,10 @@ fr: description: Description heading: Saisissez les informations sur le nouveau masquage submit: Créer le masquage - title: Créer unn nouveau masquage + title: Création d’un nouveau masquage show: description: 'Description :' - heading: Démasquage "%{title}" + heading: Affichage du masquage « %{title} » title: Affichage du masquage user: 'Créateur :' edit: Modifier ce masquage @@ -2466,8 +2522,8 @@ fr: update: flash: Modifications enregistrées. destroy: - not_empty: Ce masquage n'est pas vide. Veuillez dé-masquer toutes les versions + not_empty: Ce masquage n’est pas vide. Veuillez démasquer toutes les versions appartenant à ce masquage avant de le supprimer. flash: Masquage supprimé. - error: Il y a eu une erreur en supprimant ce masquage. + error: Une erreur est survenue lors de la suppression de ce masquage. ... diff --git a/config/locales/fur.yml b/config/locales/fur.yml index 93f1369fe..ba6225930 100644 --- a/config/locales/fur.yml +++ b/config/locales/fur.yml @@ -3,6 +3,7 @@ # Export driver: phpyaml # Author: Davio # Author: Klenje +# Author: Macofe # Author: Tocaibon --- fur: @@ -883,7 +884,6 @@ fur: motorway: Autostrade primary: Strade primarie secondary: Strade secondarie - unsurfaced: Strade blancje rail: Ferade subway: Metropolitane tram: @@ -898,7 +898,6 @@ fur: golf: Troi di golf park: Parc resident: Aree residenziâl - tourist: Atrazion turistiche common: - Comugnâi - prâts @@ -1204,7 +1203,7 @@ fur: create_block: bloche chest utent activate_user: ative chest utent deactivate_user: disative chest utent - confirm_user: conferme chest utent + confirm_user: Conferme chest utent hide_user: plate chest utent unhide_user: mostre chest utent delete_user: elimine chest utent diff --git a/config/locales/ga.yml b/config/locales/ga.yml new file mode 100644 index 000000000..f32a5cb06 --- /dev/null +++ b/config/locales/ga.yml @@ -0,0 +1,2074 @@ +# Messages for Irish (Gaeilge) +# Exported from translatewiki.net +# Export driver: phpyaml +# Author: Cliste +# Author: Tem +--- +ga: + time: + formats: + friendly: '%e %B %Y ag %H:%M' + activerecord: + models: + changeset: Tacar athruithe + changeset_tag: Clib do Thacar athruithe + country: Tír + diary_comment: Nóta Tráchta Dialainne + diary_entry: Iontráil Dialainne + friend: Cara + language: Teanga + message: Teachtaireacht + node: Nód + node_tag: Clib do Nód + old_node: Sean-nód + old_node_tag: Sean-Chlib Nóid + old_relation: Sean-Ghaol + old_relation_member: Sean-Bhall de Ghaol + old_relation_tag: Sean-Chlib Gaoil + old_way: Sean-Bhealach + old_way_node: Sean-Nód Bealaigh + old_way_tag: Sean-Chlib Bhealaigh + relation: Gaol + relation_member: Ball de Ghaol + relation_tag: Clib Gaoil + session: Seisiún + trace: Lorg + tracepoint: Pointe Loirg + tracetag: Clib Loirg + user: Úsáideoir + user_preference: Sainrogha Úsáideora + user_token: Ceadchomhartha Úsáideora + way: Bealach + way_node: Nód Bealaigh + way_tag: Clib Bhealaigh + attributes: + diary_comment: + body: Corp + diary_entry: + user: Úsáideoir + title: Ábhar + latitude: Domhanleithead + longitude: Domhanfhad + language: Teanga + friend: + user: Úsáideoir + friend: Cara + trace: + user: Úsáideoir + visible: Infheicthe + name: Ainm + size: Méid + latitude: domhanleithead + longitude: Domhanfhad + public: Poiblí + description: Cur síos + message: + sender: Seoltóir + title: Ábhar + body: Corp + recipient: Faighteoir + user: + email: Ríomhphost + active: Gníomhach + display_name: Ainm Taispeána + description: Cur síos + languages: Teangacha + pass_crypt: Focal Faire + editor: + default: Réamhshocraithe (%{name} faoi láthair) + potlatch: + name: Potlatch 1 + description: Potlatch 1 (eagathóir sa bhrabhsálaí) + id: + name: iD + description: iD (eagathóir sa bhrabhsálaí) + potlatch2: + name: Potlatch 2 + description: Potlatch 2 (eagathóir sa bhrabhsálaí) + remote: + name: Cianrialú + description: Cianrialú (JOSM nó Merkaartor) + browse: + created: Cruthaithe ag + closed: Dúnta ag + created_html: Cruthaithe <abbr title='%{title}'>%{time} ó shin</abbr> + closed_html: Dúnta <abbr title='%{title}'>%{time} ó shin</abbr> + created_by_html: Cruthaithe ag %{user} <abbr title='%{title}'>%{time} ó shin</abbr> + deleted_by_html: Scriosta ag %{user} <abbr title='%{title}'>%{time} ó shin</abbr> + edited_by_html: Curtha in eagar ag %{user} <abbr title='%{title}'>%{time} ó shin</abbr> + closed_by_html: Dúnta ag %{user} <abbr title='%{title}'>%{time} ó shin</abbr> + version: Leagan + in_changeset: Tacar athruithe + anonymous: gan ainm + no_comment: (níl aon nóta tráchta ann) + part_of: Cuid de + download_xml: Íoslódail XML + view_history: Féach ar Stair + view_details: Amharc ar Shonraí + location: 'Suíomh:' + changeset: + title: 'Tacar athruithe: %{id}' + belongs_to: Údar + node: Nóid (%{count}) + node_paginated: Nóid (%{x}-%{y} de %{count}) + way: Bealaí (%{count}) + way_paginated: Bealaí (%{x}-%{y} de %{count}) + relation: Gaolta (%{count}) + relation_paginated: Gaolta (%{x}-%{y} de %{count}) + comment: Nótaí tráchta (%{count}) + hidden_commented_by: Nóta tráchta folaithe ó %{user} <abbr title='%{exact_time}'>%{when} + ó shin</abbr> + commented_by: Nóta tráchta ó %{user} <abbr title='%{exact_time}'>%{when} ó shin</abbr> + changesetxml: XML an Tacair athruithe + osmchangexml: XML osmChange + feed: + title: Tacar athruithe %{id} + title_comment: Tacar athruithe %{id} - %{comment} + join_discussion: Logáil isteach chun páirt a ghlacadh sa phlé + discussion: Plé + node: + title: 'Nód: %{name}' + history_title: 'Stair an Nóid: %{name}' + way: + title: 'Bealach: %{name}' + history_title: 'Stair an Bhealaigh: %{name}' + nodes: Nóid + also_part_of: + one: cuid de bhealach %{related_ways} + other: cuid de bhealaí %{related_ways} + relation: + title: 'Gaol: %{name}' + history_title: 'Stair an Ghaoil: %{name}' + members: Baill + relation_member: + entry_role: '%{type} %{name} mar %{role}' + type: + node: Nód + way: Bealach + relation: Gaol + containing_relation: + entry: Gaol %{relation_name} + entry_role: Gaol %{relation_name} (mar %{relation_role}) + not_found: + sorry: 'Ár leithscéil, níorbh fhéidir %{type} #%{id} a aimsiú.' + type: + node: nód + way: bealach + relation: gaol + changeset: tacar athruithe + note: nóta + timeout: + sorry: Ár leithscéil, thóg sé rófhada an %{type} leis an ID %{id} a aisghabháil. + type: + node: nód + way: bealach + relation: gaol + changeset: tacar athruithe + note: nóta + redacted: + redaction: Ceilt %{id} + message_html: Ní féidir leagan %{version} den %{type} seo a thaispeáint toisc + go ndearna é a cheilt. Féach an %{redaction_link} chun na mionsonraí a fháil. + type: + node: nód + way: bealach + relation: gaol + start_rjs: + feature_warning: '%{num_features} gné á lódáil, rud a d''fhéadfadh moill nó + easpa freagartha a chur ar do bhrabhsálaí. An bhfuil tú cinnte gur mhaith + leat na sonraí seo a thaispeáint?' + load_data: Lódáil Sonraí + loading: Ag Lódáil... + tag_details: + tags: Clibeanna + wiki_link: + key: An leathanach cur síos ar an vicí don chlib %{key} + tag: An leathanach cur síos ar an vicí don chlib %{key}=%{value} + wikidata_link: An mhír %{page} ar Vicíshonraí + wikipedia_link: An t-alt %{page} ar an Vicipéid + telephone_link: Glaoigh ar %{phone_number} + note: + title: 'Nóta: %{id}' + new_note: Nóta Nua + description: Cur síos + open_title: 'Nóta neamhréitithe #%{note_name}' + closed_title: 'Nóta réitithe #%{note_name}' + hidden_title: 'Nóta folaithe #%{note_name}' + open_by: Cruthaithe ag %{user} <abbr title='%{exact_time}'>%{when} ó shin</abbr> + open_by_anonymous: Cruthaithe ag duine gan ainm <abbr title='%{exact_time}'>%{when} + ó shin</abbr> + commented_by: Nóta tráchta ó %{user} <abbr title='%{exact_time}'>%{when} ó shin</abbr> + commented_by_anonymous: Nóta tráchta ó dhuine gan ainm <abbr title='%{exact_time}'>%{when} + ó shin</abbr> + closed_by: Réitithe ag %{user} <abbr title='%{exact_time}'>%{when} ó shin</abbr> + closed_by_anonymous: Réitithe ag duine gan ainm <abbr title='%{exact_time}'>%{when} + ó shin</abbr> + reopened_by: Athghníomhachtaithe ag %{user} <abbr title='%{exact_time}'>%{when} + ó shin</abbr> + reopened_by_anonymous: Athghníomhachtaithe ag duine gan ainm <abbr title='%{exact_time}'>%{when} + ó shin</abbr> + hidden_by: Folaithe ag %{user} <abbr title='%{exact_time}'>%{when} ó shin</abbr> + query: + title: Gnéithe a Fhiosrú + introduction: Cliceáil ar an léarscáil chun gnéithe in aice láimhe a aimsiú. + nearby: Gnéithe in aice láimhe + enclosing: Gnéithe thart timpeall air + changeset: + changeset_paging_nav: + showing_page: Leathanach %{page} + next: Ar aghaidh » + previous: « Roimhe + changeset: + anonymous: Gan Ainm + no_edits: (níl aon athrú ann) + view_changeset_details: Amharc ar shonraí an tacair athruithe + changesets: + id: ID + saved_at: Sábháilte ag + user: Úsáideoir + comment: Nóta tráchta + area: Limistéar + list: + title: Tacair athruithe + title_user: Tacair athruithe de chuid %{user} + title_friend: Tacair athruithe de chuid do chairde + title_nearby: Tacair athruithe a rinne úsáideoirí in aice láimhe + empty: Níor aimsíodh aon tacar athruithe. + empty_area: Níl aon tacar athruithe sa limistéar seo. + empty_user: Níl aon tacar athruithe ón úsáideoir seo. + no_more: Níor aimsíodh aon tacar athruithe eile. + no_more_area: Níl aon tacar athruithe eile sa limistéar seo. + no_more_user: Níl aon tacar athruithe eile ón úsáideoir seo. + load_more: Lódáil tuilleadh + timeout: + sorry: Ár leithscéil, thóg sé rófhada an liosta de na tacair athruithe a d'iarr + tú a aisghabháil. + rss: + title_all: Plé ar thacair athruithe OpenStreetMap + title_particular: Plé ar thacar athruithe %{changeset_id} de chuid OpenStreetMap + comment: Nóta tráchta nua ar thacar athruithe %{changeset_id} ó %{author} + commented_at_html: Nuashonraithe %{when} ó shin + commented_at_by_html: Nuashonraithe %{when} ó shin ag %{user} + full: An plé iomlán + diary_entry: + new: + title: Iontráil Nua Dialainne + publish_button: Foilsigh + list: + title: Dialanna úsáideoirí + title_friends: Dialanna cairde + title_nearby: Dialann de chuid Úsáideoirí In Aice Láimhe + user_title: Dialann %{user} + in_language_title: 'Iontrálacha Dialainne i: %{language}' + new: Iontráil Nua Dialainne + new_title: Scríobh iontráil nua i do dhialann úsáideora + no_entries: Níl aon iontráil dialainne ann + recent_entries: Iontrálacha dialainne le déanaí + older_entries: Iontrálacha Níos Sine + newer_entries: Iontrálacha Níos Nuaí + edit: + title: Cuir iontráil dialainne in eagar + subject: 'Ábhar:' + body: 'Corp:' + language: 'Teanga:' + location: 'Suíomh:' + latitude: 'Domhanleithead:' + longitude: 'Domhanfhad:' + use_map_link: an léarscáil a úsáid + save_button: Sábháil + marker_text: Suíomh na hiontrála dialainne + view: + title: Dialann %{user} | %{title} + user_title: Dialann %{user} + leave_a_comment: Fág nóta tráchta + login_to_leave_a_comment: '%{login_link} chun nóta tráchta a fhágáil' + login: Logáil isteach + save_button: Sábháil + no_such_entry: + title: Níl an iontráil dialainne sin ann + heading: 'Níl aon iontráil ann a bhfuil an ID seo aici: %{id}' + body: Ár leithscéil, níl aon iontráil dialainne ná nóta tráchta ann a bhfuil + an ID %{id} aige. Seiceáil an litriú, nó b'fhéidir go bhfuil an nasc a d'úsáid + tú mícheart. + diary_entry: + posted_by: 'Postáilte ag %{link_user} ar an %{created} sa teanga seo: %{language_link}' + comment_link: Déan trácht ar an iontráil seo + reply_link: Tabhair freagra ar an iontráil seo + comment_count: + zero: Níl aon nóta tráchta ann + one: Aon nóta tráchta amháin + other: '%{count} nóta tráchta' + edit_link: Cuir an iontráil seo in eagar + hide_link: Folaigh an iontráil seo + confirm: Deimhnigh + diary_comment: + comment_from: Nóta tráchta ó %{link_user} ag %{comment_created_at} + hide_link: Folaigh an nóta tráchta seo + confirm: Deimhnigh + location: + location: 'Suíomh:' + view: Amharc + edit: Cuir in eagar + feed: + user: + title: Iontrálacha dialainne OpenStreetMap le haghaidh %{user} + description: Iontrálacha dialainne OpenStreetMap le déanaí de chuid %{user} + language: + title: 'Iontrálacha dialainne OpenStreetMap sa teanga seo: %{language_name}' + description: 'Iontrálacha dialainne a rinne úsáideoirí OpenStreetMap le déanaí + sa teanga seo: %{language_name}' + all: + title: Iontrálacha dialainne OpenStreetMap + description: Iontrálacha dialainne le déanaí ó úsáideoirí OpenStreetMap + comments: + has_commented_on: Rinne %{display_name} nótaí tráchta ar na hiontrálacha dialainne + seo a leanas + post: Postáil + when: Cá huair + comment: Nóta tráchta + ago: '%{ago} ó shin' + newer_comments: Nótaí Tráchta Níos Úire + older_comments: Nótaí Tráchta Níos Sine + export: + title: Easportáil + start: + area_to_export: Limistéar la hEaspórtáil + manually_select: Roghnaigh limistéar eile de láimh + format_to_export: Formáid le hEaspórtáil + osm_xml_data: Sonraí XML OpenStreetMap + map_image: Íomhá den Léarscáil (taispeántar an tsraith chaighdeánach) + embeddable_html: HTML inleabaithe + licence: Ceadúnas + export_details: Tá sonraí OpenStreetMap ceadúnaithe faoi <a href="http://opendatacommons.org/licenses/odbl/1.0/">Cheadúnas + Bunachar Sonraí Oscailte (ODbL) de chuid Open Data Commons</a>. + too_large: + advice: 'Má theipeann ar an easpórtáil thuas, smaoinigh ar cheann de na foinsí + sa liosta thíos a úsáid:' + body: Tá an limistéar seo rómhór le heaspórtáil mar Sonraí XML OpenStreetMap. + Zúmáil isteach nó roghnaigh limistéar níos lú, nó bain triail as ceann de + na foinsí atá sa liosta thíos chun bulc-íoslódálacha sonraí a dhéanamh. + planet: + title: Planet OSM + description: Cóipeanna a dhéantar a nuashonrú go rialta de bhunachar sonraí + iomlán OpenStreetMap + overpass: + title: Comhéadan feidhmchláir Overpass + description: Íoslódáil an bosca teorainn seo ó scáthán den bhunachar sonraí + OpenStreetMap + geofabrik: + title: Íoslódálacha Geofabrik + description: Asbhaintí a thugtar cothrom le dáta go rialta de mhór-ranna, + tíortha agus cathracha roghnaithe + metro: + title: Ábhair asbhainte Metro + description: Asbhaintí le haghaidh mórchathracha domhanda agus an ceantar + máguaird + other: + title: Foinsí Eile + description: Tá liosta de na foinsí breise ar vicí OpenStreetMap + options: Roghanna + format: Formáid + scale: Scála + max: uasta + image_size: Méid na hÍomhá + zoom: Zúmáil + add_marker: Cuir marcóir leis an léarscáil + latitude: 'D-lthd:' + longitude: 'D-fhad:' + output: Aschur + paste_html: Greamaigh HTML le leabú i suíomh gréasáil + export_button: Easportáil + geocoder: + search: + title: + latlon: Torthaí <a href="http://openstreetmap.org/">Inmheánach</a> + us_postcode: Torthaí ó <a href="http://geocoder.us/">Geocoder.us</a> + uk_postcode: Torthaí ó <a href="http://www.npemap.org.uk/">NPEMap / FreeThe + Postcode</a> + ca_postcode: Torthaí ó <a href="http://geocoder.ca/">Geocoder.CA</a> + osm_nominatim: Torthaí ó <a href="http://nominatim.openstreetmap.org/">Nominatim + OpenStreetMap</a> + geonames: Torthaí ó <a href="http://www.geonames.org/">GeoNames</a> + osm_nominatim_reverse: Torthaí ó <a href="http://nominatim.openstreetmap.org/">Nominatim + OpenStreetMap</a> + geonames_reverse: Torthaí ó <a href="http://www.geonames.org/">GeoNames</a> + search_osm_nominatim: + prefix: + aerialway: + cable_car: Carr Cábla + chair_lift: Cathaoir Chábla + drag_lift: Ardaitheoir Tarraingthe + gondola: Ardaitheoir Gandala + station: Stáisiún do Bhealach Aeir + aeroway: + aerodrome: Aeradróm + apron: Naprún aerfoirt + gate: Geata + helipad: Héileapad + runway: Rúidbhealach + taxiway: Bealach innealta + terminal: Críochfort + amenity: + animal_shelter: Dídean Ainmhithe + arts_centre: Ionad Ealaíon + atm: Meaisín bainc + bank: Banc + bar: Beár + bbq: Bearbaiciú + bench: Binse + bicycle_parking: Páirceáil Rothar + bicycle_rental: Rothair ar Cíos + biergarten: Gairdín Beorach + boat_rental: Báid ar Cíos + brothel: Drúthlann + bureau_de_change: Bureau de Change + bus_station: Busáras + cafe: Caifé + car_rental: Carranna ar Cíos + car_sharing: Comhroinnt Carranna + car_wash: Niteoir Carranna + casino: Casaíne/Casino + charging_station: Stáisiún Luchtúcháin + childcare: Cúram leanaí + cinema: Pictiúrlann + clinic: Clinic + clock: Clog + college: Coláiste + community_centre: Ionad Pobail + courthouse: Teach cúirte + crematorium: Créamatóiriam + dentist: Fiaclóir + doctors: Dochtúirí + dormitory: Áras cónaithe + drinking_water: Uisce Inólta + driving_school: Scoil Tiomána + embassy: Ambasáid + emergency_phone: Fón Éigeandála + fast_food: Mearbhia + ferry_terminal: Críochfort Farantóireachta + fire_hydrant: Béal Tuile + fire_station: Stáisiún Dóiteáin + food_court: Cúirt Bhia + fountain: Scairdeán/fuarán + fuel: Breosla + gambling: Cearrbhachas + grave_yard: Reilg + gym: Spórtlann / Giom + health_centre: Ionad Sláinte + hospital: Ospidéal + hunting_stand: Árdán seilge + ice_cream: Uachtar reoite + kindergarten: Naíonra + library: Leabharlann + market: Margadh + marketplace: Áit mhargaidh + monastery: Mainistir + motorcycle_parking: Páirceáil do Ghluaisrothair + nightclub: Club Oíche + nursery: Naíonra + nursing_home: Teach Altranais + office: Oifig + parking: Páirceáil + parking_entrance: Bealach Isteach ar Áit Pháirceála + pharmacy: Cógaslann + place_of_worship: Ionad Adhartha + police: Póilíní + post_box: Bosca Poist + post_office: Oifig an Phoist + preschool: Réamhscoil + prison: Príosún + pub: Teach tábhairne + public_building: Foirgneamh Poiblí + reception_area: Limistéar Fáilte + recycling: Ionad Athchúrsála + restaurant: Bialann + retirement_home: Áras Seanóirí + sauna: Seomra allais/sauna + school: Scoil + shelter: Scáthlán + shop: Siopa + shower: Cithfholcadh + social_centre: Ionad Sóisialta + social_club: Club Sóisialta + social_facility: Áislann Shóisialta + studio: Stiúideo + swimming_pool: Linn Snámha + taxi: Tacsaí + telephone: Teileafón Poiblí + theatre: Amharclann + toilets: Leithreas + townhall: Halla Baile + university: Ollscoil + vending_machine: Meaisín Díola + veterinary: Ionad Cúraim Tréidlia + village_hall: Ionad Pobail Sráidbhaile + waste_basket: Bosca Bruscair + waste_disposal: Diúscairt Dramhaíola + youth_centre: Ionad Óige + boundary: + administrative: Teorainn Riaracháin + census: Teorainn Daonáirimh + national_park: Páirc Náisiúnta + protected_area: Limistéar faoi Chosaint + bridge: + aqueduct: Uiscerian + suspension: Droichead Crochta + swing: Droichead lúdrach/luascdhroichead + viaduct: Tarbhealach + "yes": Droichead + building: + "yes": Foirgneamh + craft: + brewery: Grúdlann + carpenter: Siúinéir + electrician: Leictreoir + gardener: Garraíodóir + painter: Péintéir + photographer: Grianghrafadóir + plumber: Pluiméir + shoemaker: Gréasaí + tailor: Táilliúir + "yes": Siopa Ceardaíochta + emergency: + ambulance_station: Stáisiún Otharchairr + defibrillator: Dífhibrileoir + landing_site: Láthair tuirlingthe éigeandála + phone: Fón Éigeandála + highway: + abandoned: Bóthar Mór Tréigthe + bridleway: Cosán marcaíochta + bus_guideway: Lána Bus Treoraithe + bus_stop: Stad Bus + construction: Bealach Mór á Thógáil + cycleway: Raon Rothar + elevator: Ardaitheoir + emergency_access_point: Pointe Rochtana Éigeandála + footway: Cosán + ford: Áth + living_street: Sráid Chónaithe + milestone: Cloch Mhíle + motorway: Mótarbhealach + motorway_junction: Acomhal + motorway_link: Bóthar Mótarbhealaigh + path: Slí + pedestrian: Ceantar Coisithe + platform: Árdán + primary: Príomhbhóthar + primary_link: Príomhbhóthar + proposed: Bóthar Atá Beartaithe + raceway: Ráschúrsa + residential: Bóthar Cónaithe + rest_area: Láthair Scíthe + road: Bóthar + secondary: Bóthar Tánaisteach + secondary_link: Bóthar Tánaisteach + service: Bóthar Freastail/Rochtana + services: Seirbhísí Mótarbhealaigh + speed_camera: Ceamara Luais + steps: Céimeanna + street_lamp: Solas Sráide + tertiary: Bóthar Tríú-Grád + tertiary_link: Bóthar Tríú-Grád + track: Cosán + traffic_signals: Soilse Tráchta + trail: Conair + trunk: Mórbhóthar + trunk_link: Mórbhóthar + unclassified: Bóthar Neamhaicmithe + unsurfaced: Bóthar Gan Dromhchla + "yes": Bóthar + historic: + archaeological_site: Láithreán Seandálaíochta + battlefield: Láthair Chatha + boundary_stone: Cloch Theorann + building: Foirgneamh Stairiúil + bunker: Buncar + castle: Caisleán + church: Eaglais + city_gate: Geata Cathrach + citywalls: Ballaí Cathrach + fort: Dún/Ráth + heritage: Láithreán Oidhreachta + house: Teach + icon: Íocón + manor: Mainéar + memorial: Leac cuimhneacháin + mine: Mianach + monument: Séadchomhartha + roman_road: Bóthar Rómhánach + ruins: Fothracha + stone: Cloch + tomb: Tuama + tower: Túr + wayside_cross: Crois Cois Bealaigh + wayside_shrine: Scrín Cois Bealaigh + wreck: Long Bhriste + junction: + "yes": Acomhal + landuse: + allotments: Cuibhrinn + basin: Abhantrach + brownfield: Talamh Athfhorbraíochta + cemetery: Reilig + commercial: Limistéar Tráchtála + conservation: Caomhnú + construction: Tógáil + farm: Feirm + farmland: Talamh Feirme + farmyard: Clós Feirme + forest: Foraois + garages: Garáistí + grass: Féar + greenfield: Talamh Glasbháin + industrial: Limistéar Tionsclaíoch + landfill: Líonadh Talún + meadow: Móinéar/cluain + military: Limistéar Míleata + mine: Mianach + orchard: Úllord + quarry: Cairéal + railway: Iarnród + recreation_ground: Páirc Caitheamh Aimsire + reservoir: Taiscumar + reservoir_watershed: Dobhardhroim Thaiscumair + residential: Ceantar Cónaithe + retail: Miondíol + road: Limistéar Bóthair + village_green: Faiche an tSráidbhaile + vineyard: Fíonghort + "yes": Úsáid na Talún + leisure: + beach_resort: Ionad Saoire Cois Trá + bird_hide: Folachán Éanbhreathnóireachta + club: Club + common: Coimín + dog_park: Páirc do Mhadraí + fishing: Áit Iascaireachta + fitness_centre: Ionad Aclaíochta + fitness_station: Stáisiún Corpacmhainne + garden: Gairdín + golf_course: Galfchúrsa + horse_riding: Marcaíocht ar Chapall + ice_rink: Oighear-Rinc + marina: Muiríne + miniature_golf: Mionghalf + nature_reserve: Tearmann Dúlra + park: Páirc + pitch: Páirc Spóirt + playground: Áit Súgartha + recreation_ground: Páirc Caitheamh Aimsire + resort: Ionad Saoire + sauna: Seomra allais/Sauna + slipway: Sleamhnán/slip + sports_centre: Ionad Spóirt + stadium: Staid + swimming_pool: Linn Snámha + track: Raon Reatha + water_park: Páirc Uisce + "yes": Fóillíocht + man_made: + lighthouse: Teach Solais + pipeline: Píblíne + tower: Túr + works: Monarcha + "yes": De dhéantús an duine + military: + airfield: Aerpháirc Mhíleata + barracks: Beairic + bunker: Buncar + mountain_pass: + "yes": Bearnas/mám + natural: + bay: Cuan + beach: Trá + cape: Rinn/ceann tíre + cave_entrance: Bealach Isteach ar Phluais + cliff: Aill + crater: Cráitéar + dune: Dumhach + fell: Sliabh Carraigeach + fjord: Fiord + forest: Foraois + geyser: Géasar + glacier: Oighearshruth + grassland: Féarach + heath: Móinteach + hill: Cnoc + island: Oileán + land: Talamh + marsh: Riasc/seascann + moor: Feistiú + mud: Puiteach + peak: Binn + point: Rinn + reef: Sceir/scairbh + ridge: Iomaire + rock: Carraig + saddle: Mám + sand: Gaineamh + scree: Scileach + scrub: Scrobarnach + spring: Foinse uisce + stone: Cloch + strait: Caolas + tree: Crann + valley: Gleann + volcano: Bolcán + water: Uisce + wetland: Bogach + wood: Coill + office: + accountant: Cuntasóir + administrative: Riarachán + architect: Ailtire + company: Comhlacht + employment_agency: Gníomhaireacht Fostaíochta + estate_agent: Gníomhaire Eastáit + government: Oifig Rialtais + insurance: Oifig Árachais + lawyer: Dlíodóir + ngo: Oifig ENR (NGO) + telecommunication: Oifig Teileachumarsáide + travel_agent: Gníomhaireacht Taistil + "yes": Oifig + place: + allotments: Cuibhrinn + block: Bloc + airport: Aerfort + city: Cathair + country: Tír + county: Contae + farm: Feirm + hamlet: Gráig + house: Teach + houses: Tithe + island: Oileán + islet: Oileáinín + isolated_dwelling: Áit Chónaithe Iargúlta + locality: Dúiche + moor: Móinteán + municipality: Cathair bhardais/baile bardais + neighbourhood: Comharsanacht + postcode: Cód poist + region: Réigiún + sea: Farraige + state: Stát + subdivision: Fo-roinn + suburb: Bruachbhaile + town: Baile + unincorporated_area: Limistéar Neamhchorpraithe + village: Sráidbhaile + "yes": Áit + railway: + abandoned: Iarnród Tréigthe + construction: Iarnród á Thógáil + disused: Iarnróid atá As Úsáid + disused_station: Stáisiún Iarnróid As Úsáid + funicular: Iarnród Cáblach + halt: Stad Traenach + historic_station: Stáisiún Iarnróid Stairiúil + junction: Acomhal Iarnróid + level_crossing: Crosaire Comhréidh + light_rail: Iarnród Éadrom + miniature: Mion-iarnród + monorail: Aonráille + narrow_gauge: Iarnród Caol + platform: Ardán Iarnróid + preserved: Iarnród Caomhnaithe + proposed: Iarnród atá Beartaithe + spur: Craobhlíne Iarnróid + station: Stáisiún Iarnróid + stop: Stad Iarnróid + subway: Meitreo + subway_entrance: Bealach Isteach ar Mheitreo + switch: Ladhróg Iarnróid + tram: Trambhealach + tram_stop: Stad Tram + shop: + alcohol: Eischeadúnas + antiques: Siopa seandachtaí + art: Siopa Ealaíon + bakery: Bácús + beauty: Siopa Áilleachta + beverages: Siopa Deochanna + bicycle: Siopa Rothar + books: Siopa Leabhar + boutique: Búitíc (Boutique) + butcher: Búistéir + car: Siopa Carranna + car_parts: Páirteanna do Charranna + car_repair: Deisiú Carranna + carpet: Siopa Cairpéad + charity: Siopa Carthanachta + chemist: Siopa Poitigéara + clothes: Siopa Éadaí + computer: Siopa Ríomhairí + confectionery: Siopa Milseán + convenience: Siopa Áise + copyshop: Siopa Fótachóipeala + cosmetics: Siopa Cosmaidí + deli: Deilí + department_store: Siopa Ilrannach + discount: Siopa Earraí ar Lascaine + doityourself: Déan tú féin é/DIY + dry_cleaning: Tirimghlanadh + electronics: Siopa Earraí Leictreacha + estate_agent: Gníomhaire Eastáit + farm: Siopa Feirme + fashion: Siopa Faisin + fish: Siopa Éisc + florist: Bláthadóir + food: Siopa Bia + funeral_directors: Adhlacóir + furniture: Troscán + gallery: Dánlann + garden_centre: Ionad Garraíodóireachta + general: Siopa Ginearálta + gift: Siopa Bronntanas + greengrocer: Siopa Glasraí + grocery: Siopa Grósaera + hairdresser: Gruaigeadóir + hardware: Siopa Crua-earraí + hifi: Hi-Fi + insurance: Árachas + jewelry: Siopa Seodóireachta + kiosk: Both + laundry: Neachtlann + mall: Ionad Siopadóireachta + market: Margadh + mobile_phone: Siopa Fón Póca + motorcycle: Siopa Gluaisrothar + music: Siopa Ceoil + newsagent: Siopa Nuachtán + optician: Radharceolaí + organic: Siopa Bia Orgánaigh + outdoor: Siopa Earraí don Taobh Amuigh + pet: Siopa Peataí + pharmacy: Cógaslann + photo: Siopa Grianghrafadóireachta + salon: Ionad áilleachta/sciamhlann + second_hand: Siopa Earraí Athláimhe + shoes: Siopa Bróg + shopping_centre: Ionad Siopadóireachta + sports: Siopa Spóirt + stationery: Siopa Stáiseanóireachta + supermarket: Ollmhargadh + tailor: Táilliúir + toys: Siopa Bréagán + travel_agency: Gníomhaireacht Taistil + video: Siopa Scannán ar Cíos + wine: Eischeadúnas + "yes": Siopa + tourism: + alpine_hut: Bothán Alpach + apartment: Árasán + artwork: Saothar ealaíne + attraction: Ní is díol spéise + bed_and_breakfast: Lóistín (B&B) + cabin: Bothán/cábán + camp_site: Ionad Campála + caravan_site: Láithreán Carbhán + chalet: Sealla + gallery: Dánlann + guest_house: Aíochtlann + hostel: Brú Óige + hotel: Óstán + information: Eolas + motel: Móstán + museum: Iarsmalann + picnic_site: Láthair Phicnicí + theme_park: Páirc Siamsaíochta ar Théama + viewpoint: Ionad Amhairc + zoo: Zú + tunnel: + culvert: Lintéar + "yes": Tollán + waterway: + artificial: Uiscebhealach Saorga + boatyard: Bádchlós + canal: Canáil + dam: Damba + derelict_canal: Canáil Thréigthe + ditch: Díog + dock: Dug + drain: Draein + lock: Loc canála + lock_gate: Loc-chomhla + mooring: Feistiú + rapids: Fánsruth + river: Abhainn + stream: Sruthán + wadi: Sruthchúrsa(wadi) + waterfall: Eas + weir: Cora + "yes": Uiscebhealach + admin_levels: + level2: Teorainn Tíre + level4: Teorainn Stáit + level5: Teorainn Réigiúin + level6: Teorainn Contae + level8: Teorainn Cathrach + level9: Teorainn Sráidbhaile + level10: Teorainn Bruachbhaile + description: + title: + osm_nominatim: Suíomh ó <a href="http://nominatim.openstreetmap.org/">Nominatim + OpenStreetMap</a> + geonames: Suíomh ó <a href="http://www.geonames.org/">GeoNames</a> + types: + cities: Cathracha + towns: Bailte + places: Áiteacha + results: + no_results: Gan torthaí + more_results: Tuilleadh torthaí + layouts: + logo: + alt_text: Lógó OpenStreetMap + home: Gabh chuig an Suíomh Baile + logout: Logáil Amach + log_in: Logáil isteach + log_in_tooltip: Logáil isteach le cuntas a cruthaíodh cheana + sign_up: Clárú + start_mapping: Téigh i mbun Léarscáilithe + sign_up_tooltip: Cruthaigh cuntas chun eagarthóireacht a dhéanamh + edit: Cuir in Eagar + history: Stair + export: Easpórtáil + data: Sonraí + export_data: Easpórtáil Sonraí + gps_traces: Loirg GPS + gps_traces_tooltip: Loirg GPS a bhainistiú + user_diaries: Dialanna Úsáideoirí + user_diaries_tooltip: Amharc ar dhialanna úsáideoirí + edit_with: Cuir in eagar le %{editor} + tag_line: An Léarscáil Dhomhanda Vicí Shaor in Aisce + intro_header: Fáilte go OpenStreetMap! + intro_text: Is léarscáil den domhan é OpenStreetMap, a chruthaigh daoine cosúil + leatsa agus atá saor in aisce le húsáid faoi cheadúnas oscailte. + intro_2_create_account: Cruthaigh cuntas úsáideora + partners_html: Tugann %{ucl}, %{ic} agus %{bytemark}, agus %{partners}, tacaíocht + don óstáil. + partners_ucl: Lárionad VR UCL + partners_ic: Imperial College London + partners_bytemark: Bytemark Hosting + partners_partners: comhpháirtithe + osm_offline: Tá bunachar sonraí OpenStreetMap as líne faoi láthair fad agus atá + obair chothabhála riachtanach á dhéanamh ar an mbunachar sonraí. + osm_read_only: Tá bunachar sonraí OpenStreetMap sa mhód inléite amháin faoi láthair + fad agus a dhéantar obair chothabhála riachtanach ar an mbunachar sonraí. + donate: Tabhair tacaíocht d'OpenStreetMap trí %{link} a dhéanamh leis an gCiste + don Uasghrádú ar Chrua-earraí. + help: Cabhair + about: Maidir linn + copyright: Cóipcheart + community: Pobal + community_blogs: Blaganna an Phobail + community_blogs_title: Blaganna ó dhaoine i bpobal OpenStreetMap + foundation: Fondúireacht + foundation_title: Fondúireacht OpenStreetMap + make_a_donation: + title: Tabhairt tacaíocht do OpenStreetMap le síntiús airgid + text: Tabhair Síntiús Airgid + learn_more: Tuilleadh Eolais + more: Tuilleadh + license_page: + foreign: + title: Maidir leis an aistriúchán seo + text: Sa chás nach mbeidh an leathanach aistrithe seo agus an %{english_original_link} + ag teacht le chéile, tabharfar tús áite don leathanach Béarla + english_link: Leagan bunaidh Béarla + native: + title: Maidir leis an leathanach seo + text: Tá tú ag breathnú ar an leagan Béarla den leathanach cóipchirt. Is féidir + leat dul ar ais chuig an %{native_link} den leathanach seo nó is féidir leat + éirí as a bheith ag léamh faoi chúrsaí cóipchirt agus %{mapping_link}. + native_link: Leagan THIS_LANGUAGE_NAME_HERE + mapping_link: dul i mbun léarscáilithe + legal_babble: + title_html: Cóipcheart agus Ceadúnas + intro_1_html: |- + <i>Sonraí oscailte</i> atá i gceist le OpenStreetMap<sup><a href="#trademarks">®</a></sup>, atá ceadúnaithe faoi <a + href="http://opendatacommons.org/licenses/odbl/">Cheadúnas Bunachar Sonraí Oscailte</a> (ODbL) de chuid Open Data Commons ag <a + href="http://osmfoundation.org/">Fondúireacht OpenStreetMap</a> (OSMF). + intro_2_html: Tá saoirse agat ár gcuid sonraí a chóipeáil, a dháileadh, a tharchur + agus a oiriúnú, a fhad agus a thugann tú creidiúint do OpenStreetMap agus + dá rannchuiditheoirí. Má athraíonn tú ár gcuid sonraí nó má thógann tú orthu, + ní fhéadfaidh tú an toradh sin a dháileadh ach faoin gceadúnas céanna. Tá + míniú ar do chearta agus ar do fhreagrachtaí sa <a href="http://opendatacommons.org/licenses/odbl/1.0/">chód + dlíthiúil</a> iomlán. + intro_3_html: Tá an chartagrafaíocht sna tíleanna léarscáile atá againn, agus + an doiciméadú, ceadúnaithe faoin gceadúnas <a href="http://creativecommons.org/licenses/by-sa/2.0/">Sannta-Comhroinnte + Comhionann 2.0 de chuid Creative Commons</a> (CC BY-SA). + credit_title_html: Conas OpenStreetMap a lua + credit_1_html: Ceanglaímid ort an lua “©Rannchuiditheoirí OpenStreetMap” + a úsáid. + credit_2_html: Ní mór duit a chinntiú freisin go bhfuil soiléir go bhfuil na + sonraí ar fáil faoin gCeadúnas Bunachar sonraí Oscailte agus, má úsáideann + tú na tíleanna léarscáile atá againn, go bhfuil an chartagrafaíocht ceadúnaithe + mar CC BY-SA. Is féidir leat é sin a dhéanamh ach nasc a dhéanamh chuig an + bh<a href="http://www.openstreetmap.org/copyright">fógra cóipchirt seo</a>. + Mar mhalairt air sin, agus is gá duit é seo a dhéanamh má rud é gur i bhfoirm + sonraí atá OSM á dháileadh agat, is féidir leat an ceadúnaí/na ceadúnaithe + a ainmniú agus nasc a dhéanamh chuige/chucu go díreach. I meáin nach féidir + naisc a dhéanamh (m.sh. saothair chlóite), molaimid duit do léitheoirí a threorú + chuig openstreetmap.org (d'fhéadfá é sin a dhéanamh ach an seoladh iomlán + seo a thabhairt in áit 'OpenStreetMap'), chuig opendatacommons.org, agus, + más ábhartha, chuig creativecommons.org. + credit_3_html: |- + I gcás léarscáil leictreonach is féidir a bhrabhsáil, ba cheart an lua a bheith le feiceáil i gcúinne na léarscáile. + Mar shampla: + attribution_example: + alt: Sampla den bhealach chun OpenStreetMap a lua ar shuíomh gréasáin + title: Lua samplach + more_title_html: Tuilleadh eolais + more_1_html: Is féidir leat tuilleadh eolais a fháil faoinár sonraí a úsáid, + agus faoin gcaoi chun muid a lua, <a href="http://osmfoundation.org/Licence">leathanach + ceadúnais Fhondúireacht OSM</a> agus ag <a href="http://wiki.openstreetmap.org/wiki/Legal_FAQ">Ceisteanna + Coitianta Dlíthiúil</a> de chuid an phobail. + more_2_html: |- + Cé gur sonraí oscailte iad sonraí OpenStreetMap, ní féidir linn API saor in aisce den léarscáil a sholáthar do thríú páirtithe. + Féach ár b<a href="https://operations.osmfoundation.org/policies/api/">Polasaí Úsáide don API</a>,<a href="https://operations.osmfoundation.org/policies/tiles/">an Polasaí maidir le Tíleanna a úsáid</a> agus <a href="https://operations.osmfoundation.org/policies/nominatim/">an Polasaí maidir le Nominatim a úsáid</a>. + contributors_title_html: Ár rannchuiditheoirí + contributors_at_html: |- + <strong>An Ostair</strong>: Tá sonraí ann ó + <a href="http://data.wien.gv.at/">Stadt Wien</a> (faoi + <a href="http://creativecommons.org/licenses/by/3.0/at/deed.de">CC BY</a>), + <a href="http://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm">Land Vorarlberg</a> agus ó + Land Tirol (faoi <a href="http://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/">CC BY AT le leasuithe</a>). + contributors_ca_html: "<strong>Ceanada</strong>: Tá sonraí ann ó \nGeoBase®, + GeoGratis (© Department of Natural\nResources Canada), CanVec (© + Department of Natural\nResources Canada), and StatCan (Geography Division,\nStatistics + Canada)." + contributors_fi_html: '<strong>An Fhionlainn</strong>: Tá sonraí ann ó Bhunachar + Sonraí Topagrafaíochta an Maanmittauslaitos (Suirbhéireacht Náisiúnta Talún + na Fionlainne) agus ó thacair sonraí eile, faoin g<a href="http://www.maanmittauslaitos.fi/en/NLS_open_data_licence_version1_20120501">Ceadúnas + NLSFI</a>.' + contributors_fr_html: '<strong>An Fhrainc</strong>: Tá sonraí ann a fuarthas + ón Direction Générale des Impôts.' + contributors_nl_html: |- + <strong>An Ísiltír</strong>: Tá © Sonraí AND, 2007 ann + (<a href="http://www.and.com">www.and.com</a>) + contributors_footer_1_html: |- + Chun tuilleadh sonraí a fháil fúthu seo, agus faoi na sonraí eile a úsáideadh ar mhaithe le OpenStreetMap a fheabhsú, féach <a + href="http://wiki.openstreetmap.org/wiki/Contributors">leathanach na Rannchuiditheoirí</a> ar Vicí OpenStreetMap. + infringement_title_html: Sárú cóipchirt + infringement_1_html: Meabhraítear do rannchuiditheoirí OSM gan sonraí ó aon + fhoinse atá faoi chóipcheart (m.sh. Google Maps nó léarscáileanna clóite) + a chur leis riamh gan cead a fháil go sainráite ó na sealbhóirí cóipchirt. + trademarks_title_html: <span id="trademarks"></span>Trádmharcanna + welcome_page: + title: Fáilte! + introduction_html: Fáilte go OpenStreepMap, léarscáil den Domhan atá saor in aisce + agus ar féidir eagarthóireacht a dhéanamh uirthi. Anois agus tú cláraithe, tá + tú réidh chun léarscáiliú a dhéanamh. Seo treoir tosaigh leis an mbuneolas a + bheidh ag teastáil uait. + whats_on_the_map: + title: Cad atá ar an léarscáil + on_html: Is áit é OpenStreetMap chun léarscáiliú a dhéanamh ar rudaí <em>atá + ann dáiríre agus faoi láthair</em> - tá na milliúin foirgneamh, bóithre agus + sonraí eile faoi áiteacha ar fáil air. Is féidir leat cibé na gnéithe den + fhíorshaol atá suimiúil duit féin a léarscáiliú. + off_html: I measc na rudaí <em>nach</em> bhfuil ann tá sonraí bunaithe ar thuairimí + cosúil le rátálacha, gnéithe stairiúla nó teoiriciúla, agus sonraí ó fhoinsí + faoi chóipcheart. Mura bhfuil cead speisialta agat, ná cóipeáil as léarscáileanna + ar líne nó páipéir. + basic_terms: + title: Téarmaí Bunúsacha a bhaineann le Léarscáiliú + paragraph_1_html: Tá roinnt béarlagair dá chuid féin ag baint le OpenStreetMap. + Seo roinnt den na focail is tábhachtaí a bheidh úsáideach duit. + editor_html: Is éard is <strong>eagarthóir</strong> ann ná ríomhchlár nó suíomh + gréasáin a úsáideann tú chun an léarscáil a chur in eagar. + node_html: Is éard is <strong>nód</strong> ann ná pointe ar an léarscáil, cosúil + le bialann amháin nó crann. + way_html: Is éard is <strong>bealach</strong> ann ná líne nó limistéar, cosúil + le bóthair, sruthán, loch nó foirgneamh. + tag_html: Is éard is <strong>clib</strong> ann ná píosa sonraí faoi nód nó bealach, + cosúil le hainm bialainne nó teorainn luais bóthair. + rules: + title: Rialacha! + paragraph_1_html: |- + Is beag riail fhoirmiúil atá ag OpenStreetMap ach bímid ag súil leis go mbeidh rannpháirtithe ag comhoibriú leis an bpobal agus go rachaidh siad i mbun cumarsáide leis. Má tá tú ag smaoineamh ar aon ghníomhaíocht eile a dhéanamh seachas eagarthóireacht a dhéanamh de láimh, léigh agus lean na treoirlínte maidir le h<a href='http://wiki.openstreetmap.org/wiki/Import/Guidelines'>Iompórtálacha</a> agus + <a href='http://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct'>Eagarthóireacht Uathoibrithe</a>. + questions: + title: Aon cheist agat? + start_mapping: Téigh i mbun Léarscáilithe + add_a_note: + title: Easpa Ama chun Eagarthóireacht a Dhéanamh? Fág Nóta! + paragraph_1_html: Mura bhfuil tú ag iarraidh ach go ndéanfaí rud beag a cheartú + agus gan an t-am agat clárú agus foghlaim conas eagarthóireacht a dhéanamh, + tá sé an-éasca nóta a scríobh. + fixthemap: + title: Fadhb a thuairisciú / An léarscáil a dheisiú + how_to_help: + title: Conas Cabhrú + join_the_community: + title: Glac páirt sa phobal + other_concerns: + title: Ábhar imní eile + help_page: + title: Cabhair a Fháil + welcome: + url: /welcome + title: Fáilte go OSM + description: Tosaigh leis an treoir thapa seo a chlúdaíonn gnéithe bunúsacha + OpenStreetMap. + beginners_guide: + url: http://wiki.openstreetmap.org/wiki/GA:Beginners%27_guide + title: Treoir do Thosaitheoirí + description: Treoir do thosaitheoirí atá faoi stiúir an phobail. + help: + url: https://help.openstreetmap.org/ + title: help.openstreetmap.org + description: Is féidir ceist a chur nó freagraí a chuardach ar shuíomh ceisteanna + agus freagraí OSM. + mailing_lists: + title: Liosta Seachadta + description: Is féidir ceist a chur nó ábhair shuimiúla a phlé ar raon leathan + de liostaí seachadta téamacha agus réigiúnacha. + forums: + title: Fóraim + description: Ceisteanna agus plé dóibh siúd ar fearr leo comhéadan ar stíl clár + fógraí. + irc: + title: IRC + description: Comhrá idirghníomhach i go leor teangacha éagsúla agus ar go leor + ábhair éagsúla. + switch2osm: + title: switch2osm + description: Cabhair do chuideachtaí agus eagraíochtaí atá ag athrú chuig léarscáileanna + agus seirbhísí eile atá bunaithe ar OpenStreetMap. + wiki: + url: http://wiki.openstreetmap.org/ + title: wiki.openstreetmap.org + description: Brabhsáil an vicí le haghaidh doiciméadú mionsonraithe OSM. + about_page: + next: Ar aghaidh + copyright_html: <span>©</span>Rannchuiditheoirí<br>OpenStreetMap + used_by: Cuireann %{name} sonraí léarscáile ar fáil do na mílte suíomh gréasáin, + feidhmchlár móibíleach agus gléas crua-earraí + local_knowledge_title: Eolas Áitiúil + community_driven_title: Faoi Smacht an Phobail + open_data_title: Sonraí Oscailte + open_data_html: 'Is <i>sonraí oscailte</i> atá in OpenStreetMap: tá saoirse agat + é a úsáid chun críocha ar bith a fhad agus a dhéantar OpenStreetMap agus a rannchuiditheoirí + a lua. Má athraíonn tú na sonraí nó má thógann tú orthu ar bhealaí áirithe, + ní féidir leat an toradh a dháileadh ach faoin gceadúnas céanna. Féach <a href=''%{copyright_path}''>an + leathanach faoin gCóipcheart agus Ceadúnais</a> chun sonraí a fháil.' + legal_title: Dlíthiúil + partners_title: Comhpháirtithe + notifier: + diary_comment_notification: + subject: '[OpenStreetMap] Rinne %{user} nóta tráchta faoi iontráil dialainne' + hi: A %{to_user}, a chara, + header: 'Rinne %{from_user} nóta tráchta faoin iontráil dialainne OpenStreetMap + a bhfuil %{subject} mar ábhar aige:' + footer: Is féidir leat an nóta tráchta a léamh freisin ag %{readurl} agus is + féidir leat nóta tráchta a dhéanamh ag %{commenturl} nó freagra a thabhairt + ag %{replyurl} + message_notification: + hi: A %{to_user}, a chara, + header: 'Sheol %{from_user} teachtaireacht chugat trí OpenStreetMap leis an + ábhar %{subject}:' + footer_html: Is féidir leat an teachtaireacht a léamh ag %{readurl} freisin + agus is féidir leat freagra a scríobh ag %{replyurl} + friend_notification: + subject: '[OpenStreetMap] Chuir %{user} ar liosta na gcairde thú' + had_added_you: Chuir %{user} ar liosta na gcairde atá acu ar OpenStreetMap thú. + see_their_profile: Is féidir leat a p(h)róifíl a fheiceáil ag %{userurl}. + befriend_them: Is féidir an duine sin a chur ar liosta na gcairde atá agatsa + ag %{befriendurl}. + gpx_notification: + greeting: Haigh, + your_gpx_file: An comhad GPX sin a bhí agat + with_description: a bhfuil an cur síos seo ag gabháil leis + and_the_tags: 'agus na clibeanna seo a leanas:' + and_no_tags: agus clib ar bith. + failure: + subject: '[OpenStreetMap] Theip ar Iompórtáil GPX' + failed_to_import: ', theip ar an iompórtáil. Seo an earráid:' + more_info_1: Is féidir tuilleadh eolais maidir le teipeanna ar iompórtálacha + GPX agus conas + more_info_2: 'iad a sheachaint a fháil ag:' + success: + subject: '[OpenStreetMap] Iompórtáladh an GPX' + loaded_successfully: ', lódáladh é gan fhadhb le %{trace_points} as %{possible_points} + pointe féideartha.' + signup_confirm: + subject: '[OpenStreetMap] Fáilte go OpenStreetMap' + greeting: A chara, + created: Tá duine éigin (tusa, tá súil againn) tar éis cuntas a chruthú ag %{site_url}. + confirm: Sula ndéanfaimid aon rud eile, ní mór dúinn a chinntiú gur tháinig + an t-iarratas seo uait, mar sin más amhlaidh gur tháinig, cliceáil ar an nasc + thíos chun do chuntas a dheimhniú. + welcome: Tar éis duit do chuntas a dheimhniú, cuirfimid eolas breise ar fáil + duit le go mbeidh tú in ann tosú amach. + email_confirm: + subject: '[OpenStreetMap] Do sheoladh ríomhphoist a dheimhniú' + email_confirm_plain: + greeting: A chara, + hopefully_you: Is mian le duit éigin (tusa, tá súil againn), a s(h)eoladh ríomhphoist + ag %{server_url} a athrú go %{new_address}. + click_the_link: Más tusa atá ann, cliceáil ar an nasc thíos chun an t-athrú + a dheimhniú. + email_confirm_html: + greeting: A chara, + hopefully_you: Is mian le duit éigin (tusa, tá súil againn) a s(h)eoladh ríomhphoist + ag %{server_url} a athrú go %{new_address}. + click_the_link: Más tusa atá ann, cliceáil ar an nasc thíos chun an t-athrú + a dheimhniú. + lost_password: + subject: '[OpenStreetMap] Iarratas ar athshocrú pasfhocail' + lost_password_plain: + greeting: A chara, + hopefully_you: D'iarr duine éigin (tusa, b'fhéidir) go ndéanfaí an pasfhocal + a athshocrú ar an gcuntas openstreetmap.org atá ceangailte leis an seoladh + ríomhphoist seo. + click_the_link: Más tusa a bhí ann, cliceáil ar an nasc thíos chun do phasfhocal + a athshocrú. + lost_password_html: + greeting: A chara, + hopefully_you: D'iarr duine éigin (tusa, b'fhéidir) go ndéanfaí an pasfhocal + a athshocrú ar an gcuntas openstreetmap.org atá ceangailte leis an seoladh + ríomhphoist seo. + click_the_link: Más tusa a bhí ann, cliceáil ar an nasc thíos chun do phasfhocal + a athshocrú. + note_comment_notification: + anonymous: Úsáideoir gan ainm + greeting: A chara, + commented: + subject_own: '[OpenStreetMap] D''fhág %{commenter} nóta tráchta ar cheann + de na nótaí atá agat' + subject_other: '[OpenStreetMap] D''fhág %{commenter} nóta tráchta ar nóta + a bhfuil suim agat ann' + your_note: D'fhág %{commenter} nóta tráchta ar cheann de na nótaí léarscáile + atá agat in aice le %{place}. + commented_note: D'fhág %{commenter} nóta tráchta ar nóta léarscáile ar fhág + tú nóta tráchta faoi. Tá an nóta gar do %{place}. + closed: + subject_own: '[OpenStreetMap] Réitigh %{commenter} ceann de do chuid nótaí' + subject_other: '[OpenStreetMap] Réitigh %{commenter} nóta a bhfuil suim agat + ann' + your_note: 'Réitigh %{commenter} ceann de na nótaí léarscáile atá agat gar + don áit seo: %{place}.' + commented_note: 'Réitigh %{commenter} nóta léarscáile ar fhág tú nóta tráchta + faoi. Tá an nóta gar don áit seo: %{place}.' + reopened: + subject_own: '[OpenStreetMap] D''athoscail %{commenter} ceann de do chuid + nótaí' + subject_other: '[OpenStreetMap] D''athoscail %{commenter} nóta a bhfuil suim + agat ann' + your_note: 'D''athoscail %{commenter} ceann de na nótaí léarscáile atá agat + gar don áit seo: %{place}.' + commented_note: 'D''athoscail %{commenter} nóta léarscáile ar fhág tú nóta + tráchta faoi. Tá an nóta gar don áit seo: %{place}.' + details: Tá tuilleadh sonraí faoin nóta ar fáil ag %{url}. + changeset_comment_notification: + greeting: A chara, + commented: + subject_own: '[OpenStreetMap] D''fhág %{commenter} nóta tráchta ar cheann + de na tacair athruithe atá agat' + subject_other: '[OpenStreetMap] D''fhág %{commenter} nóta tráchta ar thacar + athruithe a bhfuil suim agat ann' + your_changeset: D'fhág %{commenter} nóta tráchta ar thacar athruithe atá agat + a cruthaíodh ag %{time} + commented_changeset: D'fhág %{commenter} nóta tráchta ar thacar athruithe + léarscáile a bhfuil tú ag faire air a chruthaigh %{changeset_author} ag + %{time} + partial_changeset_with_comment: a bhfuil an nóta tráchta '%{changeset_comment}' + ag gabháil leis + partial_changeset_without_comment: nach bhfuil nóta tráchta ag gabháil leis + details: Tá tuilleadh sonraí faoin tacar athruithe ar fáil ag %{url}. + message: + inbox: + title: Bosca isteach + my_inbox: Mo Bhosca Isteach + outbox: bosca amach + messages: Tá %{new_messages} agus %{old_messages} agat. + new_messages: + one: '%{count} theachtaireacht amháin' + few: '%{count} theachtaireacht nua' + many: '%{count} dteachtaireacht nua' + other: '%{count} teachtaireacht nua' + old_messages: + one: '%{count} sheanteachtaireacht' + few: '%{count} seanteachtaireacht' + many: '%{count} seanteachtaireacht nua' + other: '%{count} seanteachtaireacht' + from: Ó + subject: Ábhar + date: Dáta + no_messages_yet: Níl aon teachtaireacht agat fós. Nach smaoineofá ar theagmháil + a dhéanamh le roinnt de na %{people_mapping_nearby_link}? + people_mapping_nearby: daoine atá i mbun léarscáilithe in aice láimhe + message_summary: + unread_button: Marcáil neamhléite + read_button: Marcáil léite + reply_button: Freagair + delete_button: Scrios + new: + title: Seol teachtaireacht + send_message_to: Teachtaireacht nua a sheoladh chuig %{name} + subject: Ábhar + body: Corp + send_button: Seol + back_to_inbox: Siar chuig an mbosca isteach + message_sent: Seoladh an teachtaireacht + limit_exceeded: Tá go leor teachtaireachtaí seolta agat le déanaí. Fan píosa + sula ndéanfaidh tú iarracht tuilleadh a sheoladh. + no_such_message: + title: Níl teachtaireacht den sórt sin ann + heading: Níl teachtaireacht den sórt sin ann + body: Ár leithscéil, níl teachtaireacht ann a bhfuil an ID sin aici. + outbox: + title: Bosca amach + my_inbox: Mo %{inbox_link} + inbox: bhosca isteach + outbox: bhosca amach + messages: + one: Tá %{count} teachtaireacht seolta amháin agat + other: Tá %{count} teachtaireacht seolta agat + to: Chuig + subject: Ábhar + date: Dáta + no_sent_messages: Níl aon teachtaireacht seolta agat fós. Nach smaoineofá ar + theagmháil a dhéanamh le roinnt de na %{people_mapping_nearby_link}? + people_mapping_nearby: daoine atá i mbun léarscáilithe in aice láimhe + reply: + wrong_user: Tá tú logáilte isteach mar '%{user}' ach níor seoladh an teachtaireacht + atá tú ag iarraidh freagra a thabhairt uirthi chuig an úsáideoir sin. Logáil + isteach mar an t-úsáideoir ceart chun freagra a thabhairt. + read: + title: Léigh an teachtaireacht + from: Ó + subject: Ábhar + date: Dáta + reply_button: Freagair + unread_button: Marcáil neamhléite + back: Ar ais + to: Chuig + wrong_user: Tá tú logáilte isteach mar '%{user}' ach níor seoladh an teachtaireacht + atá tú ag iarraidh léamh chuig an úsáideoir sin agus ní hé a sheol é ach an + oiread. Logáil isteach mar an t-úsáideoir ceart chun é a léamh. + sent_message_summary: + delete_button: Scrios + mark: + as_read: Teachtaireacht marcáilte mar léite + as_unread: Teachtaireacht marcáilte mar neamhléite + delete: + deleted: Teachtaireacht scriosta + site: + index: + js_1: Tá tú ag úsáid brabhsálaí nach dtacaíonn le JavaScript, é sin nó tá JavaScript + díchumasaithe agat. + js_2: Baineann OpenStreetMap úsáid as JavaScript dá léarscáil 'slippy' (léarscáil + ghréasáin bunaithe ar thíleanna). + permalink: Buan-nasc + shortlink: Nasc gearr + createnote: Cuir nóta leis + license: + copyright: Cóipcheart OpenStreetMap agus rannchuiditheoirí, faoi cheadúnas + oscailte + remote_failed: Theip ar eagarthóireacht - déan cinnte go bhfuil JOSM nó Merkaartor + lódáilte agus go bhfuil an rogha 'cianrialú' cumasaithe + edit: + not_public: Níl do chuid athruithe socraithe mar athruithe poiblí agat. + not_public_description: Ní féidir leat an léarscáil a chur in eagar a thuilleadh + mura ndéanfaidh tú sin. Is féidir leat do chuid athruithe a shocrú mar athruithe + poiblí ar do %{user_page}. + user_page_link: leathanach úsáideora + anon_edits_link_text: Faigh amach cén fáth ar amhlaidh atá. + flash_player_required: Beidh seinnteoir Flash ag teastáil uait chun Potlatch, + eagarthóir Flash OpenStreetMap, a úsáid. Is féidir leat <a href="http://www.adobe.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash">Seinnteoir + Flash a íoslódáil ó Adobe.com</a>. <a href="http://wiki.openstreetmap.org/wiki/Editing">Tá + cúpla rogha eile</a> ar fáil eagarthóireacht a dhéanamh ar OpenStreetMap. + potlatch_unsaved_changes: Tá athruithe nár sábháladh déanta agat. (Chun sábháil + i bPotlatch, ba cheart duit an bealach nó poine reatha a dhíroghnú, má tá + tú i mbun eagarthóireachta sa mhód beo, nó cliceáil ar sábháil má tá cnaipe + sábhála le feiceáil). + potlatch2_not_configured: Níor cumraíodh Potlatch 2 - féach http://wiki.openstreetmap.org/wiki/The_Rails_Port#Potlatch_2 + chun tuilleadh eolais a fháil + potlatch2_unsaved_changes: Tá athruithe nár sábháladh déanta agat. (Chun sábháil + a dhéanamh i bPotlatch2 , ba chóir duit cliceáil ar 'sábháil'. + id_not_configured: Níor cumraíodh iD + no_iframe_support: Ní thacaíonn do bhrabhsálaí leis an ngné 'iframe' de chuid + HTML, rud atá riachtanach don ghné seo. + sidebar: + search_results: Torthaí an chuardaigh + close: Dún + search: + search: Cuardaigh + get_directions: Treoracha a fháil + get_directions_title: Treoracha a aimsiú idir dhá phointe + from: Ó + to: Chuig + where_am_i: Cá bhfuil mé? + where_am_i_title: Cur síos a dhéanamh ar an suíomh reatha leis an inneall cuardaigh + submit_text: Gabh + key: + table: + entry: + motorway: Mótarbhealach + main_road: Príomhbhóthar + trunk: Mórbhóthar + primary: Príomhbhóthar + secondary: Fobhóthar + unclassified: Bóthar neamhaicmithe + track: Cosán + bridleway: Cosán marcaíochta + cycleway: Slí rothar + cycleway_national: Slí rothar náisiúnta + cycleway_regional: Slí rothar réigiúnach + cycleway_local: Slí rothar áitiúil + footway: Cosán + rail: Iarnród + subway: Meitreo + tram: + - Iarnród Éadrom + - tram + cable: + - Carr cábla + - cathaoir chábla + runway: + - Rúidbhealach Aerfoirt + - bealach innealta + apron: + - Naprún Aerfoirt + - críochfort + admin: Teorainn riaracháin + forest: Foraois + wood: Coill + golf: Galfchúrsa + park: Páirc + resident: Ceantar cónaithe + common: + - Coimín + - móinéar + retail: Limistéar miondíola + industrial: Limistéar tionsclaíoch + commercial: Limistéar tráchtála + heathland: Móinteach/fraochmhá + lake: + - Loch + - taiscumar + farm: Feirm + brownfield: Láithreán athfhorbraíochta + cemetery: Reilig + allotments: Cuibhrinn + pitch: Páirc spóirt + centre: Ionad spóirt + reserve: Tearmann dúlra + military: Limistéar míleata + school: + - Scoil + - ollscoil + building: Foirgneamh suntasach + station: Stáisiún Iarnróid + summit: + - Mullach + - binn + tunnel: Líne bhriste = tollán + bridge: Líne dhubh = droichead + private: Rochtain phríobháideach + destination: Rochtain ar cheann scríbe + construction: Bóithre á dtógáil + bicycle_shop: Siopa rothar + bicycle_parking: Páirceáil do rothair + toilets: Leithreas + richtext_area: + edit: Cuir in eagar + preview: Réamhamharc + markdown_help: + title_html: Parsáilte le <a href="http://daringfireball.net/projects/markdown/">Markdown</a> + headings: Ceannteidil + heading: Ceannteideal + subheading: Fotheideal + unordered: Liosta gan ord + ordered: Liosta in ord + first: An chéad mhír + second: An dara mír + link: Nasc + text: Téacs + image: Íomhá + alt: Téacs malartach + url: URL + trace: + visibility: + private: Príobháideacha (ní chomhroinnfear é ach mar phointí gan ainm, gan ord) + public: Poiblí (taispeánfar é i liosta na lorg agus mar phointí gan ainm, gan + ord) + trackable: Inrianta (ní chomhroinnfear é ach mar phointí gan ainm, in ord, agus + stampaí ama acu) + identifiable: Inaitheanta (taispeánfar é i liosta na lorg agus mar phointí inaitheanta, + in ord, agus stampaí ama acu) + create: + upload_trace: Lorg GPS a Uaslódáil + edit: + title: Lorg %{name} á chur in eagar + heading: Lorg %{name} á chur in eagar + filename: 'Comhadainm:' + download: íoslódáil + uploaded_at: 'Uaslódáilte:' + points: 'Pointí:' + start_coord: 'Comhordanáid thosaigh:' + map: léarscáil + edit: cuir in eagar + owner: 'Úinéir:' + description: 'Cur síos:' + tags: 'Clibeanna:' + tags_help: teormharcáilte le camóga + save_button: Sábháil na hAthruithe + visibility: 'Infheictheacht:' + visibility_help: céard a chiallaíonn seo? + trace_form: + upload_gpx: 'Comhad GPX a Uaslódáil:' + description: 'Cur síos:' + tags: 'Clibeanna:' + tags_help: teormharcáilte le camóga + visibility: 'Infheictheacht:' + visibility_help: céard a chiallaíonn seo? + upload_button: Uaslódáil + help: Cabhair + trace_header: + upload_trace: Lorg a uaslódáil + see_all_traces: Féach gach lorg + see_your_traces: Na loirg uaitse a fheiceáil + trace_optionals: + tags: Clibeanna + view: + title: Amharc ar lorg %{name} + heading: Amharc ar lorg %{name} + pending: AR FEITHEAMH + filename: 'Comhadainm:' + download: íoslódáil + uploaded: 'Uaslódáilte:' + points: 'Pointí:' + start_coordinates: 'Comhordanáid thosaigh:' + map: léarscáil + edit: cuir in eagar + owner: 'Úinéir:' + description: 'Cur síos:' + tags: 'Clibeanna:' + none: Tada + edit_track: Cuir an rian seo in eagar + delete_track: Scrios an rian seo + trace_not_found: Níor aimsíodh an rian! + visibility: 'Infheictheacht:' + trace_paging_nav: + showing_page: Leathanach %{page} + older: Loirg Níos Sine + newer: Loirg Níos Úire + trace: + pending: AR FEITHEAMH + count_points: '%{count} pointe' + ago: '%{time_in_words_ago} ó shin' + more: tuilleadh + trace_details: Amharc ar Shonraí an Loirg + view_map: Amharc ar an Léarscáil + edit: cuir in eagar + edit_map: Cuir an Léarscáil in Eagar + public: POIBLÍ + identifiable: IN-AITHEANTA + private: PRÍOBHÁIDEACH + trackable: INRIANAITHE + by: ag + in: in + map: léarscáil + list: + public_traces: Loirg GPS phoiblí + your_traces: Na loirg GPS uaitse + public_traces_from: Loirg GPS phoiblí ó %{user} + description: Brabhsáil loirg GPS a uaslódáladh le déanaí + tagged_with: a bhfuil na clibeanna %{tags} acu + empty_html: Níl aon rud anseo fós. <a href='%{upload_link}'>Uaslódáil lorg nua</a> + nó is féidir tuilleadh a fhoghlaim faoi lorgú GPS ar an <a href='http://wiki.openstreetmap.org/wiki/Beginners_Guide_1.2'>leathanach + vicí</a>. + delete: + scheduled_for_deletion: Lorg sceidealta le scriosadh + make_public: + made_public: Lorg curtha ar fáil go poiblí + offline_warning: + message: Níl córas uaslódála na gcomhad GPX ar fáil faoi láthair + offline: + heading: Stóráil GPX As Líne + message: Níl córas uaslódála agus stórála na gcomhad GPX ar fáil faoi láthair + georss: + title: Loirg GPX OpenStreetMap + description: + description_with_count: + one: Comhad GPX a bhfuil %{count} phointe ann ó %{user} + few: Comhad GPX a bhfuil %{count} phointe ann ó %{user}} + many: Comhad GPX a bhfuil %{count} bpointe ann ó %{user}} + other: Comhad GPX a bhfuil %{count} pointe ann ó %{user} + description_without_count: Comhad GPX ó %{user} + application: + require_cookies: + cookies_needed: Is cosúil go bhfuil fianáin díchumasaithe agat - cumasaigh fianáin + i do bhrabhsálaí roimh duit leanúint ar aghaidh. + require_moderator: + not_a_moderator: Is gá duit a bheith i do mhodhnóir chun an gníomh sin a dhéanamh. + setup_user_auth: + blocked: Tá bac curtha ar do rochtain ar an API. Logáil isteach ar an gcomhéadan + gréasáin chun tuilleadh eolais a fháil. + need_to_see_terms: Cuireadh do rochtain ar an API ar fionraí go sealadach. Logáil + isteach ar an gcomhéadan gréasáin le hamharc ar Théarmaí na Rannchuiditheoirí. + Ní gá duit aontú, ach ní mór duit amharc orthu. + oauth: + oauthorize: + title: Rochtain ar do chuntas a údarú + request_access: D'iarr an feidhmchlár %{app_name} rochtain ar do chuntas, %{user}. + Seiceáil ar mhaith leat go mbeadh na cumais seo a leanas ag an bhfeidhmchlár. + Is féidir leat a mhéad nó a laghad acu agus is mian leat a roghnú. + allow_to: 'Ceadaigh don chliant-fheidhmchlár an méid seo a leanas a dhéanamh:' + allow_read_prefs: do shainroghanna úsáideora a léamh. + allow_write_prefs: do shainroghanna úsáideora a athrú. + allow_write_diary: iontrálacha dialainne agus nótaí tráchta a chruthú agus cairde + a dhéanamh. + allow_write_api: an léarscáil a athrú. + allow_read_gpx: do loirg phríobháideacha GPS a léamh. + allow_write_gpx: loirg GPS a uaslódáil. + allow_write_notes: nótaí a athrú. + grant_access: Tabhar an Rochtain + oauthorize_success: + title: Ceadaíodh an t-iarratas ar údarú + allowed: Thug tú rochtain ar do chuntas don fheidhmchár %{app_name}. + verification: Is é %{code} an cód fíorúcháin. + oauthorize_failure: + title: Theip ar an iarratas ar údarú + denied: Dhiúltaigh tú rochtain ar do chuntas don fheidhmchár %{app_name}. + invalid: Níl an ceadchomhartha bailí. + revoke: + flash: Tharraing tú siar an ceadchomhartha le haghaidh %{application} + oauth_clients: + new: + title: Iarratas nua a chlárú + submit: Cláraigh + edit: + title: D'iarratas a chur in eagar + submit: Cuir in eagar + show: + title: Sonraí OAuth le haghaidh %{app_name} + key: 'Eochair an Íditheora:' + secret: 'Rún an Íditheora:' + url: 'URL Cheadchomhartha an Iarratais:' + access_url: 'URL Cheadchomhartha na Rochtana:' + authorize_url: 'URL an Údaraithe:' + support_notice: Tacaímid le síniú HMAC-SHA1 (molta) agus síniú RSA-SHA1. + edit: Cuir Sonraí in Eagar + delete: Scrios Cliant + confirm: An bhfuil tú cinnte? + requests: 'Na ceadanna seo a leanas á n-iarraidh ón úsáideoir:' + allow_read_prefs: a s(h)ainroghanna úsáideora a léamh. + allow_write_prefs: a s(h)ainroghanna úsáideora a athrú. + allow_write_diary: iontrálacha dialainne agus nótaí tráchta a chruthú agus cairde + a dhéanamh. + allow_write_api: an léarscáil a athrú. + allow_read_gpx: a loirg phríobháideacha GPS a léamh. + allow_write_gpx: loirg GPS a uaslódáil. + allow_write_notes: nótaí a athrú. + index: + title: Mo Shonraí OAuth + my_tokens: Na Feidhmchláir atá údaraithe agam + list_tokens: 'Eisíodh na ceadchomharthaí seo a leanas faoi d''ainm chuig feidhmchláir:' + application: Ainm an Fheidhmchláir + issued_at: Eisithe Ag + revoke: Tarraing siar! + my_apps: Na Cliant-fheidhmchláir atá agam + no_apps: An bhfuil feidhmchlár agat ar mhaith leat a chlárú lena úsáid linn + leis an gcaighdeán %{oauth}? Ní mór duit d'fheidhmchlár gréasáin a chlárú + sula féidir leis iarrataí OAuth a dhéanamh chuig an tseirbhís seo. + registered_apps: 'Tá na cliant-fheidhmchláir seo a leanas cláraithe agat:' + register_new: D'fheidhmchlár a chlárú + form: + name: Ainm + required: Ag teastáil + url: URL an Phríomh-Fheidhmchláir + callback_url: URL Aisghlaoigh + support_url: URL Tacaíochta + requests: 'Na ceadanna seo a leanas a iarraidh ón úsáideoir:' + allow_read_prefs: a s(h)ainroghanna úsáideora a léamh. + allow_write_prefs: a s(h)ainroghanna úsáideora a athrú. + allow_write_diary: iontrálacha dialainne agus nótaí tráchta a chruthú agus cairde + a dhéanamh. + allow_write_api: an léarscáil a athrú. + allow_read_gpx: a loirg phríobháideacha GPS a léamh. + allow_write_gpx: loirg GPS a uaslódáil. + allow_write_notes: nótaí a athrú. + not_found: + sorry: Ár leithscéil, níorbh fhéidir an %{type} sin a aimsiú. + create: + flash: Cláraíodh an fhaisnéis + update: + flash: Tugadh an fhaisnéis faoin gcliant cothrom le dáta + destroy: + flash: Scriosadh clárú an chliant-fheidhmchláir + user: + login: + title: Logáil isteach + heading: Logáil isteach + email or username: 'Seoladh Ríomhphoist nó Ainm Úsáideora:' + password: 'Focal Faire:' + openid: '%{logo} OpenID:' + remember: Cuimhnigh orm + lost password link: Focal faire caillte agat? + login_button: Logáil isteach + register now: Cláraigh anois + with username: 'Má tá cuntas OpenStreetMap agat cheana féin logáil isteach leis + an ainm úsáideora agus pasfhocal atá agat:' + with external: 'Nó, bain úsáid as tríú páirtí le logáil isteach:' + new to osm: Nua ar OpenStreetMap? + to make changes: Chun athruithe a dhéanamh ar shonraí OpenStreetMap, ní mór + duit cuntas a bheith agat. + create account minute: Is féidir cuntas a chruthú, ní thógfaidh sé ach nóiméad + ort. + no account: Níl cuntas agat? + auth failure: Ár leithscéil, níorbh fhéidir logáil isteach leis na sonraí sin. + openid_logo_alt: Logáil isteach le OpenID + auth_providers: + openid: + title: Logáil isteach le OpenID + alt: Logáil isteach le URL OpenID + google: + title: Logáil isteach le Google + alt: Logáil isteach le OpenID Google + facebook: + title: Logáil isteach le Facebook + alt: Logáil isteach le Cuntas Facebook + windowslive: + title: Logáil isteach le Windows Live + alt: Logáil isteach le Cuntas Windows Live + github: + title: Logáil isteach le GitHub + alt: Logáil isteach le Cuntas GitHub + wikipedia: + title: Logáil isteach le Vicipéid + alt: Logáil isteach le Cuntas Vicipéid + yahoo: + title: Logáil isteach le Yahoo + alt: Logáil isteach le OpenID Yahoo + wordpress: + title: Logáil isteach le Wordpress + alt: Logáil isteach le OpenID Wordpress + aol: + title: Logáil isteach le AOL + alt: Logáil isteach le OpenID AOL + logout: + title: Logáil amach + heading: Logáil amach as OpenStreetMap + logout_button: Logáil amach + lost_password: + title: Focal faire caillte + heading: Focal Faire Caillte? + email address: 'Seoladh ríomhphoist:' + new password button: Athshocraigh an focal faire + help_text: Iontráil an seoladh ríomhphoist a d'úsáid tú le clárú, agus seolfaimid + nasc chugat a bheidh tú in ann a úsáid chun do phasfhocal a athshocrú. + notice email on way: Is oth linn gur chaill tú é :-( ach tá ríomhphost ar an + mbealach chugat le go mbeidh tú in ann é a athshocrú go luath. + notice email cannot find: Níorbh fhéidir an seoladh ríomhphoist sin a aimsiú, + ár leithscéil faoi sin. + reset_password: + title: Focal faire a athshocrú + heading: Focal Faire le haghaidh %{user} a Athshocrú + password: 'Focal Faire:' + confirm password: 'Deimhnigh an Focal Faire:' + reset: Athshocraigh an Focal Faire + flash changed: Athraíodh d'fhocal faire. + flash token bad: Níor aimsíodh an ceadchomhartha sin, seiceáil an bhfuil an + URL cruinn? + new: + title: Clárú + no_auto_account_create: Ar an drochuair ní féidir linn cuntas a chruthú duit + go huathoibríoch i láthair na huaire. + contact_webmaster: Déan teagmháil leis an <a href="%{webmaster}">máistir gréasáin</a> + chun socrú a dhéanamh cuntas a chruthú - déanfaimid gach iarracht déileáil + leis an iarratas chomh scioptha agus is féidir. + about: + header: Saor in aisce agus oscailte don eagarthóireacht + email address: 'Seoladh ríomhphoist:' + confirm email address: 'Deimhnigh an Seoladh Ríomhphoist:' + not displayed publicly: Ní thaispeáintear do sheoladh go poiblí, féach an <a + href="http://wiki.osmfoundation.org/wiki/Privacy_Policy" title="OSMF privacy + policy including section on email addresses">polasaí príobháideachta</a> atá + againn chun tuilleadh eolais a fháil + display name: 'Ainm Taispeána:' + display name description: An t-ainm úsáideora atá agat a thaispeántar go poiblí. + Is féidir leat é seo a athrú níos moille sna sainroghanna. + external auth: 'Fíordheimhniú Tríú Páirtí:' + password: 'Focal Faire:' + confirm password: 'Deimhnigh an Focal Faire:' + use external auth: Nó, bain úsáid as tríú páirtí le logáil isteach + continue: Cláraigh + terms: + consider_pd_why: céard é seo? + agree: Glac leis + decline: Diúltaigh + legale_select: 'Tír chónaithe:' + legale_names: + france: An Fhrainc + italy: An Iodáil + rest_of_world: An chuid eile den Domhan + no_such_user: + deleted: scriosta + view: + my diary: Mo Dhialann + new diary entry: iontráil nua dialainne + my edits: Mo Athruithe + my traces: Loirg uaimse + my notes: Mo Nótaí + my messages: Mo Theachtaireachtaí + my profile: Mo Phróifíl + my settings: Mo Shocruithe + my comments: Mo Nótaí Tráchta + oauth settings: socruithe oauth + blocks on me: Baic Orm + blocks by me: Baic a Rinne Mé + send message: Seol an Teachtaireacht + diary: Dialann + edits: Athruithe + traces: Loirg + notes: Nótaí Léarscáile + remove as friend: Bris cairdeas + add as friend: Cuir Cara Leis + mapper since: 'Ag léarscáiliú ó:' + ago: (%{time_in_words_ago} ó shin) + ct status: 'Téarmaí do rannchuiditheoirí:' + ct declined: Diúltaithe + ct accepted: Glactha leis %{ago} ó shin + latest edit: 'Athrú is déanaí %{ago}:' + email address: 'Seoladh ríomhphoist:' + created from: 'Cruthaithe ó:' + status: 'Stádas:' + spam score: 'Scór Turscair:' + description: Cur síos + user location: Suíomh an úsáideora + settings_link_text: na socruithe + your friends: Do chairde + km away: '%{count} km uait' + m away: '%{count} m uait' + nearby users: Úsáideoirí eile in aice láimhe + role: + administrator: Is riarthóir é an t-úsáideoir seo + moderator: Is áisitheoir é an t-úsáideoir seo + block_history: Baic Ghníomhacha + moderator_history: Baic a Tugadh + comments: 'Nótaí tráchta:' + create_block: Cuir bac ar an Úsáideoir seo + confirm: Deimhnigh + popup: + friend: Cara + account: + my settings: Mo chuid socruithe + email never displayed publicly: (nach dtaispeántar go poiblí riamh) + external auth: 'Fíordheimhniú Seachtrach:' + openid: + link: http://wiki.openstreetmap.org/wiki/OpenID + link text: céard é seo? + public editing: + enabled link text: céard é seo? + contributor terms: + heading: 'Téarmaí do Rannchuiditheoirí:' + agreed: D'aontaigh tú leis na Téarmaí nua do Rannchuiditheoirí. + not yet agreed: Níor aontaigh tú leis na Téarmaí nua do Rannchuiditheoirí + fós. + link text: céard é seo? + preferred languages: 'Teangacha is fearr leat:' + preferred editor: 'An tEagarthóir is fearr leat:' + image: 'Íomhá:' + gravatar: + gravatar: Úsáid Gravatar + link text: céard é seo? + disabled: Díchumasaíodh Gravatar. + new image: Cuir íomhá leis + keep image: Coinnigh an íomhá reatha + delete image: Bain an íomhá reatha + replace image: Ionadaigh an íomhá reatha + image size hint: (íomhá chearnógach atá 100x100 ar a laghad is fearr) + home location: 'Suíomh Baile:' + latitude: 'Domhanleithead:' + longitude: 'Domhanfhad:' + save changes button: Sábháil na hAthruithe + confirm: + heading: Féach sna ríomhphoist! + introduction_1: Tá ríomhphost chun é a dheimhniú seolta chugat againn. + introduction_2: Deimhnigh do chuntas trí chliceáil ar an nasc sa ríomhphost + agus beidh tú in ann tosú ar léirscáiliú a dhéanamh. + confirm_resend: + failure: Níor aimsíodh an t-úsáideoir %{name}. + list: + title: Úsáideoirí + heading: Úsáideoirí + suspended: + webmaster: máisitir gréasáin + user_role: + revoke: + confirm: Deimhnigh + user_block: + new: + submit: Cruthaigh bac + needs_view: Ní mór don úsáideoir logáil isteach sula mbainfear an bac seo + edit: + needs_view: An gá don úsáideoir logáil isteach sula mbainfear an bac seo? + revoke: + confirm: An bhfuil tú cinnte gur mhaith leat an bac seo a tharraingt siar? + revoke: Tarraing siar! + flash: Tarraingíodh an bac seo siar. + period: + one: uair amháin an chloig + other: '%{count} uair an chloig' + partial: + show: Taispeáin + edit: Cuir in Eagar + revoke: Tarraing siar! + confirm: An bhfuil tú cinnte? + display_name: Úsáideoir Bactha + creator_name: Cruthaitheoir + reason: Cúis don bhac + status: Stádas + revoker_name: Tarraingthe siar ag + not_revoked: (nár tarraingíodh siar) + showing_page: Leathanach %{page} + next: Ar aghaidh » + previous: « Roimhe + show: + show: Taispeáin + confirm: An bhfuil tú cinnte? + needs_view: Ní mór don úsáideoir logáil isteach sula nglanfar an bac seo. + note: + rss: + description_item: Fotha RSS don nóta %{id} + opened: 'nóta nua (gar do: %{place})' + commented: 'nóta tráchta nua (gar do: %{place})' + closed: 'nóta dúnta (gar do: %{place})' + reopened: 'nóta athoscailte (gar do: %{place})' + entry: + comment: Nóta tráchta + full: An nóta iomlán + mine: + id: ID + last_changed: Athrú deireanach + ago_html: '%{when} ó shin' + javascripts: + close: Dún + share: + title: Comhroinn + cancel: Cuir ar ceal + image: Íomhá + link: Nasc nó HTML + long_link: Nasc + short_link: Nasc Gearr + geo_uri: Geo-URI + embed: HTML + format: 'Formáid:' + scale: 'Scála:' + download: Íoslódáil + short_url: URL Gearr + embed: + report_problem: Tuairiscigh fadhb + key: + title: Eochair na Léarscáile + tooltip: Eochair na Léarscáile + map: + zoom: + in: Zúmáil isteach + out: Zúmáil amach + locate: + title: Taispeáin mo shuíomh + popup: Tá tú laistigh de {distance} {unit} den phointe seo + base: + standard: Caighdeánach + cycle_map: Léarscáil Rothaíochta + transport_map: Léarscáil Iompair + hot: Daonnúil + layers: + header: Sraitheanna Léarscáile + notes: Nótaí Léarscáile + data: Sonraí Léarscáile + title: Sraitheanna + copyright: © <a href='%{copyright_url}'>Rannchuiditheoirí OpenStreetMap</a> + donate_link_text: <a class='donate-attr' href='%{donate_url}'>Tabhair síntiús + airgid</a> + site: + edit_disabled_tooltip: Zúmáil isteach chun an léarscáil a chur in eagar + createnote_disabled_tooltip: Zúmáil isteach chun nóta a chur leis an léarscáil + map_notes_zoom_in_tooltip: Zúmáil isteach chun nótaí léarscáile a fheiceáíl + map_data_zoom_in_tooltip: Zúmáil isteach chun sonraí na léarscáile a fheiceáil + queryfeature_tooltip: Gnéithe a fhiosrú + queryfeature_disabled_tooltip: Zúmáil isteach chun gnéithe a fhiosrú + changesets: + show: + comment: Fág nóta tráchta + subscribe: Liostáil + unsubscribe: Díliostáil + hide_comment: folaigh + unhide_comment: dífholaigh + notes: + new: + add: Cuir Nóta Leis + show: + comment: Déan nóta tráchta + edit_help: Bog an léarscáil agus zúmáil isteach ar áit is mian leat a chur in + eagar, ansin cliceáil anseo. + directions: + engines: + graphhopper_bicycle: Rothar (GraphHopper) + graphhopper_foot: Ag Siúl (GraphHopper) + mapquest_bicycle: Rothar (MapQuest) + mapquest_car: Carr (MapQuest) + mapquest_foot: Ag Siúl (MapQuest) + osrm_car: Carr (OSRM) + mapzen_bicycle: Rothar (Mapzen) + mapzen_car: Carr (Mapzen) + mapzen_foot: Ag siúl (Mapzen) + directions: Treoracha + distance: Fad + errors: + no_route: Níorbh fhéidir bealach a aimsiú idir an dhá áit sin. + no_place: Ár leithscéil - níorbh fhéidir an áit sin aimsiú. + instructions: + continue_without_exit: Lean ar aghaidh ar %{name} + slight_right_without_exit: Beagán ar dheis go %{name} + turn_right_without_exit: Cas ar dheis agus tóg %{name} + sharp_right_without_exit: Casadh géar ar dheis go %{name} + uturn_without_exit: U-chasadh feadh %{name} + sharp_left_without_exit: Casadh géar ar chlé go %{name} + turn_left_without_exit: Cas ar chlé agus tóg %{name} + slight_left_without_exit: Beagán ar chlé go %{name} + via_point_without_exit: (tríd an bpointe) + follow_without_exit: Lean %{name} + roundabout_without_exit: Ag an timpeallán tóg %{name} + leave_roundabout_without_exit: Fág an timpeallán - %{name} + stay_roundabout_without_exit: Fan ar an timpeallán - %{name} + start_without_exit: Tosaigh ag deireadh %{name} + destination_without_exit: Ceann scríbe baint amach + against_oneway_without_exit: Téigh i gcoinne treo an aontreo ar %{name} + end_oneway_without_exit: Deireadh an aontreo ar %{name} + roundabout_with_exit: Ag an timpeallán, tóg bealach amach %{exit} go %{name} + unnamed: bóthar gan ainm + courtesy: Treoracha le caoinchead %{link} + time: Am + query: + node: Nód + way: Bealach + relation: Gaol + error: 'Earráid ag dul i dteagmháil le %{server}: %{error}' + timeout: Am istigh ag déanamh teagmhála le %{server} + redaction: + edit: + description: Cur síos + show: + title: Ceilt á taispeáint + user: 'Cruthaitheoir:' + edit: Cuir an cheilt seo in eagar + destroy: Bain an cheilt seo + confirm: An bhfuil tú cinnte? + create: + flash: Cruthaíodh ceilt. + update: + flash: Sábháladh na hathruithe. + destroy: + not_empty: Níl an cheilt folamh. Bain an cheilt de gach leagan lena mbaineann + an cheilt seo sula scriosfaidh tú í. + flash: Scriosadh an cheilt. + error: Tharla earráid agus an cheilt seo á scriosadh. +... diff --git a/config/locales/gd.yml b/config/locales/gd.yml index 9d47a1698..261bee3eb 100644 --- a/config/locales/gd.yml +++ b/config/locales/gd.yml @@ -1,7 +1,9 @@ # Messages for Scottish Gaelic (Gàidhlig) # Exported from translatewiki.net # Export driver: phpyaml +# Author: Akerbeltz # Author: GunChleoc +# Author: Macofe --- gd: html: @@ -185,8 +187,8 @@ gd: relation: dhen dàimh seo start_rjs: feature_warning: '''S dòcha gum fàs am brabhsair agad slaodach no cha mhòr nach - dèan e dad tuilleadh on a tha thu a'' luchdadh %{num_features} feart. A bheil - thu cinnteach gu bheil thu airson an dàta seo a shealltainn?' + dèan e dad tuilleadh on a tha thu a'' luchdadh %{num_features} gleus(an). + A bheil thu cinnteach gu bheil thu airson an dàta seo a shealltainn?' load_data: Luchdaich an dàta loading: '''Ga luchdadh...' tag_details: @@ -221,7 +223,7 @@ gd: chionn %{when}</abbr> hidden_by: Chaidh fhalach le %{user} <abbr title='%{exact_time}'>o chionn %{when}</abbr> query: - title: Lorg airson feartan sònraichte + title: Lorg feartan sònraichte introduction: Briog air a' mhapa gus feartan faisg air a lorg. nearby: Feartan am fagas enclosing: Feartan timcheall air @@ -1006,9 +1008,10 @@ gd: mapping_link: tòiseachadh air an obair-mhapa legal_babble: title_html: Còir-lethbhreac agus ceadachas - intro_1_html: '''S e <i>dàta fosgailte</i> a tha san OpenStreetMap fo cheadachas - <a href="http://opendatacommons.org/licenses/odbl/">Open Data Commons Open - Database License</a> (ODbL).' + intro_1_html: '''S e <i>dàta fosgailte</i> a tha san OpenStreetMap<sup><a href="#trademarks">®</a></sup> + fo cheadachas <a href="http://opendatacommons.org/licenses/odbl/">Open Data + Commons Open Database License</a> (ODbL) le <a href="http://osmfoundation.org/">Fonndas + OpenStreetMap</a> (OSMF).' intro_2_html: |- Faodaidh tu lethbhreacan a dhèanamh dhen dàta againn, a sgaoileadh, a thar-chur agus atharrachadh gu saor, cho fad 's a bheir thu urram @@ -1047,12 +1050,12 @@ gd: more_title_html: Barrachd fiosrachaidh more_1_html: |- Leugh barrachd air mar a chleachdas tu an dàta againn agus mar a - bheir thu urram dhuinn air na <a href="http://wiki.openstreetmap.org/wiki/Legal_FAQ">CÀBHA laghail</a>. + bheir thu urram dhuinn air <a href="http://osmfoundation.org/Licence">duilleag a' cheadachais OSMF</a> agus <a href="http://wiki.openstreetmap.org/wiki/Legal_FAQ">CÀBHA laghail</a> sa choimhearsnachd. more_2_html: |- - Ged as e dàta saor a tha san OpenStreetMap, chan urrainn dhuinn API mapa an-asgaidh a thoirt dhan luchd-leasachaidh treas phàrtaidh. - Faic <a href="http://wiki.openstreetmap.org/wiki/API_usage_policy">Poileasaidh cleachdadh an API</a>, - <a href="http://wiki.openstreetmap.org/wiki/Tile_usage_policy">Poileasaidh cleachdadh nan leacan</a> - agus <a href="http://wiki.openstreetmap.org/wiki/Nominatim#Usage_Policy">Poileasaidh cleachdadh Nominatim</a> againn. + Ged as e dàta saor a tha san OpenStreetMap, chan urrainn dhuinn API mapa an-asgaidh a thoirt do threas-phàrtaidhean. + Faic <a href="https://operations.osmfoundation.org/policies/api/">poileasaidh cleachdadh an API</a>, + <a href="https://operations.osmfoundation.org/policies/tiles/">poileasaidh cleachdadh nan leacagan</a> + agus <a href="https://operations.osmfoundation.org/policies/nominatim/">poileasaidh cleachdadh Nominatim</a> againn. contributors_title_html: Na co-thabhartaicheean againn contributors_intro_html: |- 'S e mìltean de dhaoine a tha sna co-thabhartaichean againn. @@ -1114,6 +1117,7 @@ gd: infringement_2_html: |- Ma tha thu dhen bheachd gun deach stuth fo chòir-lethbhreac a chur ri stòr-dàta OpenStreetMap no an làrach-lìn seo ann an dòigh nach eil iomchaidh, thoir sùil air a' <a href="http://www.osmfoundation.org/wiki/License/Takedown_procedure">mhodh toirt air falbh</a> againn no faidhlich e gu dìreach air an <a href="http://dmca.openstreetmap.org/">duilleag faidhlidh air loidhne</a> againn. + trademarks_title_html: <span id="trademarks"></span>Comharran-malairt welcome_page: title: Fàilte! introduction_html: Fàilte gu OpenStreetMap, mapa saor an t-saoghail a ghabhas @@ -1199,7 +1203,7 @@ gd: about_page: next: Air adhart copyright_html: <span>©</span>Co-thabhartaichean<br>OpenStreetMap - used_by: Bheir %{name} dàta mapa dha cheudan de làraichean-lìn, aplacaidean inneil-làimhe + used_by: Bheir %{name} dàta mapa dha mhìltean de làraichean-lìn, aplacaidean inneil-làimhe agus uidheaman bathair-chruaidh lede_text: Tha OpenStreetMap 'ga thogail le coimhearsnachd de luchd-mapachaidh a bheir dàta dhuinn mu rathaidean, slighean cafaidhean, stèiseanan-rèile agus @@ -1426,7 +1430,7 @@ gd: copyright: Còir-lethbhreac OpenStreetMap agus na co-thabhartaichean aige fo cheadachas fosgailte remote_failed: Dh'fhàillig leis an deasachadh - dèan cinnteach gun deach JOSM - no Merkaartor a luchdadh agus gu bheil feart an t-smachd chèin an comas + no Merkaartor a luchdadh agus gu bheil gleus an t-smachd chèin an comas edit: not_public: Cha do cuir thu romhad gum bi na dheasaicheas tu poblach. not_public_description: Chan urrainn dhut am mapa a dheasachadh tuilleadh mus @@ -1471,9 +1475,7 @@ gd: primary: Prìomh-rathad secondary: Rathad dàrnach unclassified: Rathad neo-sheòrsaichte - unsurfaced: Rathad gun uachdar track: Slighe - byway: Seach-rathad bridleway: Ceum marcachd cycleway: Slighe baidhseagail footway: Àrainn-choisichean @@ -1497,7 +1499,6 @@ gd: golf: Raon goilf park: Pàirc resident: Raon-còmhnaidh - tourist: Àite inntinneach common: - Coitcheann - Faiche @@ -1527,7 +1528,6 @@ gd: tunnel: Oir-strìochagan = tunail bridge: Oir-loidhnichean = drochaid private: Cead-inntrigidh prìobhaideach - permissive: Cead-inntrigidh cuingichte destination: Inntrigeadh a' chinn-uidhe construction: Rathaidean 'gan togail richtext_area: @@ -1843,9 +1843,9 @@ gd: title: Clàraich no_auto_account_create: Gu mì-fhortanach, can urrainn dhuinn cunntas a chruthachadh dhut gu fèin-obrachail an-dràsta. - contact_webmaster: Cuir fios gun <a href="mailto:webmaster@openstreetmap.org">mhaighstir-lìn</a> - gus cunntas iarraidh - nì sinn ar dìcheall gun cruthaich sinn fear dhut cho - luath 's a ghabhas. + contact_webmaster: Cuir fios gun <a href="%{webmaster}">mhaighstir-lìn</a> gus + cunntas iarraidh - nì sinn ar dìcheall gun cruthaich sinn fear dhut cho luath + 's a ghabhas. about: header: Saor agus gabhaidh deasachadh html: |- @@ -1870,14 +1870,6 @@ gd: auth no password: Chan iarr sinn facal-faire ort le dearbhadh treas-phàrtaidh ach dh'fhaoidte gum bi innealan a bharrachd no frithealaiche feumach air fear co-dhiù. - auth association: |- - <p>Cha deach an ID agad a nasgadh ri cunntas OpenStreetMap fhathast.</p> - <ul> - <li>Ma tha OpenStreetMap ùr dhut, feuch an cruthaich thu cunntas ùr leis an fhoirm gu h-ìosal.</li> - <li> - Ma tha cunntas agad mar-thà, 's urrainn dhut clàradh a-steach dhan chunntas agad le d' ainm-cleachdaiche 's an fhacal-fhaire agad agus an cunntas a nasgadh ri ID ann an roghainnean a' chleachdaiche agad an uairsin. - </li> - </ul> continue: Clàraich terms accepted: Mòran taing gun do dh'aontaich thu ri teirmichean a' chom-pàirtiche! terms declined: Tha sinn duilich nach do dh'aontaich thu ri teirmichean ùra @@ -1965,16 +1957,16 @@ gd: revoke: administrator: Cùl-ghairm inntrigeadh rianaire moderator: Cùl-ghairm inntrigeadh maoir - block_history: bacaidhean air am faighinn - moderator_history: bacaidhean air an toirt seachad + block_history: Bacaidhean gnìomhach + moderator_history: Bacaidhean air an toirt seachad comments: Beachdan - create_block: bacaich an cleachdaiche seo - activate_user: gnìomhaich an cleachdaiche seo - deactivate_user: cuir an cleachdaiche seo à gnìomh - confirm_user: dearbhaich an cleachdaiche seo - hide_user: falaich an cleachdaiche seo - unhide_user: neo-fhalaich an cleachdaiche seo - delete_user: sguab às an cleachdaiche seo + create_block: Bacaich an cleachdaiche seo + activate_user: Gnìomhaich an cleachdaiche seo + deactivate_user: Cuir an cleachdaiche seo à gnìomh + confirm_user: Dearbhaich an cleachdaiche seo + hide_user: Falaich an cleachdaiche seo + unhide_user: Neo-fhalaich an cleachdaiche seo + delete_user: Sguab às an cleachdaiche seo confirm: Dearbhaich friends_changesets: seata atharraichean nan caraidean friends_diaries: clàran leabhair-latha nan caraidean @@ -2067,9 +2059,8 @@ gd: success: Chuir sinn teachdaireachd dearbhaidh ùr gu %{email} agus 's urrainn dhut tòiseachadh air an obair-mhapa nuair a bhios tu air an cunntas agad a dhearbhadh.<br /><br />Ma chleachdas tu siostam an aghaidh spama a chuireas - iarrtasan dearbhaidh, dèan cinnteach gun cuir thu webmaster@openstreetmap.org - air a gheal-liosta air sgàth 's nach urrainn dhuinn freagairt ri iarrtas dearbhaidh - sam bith. + iarrtasan dearbhaidh, dèan cinnteach gun cuir thu %{sender} air a gheal-liosta + air sgàth 's nach urrainn dhuinn freagairt ri iarrtas dearbhaidh sam bith. failure: Cha deach an cleachdaiche %{name} a lorg. confirm_email: heading: Dearbhaich atharrachadh an t-seòlaidh puist-d @@ -2327,7 +2318,6 @@ gd: standard: Àbhaisteach cycle_map: Mapa baidhseagail transport_map: Mapa còmhdhalach - mapquest: MapQuest fosgailte hot: Daonnachdach layers: header: Breathan a' mhapa @@ -2387,6 +2377,9 @@ gd: no_route: Cha deach slighe a lorg eadar an dà àite ud. no_place: Duilich - cha deach an t-àite ud a lorg. instructions: + turn_right_without_exit: Tionndaidh gu deas dha %{name} + uturn_without_exit: Thoir car iomlan air %{name} + turn_left_without_exit: Tionndaidh gu clì dha %{name} unnamed: gun ainm courtesy: Chaidh na seòlaidhean a thoirt dhuinn le cead %{link} time: Ùine diff --git a/config/locales/gl.yml b/config/locales/gl.yml index 25a5f2f9b..d65124fe9 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -4,6 +4,7 @@ # Author: Banjo # Author: Elisardojm # Author: Gallaecio +# Author: Macofe # Author: Nemo bis # Author: Toliño # Author: Vivaelcelta @@ -162,6 +163,7 @@ gl: way: camiño relation: relación changeset: conxunto de cambios + note: nota timeout: sorry: Tardouse demasiado en obter os datos para o %{type} co id %{id}. type: @@ -169,6 +171,7 @@ gl: way: camiño relation: relación changeset: conxunto de cambios + note: nota redacted: redaction: Redacción %{id} message_html: A versión %{version} deste %{type} non se pode mostrar tal como @@ -255,6 +258,7 @@ gl: diary_entry: new: title: Nova entrada no diario + publish_button: Publicar list: title: Diarios de usuarios title_friends: Diarios de amigos @@ -1028,9 +1032,9 @@ gl: more_2_html: |- Malia que o OpenStreetMap é de datos abertos, non podemos proporcionar un mapa API gratuíto aos desenvolvedores. - Vexa a <a href="http://wiki.openstreetmap.org/wiki/API_usage_policy">política de uso da API</a>, - a <a href="http://wiki.openstreetmap.org/wiki/Tile_usage_policy">política de uso de cuadrantes</a> - e a <a href="http://wiki.openstreetmap.org/wiki/Nominatim#Usage_Policy">política de uso do Nominatim</a>. + Vexa a <a href="https://operations.osmfoundation.org/policies/api/">política de uso da API</a>, + a <a href="https://operations.osmfoundation.org/policies/tiles/">política de uso de cuadrantes</a> + e a <a href="https://operations.osmfoundation.org/policies/nominatim/">política de uso do Nominatim</a>. contributors_title_html: Os nosos colaboradores contributors_intro_html: |- Os nosos colaboradores son miles de persoas. Tamén incluímos @@ -1096,9 +1100,9 @@ gl: para retirar datos</a> ou deixe unha notificación no noso <a href="http://dmca.openstreetmap.org/">formulario en liña</a>. trademarks_title_html: <span id="trademarks"></span>Marcas rexistadas - trademarks_1_html: OpenStreetMap e o logotipo coa lupa son marcas rexistadas - da OpenStreetMap Foundation. Se ten algunha pregunta sobre a utilización das - marcas, por favor envée as súas cuestión ó <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">Grupo + trademarks_1_html: OpenStreetMap, o logotipo coa lupa e ''State of the Map'' + son marcas rexistadas da Fundación OpenStreetMap. Se ten algunha pregunta + sobre a utilización das marcas, por favor envée as súas cuestión ó <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">Grupo de Traballo de Licenzas</a>. welcome_page: title: Reciba a nosa benvida! @@ -1211,7 +1215,7 @@ gl: about_page: next: Seguinte copyright_html: <span>©</span>Colaboradores do<br>OpenStreetMap - used_by: '%{name} fornece datos xeográficos a centos de sitios web, aplicacións + used_by: '%{name} fornece datos xeográficos a miles de sitios web, aplicacións para móbiles e dispositivos físicos' lede_text: |- O OpenStreetMap é obra dunha comunidade de xente que achega e mantén datos @@ -1236,18 +1240,21 @@ gl: sempre que recoñeza ao OpenStreetMap e mailos seus colaboradores como os autores dos datos. Se modifica os datos ou os utiliza dalgún xeito para outros fins, pode distribuír o resultado sempre e cando o faga empregando a mesma licenza. Atopará información máis detallada na <a href='%{copyright_path}'>páxina de dereitos de autoría e licenza</a>. legal_title: Legal - legal_html: "Este sitio e moitos outros servizos relacionados son manexados pola - \ \n<a href='http://osmfoundation.org/'>Fundación OpenStreetMap</a> (OSMF) \nen - nome da comunidade.\n<br> \n<a href='http://osmfoundation.org/Contact'>Contacte - coa OSMF</a> \nse ten preguntas ou problemas sobre licenzas, dereitos de autor - ou outro tema legal." + legal_html: "Este sitio e moitos outros servizos relacionados están formalmente + operados pola \n<a href='http://osmfoundation.org/'>Fundación OpenStreetMap</a> + (OSMF) \nen nome da comunidade. O uso de tódolos servizos operados pola OSMF + está suxeito \nás nosas <a href=\"http://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy\">\nPolíticas + de Uso Aceptable</a> e á nosa <a href=\"http://wiki.osmfoundation.org/wiki/Privacy_Policy\">Política + de Privacidade</a>\n<br/> \nPor favor, <a href='http://osmfoundation.org/Contact'>contacta + coa OSMF</a> se tes algunha pregunta ou problema de licenza, dereitos de autoría + ou calquera outra cuestión legal." partners_title: Socios notifier: diary_comment_notification: - subject: '[OpenStreetMap] %{user} comentou na súa entrada de diario' + subject: '[OpenStreetMap] %{user} comentou nunha entrada de diario' hi: 'Ola %{to_user}:' - header: '%{from_user} comentou na súa recente entrada de diario no OpenStreetMap - co asunto "%{subject}":' + header: '%{from_user} comentou na entrada de diario no OpenStreetMap co asunto + "%{subject}":' footer: Tamén pode ler o comentario en %{readurl}, comentar en %{commenturl} ou responder en %{replyurl} message_notification: @@ -1338,6 +1345,7 @@ gl: vostede comentou. A nota está preto de %{place}.' details: Pode atopar máis detalles da nota en %{url}. changeset_comment_notification: + hi: Ola %{to_user}, greeting: Ola, commented: subject_own: '[OpenStreetMap] %{commenter} comentou nun dos teus conxuntos @@ -1351,6 +1359,8 @@ gl: partial_changeset_with_comment: co comentario '%{changeset_comment}' partial_changeset_without_comment: sen comentarios details: Máis detalles sobre o conxunto de cambios poden atoparse en %{url}. + unsubscribe: Para darse de baixa das actualizacións deste conxunto de cambios, + visite %{url} e prema en "darse de baixa". message: inbox: title: Caixa de entrada @@ -1472,15 +1482,17 @@ gl: table: entry: motorway: Autoestrada + main_road: Estrada principal trunk: Estrada nacional primary: Estrada principal secondary: Estrada secundaria unclassified: Estrada sen clasificar - unsurfaced: Estrada non pavimentada track: Pista - byway: Camiño secundario bridleway: Pista de cabalos cycleway: Pista de bicicletas + cycleway_national: Carril bici nacional + cycleway_regional: Carril bici rexional + cycleway_local: Carril bici local footway: Vía peonil rail: Ferrocarril subway: Metro @@ -1502,7 +1514,6 @@ gl: golf: Campo de golf park: Parque resident: Zona residencial - tourist: Atracción turística common: - Espazo común - pradaría @@ -1532,9 +1543,11 @@ gl: tunnel: Bordo a raias = túnel bridge: Bordo negro = ponte private: Acceso privado - permissive: Acceso limitado destination: Acceso a destino construction: Estradas en construción + bicycle_shop: Tenda de bicicletas + bicycle_parking: Aparcadoiro de bicicletas + toilets: Aseos richtext_area: edit: Editar preview: Vista previa @@ -1692,6 +1705,7 @@ gl: allow_read_gpx: ler as súas pistas GPS privadas. allow_write_gpx: cargar pistas GPS. allow_write_notes: modificar as notas. + grant_access: Permitir o acceso oauthorize_success: title: Aceptouse a solicitude de autorización allowed: Concedeulle acceso á súa conta á aplicación %{app_name}. @@ -1803,6 +1817,12 @@ gl: windowslive: title: Iniciar sesión co Windows Live alt: Iniciar sesión cunha conta de Windows Live + github: + title: Acceder con GitHub + alt: Acceder cunha conta de GitHub + wikipedia: + title: Iniciar sesión con Wikipedia + alt: Iniciar sesión cunha conta de Wikipedia yahoo: title: Acceder ao sistema con Yahoo alt: Acceder ao sistema cun OpenID de Yahoo @@ -1839,7 +1859,7 @@ gl: title: Rexistrarse no_auto_account_create: Por desgraza, arestora non podemos crear automaticamente unha conta para vostede. - contact_webmaster: Póñase en contacto co <a href="mailto:webmaster@openstreetmap.org">webmaster</a> + contact_webmaster: Póñase en contacto co <a href="%{webmaster}">webmaster</a> para que cree unha conta por vostede; intentaremos xestionar a solicitude o máis axiña que poidamos. about: @@ -1851,9 +1871,10 @@ gl: do colaborador</a>. email address: 'Enderezo de correo electrónico:' confirm email address: Confirmar o enderezo de correo electrónico - not displayed publicly: Non mostrado publicamente (véxase a <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" - title="política de protección de datos, incluíndo a sección sobre enderezos - de correo">política de protección de datos</a>) + not displayed publicly: A súa dirección IP non se mostra publicamente, vexa + a nosa <a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy" title="política + de protección de datos OSMF, incluíndo a sección sobre enderezos de correo">política + de protección de datos</a> para máis información display name: 'Nome mostrado:' display name description: O seu nome de usuario mostrado publicamente. Pode cambialo máis tarde nas preferencias. @@ -1863,14 +1884,6 @@ gl: use external auth: Ou ben, utilice un servizo de terceiros para acceder auth no password: Coa autenticación de terceiros non se precisa un contrasinal, aínda que hai algunhas ferramentas e servidores que aínda a solicitan. - auth association: |- - <p>O seu identificador todavía non está asociado cunha conta de OpenStreetMap.</p> - <ul> - <li>Se eres novo en OpenStreetMap, por favor crea unha conta mediante o seguinte formulario.</li> - <li> - Se xa tes unha conta, podes iniciar sesión na túa conta usando o teu nome de usuario e contrasinal e logo asociar a conta co teu identificador na configuración de usuario. - </li> - </ul> continue: Rexistrarse terms accepted: Grazas por aceptar os novos termos do colaborador! terms declined: Sentimos que decidise non aceptar os novos Termos do colaborador. @@ -1900,6 +1913,7 @@ gl: heading: O usuario "%{user}" non existe body: Non existe ningún usuario co nome "%{user}". Comprobe a ortografía ou que a ligazón que seguiu estea ben. + deleted: borrado view: my diary: O meu diario new diary entry: nova entrada no diario @@ -1951,16 +1965,16 @@ gl: revoke: administrator: Revogar o acceso de administrador moderator: Revogar o acceso de moderador - block_history: bloqueos recibidos - moderator_history: bloqueos impostos + block_history: Bloqueos activos + moderator_history: Bloqueos impostos comments: Comentarios - create_block: bloquear este usuario - activate_user: activar este usuario - deactivate_user: desactivar este usuario - confirm_user: confirmar este usuario - hide_user: agochar este usuario - unhide_user: descubrir este usuario - delete_user: borrar este usuario + create_block: Bloquear este usuario + activate_user: Activar este usuario + deactivate_user: Desactivar este usuario + confirm_user: Confirmar este usuario + hide_user: Agochar este usuario + unhide_user: Descubrir este usuario + delete_user: Borrar este usuario confirm: Confirmar friends_changesets: conxuntos de cambios dos amigos friends_diaries: entradas de diario dos amigos @@ -2015,6 +2029,8 @@ gl: gravatar: Usar Gravatar link: http://wiki.openstreetmap.org/wiki/Gravatar link text: que é isto? + disabled: Gravatar foi desactivado. + enabled: A visualización do seu Gravatar foi activada. new image: Engadir unha imaxe keep image: Manter a imaxe actual delete image: Eliminar a imaxe actual @@ -2048,8 +2064,8 @@ gl: confirm_resend: success: Busque unha nota de confirmación que lle enviamos a %{email} e comezará a crear mapas de contado.<br /><br />Se emprega un sistema de bloqueo de spam, - asegúrese de incluír webmaster@openstreetmap.org na súa lista branca para - poder completar o proceso sen problemas. + asegúrese de incluír %{sender} na súa lista branca para poder completar o + proceso sen problemas. failure: Non se atopou o usuario "%{name}". confirm_email: heading: Confirmar o cambio do enderezo de correo electrónico @@ -2108,6 +2124,13 @@ gl: no_authorization_code: Sen código de autorización unknown_signature_algorithm: Algoritmo de sinatura descoñecido invalid_scope: Ámbito inválido + auth_association: + heading: O seu identificador aínda non está asociado cunha conta OpenStreetMap + option_1: Se é novo en OpenStreetMap, por favor cree unha nova conta utilizando + o formulario de abaixo. + option_2: Se xa ten unha conta, pode conectarse á súa conta usando o seu nome + de usuario e contrasinal, e logo asociar a conta co seu Identificador nas + súas preferencias de usuario user_role: filter: not_an_administrator: Só os administradores poden xestionar os roles dos usuarios, @@ -2289,10 +2312,13 @@ gl: center_marker: Centrar o mapa no marcador paste_html: Pegue o código HTML para incluílo na páxina web view_larger_map: Ver un mapa máis grande + only_standard_layer: Só a capa estándar pode exportarse como unha imaxe + embed: + report_problem: Informar sobre un problema key: title: Lenda do mapa tooltip: Lenda do mapa - tooltip_disabled: A lenda do mapa só está dispoñible para a capa estándar + tooltip_disabled: A lenda do mapa non dispoñible para esta capa map: zoom: in: Ampliar @@ -2304,12 +2330,12 @@ gl: standard: Estándar cycle_map: Mapa ciclista transport_map: Mapa de transporte - mapquest: MapQuest Open hot: Humanitario layers: header: Capas do mapa notes: Notas de mapa data: Datos do mapa + gps: Trazas GPS públicas overlays: Activar a sobreposición para reparar o mapa title: Capas copyright: © <a href='%{copyright_url}'>Colaboradores do OpenStreetMap</a> @@ -2355,6 +2381,9 @@ gl: mapquest_car: Coche (MapQuest) mapquest_foot: A pé (MapQuest) osrm_car: Coche (OSRM) + mapzen_bicycle: En bicicleta (Mapzen) + mapzen_car: En coche (Mapzen) + mapzen_foot: A pé (Mapzen) directions: Indicacións distance: Distancia errors: @@ -2363,11 +2392,21 @@ gl: instructions: continue_without_exit: Continuar en %{name} slight_right_without_exit: Xire un pouco cara á dereita en %{name} + offramp_right_without_exit: Colla a rampla á dereita en %{name} + onramp_right_without_exit: Xire á dereita na rampla en %{name} + endofroad_right_without_exit: Ó final da estrada xire á dereita en %{name} + merge_right_without_exit: Únase á dereita en %{name} + fork_right_without_exit: Na bifurcación xire á dereita en %{name} turn_right_without_exit: Xire á dereita en %{name} sharp_right_without_exit: Xiro brusco á dereita en %{name} uturn_without_exit: Cambio de sentido en %{name} sharp_left_without_exit: Xiro brusco á esquerda en %{name} turn_left_without_exit: Xire á esquerda cara %{name} + offramp_left_without_exit: Colla a rampla á esquerda en %{name} + onramp_left_without_exit: Xire á esquerda na rampla en %{name} + endofroad_left_without_exit: Ó final da estrada xire á esquerda en %{name} + merge_left_without_exit: Únase á esquerda en %{name} + fork_left_without_exit: Na bifurcación xire á esquerda en %{name} slight_left_without_exit: Xire un pouco cara á esquerda en %{name} via_point_without_exit: (punto intermedio) follow_without_exit: Siga %{name} @@ -2379,6 +2418,11 @@ gl: against_oneway_without_exit: Ir en contra dun só sentido en %{name} end_oneway_without_exit: Final dun só sentido en %{name} roundabout_with_exit: Na rotonda coller saída %{exit} en %{name} + turn_left_with_exit: Na rotonda xirar á esquerda cara a %{name} + slight_left_with_exit: Na rotonda xirar levemente á esquerda cara a %{name} + turn_right_with_exit: Na rotonda xirar á dereita cara a %{name} + slight_right_with_exit: Na rotonda xirar levemente á dereita cara a %{name} + continue_with_exit: Na rotonda continuar recto cara a %{name} unnamed: sen nome courtesy: Indicacións cortesía de %{link} time: Tempo diff --git a/config/locales/he.yml b/config/locales/he.yml index 759db7489..cdf75890c 100644 --- a/config/locales/he.yml +++ b/config/locales/he.yml @@ -8,8 +8,10 @@ # Author: Ex-Diktator # Author: ExampleTomer # Author: GilCahana +# Author: Guycn2 # Author: Inkbug # Author: Itay naor +# Author: LaG roiL # Author: Metraduk # Author: Nemo bis # Author: Orsa @@ -177,6 +179,7 @@ he: way: דרך relation: יחס changeset: ערכת שינויים + note: הערה timeout: sorry: אנו מתנצלים, אך טעינת התוכן עבור ה%{type} עם המזהה %{id}, ארכה זמן רב מדי. @@ -185,6 +188,7 @@ he: way: דרך relation: קשר changeset: ערכת שינויים + note: הערה redacted: redaction: חיתוך %{id} message_html: 'לא ניתן להציג את הגרסה %{version} של %{type} מכיוון שהיא נחתכה. @@ -267,6 +271,7 @@ he: diary_entry: new: title: רשומת יומן חדשה + publish_button: פרסום list: title: יומנים של המשתמש title_friends: יומנים של חברים @@ -949,14 +954,14 @@ he: edit_with: לעריכה עם %{editor} tag_line: מפת עולם חופשית בשיטת הוויקי intro_header: ברוכים הבאים ל־OpenStreetMap! - intro_text: OpenStreetMap הוא מפה של העולם, נוצר על־ידי אנשים כמוך, וחופשי לשימוש - תחת רשיון פתוח. + intro_text: OpenStreetMap היא מפה של העולם, שנוצרת על־ידי אנשים כמוך, וחופשית + לשימוש תחת רישיון פתוח. intro_2_create_account: נא ליצור חשבון משתמש partners_html: האירוח נתמך על־ידי מרכז %{ucl}‏, %{ic} ו%{bytemark}, ועל־ידי %{partners} אחרים. partners_ucl: מרכז UCL VR partners_ic: המכללה המלכותית של לונדון - partners_bytemark: בייטמארק + partners_bytemark: אירוח בייטמארק partners_partners: שותפים partners_url: http://wiki.openstreetmap.org/wiki/Partners osm_offline: מסד הנתונים של אתר OpenStreetMap אינו מקוון כעת בשל עבודות תחזוקה @@ -1097,10 +1102,10 @@ he: ההסרה</a> שלנו או כתבו תלונה ישירות <a href="http://dmca.openstreetmap.org/">בדף התלונות המקוון שלנו</a>. trademarks_title_html: <span id="trademarks"></span>סימנים מסחריים - trademarks_1_html: OpenStreetMap וסמל הזכוכית המגדלת הם סימנים מסחריים של קרן - OpenStreetMap. אם יש לך שאלות על השימוש שלך בסימנים, נא לשלוח את השאלות ל<a - href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">קבוצת העבודה - של הרישוי</a>. + trademarks_1_html: OpenStreetMap, סמל הזכוכית המגדלת ו־State of the Map הם סימנים + מסחריים של קרן OpenStreetMap. אם יש לך שאלות על השימוש שלך בסימנים, נא לשלוח + את השאלות ל<a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">קבוצת + העבודה של הרישוי</a>. welcome_page: title: ברוך בואך! introduction_html: ברוך בואך ל־OpenStreetMap, מפה חופשית של העולם, שאפשר לערוך. @@ -1201,7 +1206,7 @@ he: about_page: next: הבא copyright_html: <span>©</span>תורמי<br>OpenStreetMap - used_by: '%{name} מפעילה את נתוני המפה במאות אתרי אינטרנט, יישומים ומכשירים שונים' + used_by: '%{name} מפעילה נתוני המפה באלפי אתרי אינטרנט, יישומים ומכשירים שונים' lede_text: את OpenStreetMap בונה קהילת ממפים שתורמים ומתחזקים נתונים על דרכים, שבילים, בתי־קפה, תחנות רכבת ועוד הרבה יותר, מסביב לעולם. local_knowledge_title: ידע מקומי @@ -1225,7 +1230,10 @@ he: לפי התנאים של אותו הרישיון. ר' את <a href='%{copyright_path}'>דף הרישיון וזכויות היוצרים</a> לפרטים נוספים. legal_title: משפטי legal_html: |- - האתר הזה ושירותים רבים אחרים מופעלים על־ידי <a href='http://osmfoundation.org/'>קרן OpenStreetMap</a>‏ (OSMF) בשם הקהילה. + האתר הזה ושירותים רבים אחרים מופעלים על־ידי <a href='http://osmfoundation.org/'>קרן OpenStreetMap</a>‏ (OSMF) בשם הקהילה. השימוש בכל השירותים במפעילה OSMF כפוף + ל־<a href="http://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy"> + מדיניות שימוש קביל</a> שלנו + ול־<a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy">Privacy Policy</a>מדיניות הפרטיות</a> שלנו <br> נא <a href='http://osmfoundation.org/Contact'>ליצור קשר עם OSMF</a> אם יש לך שאלות על רישוי, זכויות יוצרים או שאלות ובעיות משפטיות אחרות. partners_title: שותפים @@ -1445,15 +1453,17 @@ he: table: entry: motorway: כביש מהיר + main_road: דרך ראשית trunk: דרך ראשית primary: כביש ראשי secondary: כביש משני unclassified: דרך לא מסווגת - unsurfaced: דרך לא סלולה track: מסלול מרוצים - byway: דרך צדדית bridleway: מסלול לרכיבת סוסים cycleway: דרך לאופניים + cycleway_national: מסלול אופניים לאומי + cycleway_regional: מסלול אופניים אזורי + cycleway_local: מסלול אופניים מקומי footway: דרך להולכי רגל rail: מסילת ברזל subway: רכבת תחתית @@ -1475,7 +1485,6 @@ he: golf: מסלול גולף park: פארק resident: אזור מגורים - tourist: אתר תיירותי common: - מרעה - מרעה @@ -1505,9 +1514,11 @@ he: tunnel: קו מקווקו = מנהרה bridge: קו שחור = גשר private: גישה פרטית - permissive: גישה מותרת destination: גישה ליעד construction: דרכים בבנייה + bicycle_shop: חנות אופניים + bicycle_parking: חניית אופניים + toilets: שירותים richtext_area: edit: עריכה preview: תצוגה מקדימה @@ -1659,6 +1670,7 @@ he: allow_read_gpx: לקרוא את מסלולי ה־GPS הפרטיים שלך. allow_write_gpx: להעלות מסלולי GPS. allow_write_notes: לשנות הערות + grant_access: מתן גישה oauthorize_success: title: בקשת אישור אושרה allowed: נתת ליישום %{app_name} גישה לחשבונך. @@ -1766,6 +1778,9 @@ he: windowslive: title: כניסה עם Windows Live alt: כניסה עם חשבון Windows Live + github: + title: כניסה באמצעות GitHub + alt: כניסה עם חשבון GitHub yahoo: title: כניסה עם יאהו alt: כניסה עם OpenID של יאהו @@ -1800,8 +1815,8 @@ he: new: title: הרשמה no_auto_account_create: למרבה הצער, כעת איננו יכולים ליצור לך חשבון באופן אוטומטי. - contact_webmaster: נא ליצור קשר עם <a href="mailto:webmaster@openstreetmap.org">מנהל - האתר</a> כדי שייווצר חשבון, ואנחנו נשתדל לטפל בבקשה כמה שיותר מהר. + contact_webmaster: נא ליצור קשר עם <a href="%{webmaster}">מנהל האתר</a> על מנת + לארגן יצירת חשבון - אנחנו נשתדל לטפל בבקשה כמה שיותר מהר. about: header: חופשית וניתנת לעריכה html: |- @@ -1812,9 +1827,9 @@ he: התרומה</a>. email address: 'כתובת דוא״ל:' confirm email address: 'אימות כתובת דוא״ל:' - not displayed publicly: לא מוצג בפומבי (ר׳ <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" - title="wiki privacy policy including section on email addresses">מידיניות - פרטיות</a>) + not displayed publicly: הכתובת שלף לא מוצגת בפומבי, ר׳ את <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" + title="OSMF privacy policy including section on email addresses">מידיניות + פרטיות</a> למידע נוסף display name: 'שם התצוגה:' display name description: שם המשתמש שלך, שמוצג בפומבי. אפשר לשנות את זה בהעפות שלך. @@ -1824,16 +1839,6 @@ he: use external auth: 'לחלופין, השתמשו בצד שלישי כדי להיכנס:' auth no password: עם אימות צד שלישי אין צורך בססמה, אבל כלים נוספים או שרת יכולים להזדקק לכזה. - auth association: |- - <p>המזהה שלך עדיין לא מזוהה עם חשבון OpenStreetMap.</p> - <ul> - <li>אם הגעת רק עכשיו ל־OpenStreetMap, נא ליצור חשבון חדש בטופס להלן.</li> - <li> - אם כבר יש לך חשבון, אפשר להיכנס לחשבון שלך - באמצעות שם המשתמש והססמה שלך ואז לשייך את החשבון שלך - עם המזהה בהגדרות המשתמש שלך. - </li> - </ul> continue: הרשמה terms accepted: תודה על קבלת תנאי התרומה החדשים! terms declined: אנחנו מצטערים שהחלטת לא לקבל את תנאי התרומה החדשים. למידע נוסף @@ -1860,6 +1865,7 @@ he: title: אין משתמש כזה heading: המשתמש %{user} אינו קיים body: סליחה, אין חשבון בשם %{user}. אולי האיות לא נכון ואולי לחצת על קישור שגוי. + deleted: נמחק view: my diary: היומן שלי new diary entry: רשומה חדשה ביומן @@ -1911,12 +1917,12 @@ he: revoke: administrator: שלילת הרשאות מפעיל moderator: שלילת הרשאות מנהל - block_history: חסימות שהתקבלו + block_history: חסימות פעילות moderator_history: חסימות שניתנו comments: הערות create_block: חסימת משתמש זה activate_user: הפעלת משתמש זה - deactivate_user: ביטול הפעלת משתמש זה + deactivate_user: כיבוי משתמש זה confirm_user: אישור משתמש זה hide_user: הסתרת משתמש זה unhide_user: ביטול הסתרת משתמש זה @@ -1972,6 +1978,8 @@ he: gravatar: להשתמש ב־Gravatar link: http://wiki.openstreetmap.org/wiki/Gravatar link text: מה זה? + disabled: הגראווטר כובה. + enabled: הצגת הגראווטר שלך הופעלה. new image: הוספת תמונה keep image: לשמירה על התמונה הנוכחית delete image: להסרת התמונה הנוכחית @@ -2001,10 +2009,10 @@ he: reconfirm_html: אם ברצונך לקבל שוב מכתב אימות, <a href="%{reconfirm}">נא ללחוץ כאן</a>. confirm_resend: - success: תודה על הרישום. שלחנו מכתב אישור לכתובת %{email} וכשנקבל ממך את האישור, - אפשר יהיה להתחיל למפות.<br /><br />אם נעשה בחשבון הדוא״ל שלך שימוש במערכת - שמלבינה הודעות, נא להוסיף את webmaster@openstreetmap.org לרשימה הלבנה, כי - איננו יכולים להשיב לבקשות אישור. + success: שלחנו הודעת אישור חדש לכתובת %{email} ומרגע אישור חשבונך, אפשר יהיה + להתחיל למפות.<br /><br />אם בדואר האלקטרוני שלך מופעלת מערכת נגד דואר זהל + אשר שולחת בקשות אישור, נא להוסיף את %{sender} לרשימה הלבנה, מאחר ואיננו יכולים + להשיב לבקשות אישור כלשהן. failure: משתמש %{name} לא נמצא. confirm_email: heading: אישור שינוי כתובת הדוא״ל @@ -2061,6 +2069,12 @@ he: no_authorization_code: אין קוד כניסה unknown_signature_algorithm: אלגוריתם חתימה בלתי־ידוע invalid_scope: טווח בלתי־תקין + auth_association: + heading: המזהה שלך עדיין אינו משויך לחשבון לחשבון OpenStreetMap. + option_1: אם התחלת רק עכשיו עם OpenStreetMap, נא ליצור חשבון חדש באמצעות הטופס + להלן. + option_2: אם כבר יש לך חשבון, אפשר להיכנס לחשבון שלך באמצעות שם המשתמש והססמה + שלך ואז לשייך את החשבון שלך למזהה מהגדרות המשתמש שלך. user_role: filter: not_an_administrator: רק מפעילים יכולים לבצע ניהול תפקידים ואין לך הרשאת מפעיל. @@ -2231,6 +2245,9 @@ he: center_marker: למרכז את המפה לפי הסמן paste_html: הדבקת HTML להטבעה באתר view_larger_map: צפייה במפה גדולה יותר + only_standard_layer: אפשר לייצא רק את השכבה התקנית בתור תמונה + embed: + report_problem: דיווח על בעיה key: title: מפת מפתח tooltip: מפת מפתח @@ -2294,6 +2311,9 @@ he: mapquest_car: במכונית (MapQuest) mapquest_foot: ברגל (MapQuest) osrm_car: במכונית (ORSM) + mapzen_bicycle: באופניים (Mapzen) + mapzen_car: במכונית (Mapzen) + mapzen_foot: ברגל (Mapzen) directions: כיוונים distance: מרחק errors: @@ -2302,11 +2322,21 @@ he: instructions: continue_without_exit: להמשיך על %{name} slight_right_without_exit: קצת ימינה אל %{name} + offramp_right_without_exit: לעלות ימינה אל %{name} + onramp_right_without_exit: לפנות ימינה לעלייה אל %{name} + endofroad_right_without_exit: בסוף הדרך לפנות ימינה אל %{name} + merge_right_without_exit: להתמזג ימינה אל %{name} + fork_right_without_exit: בהתפצלות לפנות ימינה אל %{name} turn_right_without_exit: לפנות ימינה אל %{name} sharp_right_without_exit: פנייה חדה ימינה אל %{name} uturn_without_exit: פניית פרסה על %{name} sharp_left_without_exit: פנייה חדה שמאלה אל %{name} turn_left_without_exit: פנייה שמאלה אל %{name} + offramp_left_without_exit: לעלות שמאלה אל %{name} + onramp_left_without_exit: לפנות שמאלה לעלייה אל %{name} + endofroad_left_without_exit: בסוף הדרך לפנות שמאלה אל %{name} + merge_left_without_exit: להתמזג שמאלה אל %{name} + fork_left_without_exit: בהתפצלות לפנות שמאלה אל %{name} slight_left_without_exit: קצת שמאלה אל %{name} via_point_without_exit: (דרך נקודה) follow_without_exit: להמשיך על %{name} diff --git a/config/locales/hr.yml b/config/locales/hr.yml index 5f8a7c2bf..5780f8494 100644 --- a/config/locales/hr.yml +++ b/config/locales/hr.yml @@ -3,6 +3,7 @@ # Export driver: phpyaml # Author: Ex13 # Author: Janjko +# Author: Macofe # Author: Mnalis # Author: Mvrban # Author: Nemo bis @@ -11,6 +12,7 @@ # Author: Ruila # Author: SpeedyGonsales # Author: Teoo3 +# Author: Сербијана --- hr: time: @@ -125,11 +127,16 @@ hr: way_paginated: Putovi(%{x}-%{y} od %{count}) relation: Relacije (%{count}) relation_paginated: Relacije(%{x}-%{y} od %{count}) + comment: Komentari (%{count}) + hidden_commented_by: Komentar skriven od %{user} <abbr title="%{exact_time}">prije + %{when}</abbr> + commented_by: Komentirao/la %{user} <abbr title='%{exact_time}'>prije %{when}</abbr> changesetxml: XLM Changeset osmchangexml: osmChange XML feed: title: Changeset %{id} title_comment: Changeset %{id} - %{comment} + join_discussion: Prijavi se za uključivanje u raspravu discussion: Razgovor node: title: 'Točka: %{name}' @@ -161,6 +168,7 @@ hr: way: put relation: relacija changeset: changeset + note: biljeÅ¡ka timeout: sorry: Žao mi je, podaci za %{type} sa id %{id}, predugo se čekaju. type: @@ -168,8 +176,11 @@ hr: way: put relation: relacija changeset: changeset + note: biljeÅ¡ka redacted: redaction: Redakcija %{id} + message_html: Verzija %{version} ove %{type} ne može se prikazati jer je uređena. + Molim pogledaj %{redaction_link} za dodatne informacije. type: node: točka way: put @@ -184,7 +195,9 @@ hr: wiki_link: key: Opis wiki stranica za oznaku %{key} (tag) tag: Opis wiki stranica za oznaku %{key}=%{value} (tag) + wikidata_link: '%{page} Predmet na Wikidata' wikipedia_link: Članak o %{page} na Wikipediji + telephone_link: Nazovi %{phone_number} note: title: 'BiljeÅ¡ka: %{id}' new_note: Nova biljeÅ¡ka @@ -205,7 +218,10 @@ hr: %{when}</abbr> hidden_by: Sakrio/la %{user} <abbr title='%{exact_time}'>prije %{when}</abbr> query: + title: Potraži značajke + introduction: Klikni na kartu za pronalazak okolnih značajki. nearby: Obližnje značajke + enclosing: Obuhvaćene značajke changeset: changeset_paging_nav: showing_page: Stranica %{page} @@ -236,9 +252,17 @@ hr: timeout: sorry: Nažalost, popis Changeseta (skupa promjena) koje ste zatražili je predugo trajalo za preuzimanje. + rss: + title_all: Rasprava o OpenStreetMap setu promjena + title_particular: 'Rasprava o OpenStreetMap setu promjena #%{changeset_id}' + comment: 'Novi komentar na setu promjena #%{changeset_id} od %{author}' + commented_at_html: Osvježeno prije %{when} + commented_at_by_html: Osvježio korisnik %{user} prije %{when} + full: Kompletna rasprava diary_entry: new: title: Novi zapis u dnevnik + publish_button: Objavi list: title: Dnevnici korisnika title_friends: Dnevnici prijatelja @@ -376,17 +400,21 @@ hr: search_osm_nominatim: prefix: aerialway: + cable_car: Kabinska žičara chair_lift: Sedežnica drag_lift: Sidro/tanjurić + gondola: Žičara station: Stanica žičare aeroway: aerodrome: Zračna luka apron: PristaniÅ¡na platforma + gate: Izlaz helipad: Heliodrom runway: Pista taxiway: Rulnica terminal: Terminal amenity: + animal_shelter: SkloniÅ¡te za životinje arts_centre: Umjetnički centar atm: Bankomat bank: Banka @@ -395,6 +423,8 @@ hr: bench: Klupa bicycle_parking: Biciklistički parking bicycle_rental: Rent a bicikl + biergarten: Vrtna pivnica + boat_rental: Najam brodova brothel: Bordel bureau_de_change: Mjenjačnica bus_station: Autobusni kolodvor @@ -403,8 +433,11 @@ hr: car_sharing: Carsharing car_wash: Autopraonica casino: Casino + charging_station: Postaja za punjenje električnih automobila + childcare: Vrtić cinema: Kino clinic: Klinika + clock: Sat college: Fakultet community_centre: DruÅ¡tveni centar courthouse: Sud @@ -420,8 +453,10 @@ hr: ferry_terminal: Trajektni terminal fire_hydrant: Hidrant fire_station: Vatrogasna postaja + food_court: Blagovaonski kutak fountain: Fontana fuel: Benzinska + gambling: Kockarnica grave_yard: Groblje gym: Fitness centar health_centre: Zdravstveni centar @@ -432,11 +467,14 @@ hr: library: Knjižnica market: Tržnica marketplace: Tržnica + monastery: Samostan + motorcycle_parking: Parking za motocikle nightclub: Noćni klub nursery: Čuvanje djece nursing_home: Starački dom office: Kancelarija parking: Parking + parking_entrance: Ulaz na parking pharmacy: Ljekarna place_of_worship: Crkva police: Policija @@ -454,7 +492,10 @@ hr: school: Å kola shelter: SkloniÅ¡te shop: Trgovina + shower: TuÅ¡ + social_centre: DruÅ¡tveni centar social_club: DruÅ¡tveni klub + social_facility: DruÅ¡tvena ustanova studio: Studio swimming_pool: Bazen taxi: Taxi @@ -467,26 +508,50 @@ hr: veterinary: Veterinar village_hall: Seoski Dom waste_basket: Kanta za otpatke + waste_disposal: Kontejner za smeće youth_centre: Centar za mladež boundary: administrative: Administrativna granica + census: Statističke granice national_park: Nacionalni park protected_area: ZaÅ¡tićeno područje bridge: + aqueduct: Akvadukt + suspension: Viseći most + swing: Pokretni most viaduct: Vijadukt "yes": Most building: "yes": Zgrada + craft: + brewery: Pivovara + carpenter: Stolar + electrician: Električar + gardener: Vrtlar + painter: Soboslikar + photographer: Fotograf + plumber: Vodoinstalater + shoemaker: Obućar + tailor: Krojač + "yes": Radionica + emergency: + ambulance_station: Garaža hitne pomoći + defibrillator: Defibrilator + landing_site: Mjesto slijetanja u nuždi + phone: Telefon za hitne službe highway: + abandoned: NapuÅ¡tena cesta bridleway: Konjička staza bus_guideway: Autobusna traka bus_stop: Autobusno stajaliÅ¡te construction: Autocesta u izgradnji cycleway: Biciklistička staza + elevator: Dizalo emergency_access_point: S.O.S. točka footway: PjeÅ¡ačka staza ford: Ford living_street: Ulica smirenog prometa + milestone: Kilometarski stup motorway: Autocesta motorway_junction: Čvor (autoputa) motorway_link: Autocesta (pristupna cesta) @@ -495,14 +560,18 @@ hr: platform: Platforma primary: Državna cesta primary_link: Državna cesta + proposed: Planirana cesta raceway: TrkaliÅ¡te residential: Ulica stanovanja + rest_area: OdmoriÅ¡te road: Cesta secondary: Županijska cesta secondary_link: Županijska cesta service: Servisna cesta services: Autocesta - usluge + speed_camera: Kamera za kontrolu brzine steps: Stepenice + street_lamp: Ulična rasvjeta tertiary: Lokalna cesta track: Makadam trail: Staza @@ -510,11 +579,13 @@ hr: trunk_link: Cesta rezrevirana za mot. voz. - prilazna cesta unclassified: Nerazvrstana cesta unsurfaced: Neasfaltirana cesta + "yes": Cesta historic: archaeological_site: ArheoloÅ¡ko nalaziÅ¡te battlefield: Bojno polje boundary_stone: Granični kamen building: Povijesna zgrada + bunker: Bunker castle: Dvorac church: Crkva citywalls: Gradske zidine @@ -844,7 +915,7 @@ hr: text: Vi gledate englesku verziju stranice o autorskim pravima. Možete se vratiti na %{native_link} ove stranice ili možete prestati čitati o autorskim pravima i %{mapping_link}. - native_link: HRVATSKI verzija + native_link: hrvatsko izdanje mapping_link: počnite kartirati legal_babble: title_html: Autorska prava i Dozvola @@ -904,7 +975,7 @@ hr: welcome_page: title: DobrodoÅ¡li! whats_on_the_map: - title: Å to je na karti + title: Å to ova karta sadrži basic_terms: way_html: <strong>Put</strong> je linija ili područje, npr. cesta, potok, jezero ili zgrada. @@ -1129,9 +1200,7 @@ hr: primary: Primarna cesta secondary: Sekundarna cesta unclassified: Nerazvrstana cesta - unsurfaced: Neasfaltirana cesta track: Neasfaltirani put - byway: Usputna staza bridleway: Staza za konje cycleway: Biciklistička staza footway: PjeÅ¡ačka staza @@ -1155,7 +1224,6 @@ hr: golf: Golf teren park: Park resident: Stambeno područje - tourist: Turistička atrakcija common: - Travnjaci - livade @@ -1185,7 +1253,6 @@ hr: tunnel: Iscrtkani rubovi = tunel bridge: Crni rubovi = most private: Privatni pristup - permissive: Pristup uz dozvolu destination: Pristup odrediÅ¡tu construction: Ceste u izgradnji richtext_area: @@ -1399,7 +1466,7 @@ hr: password: 'Lozinka:' openid: '%{logo} OpenID:' remember: 'Zapamti me:' - lost password link: Izgubljena lozinka? + lost password link: Izgubljena zaporka? login_button: Prijava register now: Registrirajte se sada new to osm: Novi na OpenStreetMap? @@ -1415,12 +1482,12 @@ hr: heading: Odjava iz OpenStreetMap logout_button: Odjava lost_password: - title: Izgubljena lozinka - heading: Zaboravljena lozinka? + title: Izgubljena zaporka + heading: Zaboravljena zaporka? email address: 'Email adresa:' new password button: Reset lozinke help_text: Unesite email adresu koju ste koristili za otvaranje računa i poslati - ćemo vam link kojim možete resetirati lozinku. + ćemo vam poveznicu kojom možete resetirati zaporku. notice email on way: Žao mi je Å¡to ste je izgubili :-( ali email je na putu tako da je možete resetirati uskoro. notice email cannot find: Ne mogu pronaći email adresu. @@ -1428,7 +1495,7 @@ hr: title: Reset lozinke heading: Reset lozinke za %{user} password: 'Lozinka:' - confirm password: 'Potvrdi lozinku:' + confirm password: 'Potvrdi zaporku:' reset: Reset lozinke flash changed: VaÅ¡a lozinka je promjenjena. flash token bad: Nije pronađen takav token, provjeri URL? @@ -1436,7 +1503,7 @@ hr: title: Otvori račun no_auto_account_create: Nažalost nismo u mogućnosti automatski otvarati korisničke račune. - contact_webmaster: Molim kontaktirajte <a href="mailto:webmaster@openstreetmap.org">webmastera</a> + contact_webmaster: Molim kontaktirajte <a href="%{webmaster}">webmastera</a> da priredi za stvaranje korisničkog računa - pokuÅ¡ati ćemo se pozabaviti s ovime u najkraćem vremenu. license_agreement: Kada potvrdiÅ¡ svoj račun trebati ćeÅ¡ pristati na <a href="http://www.osmfoundation.org/wiki/License/Contributor_Terms">uvjete @@ -1449,7 +1516,7 @@ hr: display name description: Javno prikazano korisničko ime. Možete ga promjeniti i kasnije u postavkama. password: 'Lozinka:' - confirm password: 'Potvrdi lozinku:' + confirm password: 'Potvrdi zaporku:' continue: Otvori račun terms accepted: Hvala za prihvaćanje novih pridonositeljskih uvjeta! terms: @@ -1524,16 +1591,16 @@ hr: revoke: administrator: Opozovi pristup administatora moderator: Opozovi pristup moderatora - block_history: prikaži dobivene blokade - moderator_history: prikaži dane blokade + block_history: Aktivne blokade + moderator_history: Prikaži dane blokade comments: Komentari - create_block: blokiraj ovog korisnika - activate_user: aktiviraj ovog korisnika - deactivate_user: deaktiviraj ovog korisnika - confirm_user: potvrdi ovog korisnika - hide_user: sakrij ovog korisnika - unhide_user: otkrij ovog korisnika - delete_user: obriÅ¡i ovog korisnika + create_block: Blokiraj ovog korisnika + activate_user: Aktiviraj ovog korisnika + deactivate_user: Deaktiviraj ovog korisnika + confirm_user: Potvrdi ovog korisnika + hide_user: Sakrij ovog korisnika + unhide_user: Otkrij ovog korisnika + delete_user: ObriÅ¡i ovog korisnika confirm: Potvrdi popup: your location: VaÅ¡a lokacija @@ -1607,8 +1674,8 @@ hr: confirm_resend: success: Poslali smo novu potvrdu na email %{email}, a čim potvrdiÅ¡ svoj račun, moći ćeÅ¡ početi kartirati.<br /><br />Ako koristiÅ¡ antispam sustav koji Å¡alje - potvrdu zahtjeva, molim te da provjeriÅ¡ je li webmaster@openstreetmap.org - na tzv. "whitelisti", jer nismo u mogućnosti odgovarati na potvrde zahtjeva. + potvrdu zahtjeva, molim te da provjeriÅ¡ je li %{sender} na tzv. "whitelisti", + jer nismo u mogućnosti odgovarati na potvrde zahtjeva. failure: Korisnik %{name} nije pronađen. confirm_email: heading: Potvrdi promjenu email adrese. diff --git a/config/locales/hsb.yml b/config/locales/hsb.yml index 7cdfb5ad7..204819de0 100644 --- a/config/locales/hsb.yml +++ b/config/locales/hsb.yml @@ -2,6 +2,7 @@ # Exported from translatewiki.net # Export driver: phpyaml # Author: J budissin +# Author: Macofe # Author: Michawiki # Author: MikławÅ¡ --- @@ -118,11 +119,16 @@ hsb: way_paginated: Puće (%{x}-%{y} z %{count}) relation: Relacije (%{count}) relation_paginated: Relacije (%{x}-%{y} z %{count}) + comment: Komentary (%{count}) + hidden_commented_by: Schowany komentar wužiwarja %{user} <abbr title='%{exact_time}'>před + %{when}</abbr> + commented_by: Komentar wužiwarja %{user} <abbr title='%{exact_time}'>před %{when}</abbr> changesetxml: Sadźba změnow XML osmchangexml: osmChange XML feed: title: Sadźba změnow %{id} title_comment: Sadźba změnow %{id} - %{comment} + join_discussion: Přizjew so, zo by móhł(a) sobu diskutować discussion: Diskusija node: title: 'Suk: %{name}' @@ -156,6 +162,7 @@ hsb: way: puć relation: relacija changeset: sadźba změnow + note: pokiw timeout: sorry: Wodaj, traje předołho, daty za %{type} z ID %{id} wotwołać. type: @@ -163,6 +170,7 @@ hsb: way: puć relation: relacija changeset: sadźba změnow + note: pokiw redacted: redaction: Redakcija %{id} message_html: Wersija %{version} tutoho %{type}a njeda so pokazać, dokelž je @@ -205,12 +213,14 @@ hsb: %{when}</abbr> hidden_by: Schowany wot %{user} <abbr title='%{exact_time}'>před %{when}</abbr> query: + title: Funkcije napraÅ¡ować introduction: Klikń na kartu, zo by susodne objekty namakał(a). nearby: Objekty w bliskosći + enclosing: Wobdawace funkcije changeset: changeset_paging_nav: showing_page: Strona %{page} - next: Přichodna » + next: Dale » previous: « Předchadna changeset: anonymous: Anonymny @@ -237,11 +247,16 @@ hsb: timeout: sorry: Bohužel je předołho trało, skupiny změny, kotrež sy požadał, wotwołać. rss: + title_all: Diskusija wo sadźbje změnow OpenStreetMap + title_particular: Diskusija wo sadźbje změnow čo. %{changeset_id} OpenStreetMap + comment: Nowy komentar k sadźbje změnow čo. %{changeset_id} wot %{author} + commented_at_html: Zaktualizowane před %{when} commented_at_by_html: Před %{when} wot %{user} nahraty full: Dospołna diskusija diary_entry: new: title: Nowy dźenikowy zapisk + publish_button: Wozjewić list: title: Dźeniki wužiwarjow title_friends: Dźeniki přećelow @@ -381,8 +396,10 @@ hsb: search_osm_nominatim: prefix: aerialway: + cable_car: powjaznica chair_lift: Sydłowy lift drag_lift: Wlečny lift + gondola: Gondlowa powjaznica station: Gondlowa stacija aeroway: aerodrome: Lětanišćo @@ -393,6 +410,7 @@ hsb: taxiway: Lětadłowa jězdnja terminal: Terminal amenity: + animal_shelter: zwěrjacy dom arts_centre: Kulturny centrum atm: Bankomat bank: Banka @@ -402,6 +420,7 @@ hsb: bicycle_parking: Wotstajenišćo za kolesa bicycle_rental: Wupožcowarnja za kolesa biergarten: Piwowa zahroda + boat_rental: wupožčenje čołmow brothel: Bordel bureau_de_change: Měnjernja bus_station: Busowe dwórnišćo @@ -411,8 +430,10 @@ hsb: car_wash: Awtomyjernja casino: Kazino charging_station: Napjelnjenska stacija + childcare: hladanje dźěći cinema: Kino clinic: Klinika + clock: časnik college: Wysoka Å¡ula community_centre: Zhromadny centrum courthouse: Sudnistwo @@ -431,6 +452,7 @@ hsb: food_court: Food Court fountain: Studnja fuel: Tankownja + gambling: Hra wo zbožo grave_yard: Kěrchow gym: Fitnesowy center/Fitnesowe studijo health_centre: Strowotny centrum @@ -441,11 +463,14 @@ hsb: library: Knihownja market: Wiki marketplace: Torhošćo + monastery: klóšter + motorcycle_parking: parkowanišćo za motorske nightclub: Nócny klub nursery: Pěstowarnja nursing_home: Hladarnja office: Běrow parking: Parkowanišćo + parking_entrance: zajězd parkowanišća pharmacy: Lěkarnja place_of_worship: Boži dom police: Policija @@ -479,6 +504,7 @@ hsb: veterinary: Zwěrjacy lěkar village_hall: Gmejnski centrum waste_basket: Wotpadkowe sudobjo + waste_disposal: wotstronjenje wotpadkow youth_centre: Centrum za młodostnych boundary: administrative: Zarjadniska hranica @@ -493,14 +519,30 @@ hsb: "yes": Móst building: "yes": Twarjenje + craft: + brewery: piwarnja + carpenter: ćěsla + electrician: elektrikar + gardener: zahrodnik + painter: moler + photographer: fotograf + plumber: klampnar + shoemaker: Å¡ewc + tailor: krawc + "yes": rjemjeslniski wobchod emergency: + ambulance_station: wuchowanska stacija + defibrillator: defibrilator + landing_site: nuzowe přizemišćo phone: Nuzowy telefon highway: + abandoned: rozpušćena awtodróha bridleway: Jěchanski puć bus_guideway: Trolejbusowy milinowód bus_stop: Busowe zastanišćo construction: Dróha so twari cycleway: Kolesowarska šćežka + elevator: zběhadło emergency_access_point: Přijimarnja njezbožow footway: Pućik ford: Bród @@ -529,32 +571,41 @@ hsb: tertiary: Dróha třećeho rjada tertiary_link: Dróha třećeho rjada track: Pólny puć + traffic_signals: ampla trail: Šćežka trunk: Dalokodróha trunk_link: Dalokodróha unclassified: Njezarjadowana dróha unsurfaced: Njewobtwjerdźena dróha + "yes": dróha historic: archaeological_site: Archeologiske wurywanišćo battlefield: Bitwišćo boundary_stone: Měznik - building: Twarjenje + building: historiske twarjenje + bunker: bunker castle: Hród church: Cyrkej + city_gate: měšćanske wrota citywalls: Měšćanske murje fort: Fort + heritage: twarske herbstwo house: Dom icon: Ikona manor: Knježi dwór memorial: Wopomnišćo mine: Podkopki monument: Pomnik + roman_road: romska dróha ruins: Rozpadanki + stone: błudźenk tomb: Row tower: Wěža wayside_cross: Pućny křiž wayside_shrine: Stołp wreck: Wrak + junction: + "yes": křižowanišćo landuse: allotments: Małozahrodki basin: Basenk @@ -586,14 +637,19 @@ hsb: road: Dróhowe pasmo village_green: Nawjes vineyard: Winicy + "yes": wužiwanje pódy leisure: beach_resort: Mórske kupjele bird_hide: Ptači schow + club: towarstwo common: Gmejnski kraj + dog_park: psyči park fishing: Rybnišćo + fitness_centre: fitnessownja fitness_station: Fitnesowy center garden: Zahroda golf_course: Golfownišćo + horse_riding: jěchanje ice_rink: Smykanišćo marina: Jachtowy přistaw miniature_golf: Minigolf @@ -602,6 +658,7 @@ hsb: pitch: Sportnišćo playground: Hrajkanišćo recreation_ground: Wočerstwjenišćo + resort: prózdninske městno sauna: Sawna slipway: Helling sports_centre: Sportowy centrum @@ -609,6 +666,13 @@ hsb: swimming_pool: Swimmingpool track: Běhanišćo water_park: Wodowy park + "yes": wólny čas + man_made: + lighthouse: swětłownja + pipeline: rołowód + tower: wěža + works: fabrika + "yes": kumÅ¡tne military: airfield: Wojerske lětanišćo barracks: Kaserna @@ -628,6 +692,7 @@ hsb: forest: Lěs geyser: Geiser glacier: Lodowc + grassland: łuka heath: Hola hill: Hórka island: Kupa @@ -635,11 +700,13 @@ hsb: marsh: MarÅ¡a moor: Bahno mud: Błóto - peak: Å pica + peak: WjerÅ¡k point: Dypk reef: Rif ridge: Horinski hrjebjeń rock: Skała + saddle: přesmyk + sand: pěsk scree: Walanki scrub: Kerki spring: Žórło @@ -653,6 +720,7 @@ hsb: wood: Lěs office: accountant: Knihiwjedniski běrow + administrative: zarjadnistwo architect: Architektny běrow company: Zawod employment_agency: Dźěłowy zarjad @@ -665,6 +733,8 @@ hsb: travel_agent: Pućowanski běrow "yes": Běrow place: + allotments: małozahrodki + block: blok airport: Lětanišćo city: Wulkoměsto country: Kraj @@ -689,6 +759,7 @@ hsb: town: Město unincorporated_area: Bjezgmejnska kónčina village: Wjes + "yes": městno railway: abandoned: Rozpušćena železnica construction: Železnica so twari @@ -709,7 +780,7 @@ hsb: spur: Přizamkowe kolije station: Dwórnišćo stop: Železniske zastanišćo - subway: Metrowa stacija + subway: metro subway_entrance: Zachod do podzemskeje železnicy switch: Wuhibka tram: Tramwajka @@ -791,6 +862,7 @@ hsb: "yes": Wobchod tourism: alpine_hut: Hórska bawda + apartment: apartment artwork: Wuměłska twórba attraction: Atrakcija bed_and_breakfast: Přenocowanje ze snědanju @@ -798,6 +870,7 @@ hsb: camp_site: Stanowanišćo caravan_site: Campingowanišćo za caravany chalet: Chata + gallery: galerija guest_house: Hóstny dom hostel: Hospoda hotel: Hotel @@ -829,6 +902,7 @@ hsb: wadi: Wadi waterfall: Wodopad weir: Spušćadło + "yes": wódna dróha admin_levels: level2: Statna hranica level4: Krajna hranica @@ -871,7 +945,7 @@ hsb: edit_with: Z %{editor} wobdźěłać tag_line: Swobodna swětowa karta intro_header: Witaj k OpenStreetMap! - intro_text: OpenStreetMap je karta swěta, wutworjena wot ludźi kaž ty a hodźi + intro_text: OpenStreetMap je karta swěta, wutworjena wot ludźi kaž tebje a hodźi so swobodnje pod wotewrjenej licencu wužiwać. intro_2_create_account: Załož wužiwarske konto partners_html: Hostowanje so wot %{ucl}, %{ic}, %{bytemark} a druhich %{partners} @@ -916,7 +990,8 @@ hsb: intro_1_html: |- OpenStreetMap su <i>zjawne daty</i>, licencowane pod licencu <a href="http://opendatacommons.org/licenses/odbl/">Open Data - Commons Open Database</a> (ODbL). + Commons Open Database</a> (ODbL) wot <a + href="http://osmfoundation.org/">załožby OpenStreetMap</a> (OSMF). intro_2_html: MóžeÅ¡ naÅ¡e daty kopěrować, rozdźělić, přenjesć a přiměrić, tak dołho kaž OpenStreetMap a jich sobuskutkowacych naspominaÅ¡. Jeli změniÅ¡ naÅ¡e daty abo zepěraÅ¡ so na nje, móžeÅ¡ wuslědk jenož pod samsnej licencu rozdźělić. @@ -942,9 +1017,9 @@ hsb: alt: Přikład, kak so na webstronje na OpenStreetMap pokazuje title: Připokazanski přikład more_title_html: DalÅ¡e informacije - more_1_html: Čitaj wjace wo wužiwanju naÅ¡ich datow a kak hodźi so nas připóznać, - pod <a href="http://wiki.openstreetmap.org/wiki/Legal_FAQ">Huste prawniske - praÅ¡enja</a>. + more_1_html: |- + Čitaj wjace wo wužiwanju naÅ¡ich datow a kak hodźi so nas přispomnić na <a + href="http://osmfoundation.org/Licence">stronje OSMF wo licencach</a> a pod <a href="http://wiki.openstreetmap.org/wiki/Legal_FAQ">"Huste prawniske praÅ¡enja"</a>. more_2_html: "Hačrunjež OpenStreetMap wobsteji ze zjawnych datow, njemóžemy darmotny kartowy API za wuwiwarjow třećich poskićić. \nHlej naÅ¡e <a href=\"http://wiki.openstreetmap.org/wiki/API_usage_policy\">prawidła za wužiwanje API</a>, <a href=\"http://wiki.openstreetmap.org/wiki/Tile_usage_policy\">Prawidła @@ -972,6 +1047,9 @@ hsb: data, 2007 (<a href="http://www.and.com">www.and.com</a>)' contributors_nz_html: '<strong>Nowoseelandska</strong>: Wobsahuje daty ze žórłow wot Land Information New Zealand. Awtorske prawo wuměnjene.' + contributors_si_html: '<strong>Słowjenska</strong>: Wobsahuje daty ze <a href="http://www.gu.gov.si/en/">zarjada + za krajměrjenje a kartěrowanje</a> kaž tež z <a href="http://www.mkgp.gov.si/en/">ministerstwa + za ratarstwo, lěsnistwo a zežiwjenje</a> (zjawne informacije Słowjenskeje).' contributors_za_html: '<strong>Južna Afrika</strong>: Wobsahuje daty z <a href="http://www.ngi.gov.za/">Chief Directorate: National Geo-Spatial Information</a>, Statne awtorske prawo wuměnjene.' @@ -993,6 +1071,11 @@ hsb: so proÅ¡u na naÅ¡e <a href="http://www.osmfoundation.org/wiki/License/Takedown_procedure">postupowanje za wotstronjenje wobsaha</a>abo zdźěl to direktnje na naÅ¡ej <a href="http://dmca.openstreetmap.org/">formularnej stronje</a>. + trademarks_title_html: <span id="trademarks"></span>markowe znamjo + trademarks_1_html: OpenStreetMap, logo z lupu a staw karty su registrowane znamjenja + załožby OpenStreetMap. MaÅ¡-li praÅ¡enja wo wužiwanju znamjo, pósćel je proÅ¡u + <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">dźěłowej + skupinje "licency"</a>. welcome_page: title: Witaj! introduction_html: Witaj k OpenstreetMap, swobodnej a wobdźěłujomnej karće swěta. @@ -1018,6 +1101,14 @@ hsb: abo twarjenje. tag_html: <strong>Atribut</strong> je datowa kajkosć wo suku abo puću, na přikład mjeno hosćenca abo najwyÅ¡a spěšnosć na hasy. + rules: + title: Prawidła! + paragraph_1_html: "OpenStreetMap ma jenož mało formelnych prawidłow, ale wočakujemy + wot wšěch wobdźělnikow, zo bychu ze zhromadźenstwom hromadźe dźěłali a komunikowali. + PlanujeÅ¡-li druhe činitosće hač wobdźěłanje z ruku, proÅ¡u přečitaj prawidła + wo <a href='http://wiki.openstreetmap.org/wiki/Import/Guidelines'>importowanju</a> + a \n<a href='http://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct'>automatiskim + wobdźěłanju</a> a měj so po nim." questions: title: MaÅ¡ hišće praÅ¡enja? paragraph_1_html: |- @@ -1059,20 +1150,38 @@ hsb: url: /welcome title: Witaj k OSM description: Započń z tutym spěšnym nawodom, kotryž zakłady OpenStreetMap wobsahuje. + beginners_guide: + url: http://wiki.openstreetmap.org/wiki/hsb:Beginners%27_guide + title: Instrukcije za nowačkow + description: Přez zhromadźenstwo wothladowany nawod za započatkowarjow. help: url: https://help.openstreetmap.org/ title: help.openstreetmap.org - description: PraÅ¡ej so něčeho abo pytaj za wotmołwami na stronje praÅ¡enjow a - wotmołwow OpenStreetMap. + description: PraÅ¡ej so za něčim abo pytaj za wotmołwami na stronje praÅ¡enjow + a wotmołwow OpenStreetMap. + mailing_lists: + title: Rozesyłanske lisćiny + description: Staj praÅ¡enje abo diskutuj zajimawe wěcy w šěrokim wobłuku temow + abo regionalnych rozesyłanskich lisćinow. + forums: + title: Forum + description: PraÅ¡enja a diskusije za tych, kotřiž powjerch čorneje deski preferuja. + irc: + title: IRC + description: Interaktiwny chat we wÅ¡elakich rěčach a wo wjele temach. + switch2osm: + title: Přeńć k OSM + description: Pomoc za předewzaća a organizacije, kotrež na kartach a druhich + słužbach bazuja a k OpenStreetMap přeńdu. wiki: url: http://wiki.openstreetmap.org/ title: wiki.openstreetmap.org description: Přepytaj wiki za nadrobnej OSM-dokumentaciju about_page: - next: Přichodna + next: Dale copyright_html: <span>© </span>sobuskutkowacy<br>OpenStreetMap - used_by: '%{name} staja kartowe daty za sta websydłow, mobilne nałoženja a graty - k dispoziciji' + used_by: '%{name} staja kartowe daty za tysacy websydłow, mobilne nałoženja a + graty k dispoziciji' lede_text: OpenStreetMap twori so wot zhromadźenstwa kartěrowarjow, kotřiž daty wo hasach, pućach, kofejownjach, dwórnišćach a wjele wjace na cyłym swěće přinoÅ¡uja a hladaja. @@ -1091,6 +1200,7 @@ hsb: daty na wěste waÅ¡nje změniÅ¡ abo wutworiÅ¡, móžeÅ¡ wuslědk jenož pod samsnej licencu rozdźělić.Hlej <a href=''%{copyright_path}''>stronu awtorskeho prawa a licency</a> za podrobnosće.' + legal_title: Prawniske pokiwy partners_title: Partnerojo notifier: diary_comment_notification: @@ -1193,8 +1303,15 @@ hsb: greeting: Witaj, commented: subject_own: '[OpenStreetMap] %{commenter} je jednu z twojich změnow komentował(a)' + subject_other: '[OpenStreetMap] %{commenter} je sadźbu změnow komentował, + za kotruž so zajimujeÅ¡' + your_changeset: '%{commenter} je jednu z twojich sadźbow změnow komentował, + wutworjenu %{time}' + commented_changeset: '%{commenter} je sadźbu změnow karty komentował, kotruž + wobkedźbujeÅ¡ a kotraž je so wot %{changeset_author} %{time} wutworiła' partial_changeset_with_comment: z komentarom „%{changeset_comment}“ partial_changeset_without_comment: bjez komentara + details: DalÅ¡e podrobnosće wo sadźbje změnow móžeÅ¡ na %{url} namakać. message: inbox: title: Póstowy kašćik @@ -1312,6 +1429,10 @@ hsb: close: Začinić search: search: Pytać + get_directions: Rutu wuličić + get_directions_title: Wobličenje čary mjez městnomaj + from: Wot + to: Do where_am_i: Hdźe sym? where_am_i_title: Aktualne městno z pomocu pytawy wopisać submit_text: Dźi @@ -1319,13 +1440,12 @@ hsb: table: entry: motorway: Awtodróha + main_road: Hłowna dróha trunk: Dalokodróha primary: Zwjazkowa dróha secondary: Krajna dróha, statna dróha unclassified: Njeklasifikowana dróha - unsurfaced: Njewobtwjerdźena dróha track: Čara - byway: Pódlanski puć bridleway: Jěchanski puć cycleway: Kolesowarska šćežka footway: Chódnik @@ -1349,7 +1469,6 @@ hsb: golf: Golfownišćo park: Park resident: Bydlenski wobwod - tourist: Turistiska atrakcija common: - PowÅ¡itkowny - łuka @@ -1379,7 +1498,6 @@ hsb: tunnel: Smužkowana kroma = tunl bridge: Čorna kroma = móst private: Priwatny přistup - permissive: Dowoleny přistup destination: Jenož za přidróžnych construction: Dróhi w twarje richtext_area: @@ -1546,6 +1664,7 @@ hsb: allow_read_gpx: twoje priwatne GPS-ćěrje čitać. allow_write_gpx: GPS-ćěrje nahrać. allow_write_notes: pokazki změnić. + grant_access: Přistup dać oauthorize_success: title: Awtorizowanske napraÅ¡owanje dowolene allowed: Sy přistup nałoženja %{app_name} na twoje konto dowolił. @@ -1630,6 +1749,7 @@ hsb: register now: Nětko registrować with username: 'MaÅ¡ hižo konto pola OpenStreetMap? ProÅ¡u přizjew so z wužiwarskim mjenom a hesłom:' + with external: 'Wužiwaj jako alternatiwu třećeho za přizjewjenje:' new to osm: Nowy w OpenStreetMap? to make changes: Zo by daty OpenStreetMap změnił, dyrbiÅ¡ konto měć. create account minute: Załož konto. Traje jenož chwilku. @@ -1642,6 +1762,31 @@ hsb: chceÅ¡ wo tym diskutować. auth failure: Bohužel přizjewjenje z tutymi podaćemi móžno njeje. openid_logo_alt: Z OpenID přizjewić + auth_providers: + openid: + title: Přizjewjenje z OpenID + alt: Přizjewjenje z OpenID-URL + google: + title: Přizjewjenje z Google + alt: Přizjewjenje z Google OpenID + facebook: + title: Přizjewjenje z Facebook + alt: Přizjewjenje z facebookowym kontom + windowslive: + title: Přizjewjenje z Windows Live + alt: Přizjewjenje z kontom Windows Live + github: + title: Z GitHub přizjewić + alt: Z kontom GitHub přizjewić + yahoo: + title: Přizjewjenje z Yahoo + alt: Přizjewjenje z Yahoo OpenID + wordpress: + title: Přizjewjenje z Wordpress + alt: Přizjewjenje z Wordpress OpenID + aol: + title: Přizjewjenje z AOL + alt: Přizjewjenje z AOL OpenID logout: title: Wotzjewić heading: Z OpenStreetMap wotzjewić @@ -1668,8 +1813,8 @@ hsb: title: Registrować no_auto_account_create: Bohužel njemóžemy tuchwilu žane konto za tebje awtomatisce załožić. - contact_webmaster: ProÅ¡u staj so z <a href="mailto:webmaster@openstreetmap.org">webmasterom</a> - do zwiska, zo by so konto załožiło - budźemy pospytać napraÅ¡owanje tak spěšnje + contact_webmaster: ProÅ¡u staj so z <a href="%{webmaster}">webmasterom</a> do + zwiska, zo by so konto załožiło - budźemy pospytać napraÅ¡owanje tak spěšnje kaž móžno wobdźěłać. about: header: Swobodny a wobdźěłujomny @@ -1686,8 +1831,12 @@ hsb: display name: 'Wužiwarske mjeno:' display name description: Sy wužiwarske mjeno zjawnje pokazał. MóžeÅ¡ to pozdźiÅ¡o w nastajenjach změnić. + external auth: Awtentifikacija přez třeću stronu password: 'Hesło:' confirm password: 'Hesło wobkrućić:' + use external auth: Jako alternatiwa wužij třeću stronu za přizjewjenje + auth no password: Z přizjewjenjom přez třeću stronu hesło trěbne njeje, ale + někotrym přidatnym funkcijam abo serweram móhło być trjeba. continue: Registrować terms accepted: Dźakujemy so, zo sy nowe wuměnjenja za sobuskutkowarjow akceptował! terms declined: Wobžarujemy, zo sy so rozsudźił, nowe wužiwarske wuměnjenja @@ -1717,6 +1866,7 @@ hsb: heading: Wužiwar %{user} njeeksistuje body: Bohužel žadyn wužiwar z mjenom %{user} njeje. ProÅ¡u skontroluj prawopis, abo wotkaz, na kotryž sy kliknył, je njepłaćiwy. + deleted: zhaÅ¡any view: my diary: Mój dźenik new diary entry: nowy dźenikowy zapisk @@ -1768,16 +1918,16 @@ hsb: revoke: administrator: Prawa administratora preč wzać moderator: Prawa moderatora preč wzać - block_history: Dóstane blokowanja + block_history: Aktiwne blokowanja moderator_history: Date blokowanja comments: Komentary - create_block: tutoho wužiwarja blokować - activate_user: tutoho wužiwarja aktiwizować - deactivate_user: tutoho wužiwarja znjemóžnić - confirm_user: tutoho wužiwarja wobkrućić - hide_user: tutoho wužiwarja schować - unhide_user: tutoho wužiwarja pokazaś - delete_user: tutoho wužiwarja zničić + create_block: Tutoho wužiwarja blokować + activate_user: Tutoho wužiwarja aktiwizować + deactivate_user: Tutoho wužiwarja znjemóžnić + confirm_user: Tutoho wužiwarja wobkrućić + hide_user: Tutoho wužiwarja schować + unhide_user: Tutoho wužiwarja pokazaś + delete_user: Tutoho wužiwarja zhaÅ¡eć confirm: Wobkrućić friends_changesets: Sadźby změnow twojich přećelow friends_diaries: Dźenikowe zapiski přećelow @@ -1793,6 +1943,7 @@ hsb: current email address: 'Aktualna e-mejlowa adresa:' new email address: 'Nowa e-mejlowa adresa:' email never displayed publicly: (njeje ženje zjawnje widźomna) + external auth: 'Eksterna awtentifikacija:' openid: link: http://wiki.openstreetmap.org/wiki/OpenID link text: Å to to je? @@ -1862,7 +2013,7 @@ hsb: confirm_resend: success: Smy nowu wobkrućenski e-mejl na %{email} póslali a tak ruče hač swoje konto wobkrućiÅ¡, móžeÅ¡ kartěrowanje započeć.<br /><br /> Jeli přećiwospamowy - system wužiwaÅ¡, kotryž wobkrućenske napraÅ¡owanja sćele, přewzmi adresu webmaster@openstreetmap.org + system wužiwaÅ¡, kotryž wobkrućenske napraÅ¡owanja sćele, přewzmi adresu %{sender} do swojeje běłeje lisćiny, dokelž njemóžemy na wobkrućenske napraÅ¡owanja wotmołwić. failure: Wužiwar %{name} njenamakany. confirm_email: @@ -1870,8 +2021,9 @@ hsb: press confirm button: Klikń deleka na wobkrućenske tłóčatko, zo by swoju nowu e-mejlowu adresu wobkrućił. button: Wobkrućić - success: Twoja e-mejlowa adresa bu wobkrućena, dźakujemy so za registrowanje! + success: Změnjenje twojeje mejloweje adresy bu wobkrućena. failure: E-mejlowa adresa je hižo z tutym kodom wobkrućena. + unknown_token: Wobkrućenski kod je spadnjeny abo njeeksistuje. set_home: flash success: Domjace stejnišćo bu wuspěšnje składowany go_public: @@ -1911,6 +2063,19 @@ hsb: <p> Tutón rozsud budźe so bórze wot administratora pruwować, abo móžeÅ¡ so z %{webmaster} do zwiska stajić, jeli chceÅ¡ wo tym diskutować. </p> + auth_failure: + connection_failed: Zwisk z awtentifikaciskim poskićowarjom je so nimokulił + invalid_credentials: Njepłaćiwe awtentifikaciske informacije + no_authorization_code: Žadyn kod za awtorizowanje + unknown_signature_algorithm: Njeznaty signaturowy algoritmus + invalid_scope: Njepłaćiwy wobłuk + auth_association: + heading: WaÅ¡ ID hišće z kontom OpenStreetMap zwjazany njeje. + option_1: Jeli sy nowy na OpenStreetMap, załož nowe konto z pomocu slědowaceho + formulara. + option_2: Jeli konto hižo maÅ¡, móžeÅ¡ so pola swojeho konta z pomocu swojeho + wužiwarskeho mjena a hesła přizjewić a potom konto ze swojim ID w swojich + wužiwarskich nastajenjach zwjazać. user_role: filter: not_an_administrator: Jenož administratorojo móžeja wužiwarske róle zrjadować, @@ -2026,6 +2191,8 @@ hsb: heading: '%{block_on} wot %{block_by} zablokowany' time_future: Kónči so %{time} time_past: Je so před %{time} skónčiło. + created: Wutworjeny + ago: před %{time} status: Status show: Pokazać edit: Wobdźěłać @@ -2076,6 +2243,7 @@ hsb: link: Wotkaz abo HTML long_link: Wotkaz short_link: Krótki wotkaz + geo_uri: geo-URI embed: HTML custom_dimensions: Swójske wotměry nastajić format: 'Format:' @@ -2087,6 +2255,9 @@ hsb: center_marker: Kartu na marce centrować paste_html: HTML-kod kopěrować, zo by so do websydła zasadźił view_larger_map: WjetÅ¡u kartu pokazać + only_standard_layer: Jenož standardna runina da so jako wobraz eksportować + embed: + report_problem: Problem zdźělić key: title: Legenda tooltip: Legenda @@ -2102,7 +2273,6 @@ hsb: standard: Standard cycle_map: Kolesowa karta transport_map: Wobchadna karta - mapquest: MapQuest Open hot: Sobuskutkowacy humanitarneje pomocy layers: header: Kartowe runiny @@ -2119,6 +2289,8 @@ hsb: createnote_disabled_tooltip: PowjetÅ¡ kartu, zo by pokazku přidał map_notes_zoom_in_tooltip: PowjetÅ¡ kartu, zo by pokazki widźał map_data_zoom_in_tooltip: PowjetÅ¡ kartu, zo by daty widźał + queryfeature_tooltip: Funkcije napraÅ¡ować + queryfeature_disabled_tooltip: Za napraÅ¡owanje funkcijow powjetÅ¡ić changesets: show: comment: Komentar @@ -2143,11 +2315,51 @@ hsb: comment: Komentar edit_help: Přesuń kartu do městna, kotrež chceÅ¡ wobdźěłać, powjetÅ¡ tam a klikń potom tu. + directions: + engines: + graphhopper_bicycle: Koleso (GraphHopper) + graphhopper_foot: Pěši (GraphHopper) + mapquest_bicycle: Koleso (MapQuest) + mapquest_car: Awto (MapQuest) + mapquest_foot: Pěši (MapQuest) + osrm_car: Awto (OSRM) + mapzen_bicycle: Koleso (Mapzen) + mapzen_car: Awto (Mapzen) + mapzen_foot: Pěši (Mapzen) + directions: Směry + distance: Zdalenosć + errors: + no_route: Njenamakach čaru mjez tutymaj městnomaj. + no_place: Njenamakach tute městno. + instructions: + continue_without_exit: Dale na %{name} + slight_right_without_exit: połnaprawo na %{name} + turn_right_without_exit: Wotboč naprawo na %{name} + sharp_right_without_exit: Połnje naprawo na %{name} + uturn_without_exit: So zawróćić podłu %{name} + sharp_left_without_exit: Połnje nalěwo na %{name} + turn_left_without_exit: Wotboč nalěwo na %{name} + slight_left_without_exit: Połnalěwo na %{name} + via_point_without_exit: (přez městno) + follow_without_exit: Dale na %{name} + roundabout_without_exit: Wzaj %{name} w kružnym wobchadźe + leave_roundabout_without_exit: Wopušć kružny wobchad – %{name} + stay_roundabout_without_exit: Wostań w kružnym wobchadźe – %{name} + start_without_exit: Na kóncu %{name} započeć + destination_without_exit: Cil docpěty + against_oneway_without_exit: Přećiwo jednosměrowej dróze na %{name}hić + end_oneway_without_exit: Kónc jednosměroweje dróhi na %{name} + roundabout_with_exit: W kružnym wobchadźe wzaj wujězd %{exit} na %{name} + unnamed: njeznaty puć + courtesy: Směrowe instrukcije pochadźeja wot %{link} + time: Čas query: node: Suk way: Puć relation: Relacija nothing_found: Žane funkcije namakane + error: 'Zmylk při kontaktowanju %{server}: %{error}' + timeout: Čas překročowany při kontaktowanju %{server} redaction: edit: description: Wopisanje diff --git a/config/locales/hu.yml b/config/locales/hu.yml index 5c3252751..50bd81536 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -1,6 +1,7 @@ # Messages for Hungarian (magyar) # Exported from translatewiki.net # Export driver: phpyaml +# Author: BanKris # Author: BáthoryPéter # Author: City-busz # Author: Csega @@ -10,13 +11,16 @@ # Author: Grin # Author: Kempelen # Author: Leiric +# Author: Macofe # Author: Misibacsi +# Author: Máté # Author: Nemo bis # Author: R-Joe # Author: Ruila # Author: Samat # Author: Sucy # Author: Tacsipacsi +# Author: Uno20001 --- hu: time: @@ -24,11 +28,11 @@ hu: friendly: '%Y. %B %e., %H.%M' activerecord: models: - acl: Hozzáférés-vezérlési lista + acl: Hozzáférés-szabályzási lista changeset: Módosításcsomag changeset_tag: Módosításcsomag címkéje country: Ország - diary_comment: Naplóhozzászólás + diary_comment: Naplómegjegyzés diary_entry: Naplóbejegyzés friend: Barát language: Nyelv @@ -131,11 +135,16 @@ hu: way_paginated: Vonalak (%{x}-%{y} összesen %{count}) relation: Kapcsolatok (%{count}) relation_paginated: Kapcsolatok (%{x}-%{y} összesen %{count}) + comment: Hozzászólások (%{count}) + hidden_commented_by: 'Rejtett hozzászólás, szerzője: %{user} <abbr title=''%{exact_time}''>%{when}</abbr>' + commented_by: 'Hozzászólás, szerzője: %{user} <abbr title=''%{exact_time}''>%{when}</abbr>' changesetxml: Changeset XML osmchangexml: osmChange XML feed: title: 'Módosításcsomag: %{id}' title_comment: 'Módosításcsomag: %{id} - %{comment}' + join_discussion: Jelentkezz be, hogy bekapcsolódhass a megbeszélésbe + discussion: Megbeszélés node: title: 'Pont: %{name}' history_title: 'Pont történet: %{name}' @@ -166,6 +175,7 @@ hu: way: vonal relation: kapcsolat changeset: módosításcsomag + note: megjegyzés timeout: sorry: Sajnálom, a(z) %{type} típusú %{id} azonosítójú adatok kinyerése túl sokáig tartott. @@ -174,6 +184,7 @@ hu: way: vonal relation: kapcsolat changeset: módosításcsomag + note: megjegyzés redacted: redaction: Eltávolítás %{id} message_html: A %{type} %{version} verzióját nem lehet megjeleníteni, mert el @@ -211,6 +222,11 @@ hu: reopened_by: Újraaktiválta %{user} <abbr title='%{exact_time}'>%{when}</abbr> reopened_by_anonymous: Újraaktiválva névtelenül <abbr title='%{exact_time}'>%{when}</abbr> hidden_by: Elrejtette %{user} <abbr title='%{exact_time}'>%{when}</abbr> + query: + title: Lekérdezési Funkciók + introduction: Kattintson a térképen, a közeli funkciók kereséséhez. + nearby: Közeli funkciók + enclosing: Bentfoglalt funkciók changeset: changeset_paging_nav: showing_page: '%{page} oldal' @@ -241,9 +257,17 @@ hu: timeout: sorry: Sajnálom, az általad kért módosításcsomagok listájának lekérése túl sokáig tartott. + rss: + title_all: OpenStreetMap változtatáscsomag vita + title_particular: 'OpenStreetMap változtatáscsomag #%{changeset_id} vita' + comment: 'Új hozzászólás a változtatáscsomaghoz #%{changeset_id} by %{author}' + commented_at_html: Frissítve %{when} + commented_at_by_html: '%{when} ezelőtt frissítette %{user}' + full: Teljes beszélgetés diary_entry: new: title: Új naplóbejegyzés + publish_button: Publikálás list: title: Felhasználók naplói title_friends: Ismerősök naplói @@ -348,6 +372,7 @@ hu: frissített kivonata metro: title: Metro Extracts + description: A főbb városok, valamint a környező területek kivonatai other: title: Más források description: További források az OpenStreetMap wiki oldalán találhatók @@ -355,7 +380,7 @@ hu: format: 'Formátum:' scale: Méretarány max: max. - image_size: 'Képméret:' + image_size: Képméret zoom: Nagyítási szint add_marker: Jelölő hozzáadása a térképhez latitude: 'Földrajzi szélesség:' @@ -380,8 +405,10 @@ hu: search_osm_nominatim: prefix: aerialway: + cable_car: Fülkés felvonó chair_lift: Libegő drag_lift: Sífelvonó + gondola: Gondola station: Drótkötélpálya megálló aeroway: aerodrome: Repülőtér @@ -392,6 +419,7 @@ hu: taxiway: gurulóút terminal: Utasterminál amenity: + animal_shelter: Állatmenhely arts_centre: Művészeti központ atm: Bankautomata bank: Bank @@ -401,6 +429,7 @@ hu: bicycle_parking: Kerékpártároló bicycle_rental: Kerékpárkölcsönző biergarten: Sörkert + boat_rental: Csónakkölcsönző brothel: Bordélyház bureau_de_change: Pénzváltó bus_station: Autóbusz-állomás @@ -410,8 +439,10 @@ hu: car_wash: Autómosó casino: Kaszinó charging_station: Elektromos töltőállomás + childcare: Gyermekgondozás cinema: Mozi clinic: Klinika + clock: Óra college: Főiskola community_centre: Művelődési központ courthouse: Bíróság @@ -430,6 +461,7 @@ hu: food_court: Ételudvar fountain: Szökőkút fuel: Benzinkút + gambling: Szerencsejáték grave_yard: Kis temető gym: Fitnesz- / Tornaterem health_centre: Egészségügyi központ @@ -440,11 +472,14 @@ hu: library: Könyvtár market: Piac marketplace: Vásártér + monastery: Kolostor + motorcycle_parking: Motoros parkoló nightclub: Éjszakai bár nursery: Óvoda nursing_home: Idősek otthona office: Iroda parking: Parkoló + parking_entrance: Parkoló bejárat pharmacy: Gyógyszertár place_of_worship: Vallási hely police: Rendőrség @@ -478,6 +513,7 @@ hu: veterinary: Állatorvosi rendelő village_hall: Községháza waste_basket: Szemétgyűjtő kosár + waste_disposal: Hulladék lerakó youth_centre: Ifjúsági központ boundary: administrative: Közigazgatási határ @@ -492,14 +528,30 @@ hu: "yes": Híd building: "yes": Épület + craft: + brewery: Sörfőzde + carpenter: Ács + electrician: Villanyszerelő + gardener: Kertész + painter: Festő + photographer: Fényképész + plumber: Vízvezetékszerelő + shoemaker: Cipész + tailor: Szabó + "yes": Kézműves bolt emergency: + ambulance_station: Mentőállomás + defibrillator: Defibrillátor + landing_site: Vészhelyzeti leszállóhely phone: Segélyhívó highway: + abandoned: Elhagyatott út bridleway: Lovaglóút bus_guideway: Buszsín bus_stop: Buszmegálló construction: Építés alatt álló közút cycleway: Kerékpárút + elevator: Lift emergency_access_point: Vészhelyzeti hozzáférési pont footway: Gyalogút ford: Gázló @@ -528,32 +580,41 @@ hu: tertiary: Bekötőút tertiary_link: Bekötőút track: Földút + traffic_signals: Jelzőlámpák trail: Túraút trunk: Autóút trunk_link: Autóút unclassified: Egyéb út unsurfaced: Burkolatlan út + "yes": Út historic: archaeological_site: Régészeti lelőhely battlefield: Csatamező boundary_stone: Határkő building: Történelmi épület + bunker: Bunker castle: Vár church: Templom + city_gate: Városkapu citywalls: Városfal fort: Erőd + heritage: Világörökségi helyszín house: Ház icon: Ikon manor: Majorság memorial: Emlékmű mine: Bánya monument: Műemlék + roman_road: Római út ruins: Rom + stone: Kő tomb: Sírkő tower: Torony wayside_cross: Útszéli kereszt wayside_shrine: Útszéli kegyhely wreck: Hajóroncs + junction: + "yes": Csomópont landuse: allotments: Kert basin: Medence @@ -585,22 +646,28 @@ hu: road: Közúti terület village_green: Közös mező vineyard: Szőlős + "yes": Földhasználat leisure: beach_resort: Tengerparti üdülőhely bird_hide: Madárles + club: Klub common: Közös terület + dog_park: Kutyapark fishing: Horgászterület + fitness_centre: Fitneszközpont fitness_station: Fitneszterem garden: Kert golf_course: Golfpálya + horse_riding: Lovaglás ice_rink: Műjégpálya marina: Kishajókikötő miniature_golf: Minigolfpálya nature_reserve: Természetvédelmi terület park: Park - pitch: Labdarúgópálya + pitch: Sportpálya playground: Játszótér recreation_ground: Szabadidőpark + resort: Üdülőhely sauna: Szauna slipway: Sólya sports_centre: Sportközpont @@ -608,6 +675,13 @@ hu: swimming_pool: Uszoda track: Futópálya water_park: Vízipark + "yes": Szabadidő + man_made: + lighthouse: Világítótorony + pipeline: Csővezeték + tower: Torony + works: Gyár + "yes": Mesterséges military: airfield: Katonai repülőtér barracks: Laktanya @@ -618,7 +692,7 @@ hu: bay: Öböl beach: Part cape: Partfok - cave_entrance: Barlangbejárat + cave_entrance: Barlang bejárat cliff: Szikla crater: Kráter dune: Dűne @@ -627,6 +701,7 @@ hu: forest: Erdő geyser: Gejzír glacier: Gleccser + grassland: Füves puszta heath: Puszta hill: Domb island: Sziget @@ -639,6 +714,8 @@ hu: reef: Zátony ridge: Hegygerinc rock: Szikla + saddle: Hágó + sand: Homok scree: Sziklatörmelék scrub: Cserjés spring: Forrás @@ -665,6 +742,8 @@ hu: travel_agent: Utazási iroda "yes": Iroda place: + allotments: Veteményeskertek + block: Blokk airport: Repülőtér city: Nagyváros country: Ország @@ -689,6 +768,7 @@ hu: town: Város unincorporated_area: Jogi személyiséggel nem rendelkező terület village: Nagyközség + "yes": Hely railway: abandoned: Felhagyott vasút construction: Építés alatt álló vasút @@ -709,7 +789,7 @@ hu: spur: Vasúti szárnyvonal station: Vasútállomás stop: Vasúti megálló - subway: Metróállomás + subway: Metró subway_entrance: Metrókijárat switch: Vasúti váltó tram: Villamos @@ -791,6 +871,7 @@ hu: "yes": Bolt tourism: alpine_hut: Alpesi kunyhó + apartment: Lakás artwork: Műalkotás attraction: Látnivaló bed_and_breakfast: Vendégház @@ -798,6 +879,7 @@ hu: camp_site: Kemping caravan_site: Lakókocsitábor chalet: Nyaralóház + gallery: Galéria guest_house: Vendégház hostel: Turistaszálló hotel: Szálloda @@ -829,6 +911,7 @@ hu: wadi: Vádi waterfall: Vízesés weir: Bukógát + "yes": Vízi út admin_levels: level2: Országhatár level4: Államhatár @@ -913,10 +996,11 @@ hu: mapping_link: kezdheted a térképezést legal_babble: title_html: Szerzői jog és licenc - intro_1_html: |2- - Az OpenStreetMap egy <i>szabad adathalmaz</i>, amelyre az <a + intro_1_html: |- + Az OpenStreetMap<sup><a href="#trademarks">®</a></sup> egy <i>szabad adathalmaz</i>, amelyet az <a href="http://opendatacommons.org/licenses/odbl/">Open Data - Commons Open Database License</a> licenc (ODbL) vonatkozik. + Commons Open Database License</a> licenc (ODbL) alatt tett közzé az <a + href="http://osmfoundation.org/">OpenStreetMap Alapítvány</a> (OSMF). intro_2_html: |2- Szabadon másolhatod, terjesztheted, továbbíthatod és átdolgozhatod adatainkat mindaddig, amíg feltünteted az OpenStreetMapot és közreműködőit. Ha módosítod vagy felhasználod az adatainkat, akkor az eredményt is csak azonos licenccel terjesztheted. A teljes <a href="http://opendatacommons.org/licenses/odbl/1.0/">jogi @@ -949,13 +1033,14 @@ hu: title: Példa egy hivatkozásra more_title_html: Tudj meg többet! more_1_html: |- - További információ adataink használatáról a <a - href="http://wiki.openstreetmap.org/wiki/Legal_FAQ">Jogi - GYIK</a>-ban. + További információ adataink használatáról az <a + href="http://osmfoundation.org/License">OSMF Licenc lapon</a> és a közösség <a + href="http://wiki.openstreetmap.org/wiki/Legal_FAQ">Jogi + GYIK</a> gyűjteményében. more_2_html: |- - Habár az OpenStreetMap egy nyílt adatforrás, nem tudunk ingyenes térkép API elérést biztosítani külső fejlesztőknek. + Habár az OpenStreetMap egy nyílt adatforrás, nem tudunk ingyenes térkép API elérést biztosítani a harmadik feleknek. - Lásd az <a href="http://wiki.openstreetmap.org/wiki/API_usage_policy">API Felhasználási Irányelveinket</a>, a <a href="http://wiki.openstreetmap.org/wiki/Tile_usage_policy">Csempe Felhasználási Irányelveinket</a> és a <a href="http://wiki.openstreetmap.org/wiki/Nominatim#Usage_Policy">Nominatim Felhasználási Irányelveinket</a>. + Lásd az <a href="https://operations.osmfoundation.org/policies/tiles/">API Felhasználási Irányelveinket</a>, a <a href="http://wiki.openstreetmap.org/wiki/Tile_usage_policy">Csempe Felhasználási Irányelveinket</a> és a <a href="https://operations.osmfoundation.org/policies/nominatim/">Nominatim Felhasználási Irányelveinket</a>. contributors_title_html: Közreműködőink contributors_intro_html: 'Többszáz egyéni közreműködőnk van. További, szabadon elérhető adatokat is felhasználunk nemzeti térkép intézetektől és más forrásokból, @@ -970,6 +1055,10 @@ hu: Resources Canada), CanVec (© Department of Natural Resources Canada), and StatCan (Geography Division, Statistics Canada). + contributors_fi_html: "<strong>Finnország</strong>: Adatokat tartalmaz akövetkező + forrásokból: \nNational Land Survey of Finland's Topographic Database\nés + más adatforrások a href=\"http://www.maanmittauslaitos.fi/en/NLS_open_data_licence_version1_20120501\">NLSFI + License</a> alatt." contributors_fr_html: |- <strong>France</strong>: adatokat tartalmaz a következő forrásból: Direction Générale des Impôts. @@ -979,6 +1068,10 @@ hu: contributors_nz_html: |- <strong>Új-Zéland</strong>: adatokat tartalmaz a következő forrásból: Land Information New Zealand. Szerzői jog fenntartva. + contributors_si_html: '<strong>Szlovénia</strong>: Tartalmaz adatokat a <a href="http://www.gu.gov.si/en/">Földmérési + és Térképészeti Hatóságtól</a> és a <a href="http://www.mkgp.gov.si/en/">Földművelési, + Erdőgazdálkodási és Élelmezésügyi Minisztériumtól</a> (nyilvános információk + Szlovéniában).' contributors_za_html: |- <strong>Dél-Afrika</strong>: tartalmaz olyan adatokat, amik a <a href="http://www.ngi.gov.za/">Chief Directorate: @@ -1002,6 +1095,7 @@ hu: Ha úgy gondolod, hogy jogvédett anyag került jogszerűtlenül az OpenStreetMap adatbázisba vagy erre a weblapra, kérjük olvasd el az <a href="http://www.osmfoundation.org/wiki/License/Takedown_procedure">eltávolítási folyamat leírását</a> vagy jelentsd be közvetlenül az <a href="http://dmca.openstreetmap.org/">online bejelentő oldalon</a>. + trademarks_title_html: <span id="trademarks"></span>Védjegyek welcome_page: title: Üdvözlet! introduction_html: Üdvözöl az OpenStreetMap - a szabad és szerkeszthető világtérkép @@ -1028,6 +1122,14 @@ hu: egy út, folyó, tó vagy épület. tag_html: A <strong>címke</strong> egy pici adat egy ponthoz vagy vonalhoz, mint például egy étterem neve vagy egy sebességkorlátozás mértéke. + rules: + title: Szabályok! + paragraph_1_html: "Az openStreetMap-nek van néhány formális szabálya is de alapvetően + minden résztvevőtől azt várjuk el hogy együttműködjön és kommunikáljon a közösség + többi tagjával. Ha bármilyen kézi szerkesztésen túlmutató tevékenységet tervezel + akkor kérjük, hogy olvasd el az erről szóló útmutatókat az \n<a href='http://wiki.openstreetmap.org/wiki/Import/Guidelines'>Importálásról</a> + és az \n<a href='http://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct'>Automatikus + szerkesztésekről</a> szóló lapokon." questions: title: Kérdésed van? paragraph_1_html: Az OpenStreetMap számos anyagot kínál fel ahhoz, hogy ismerkedj @@ -1064,9 +1166,17 @@ hu: title: Üdvözlünk az OSM-en beginners_guide: url: http://wiki.openstreetmap.org/wiki/Hu:Beginners%27_guide + title: Kezdők kézikönyve + description: A közösség által karbantartott útmutató kezdőknek. help: url: https://help.openstreetmap.org/ title: help.openstreetmap.org + mailing_lists: + title: Levelezőlisták + forums: + title: Fórumok + irc: + title: IRC wiki: url: https://wiki.openstreetmap.org/wiki/Hu:Main_Page title: wiki.openstreetmap.org @@ -1075,6 +1185,7 @@ hu: copyright_html: <span>©</span>OpenStreetMap<br />közreműködők local_knowledge_title: Helyi tudásbázis open_data_title: Szabad adatok + legal_title: Jogi segítség partners_title: Partnerek notifier: diary_comment_notification: @@ -1175,6 +1286,13 @@ hu: commented_note: '[OpenStreetMap] %{commenter} újra megnyitotta az egyik jegyzetet amelyhez te is hozzászóltál, %{place} közelében.' details: 'A jegyzetről további információk: %{url}.' + changeset_comment_notification: + greeting: Szia! + commented: + subject_own: '[OpenStreetMap] %{commenter} hozzászólt az egyik változtatáscsomagodhoz' + subject_other: '[OpenStreetMap] %{commenter} hozzászólt az egyik, általad + érdekesnek vélt változtatáscsomaghoz' + partial_changeset_without_comment: hozzászólás nélkül message: inbox: title: Beérkezett üzenetek @@ -1286,6 +1404,10 @@ hu: close: Bezár search: search: Keresés + get_directions: Útvonalterv + get_directions_title: Útirány keresése két pont között + from: Feladó + to: Címzett where_am_i: Hol vagyok? where_am_i_title: A jelenlegi helyszín leírása a keresőmotor segítségével submit_text: Menj @@ -1293,15 +1415,17 @@ hu: table: entry: motorway: Autópálya + main_road: Fő út trunk: Autóút primary: Főút secondary: Összekötő út unclassified: Egyéb út - unsurfaced: Burkolatlan út track: Földút - byway: Ösvény bridleway: Lovaglóút cycleway: Kerékpárút + cycleway_national: Nemzeti kerékpárút + cycleway_regional: Regionális kerékpárút + cycleway_local: Helyi kerékpárút footway: Gyalogút rail: Vasút subway: Metró @@ -1323,7 +1447,6 @@ hu: golf: Golfpálya park: Park resident: Gyalogos övezet - tourist: Turisztikai látványosság common: - Füves terület - rét @@ -1338,7 +1461,7 @@ hu: brownfield: Bontási terület cemetery: Temető allotments: Kert - pitch: Labdarúgópálya + pitch: Sportpálya centre: Sportközpont reserve: Természetvédelmi terület military: Katonai terület @@ -1353,9 +1476,11 @@ hu: tunnel: Szaggatott szegély = alagút bridge: Fekete szegély = híd private: Behajtás csak engedéllyel - permissive: Behajtás engedélyezett destination: Csak célforgalom construction: Utak építés alatt + bicycle_shop: Kerékpár bolt + bicycle_parking: Kerékpár parkoló + toilets: Nyilvános WC richtext_area: edit: Szerkeszt preview: Előnézet @@ -1481,7 +1606,8 @@ hu: georss: title: OpenStreetMap GPS nyomvonalak description: - description_with_count: GPX fájl %{count} ponttal %{user} felhasználótól + description_with_count: + other: GPX fájl %{count} ponttal %{user} felhasználótól description_without_count: GPX fájl %{user} felhasználótól application: require_cookies: @@ -1497,6 +1623,7 @@ hu: Ezt nem kell elfogadnod, de meg kell tekintened. oauth: oauthorize: + title: A fiókodhoz való hozzáférés engedélyezése request_access: A(z) %{app_name} alkalmazás hozzáférést kér a felhasználói fiókodhoz, %{user}. Kérlek, jelöld, ha azt szeretnéd, hogy az alkalmazás rendelkezzen a következő képességekkel. Választhatsz olyan sokat vagy keveset, amennyit @@ -1509,10 +1636,14 @@ hu: allow_read_gpx: magán GPS nyomvonalak olvasása. allow_write_gpx: GPS nyomvonalak feltöltése. allow_write_notes: jegyzet módosítása + grant_access: Hozzáférés megadása oauthorize_success: + title: Hozzáférési kérés jóváhagyva + allowed: '%{app_name} számára hozzáférést biztosítottál a fiókodhoz.' verification: 'Az ellenőrző kód: %{code}.' oauthorize_failure: title: Az azonosítás sikertelen. + denied: '%{app_name} alkalmazástól megtagadtad, hogy hozzáférhessen a fiókodhoz.' invalid: A hitelesítő token érvénytelen. revoke: flash: Visszavontad az utalványt a(z) %{application} alkalmazáshoz @@ -1584,12 +1715,13 @@ hu: email or username: 'E-mail cím vagy felhasználónév:' password: 'Jelszó:' openid: '%{logo} OpenID:' - remember: 'Emlékezz rám:' + remember: Emlékezz rám lost password link: Elfelejtetted a jelszavad? login_button: Bejelentkezés register now: Regisztrálj most with username: 'Már van OpenStreetMap fiókod? Jelentkezz be a felhasználóneveddel és jelszavaddal:' + with external: 'Alternatívaként használj külső fiókot a bejelentkezéshez:' new to osm: Új vagy az OpenStreetMapnál? to make changes: Ahhoz, hogy módosíthasd az OpenStreetMap-adatokat, rendelkezned kell egy felhasználói fiókkal. @@ -1607,10 +1739,30 @@ hu: auth_providers: openid: title: Bejelentkezés OpenID-vel + google: + title: Bejelentkezés Google-lel + alt: Bejelentkezés Google OpenID-vel + facebook: + title: Bejelentkezés Facebook-kal + alt: Bejelentkezés Facebook fiókkal + windowslive: + title: Bejelentkezés Windows Live-val. + alt: Bejelentkezés Windows Live fiókkal + github: + title: Bejelentkezés GitHub-bal + alt: Bejelentkezés GitHub fiókkal + wikipedia: + title: Bejelentkezés Wikipédiával + alt: Wikipédia fiókkal való bejelentkezés yahoo: title: Bejelentkezés Yahoo-val + alt: Bejelentkezés Yahoo OpenID-vel + wordpress: + title: Bejelentkezés Wordpress-szel + alt: Bejelentkezés Wordpress OpenID-vel aol: title: Bejelentkezés AOL-lal + alt: Bejelentkezés AOL OpenID-vel logout: title: Kijelentkezés heading: Kijelentkezés az OpenStreetMapból @@ -1637,7 +1789,7 @@ hu: title: Felhasználói fiók létrehozása no_auto_account_create: Sajnos jelenleg nem tudunk neked létrehozni automatikusan egy felhasználói fiókot. - contact_webmaster: Kérlek fordulj a <a href="mailto:webmaster@openstreetmap.org">webmesterhez</a> + contact_webmaster: Kérlek fordulj a <a href="%{webmaster}">webmesterhez</a> (angolul), hogy lehetővé tegye felhasználói fiók létrehozását - mi igyekszünk olyan gyorsan foglalkozni a kéréssel, amilyen gyorsan csak lehet. about: @@ -1656,8 +1808,10 @@ hu: display name: 'Megjelenítendő név:' display name description: A nyilvánosan megjelenített felhasználóneved. A beállításaidban később megváltoztathatod. + external auth: 'Harmadik fél általi hitelesítés:' password: 'Jelszó:' confirm password: 'Jelszó megerősítése:' + use external auth: Alternatívaként használhatsz külső fiókokat a bejelentkezéshez continue: Regisztráció terms accepted: Köszönjük, hogy elfogadtad az új hozzájárulási feltételeket! terms declined: Sajnáljuk, hogy úgy döntöttél, nem fogadod el az új hozzájárulási @@ -1687,6 +1841,7 @@ hu: heading: '%{user} felhasználó nem létezik' body: Sajnálom, nincs %{user} nevű felhasználó. Ellenőrizd a helyességét, vagy lehet, hogy a link, amire kattintottál, rossz. + deleted: törölve view: my diary: Naplóm new diary entry: új naplóbejegyzés @@ -1739,15 +1894,15 @@ hu: revoke: administrator: Adminisztrátori hozzáférés visszavonása moderator: Moderátori hozzáférés viszzavonása - block_history: kapott blokkolások megjelenítése - moderator_history: kiosztott blokkolások megjelenítése + block_history: Aktív blokkolások + moderator_history: Kiosztott blokkolások comments: Megjegyzések create_block: ezen felhasználó blokkolása - activate_user: felhasználó aktiválása - deactivate_user: felhasználó deaktiválása - confirm_user: felhasználó megerősítése + activate_user: ezen felhasználó aktiválása + deactivate_user: ezen felhasználó deaktiválása + confirm_user: ezen felhasználó megerősítése hide_user: ezen felhasználó elrejtése - unhide_user: felhasználó elrejtésének megszüntetése + unhide_user: ezen felhasználó elrejtésének megszüntetése delete_user: ezen felhasználó törlése confirm: Megerősítés friends_changesets: Ismerőseid módosításcsomagjai @@ -1764,6 +1919,7 @@ hu: current email address: 'Jelenlegi e-mail cím:' new email address: 'Új e-mail cím:' email never displayed publicly: (soha nem jelenik meg nyilvánosan) + external auth: 'Külső Hitelesítés:' openid: link: http://wiki.openstreetmap.org/wiki/OpenID link text: mi ez? @@ -1835,16 +1991,17 @@ hu: success: Elküldtünk egy új megerősítő üzenetet a(z) %{email} címre, és amint megerősíted a felhasználói fiókodat, hozzákezdhetsz a térképezéshez.<br /><br />Ha használsz olyan antispam rendszert, amely megerősítési kérelmeket küld, - akkor győződj meg róla, hogy engedélylistára tetted a webmaster@openstreetmap.org - címet, mivel nem tudunk válaszolni megerősítési kérelmekre. + akkor győződj meg róla, hogy engedélylistára tetted a %{sender} címet, mivel + nem tudunk válaszolni megerősítési kérelmekre. failure: '%{name} felhasználó nem található.' confirm_email: heading: E-mail cím módosításának megerősítése press confirm button: Új e-mail címed megerősítéséhez nyomd meg az alábbi megerősítés gombot. button: Megerősítés - success: E-mail címed megerősítve, köszönjük a regisztrációt! + success: Az e-mail címed módosítása megerősítve! failure: Egy e-mail cím már megerősítésre került ezzel az utalvánnyal. + unknown_token: Ez a megerősítő kódo lejárt, vagy nem létezik. set_home: flash success: Otthon helye sikeresen mentve go_public: @@ -1888,6 +2045,9 @@ hu: Ezt a döntést rövidesen felül fogja vizsgálni egy adminisztrátor, vagy kapcsolatba léphetsz a %{webmaster}rel, ha meg szeretnéd vitatni ezt. </p> + auth_failure: + no_authorization_code: Nem engedély kód + unknown_signature_algorithm: Ismeretlen aláírási algoritmus user_role: filter: not_an_administrator: Csak adminisztrátorok végezhetik a felhasználói szerepek @@ -2004,6 +2164,8 @@ hu: heading: '%{block_by} blokkolta %{block_on} felhasználót' time_future: Véget ér %{time} múlva time_past: Véget ért %{time} óta + created: Létrehozva + ago: '%{time} ezelőtt' status: Állapot show: Megjelenítés edit: Szerkesztés @@ -2050,6 +2212,7 @@ hu: link: Link vagy HTML long_link: Link short_link: Rövid link + geo_uri: Geo URI embed: HTML custom_dimensions: Kiterjedés megadása format: 'Formátum:' @@ -2061,10 +2224,13 @@ hu: center_marker: Térkép középpontja a helyjelölő paste_html: Weboldalba beágyazáshoz illeszd be ezt a HTML-t view_larger_map: Nagyobb térkép + only_standard_layer: Csak az alap réteget lehet képként exportálni + embed: + report_problem: Probléma jelentése key: title: Jelmagyarázat tooltip: Jelmagyarázat - tooltip_disabled: A jelmagyarázat csak az alapértelmezett rétegen érhető el + tooltip_disabled: A jelmagyarázat nem érhető el ezen a rétegen map: zoom: in: Nagyítás @@ -2076,12 +2242,12 @@ hu: standard: Alapértelmezett cycle_map: Kerékpártérkép transport_map: Tömegközlekedési térkép - mapquest: MapQuest Open hot: Humanitáriánus layers: header: Térképnézetek notes: Térképjegyzetek data: Térképadatok + gps: Nyilvános GPS nyomvonalak overlays: További rétegek engedélyezése a térkép hibáinak javítása érdekében title: Rétegek copyright: © <a href='%{copyright_url}'>OpenStreetMap közreműködők</a> @@ -2093,6 +2259,15 @@ hu: createnote_disabled_tooltip: Nagyíts térképes jegyzet hozzáadásához map_notes_zoom_in_tooltip: Nagyítsd fel a térképet a jegyzetek megjelenítéséhez map_data_zoom_in_tooltip: Nagyítsd fel a térképet a térképadatok megjelenítéséhez + queryfeature_tooltip: Lekérdezési funkciók + queryfeature_disabled_tooltip: Nagyítás a lekérdezési funkciókra + changesets: + show: + comment: Megjegyzés + subscribe: Feliratkozás + unsubscribe: Leiratkozás + hide_comment: elrejt + unhide_comment: megjelenít notes: new: intro: Hibát találtál vagy valami hiányzik? Tudasd a többi térképezővel, hogy @@ -2108,6 +2283,45 @@ hu: reactivate: Újraaktiválás comment_and_resolve: Hozzászólás és lezárás comment: Hozzászólás + edit_help: Mozgassa a térképet, nagyítson ott ahol módosítani szeretne, majd kattintson + ide. + directions: + engines: + graphhopper_bicycle: Kerékpár (GraphHopper) + graphhopper_foot: Gyalog (GraphHopper) + mapquest_bicycle: Kerékpár (MapQuest) + mapquest_car: Autó (MapQuest) + mapquest_foot: Gyalog (MapQuest) + osrm_car: Autó (OSRM) + mapzen_bicycle: Kerékpár (Mapzen) + mapzen_car: Autó (Mapzen) + mapzen_foot: Gyalog (Mapzen) + directions: Irányok + distance: Távolság + errors: + no_route: Nem található útvonal a két hely között. + no_place: Sajnálom – a hely nem található. + instructions: + continue_without_exit: Folyamatosan %{name} + slight_right_without_exit: Enyhén jobbra %{name} + turn_right_without_exit: Forduljon jobbra %{name} + sharp_right_without_exit: Élesen jobbra %{name} + uturn_without_exit: Forduljon vissza %{name} + sharp_left_without_exit: Élesen balra %{name} + turn_left_without_exit: Forduljon balra %{name} + slight_left_without_exit: Enhén balra %{name} + follow_without_exit: Kövesse %{name} + leave_roundabout_without_exit: Hagyja el körforgalmat - %{name} + stay_roundabout_without_exit: Maradjon a körforgalomban - %{name} + unnamed: névtelen út + time: Időpont + query: + node: Csomópont + way: Vonal + relation: Kapcsolat + nothing_found: Nem találhatóak jellemzők + error: 'Hiba a %{server} szerverhez való kapcsolódáshoz: %{error}' + timeout: Időtúllépés a %{server}szerverhez kapcsolódás során redaction: edit: description: Leírás diff --git a/config/locales/ia.yml b/config/locales/ia.yml index 77880f15c..eebb71d02 100644 --- a/config/locales/ia.yml +++ b/config/locales/ia.yml @@ -2,6 +2,8 @@ # Exported from translatewiki.net # Export driver: phpyaml # Author: Carlosedepaula +# Author: Julian Mendez +# Author: Macofe # Author: McDutchie # Author: Nemo bis --- @@ -159,6 +161,7 @@ ia: way: via relation: relation changeset: gruppo de modificationes + note: nota timeout: sorry: Pardono, le datos pro le %{type} con le ID %{id} ha prendite troppo de tempore pro esser recuperate. @@ -167,6 +170,7 @@ ia: way: via relation: relation changeset: gruppo de modificationes + note: nota redacted: redaction: Obscuration %{id} message_html: Le version %{version} de iste %{type} non pote esser monstrate @@ -185,7 +189,7 @@ ia: wiki_link: key: Le pagina wiki que describe le etiquetta %{key} tag: Le pagina wiki que describe le etiquetta %{key}=%{value} - wikidata_link: Le elemento %{page} in Wikidatos + wikidata_link: Le elemento %{page} in Wikidata wikipedia_link: Le articulo %{page} in Wikipedia telephone_link: Telephonar %{phone_number} note: @@ -256,6 +260,7 @@ ia: diary_entry: new: title: Nove entrata de diario + publish_button: Publicar list: title: Diarios de usatores title_friends: Diarios de amicos @@ -467,6 +472,7 @@ ia: nursing_home: Casa de convalescentia office: Officio parking: Parking + parking_entrance: Entrata de autoparco pharmacy: Pharmacia place_of_worship: Loco de adoration police: Policia @@ -500,6 +506,7 @@ ia: veterinary: Clinica veterinari village_hall: Casa communal waste_basket: Corbe a papiro + waste_disposal: Tractamento de immunditias youth_centre: Centro pro le juventute boundary: administrative: Limite administrative @@ -514,14 +521,30 @@ ia: "yes": Ponte building: "yes": Edificio + craft: + brewery: Fabrica de bira + carpenter: Carpentero + electrician: Electricista + gardener: Jardinero + painter: Pictor + photographer: Photographo + plumber: Plumbero + shoemaker: Scarpero + tailor: Sartor + "yes": Boteca de artisanato emergency: + ambulance_station: Station de ambulantias + defibrillator: Defibrillator + landing_site: Loco de atterrage de emergentia phone: Telephono de emergentia highway: + abandoned: Via abandonate bridleway: Sentiero pro cavallos bus_guideway: Via guidate de autobus bus_stop: Halto de autobus construction: Strata in construction cycleway: Pista cyclabile + elevator: Ascensor emergency_access_point: Puncto de accesso de emergentia footway: Sentiero pro pedones ford: Vado @@ -562,22 +585,29 @@ ia: battlefield: Campo de battalia boundary_stone: Lapide de frontiera building: Edificio historic + bunker: Bunker castle: Castello church: Ecclesia + city_gate: Porta de citate citywalls: Muro del citate fort: Forte + heritage: Sito de patrimonio house: Casa icon: Icone manor: Casa seniorial memorial: Memorial mine: Mina monument: Monumento + roman_road: Via roman ruins: Ruinas + stone: Petra tomb: Tumba tower: Turre wayside_cross: Cruce juxta le via wayside_shrine: Reliquario juxta le via wreck: Naufragio + junction: + "yes": Intersection landuse: allotments: Jardines familial basin: Bassino @@ -609,14 +639,19 @@ ia: road: Area de cammino village_green: Parco de village vineyard: Vinia + "yes": Uso de terreno leisure: beach_resort: Loco de vacantias al plagia bird_hide: Observatorio de aves + club: Club common: Terreno commun + dog_park: Parco pro canes fishing: Area de pisca + fitness_centre: Centro de fitness fitness_station: Gymnasio garden: Jardin golf_course: Campo de golf + horse_riding: Equitation ice_rink: Patinatorio marina: Porto de yachts miniature_golf: Minigolf @@ -625,6 +660,7 @@ ia: pitch: Campo sportive playground: Area de jocos recreation_ground: Terreno de recreation + resort: Centro touristic sauna: Sauna slipway: Rampa de barca sports_centre: Centro sportive @@ -632,6 +668,13 @@ ia: swimming_pool: Piscina track: Pista de athletismo water_park: Parco aquatic + "yes": Tempore libere + man_made: + lighthouse: Pharo + pipeline: Tubulatura + tower: Turre + works: Fabrica + "yes": Artificial military: airfield: Aerodromo militar barracks: Barracas @@ -651,6 +694,7 @@ ia: forest: Foreste geyser: Geyser glacier: Glaciero + grassland: Prato heath: Landa hill: Collina island: Insula @@ -663,6 +707,8 @@ ia: reef: Scolio ridge: Cresta rock: Rocca + saddle: Sella + sand: Sablo scree: Detrito cadite scrub: Arbusto spring: Fontana @@ -676,6 +722,7 @@ ia: wood: Bosco office: accountant: Contabile + administrative: Administration architect: Architecto company: Compania employment_agency: Agentia de empleo @@ -688,6 +735,8 @@ ia: travel_agent: Agentia de viages "yes": Officio place: + allotments: Jardines familial + block: Bloco airport: Aeroporto city: Citate country: Pais @@ -712,6 +761,7 @@ ia: town: Urbe unincorporated_area: Area sin municipalitate village: Village + "yes": Loco railway: abandoned: Ferrovia abandonate construction: Ferrovia in construction @@ -732,7 +782,7 @@ ia: spur: Ramification de ferrovia station: Station ferroviari stop: Halto ferroviari - subway: Station de metro + subway: Metro subway_entrance: Entrata al metro switch: Agulia tram: Tramvia @@ -814,6 +864,7 @@ ia: "yes": Boteca tourism: alpine_hut: Cabana alpin + apartment: Appartamento artwork: Obra de arte attraction: Attraction bed_and_breakfast: Bed and Breakfast @@ -821,6 +872,7 @@ ia: camp_site: Terreno de camping caravan_site: Terreno pro caravanas chalet: Chalet + gallery: Galeria guest_house: Albergo hostel: Albergo hotel: Hotel @@ -852,6 +904,7 @@ ia: wadi: Wadi waterfall: Cascada weir: Barrage + "yes": Curso de aqua admin_levels: level2: Frontiera de pais level4: Frontiera de stato @@ -938,9 +991,10 @@ ia: legal_babble: title_html: Copyright e Licentia intro_1_html: |- - OpenStreetMap es <i>datos aperte</i>, licentiate sub le <a + OpenStreetMap<sup><a href="#trademarks">®</a></sup> es <i>datos aperte</i>, licentiate sub le <a href="http://opendatacommons.org/licenses/odbl/">Open Data - Commons Open Database License</a> (ODbL). + Commons Open Database License</a> (ODbL) per le <a + href="http://osmfoundation.org/">Fundation OpenStreetMap</a> (OSMF). intro_2_html: |2- Vos es libere de copiar, distribuer, transmitter e adaptar nostre cartas e datos, a condition que vos da recognoscentia a OpenStreetMap e su @@ -965,14 +1019,13 @@ ia: alt: Exemplo de como recognoscer OpenStreetMap in un pagina web title: Exemplo de recognoscentia more_title_html: Pro saper plus - more_1_html: |2- - Lege plus super le uso de nostre datos, e como recognoscer nos, al <a - href="http://wiki.openstreetmap.org/wiki/Legal_FAQ">FAQ - Legal</a>. + more_1_html: |- + Lege plus sur le uso de nostre datos, e como recognoscer nos, in le <a + href="http://osmfoundation.org/Licence">pagina de licentia OSMF</a> e in le <a href="http://wiki.openstreetmap.org/wiki/Legal_FAQ">FAQ juridic</a> communitari. more_2_html: |- - Ben que OpenStreetMap es datos aperte, nos non pote fornir un API cartographic gratuite pro disveloppatores tertie. Vide nostre <a href="http://wiki.openstreetmap.org/wiki/API_usage_policy">politica pro le uso del API</a>, - <a href="http://wiki.openstreetmap.org/wiki/Tile_usage_policy">politica pro le uso de tegulas</a> - e <a href="http://wiki.openstreetmap.org/wiki/Nominatim#Usage_Policy">politica pro le uso de Nominatim</a>. + Ben que OpenStreetMap es datos aperte, nos non pote fornir un API cartographic gratuite pro tertios. Vide nostre <a href="https://operations.osmfoundation.org/policies/api/">politica pro le uso del API</a>, + <a href="https://operations.osmfoundation.org/policies/tiles">politica pro le uso de tegulas</a> + e <a href="https://operations.osmfoundation.org/policies/nominatim">politica pro le uso de Nominatim</a>. contributors_title_html: Nostre contributores contributors_intro_html: 'Nostre contributores es milles de personas. Nos include anque le datos sub licentia aperte de agentias cartographic national e de @@ -1000,6 +1053,11 @@ ia: contributors_nz_html: |- <strong>Nove Zelandia</strong>: Contine datos proveniente de Land Information New Zealand. Crown Copyright reservate. + contributors_si_html: |- + <strong>Slovenia</strong>: Contine datos ab le + <a href="http://www.gu.gov.si/en/">Surveying and Mapping Authority</a> e del + <a href="http://www.mkgp.gov.si/en/">Ministerio del Agricultura, Silvicultura e Alimento</a> + (information public de Slovenia). contributors_za_html: |- <strong>Africa del Sud</strong>: Contine datos proveniente del <a href="http://www.ngi.gov.za/">Chief Directorate: @@ -1027,6 +1085,11 @@ ia: favor consulta nostre <a href="http://www.osmfoundation.org/wiki/License/Takedown_procedure">procedura de remotion</a> o submitte un plancto immediate usante nostre <a href="http://dmca.openstreetmap.org/">formulario in linea</a>. + trademarks_title_html: <span id="trademarks"></span>Marcas commercial + trademarks_1_html: OpenStreetMap, le logotypo con le lupa e "State of the Map" + es marcas registrate del Fundation OpenStreetMap. Si vos ha questiones sur + le uso de iste marcas, invia los al <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">gruppo + de labor sur licentias</a>. welcome_page: title: Benvenite! introduction_html: Bevenite a OpenStreetMap, le carta libere e modificabile del @@ -1053,6 +1116,14 @@ ia: tag_html: Un <strong>etiquetta</strong> es un unitate de information sur un nodo o via, como le nomine de un restaurante o le limite de velocitate de un strata. + rules: + title: Regulas! + paragraph_1_html: OpenStreetMap ha poc regulas formal, ma nos expecta que tote + le participantes collabora e communica con le communitate. Si vos considera + un activitate altere que modification per mano, lege e seque le directivas + sur le <a href='http://wiki.openstreetmap.org/wiki/Import/Guidelines'>importation</a> + e sur le <a href='http://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct'>modification + automatisate</a>. questions: title: Questiones? paragraph_1_html: |- @@ -1095,11 +1166,29 @@ ia: url: /welcome title: Benvenite a OSM description: Comencia con iste guida rapide sur le fundamentos de OpenStreetMap. + beginners_guide: + title: Guida pro comenciantes + description: Guida pro comenciantes, mantenite per le communitate. help: url: https://help.openstreetmap.org/ title: help.openstreetmap.org description: Pone un question o cerca responsas sur le sito de questiones e responsas de OSM. + mailing_lists: + title: Listas de diffusion + description: Pone un question o discute cosas interessante sur un varietate + de listas de diffusion thematic o regional. + forums: + title: Foros + description: Questiones e discussiones pro qui prefere un interfacie in stilo + de tabuliero de bulletines. + irc: + title: IRC + description: Conversation interactive in multe linguas differente e sur multe + themas. + switch2osm: + description: Adjuta pro companias e organisationes qui vole migrar a cartas + e altere servicios a base de OpenStreetMap. wiki: url: http://wiki.openstreetmap.org/ title: wiki.openstreetmap.org @@ -1107,7 +1196,7 @@ ia: about_page: next: Sequente copyright_html: <span>©</span>Contributores de<br>OpenStreetMap - used_by: '%{name} forni datos cartographic a centenas de sitos web, applicationes + used_by: '%{name} forni datos cartographic a milles de sitos web, applicationes mobile e dispositivos physic' lede_text: OpenStreetMap es construite per un communitate de cartographos que contribue e mantene datos sur stratas, sentieros, cafés, stationes ferroviari @@ -1118,11 +1207,29 @@ ia: imageria aeree, apparatos GPS e cartas ordinari de terreno pro verificar que OSM es accurate e actual. community_driven_title: Dirigite per le communitate + community_driven_html: |- + Le communitate de OpenStreetMap es diverse, passionate e cresce cata die. Nostre contributores include cartographos enthusiasta, professionales de GIS, ingenieros gerente le servitores de OSM, humanitarios cartographiante areas devastate per un disastro, e multe alteres. + Pro apprender plus sur le communitate, vide le <a href='%{diary_path}'>diarios del usatores</a>, le + <a href='http://blogs.openstreetmap.org/'>blogs del communitate</a> e le sito web del <a href='http://www.osmfoundation.org/'>Fundation OSM</a>. + open_data_title: Datos aperte + open_data_html: |- + OpenStreetMap es constituite per <i>datos aperte</i>: tu es libere de usar lo pro qualcunque scopo a condition que tu da credito a OpenStreetMap e su contributores. Si tu altera o extende le datos in certe manieras, tu pote distribuer le resultato solmente sub le mesme licentia. Vide le pagina <a href='%{copyright_path}'>Copyright e + Licentia</a> pro detalios. + legal_title: Juridic + legal_html: "Iste sito e multe altere servicios associate es formalmente gerite + per le \n<a href=\"http://osmfoundation.org/\">Fundation OpenStreetMap</a> + (OSMF) \nin nomine del communitate. Le uso de tote le servicios gerite per OSMF + es subjecte a nostre <a href=\"http://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy\">\npoliticas + de uso acceptabile</a> e a nostre <a href=\"http://wiki.osmfoundation.org/wiki/Privacy_Policy\">politica + de confidentialitate</a>\n<br> \n<a href=\"http://osmfoundation.org/Contact\">Contacta + OSMF</a> \nsi vos ha questiones sur licentias, derectos de autor o altere themas + juridic." + partners_title: Partners notifier: diary_comment_notification: - subject: '[OpenStreetMap] %{user} commentava un entrata de tu diario' + subject: '[OpenStreetMap] %{user} commentava un entrata de diario' hi: Salute %{to_user}, - header: '%{from_user} ha commentate le entrata recente de tu diario de OpenStreetMap + header: '%{from_user} ha commentate le entrata recente de diario OpenStreetMap con le subjecto %{subject}:' footer: Tu pote tamben leger le commento a %{readurl} e tu pote commentar a %{commenturl} o responder a %{replyurl} @@ -1160,7 +1267,8 @@ ia: confirm: 'Ante de facer altere cosa, nos debe confirmar que iste requesta proveniva de te. Dunque, si tu lo faceva, per favor clicca sur le ligamine sequente pro confirmar tu conto:' - welcome: Benvenite! Ecce alcun information supplementari pro adjutar te a comenciar. + welcome: Post le confirmation de tu conto, nos te fornira alcun information + supplementari pro adjutar te a comenciar. email_confirm: subject: '[OpenStreetMap] Confirma tu adresse de e-mail' email_confirm_plain: @@ -1212,7 +1320,27 @@ ia: subject_other: '[OpenStreetMap] %{commenter} ha reactivate un nota de tu interesse' your_note: '%{commenter} ha reactivate un de tu notas de carta in le vicinitate de %{place}.' + commented_note: '%{commenter} ha reactivate un nota de carta que tu ha commentate. + Le nota es in le vicinitate de %{place}.' details: Plus detalios sur le nota pote esser trovate a %{url}. + changeset_comment_notification: + hi: Salute %{to_user}, + greeting: Salute, + commented: + subject_own: '[OpenStreetMap] %{commenter} ha commentate un de tu gruppos + de modificationes' + subject_other: '[OpenStreetMap] %{commenter} ha commentate un gruppo de modificationes + que te interessa' + your_changeset: '%{commenter} ha commentate un de tu gruppos de modificationes + create le %{time}' + commented_changeset: '%{commenter} ha commentate un gruppo de modificationes + que tu observa, create per %{changeset_author} le %{time}' + partial_changeset_with_comment: con commento '%{changeset_comment}' + partial_changeset_without_comment: sin commento + details: Plus detalios sur le gruppo de modificationes pote esser trovate a + %{url}. + unsubscribe: Pro disabonar te del actualisationes de iste gruppo de modificationes, + visita %{url} e clicca sur "Disabonar". message: inbox: title: Cassa de entrata @@ -1323,6 +1451,10 @@ ia: close: Clauder search: search: Cercar + get_directions: Obtener itinerario + get_directions_title: Indicar le cammino inter duo punctos + from: De + to: A where_am_i: Ubi es io? where_am_i_title: Describer le position actual per medio del motor de recerca submit_text: Va @@ -1330,15 +1462,17 @@ ia: table: entry: motorway: Autostrata + main_road: Strata principal trunk: Via national primary: Via primari secondary: Via secundari unclassified: Via non classificate - unsurfaced: Cammino de terra track: Pista - byway: Via minor bridleway: Sentiero pro cavallos cycleway: Via cyclabile + cycleway_national: Pista cyclabile national + cycleway_regional: Pista cyclabile regional + cycleway_local: Pista cyclabile local footway: Sentiero pro pedones rail: Ferrovia subway: Metro @@ -1360,7 +1494,6 @@ ia: golf: Percurso de golf park: Parco resident: Area residential - tourist: Attraction touristic common: - Commun - prato @@ -1390,9 +1523,11 @@ ia: tunnel: Bordo a lineettas = tunnel bridge: Bordo nigre = ponte private: Accesso private - permissive: Accesso subjecte a permission destination: Traffico local construction: Vias in construction + bicycle_shop: Magazin de bicyclettas + bicycle_parking: Parcamento de bicyclettas + toilets: Toilettes richtext_area: edit: Modificar preview: Previsualisation @@ -1520,6 +1655,13 @@ ia: offline: heading: Immagazinage GPX foras de linea message: Le systema pro immagazinar e incargar files GPX es actualmente indisponibile. + georss: + title: Tracias GPS de OpenStreetMap + description: + description_with_count: + one: File GPX con %{count} puncto de %{user} + other: File GPX con %{count} punctos de %{user} + description_without_count: File GPX de %{user} application: require_cookies: cookies_needed: Tu pare haber disactivate le cookies. Per favor activa le cookies @@ -1534,6 +1676,7 @@ ia: Non es necessari declarar se de accordo, ma es obligatori haber legite los. oauth: oauthorize: + title: Autorisar accesso a tu conto request_access: Le application %{app_name} requesta accesso a tu conto "%{user}". Per favor verifica si tu vole que le application ha le sequente possibilitates. Tu pote seliger tantes o si poches como tu vole. @@ -1545,6 +1688,15 @@ ia: allow_read_gpx: leger tu tracias GPS private. allow_write_gpx: incargar tracias GPS. allow_write_notes: modificar notas. + grant_access: Conceder accesso + oauthorize_success: + title: Requesta de autorisation acceptate + allowed: Tu ha concedite al application %{app_name} le accesso a tu conto. + verification: Le codice de verification es %{code}. + oauthorize_failure: + title: Requesta de autorisation fallite + denied: Tu ha refusate al application %{app_name} le accesso a tu conto. + invalid: Le indicio de autorisation non es valide. revoke: flash: Tu ha revocate le indicio pro %{application} oauth_clients: @@ -1622,6 +1774,7 @@ ia: register now: Registrar ora with username: 'Ha tu jam un conto de OpenStreetMap? Per favor aperi session con tu nomine de usator e contrasigno:' + with external: 'Alternativemente, usa un tertio pro aperir session:' new to osm: Nove a OpenStreetMap? to make changes: Pro facer modificationes in le datos de OpenStreetMap, es necessari haber un conto. @@ -1635,6 +1788,34 @@ ia: si tu vole discuter isto. auth failure: Pardono, non poteva aperir un session con iste detalios. openid_logo_alt: Aperir session con OpenID + auth_providers: + openid: + title: Aperir session con OpenID + alt: Aperir session con un URL de OpenID + google: + title: Aperir session con Google + alt: Aperir session con un OpenID de Google + facebook: + title: Aperir session con Facebook + alt: Aperir session con un conto de Facebook + windowslive: + title: Aperir session con Windows Live + alt: Aperir session con un conto de Windows Live + github: + title: Aperir session con GitHub + alt: Aperir session con un conto de GitHub + wikipedia: + title: Aperir session con Wikipedia + alt: Aperir session con un conto de Wikipedia + yahoo: + title: Aperir session con Yahoo + alt: Aperir session con un OpenID de Yahoo + wordpress: + title: Aperir session con WordPress + alt: Aperir session con un OpenID de WordPress + aol: + title: Aperir session con AOL + alt: Aperir session con un OpenID de AOL logout: title: Clauder session heading: Clauder le session de OpenStreetMap @@ -1661,7 +1842,7 @@ ia: title: Crear conto no_auto_account_create: Infortunatemente in iste momento non es possibile crear un conto pro te automaticamente. - contact_webmaster: Per favor contacta le <a href="mailto:webmaster@openstreetmap.org">webmaster</a> + contact_webmaster: Per favor contacta le <a href="%{webmaster}">webmaster</a> pro arrangiar le creation de un conto. Nos tentara tractar vostre requesta le plus rapidemente possibile. about: @@ -1674,9 +1855,10 @@ ia: de contributor</a>. email address: 'Adresse de e-mail:' confirm email address: 'Confirmar adresse de e-mail:' - not displayed publicly: Non monstrate publicamente (vide le <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" - title="politica de confidentialitate del wiki includente un section super - adresses de e-mail">politica de confidentialitate</a>) + not displayed publicly: Tu adresse non es monstrate publicamente. Vide nostre + <a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy" title="Politica + de confidentialitate de OSMF includente un section sur adresses de e-mail">politica + de confidentialitate</a> pro plus information. display name: 'Nomine public:' display name description: Tu nomine de usator monstrate publicamente. Tu pote cambiar lo plus tarde in le preferentias. @@ -1686,16 +1868,6 @@ ia: use external auth: Alternativemente, usa un tertio pro aperir session auth no password: Con authentication per tertio, un contrasigno non es necessari, ma alcun instrumentos o servitores supplementari pote totevia necessitar un. - auth association: |- - <p>Tu ID non es ancora associate con un conto de OpenStreetMap.</p> - <ul> - <li>Si tu es nove in OpenStreetMap, crea un nove contro con le formulario ci-infra.</li> - <li> - Si tu ha jam un conto, tu pote aperir session - con tu nomine de usator e contrasigno e alora associar le conto - a tu ID in tu preferentias de usator. - </li> - </ul> continue: Crear conto terms accepted: Gratias pro acceptar le nove conditiones de contributor! terms declined: Nos regretta que tu ha decidite de non acceptar le nove Conditiones @@ -1727,6 +1899,7 @@ ia: heading: Le usator %{user} non existe body: Non existe un usator con le nomine %{user}. Per favor verifica le orthographia, o pote esser que le ligamine que tu sequeva es incorrecte. + deleted: delite view: my diary: Mi diario new diary entry: nove entrata de diario @@ -1778,16 +1951,16 @@ ia: revoke: administrator: Revocar accesso de administrator moderator: Revocar accesso de moderator - block_history: blocadas recipite - moderator_history: blocadas date + block_history: Blocadas active + moderator_history: Blocadas imponite comments: Commentos - create_block: blocar iste usator - activate_user: activar iste usator - deactivate_user: disactivar iste usator - confirm_user: confirmar iste usator - hide_user: celar iste usator - unhide_user: revelar iste usator - delete_user: deler iste usator + create_block: Blocar iste usator + activate_user: Activar iste usator + deactivate_user: Disactivar iste usator + confirm_user: Confirmar iste usator + hide_user: Celar iste usator + unhide_user: Revelar iste usator + delete_user: Deler iste usator confirm: Confirmar friends_changesets: gruppos de modificationes de tu amicos friends_diaries: articulos de diario de tu amicos @@ -1841,6 +2014,8 @@ ia: gravatar: gravatar: Usar Gravatar link text: que es isto? + disabled: Gravatar ha essite disactivate. + enabled: Tu Gravatar ha essite activate e essera monstrate desde ora. new image: Adder un imagine keep image: Retener le imagine actual delete image: Remover le imagine actual @@ -1873,10 +2048,10 @@ ia: hic</a>. confirm_resend: success: Nos ha inviate un nove message de confirmation a %{email} e si tosto - que tu confirma le conto, tu potera comenciar a cartographiar.<br /><br />Si + que tu confirma le conto, tu potera comenciar a cartographar.<br /><br />Si tu usa un systema anti-spam que invia requestas de confirmation, alora per - favor assecura te de adder webmaster@openstreetmap.org al lista blanc, post - que nos non pote responder a requestas de confirmation. + favor assecura te de adder %{sender} al lista blanc, alteremente nos non pote + responder a requestas de confirmation. failure: Usator %{name} non trovate. confirm_email: heading: Confirmar un cambio de adresse de e-mail @@ -1934,6 +2109,12 @@ ia: no_authorization_code: Nulle codice de autorisation unknown_signature_algorithm: Algorithmo de signatura non cognoscite invalid_scope: Ambito non valide + auth_association: + heading: Tu ID non es ancora associate a un conto de OpenStreetMap. + option_1: Si tu es nove in OpenStreetMap, per favor crea un conto per medio + del formulario sequente. + option_2: Si tu jam ha un conto, tu pote aperir session con tu nomine de usator + e contrasigno e postea associar le conto a tu ID in tu preferentias de usator. user_role: filter: not_an_administrator: Solmente administratores pote gerer le rolos de usator, @@ -2112,10 +2293,13 @@ ia: center_marker: Centrar le carta sur le marcator paste_html: Colla HTML pro incorporar in sito web view_larger_map: Vider carta plus grande + only_standard_layer: Solmente le strato standard pote esser exportate como imagine + embed: + report_problem: Reportar problema key: title: Legenda tooltip: Legenda - tooltip_disabled: Le legenda es disponibile solmente pro le strato Standard + tooltip_disabled: Le legenda non es disponibile pro iste strato map: zoom: in: Zoom avante @@ -2127,12 +2311,12 @@ ia: standard: Standard cycle_map: Carta cyclista transport_map: Carta de transporto - mapquest: MapQuest Open hot: Humanitario layers: header: Stratos de carta notes: Notas de carta data: Datos de carta + gps: Tracias GPS public overlays: Activar superpositiones pro resolver problemas in le carta title: Stratos copyright: © <a href='%{copyright_url}'>contributores de OpenStreetMap</a> @@ -2170,6 +2354,66 @@ ia: comment: Commento edit_help: Displacia le carta e face zoom avante in un loco que tu vole modificar, postea clicca hic. + directions: + engines: + graphhopper_bicycle: Bicycletta (GraphHopper) + graphhopper_foot: Pedestre (GraphHopper) + mapquest_bicycle: Bicycletta (MapQuest) + mapquest_car: Auto (MapQuest) + mapquest_foot: Pedestre (MapQuest) + osrm_car: Auto (OSRM) + mapzen_bicycle: Bicycletta (Mapzen) + mapzen_car: Auto (Mapzen) + mapzen_foot: Pedestre (Mapzen) + directions: Itinerario + distance: Distantia + errors: + no_route: Nulle route ha essite trovate inter iste duo locos. + no_place: Iste loco non ha essite trovate. + instructions: + continue_without_exit: Continuar sur %{name} + slight_right_without_exit: Girar legiermente a dextra verso %{name} + offramp_right_without_exit: Prende le rampa a dextra verso %{name} + onramp_right_without_exit: Girar a dextra sur le rampa verso %{name} + endofroad_right_without_exit: Al fin del strata, girar a dextra verso %{name} + merge_right_without_exit: Junger a dextra verso %{name} + fork_right_without_exit: Al bifurcation, girar a dextra verso %{name} + turn_right_without_exit: Girar a dextra verso %{name} + sharp_right_without_exit: Curva acute a dextra verso %{name} + uturn_without_exit: Retornar preter %{name} + sharp_left_without_exit: Curva acute a sinistra verso %{name} + turn_left_without_exit: Girar a sinistra verso %{name} + offramp_left_without_exit: Prende le rampa al sinistra verso %{name} + onramp_left_without_exit: Girar a sinistra sur le rampa verso %{name} + endofroad_left_without_exit: Al fin del strata, girar a sinistra verso %{name} + merge_left_without_exit: Junger a sinistra verso %{name} + fork_left_without_exit: Al bifurcation, girar a sinistra verso %{name} + slight_left_without_exit: Girar legiermente a sinistra verso %{name} + via_point_without_exit: (puncto intermedie) + follow_without_exit: Sequer %{name} + roundabout_without_exit: Al rotunda prender %{name} + leave_roundabout_without_exit: Quitar rotunda - %{name} + stay_roundabout_without_exit: Remaner sur rotunda - %{name} + start_without_exit: Comenciar al fin de %{name} + destination_without_exit: Attinger destination + against_oneway_without_exit: Ir contra direction obligatori sur %{name} + end_oneway_without_exit: Fin del direction obligatori sur %{name} + roundabout_with_exit: Al rotunda prende le exito %{exit} sur %{name} + turn_left_with_exit: Al rotunda, girar a sinistra verso %{name} + slight_left_with_exit: Al rotunda, girar legiermente a sinistra verso %{name} + turn_right_with_exit: Al rotunda, girar a dextra verso %{name} + slight_right_with_exit: Al rotunda, girar legiermente a dextra verso %{name} + continue_with_exit: Al rotunda, continuar toto recte verso %{name} + unnamed: cammino sin nomine + courtesy: Itinerario fornite per %{link} + time: Tempore + query: + node: Nodo + way: Via + relation: Relation + nothing_found: Nulle elemento trovate + error: 'Error al contactar %{server}: %{error}' + timeout: Tempore limite excedite contactante %{server} redaction: edit: description: Description diff --git a/config/locales/id.yml b/config/locales/id.yml index 02ad3677e..87fa9c86b 100644 --- a/config/locales/id.yml +++ b/config/locales/id.yml @@ -1,6 +1,7 @@ # Messages for Indonesian (Bahasa Indonesia) # Exported from translatewiki.net # Export driver: phpyaml +# Author: Arief # Author: Arifin.wijaya # Author: C5st4wr6ch # Author: Dewisulistio @@ -10,8 +11,10 @@ # Author: Ilham151096 # Author: Irwangatot # Author: Iwan Novirion +# Author: Jagwar # Author: JakArtisan # Author: Kenrick95 +# Author: Macofe # Author: Relly Komaruzaman # Author: Rizkiahmadz # Author: Vasanthi @@ -175,6 +178,7 @@ id: way: way/garis relation: relasi changeset: Set perubahan + note: catatan timeout: sorry: Maaf, data untuk %{type} dengan id %{id}, terlalu lama untuk dibuka. type: @@ -182,6 +186,7 @@ id: way: way/garis relation: relasi changeset: set perubahan + note: catatan redacted: redaction: Redaksi %{id} message_html: Versi %{version} %{type} ini tidak dapat ditampilkan karena telah @@ -272,6 +277,7 @@ id: diary_entry: new: title: Entri Baru Catatan Harian + publish_button: Terbitkan list: title: Catatan harian pengguna title_friends: Catatan harian teman @@ -420,7 +426,7 @@ id: gate: Gerbang helipad: Helipad runway: Landasan pacu - taxiway: Jalur taxi + taxiway: Landas hubung terminal: Terminal amenity: animal_shelter: Tempat Perlindungan Hewan @@ -432,7 +438,7 @@ id: bench: Bangku bicycle_parking: Parkir Sepeda bicycle_rental: Penyewaan Sepeda - biergarten: Beer Garden + biergarten: Taman Bir boat_rental: Penyewaan Perahu brothel: Bordil bureau_de_change: Penukaran Valuta Asing @@ -472,7 +478,7 @@ id: hospital: Rumah Sakit hunting_stand: Pos Berburu ice_cream: Es Krim - kindergarten: Taman Kanak-Kanak + kindergarten: Taman Kanak-kanak library: Perpustakaan market: Pasar marketplace: Pasar @@ -586,8 +592,8 @@ id: track: Trek traffic_signals: Lampu Lalu Lintas trail: Jejak - trunk: Jalan Utama - trunk_link: Jalan Utama Bukan Tol + trunk: Jalan Nasional + trunk_link: Jalan Nasional unclassified: Jalan Tidak Terklasifikasi unsurfaced: Jalan Tanpa Permukaan "yes": Jalan @@ -988,15 +994,15 @@ id: license_page: foreign: title: Tentang terjemahan ini - text: Saat terjadi konflik antara halaman diterjemahkan dan %{english_original_link}, + text: Saat terjadi konflik antara halaman terjemahan dan %{english_original_link}, halaman bahasa Inggris akan diutamakan - english_link: Bahasa Inggris asli + english_link: asli bahasa Inggris native: - title: Tentang Halaman ini + title: Tentang halaman ini text: Anda melihat versi bahasa Inggris dari halaman hak cipta. Anda dapat kembali - ke %{native_link} dari Halaman ini atau Anda dapat berhenti membaca tentang + ke %{native_link} dari halaman ini atau Anda dapat berhenti membaca tentang hak cipta dan %{mapping_link}. - native_link: Versi Bahasa Indonesia + native_link: versi bahasa Indonesia mapping_link: memulai pemetaan legal_babble: title_html: Hak Cipta & Lisensi @@ -1006,26 +1012,24 @@ id: Commons Open Database License</a> (ODbL) oleh <a href="http://osmfoundation.org/">OpenStreetMap Foundation</a> (OSMF). intro_2_html: |- - Anda dibebaskan untuk menyalin, mendistribusikan, mentransfer dan mengadaptasi data kami, - selama Anda menyertakan OpenStreetMap dan kontributornya. Jika anda merubah atau membangun - data kami, Anda harus mendistribusikan hasilnya dalam lisensi yang sama. - <a href="http://opendatacommons.org/licenses/odbl/1.0/">kode legal - code</a> akan menjelaskan hak dan kewajiban Anda + Anda dibebaskan untuk menyalin, menyalurkan, mentransfer dan mengadaptasi data kami, + selama Anda menyertakan OpenStreetMap dan kontributornya. Jika Anda mengubah atau membangun + data kami, Anda harus menyalurkan hasilnya dalam lisensi yang sama. + <a href="http://opendatacommons.org/licenses/odbl/1.0/">Kode legal</a> berisi penjelasan hak dan kewajiban Anda. intro_3_html: |- Kartografi dalam tampilan peta dan dokumentasi kami berlisensi di bawah <a href="http://creativecommons.org/licenses/by-sa/2.0/">Creative Commons Attribution-ShareAlike 2.0</a> lisensi (CC-BY-SA). credit_title_html: Cara memberikan kredit pada OpenStreetMap - credit_1_html: |- - Kami meminta anda untuk menggunakan kredit “© Kontributor OpenStreetMap - ”. + credit_1_html: Kami mewajibkan Anda untuk menggunakan kredit “© Kontributor + OpenStreetMap”. credit_2_html: Anda juga harus memperjelas bahwa data tersedia di bawah Lisensi Database Terbuka, dan jika menggunakan tiles peta kami, kartografi berlisensi sebagai CC-BY-SA. Anda dapat melakukannya dengan menghubungkan ke <a href="http://www.openstreetmap.org/copyright">halaman hak cipta</a>. Alternatifnya, dan sebagai sebuah persyaratan jika Anda mendistribusikan OSM dalam bentuk data, Anda dapat menamakan dan menghubungkannya langsung - pada lisensinya. Pada media dimana tautan tidak dimungkinkan (misalnya hasil - cetak), kami menyarankan anda untuk mengarahkan pembaca anda pada openstreetmap.org + pada lisensinya. Pada media yang tidak memungkinkan tautan (misalnya hasil + cetak), kami menyarankan Anda untuk mengarahkan pembaca Anda pada openstreetmap.org (mungkin dengan memperluas halaman 'OpenStreetMap' secara penuh), untuk opendatacommons.org, dan jika relevan, untuk creativecommons.org. credit_3_html: |- @@ -1087,8 +1091,8 @@ id: Survey © Hak cipta dan basis data milik Kerajaan 2010-12. contributors_footer_1_html: |- - Untuk rincian lebih lanjut, dan sumber-sumber lainnya yang telah digunakan untuk meningkatkan OpenStreetMap, silahkan lihat <a - href="http://wiki.openstreetmap.org/wiki/Contributors">Kontributor halaman</a> pada Wiki OpenStreetMap. + Untuk rincian lebih lanjut, dan sumber-sumber lainnya yang telah digunakan untuk meningkatkan OpenStreetMap, silakan lihat <a + href="http://wiki.openstreetmap.org/wiki/Contributors">halaman Kontributor</a> pada Wiki OpenStreetMap. contributors_footer_2_html: Dimasukkannya data dalam OpenStreetMap tidak berarti bahwa penyedia data yang asli mendukung OpenStreetMap, menyediakan jaminan, atau menerima tanggung jawab apapun. @@ -1101,9 +1105,9 @@ id: ditambahkan ke OpenStreetMap database atau situs ini, silakan lihat <a href="http://www.osmfoundation.org/wiki/License/Takedown_procedure">prosedur takedown</a> kami atau kirimkan file langsung pada <a href="http://dmca.openstreetmap.org/">pengajuan halaman on-line</a>. trademarks_title_html: <span id="trademarks"></span>Merek dagang - trademarks_1_html: OpenStreetMap dan logo kaca pembesar adalah merek dagang - terdaftar dari OpenStreetMap Foundation. Jika Anda memiliki pertanyaan tentang - penggunaan merek tersebut, silakan kirim pertanyaan Anda ke <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">Licensing + trademarks_1_html: OpenStreetMap, logo lup, dan State of the Map adalah merek + dagang terdaftar dari OpenStreetMap Foundation. Jika Anda memiliki pertanyaan + tentang penggunaan merek tersebut, silakan kirim pertanyaan Anda ke <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">Licence Working Group</a>. welcome_page: title: Selamat datang! @@ -1133,6 +1137,12 @@ id: jalan, seperti \nnama restoran atau batas kecepatan jalan" rules: title: Aturan! + paragraph_1_html: OpenStreetMap memiliki sedikit aturan formal tetapi kami mengharapkan + semua pesertanya untuk bekerja sama dan berkomunikasi dalam komunitas. Jika + Anda memikirkan aktivitas selain menyunting secara langsung, mohon baca dan + ikuti panduan pada<a href='http://wiki.openstreetmap.org/wiki/Import/Guidelines'>Impor</a> + dan <a href='http://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct'>Penyuntingan + otomatis</a>. questions: title: Ada pertanyaan? paragraph_1_html: "OpenStreetMap memiliki beberapa sumber daya untuk belajar @@ -1179,6 +1189,7 @@ id: title: Selamat datang di OSM description: Mulailah dengan panduan cepat meliputi dasar-dasar OpenStreetMap. beginners_guide: + url: http://wiki.openstreetmap.org/wiki/Panduan%27_pemula title: Pedoman Pemula description: Panduan yang ditunjang komunitas bagi pemula. help: @@ -1209,14 +1220,14 @@ id: about_page: next: Berikutnya copyright_html: <span>©</span>Kontributor<br>OpenStreetMap - used_by: Kekuatan %{name} memetakan data pada ratusan situs web, aplikasi seluler, + used_by: Kekuatan %{name} memetakan data pada ribuan situs web, aplikasi seluler, dan perangkat keras lede_text: "OpenStreetMap dibangun oleh komunitas pembuat peta yang berkontribusi dan memelihara data \ntentang jalan, jalur, kafe, stasiun kereta api, dan masih banyak lagi, di seluruh dunia." local_knowledge_title: Pengetahuan Lokal local_knowledge_html: "OpenStreetMap menekankan pengetahuan lokal. Kontributor - menggunakan \ncitra udara, perangkat GPS, dan lapangan berteknologi rendah peta + menggunakan \ncitra udara, perangkat GPS, dan peta lapangan berteknologi rendah untuk memverifikasi bahwa OSM akurat dan termutakhir." community_driven_title: Berbasis Masyarakat community_driven_html: |- @@ -1226,14 +1237,16 @@ id: dan lain-lain. Untuk mengetahui lebih lanjut, baca <a href='%{diary_path}'>catatan harian pengguna</a>, <a href='http://blogs.openstreetmap.org/'>blog komunitas</a>, dan situs web <a href='http://www.osmfoundation.org/'>OSM Foundation</a>. - open_data_title: Buka Data + open_data_title: Data Terbuka open_data_html: 'OpenStreetMap adalah <i>data terbuka</i>: Anda bebas untuk menggunakannya untuk tujuan apapun selama Anda memberi penghargaan pada OpenStreetMap dan kontributornya. Jika Anda mengubah atau membangun dari data dengan cara tertentu, Anda dapat menyebarkan hasilnya hanya di bawah lisensi yang sama. Lihat <a href=''%{copyright_path}''>halaman Hak Cipta dan Lisensi</a> untuk perinciannya.' + legal_title: Legal legal_html: |- - Situs ini dan layanan terkait lainnya dioperasikan secara resmi oleh <a href='http://osmfoundation.org/'>OpenStreetMap Foundation</a> (OSMF) atas nama komunitas. + Situs ini dan layanan terkait lainnya dioperasikan secara resmi oleh <a href='http://osmfoundation.org/'>OpenStreetMap Foundation</a> (OSMF) atas nama komunitas. Menggunakan semua layanan yang dioperasikan oleh OSMF tunduk kepada <a href="http://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy"> + Kebijakan Penggunaan Diterima</a> dan <a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy">Kebijakan Privasi</a> kami <br> Silakan <a href='http://osmfoundation.org/Contact'>menghubungi OSMF</a> jika Anda punya pertanyaan seputar lisensi, hak cipta, atau isu dan pertanyaan hukum lainnya. partners_title: Rekan @@ -1457,7 +1470,7 @@ id: potlatch2_unsaved_changes: Anda memiliki perubahan yang belum disimpan. (Untuk menyimpannya dengan Potlatch 2, Anda dapat klik simpan.) id_not_configured: iD belum dikonfigurasikan - no_iframe_support: Browser Anda tidak mendukung iframes HTML yang diperlukan + no_iframe_support: Peramban Anda tidak mendukung iframe HTML yang diperlukan untuk fitur ini. sidebar: search_results: Hasil Pencarian @@ -1475,15 +1488,17 @@ id: table: entry: motorway: Jalan Tol - trunk: Jalan Utama Bukan Tol + main_road: Jalan utama + trunk: Jalan nasional primary: Jalan Primer secondary: Jalan Sekunder unclassified: Jalan Tidak Terklasifikasi - unsurfaced: Jalan Tanpa Permukaan track: Trek - byway: Jalan Kampung bridleway: Jalan Tanah cycleway: Jalur Sepeda + cycleway_national: Jalur sepeda nasional + cycleway_regional: Jalur sepeda daerah + cycleway_local: Jalur sepeda lokal footway: Jalan Setapak rail: Rel Kereta subway: Kereta bawah tanah @@ -1495,7 +1510,7 @@ id: - Kereta Gantung runway: - Landasan bandara - - Jalur taxi + - landas hubung apron: - Tempat Parkir Pesawat - terminal @@ -1505,11 +1520,10 @@ id: golf: Lapangan Golf park: Taman resident: Area Permukiman - tourist: Objek wisata common: - Umum - Padang rumput - retail: Area pertokoan retail + retail: Area pertokoan industrial: Kawasan industri commercial: Area komersial heathland: Semak @@ -1535,9 +1549,11 @@ id: tunnel: Dashed Casing = terowongan bridge: Black casing = jembatan private: Akses pribadi - permissive: Akses Permisif - destination: Akses Tujuan + destination: Akses tujuan construction: Jalan sedang diperbaiki + bicycle_shop: Toko sepeda + bicycle_parking: Tempat parkir sepeda + toilets: Toilet richtext_area: edit: Edit preview: Tinjauan @@ -1565,16 +1581,16 @@ id: identifiable: Dapat Diidentifikasi (ditampilkan dalam daftar jejak dan sebagai diidentifikasi, mengatur poin dengan waktu pengambilan) create: - upload_trace: Upload trek GPS - trace_uploaded: File GPX Anda telah di-upload dan menunggu penyisipan dalam - database. Ini biasanya akan membutuhkan waktu setengah jam, dan sebuah email - akan dikirim kepada Anda ketika sudah selesai. + upload_trace: Unggah Jejak GPS + trace_uploaded: File GPX Anda telah diunggah dan menunggu penyisipan dalam database. + Ini biasanya membutuhkan waktu setengah jam, dan sebuah email akan dikirim + kepada Anda saat selesai. edit: title: Mengedit jejak %{name} heading: Mengedit dijitasi %{name} filename: 'Nama File:' - download: download - uploaded_at: 'Diupload:' + download: unduh + uploaded_at: 'Diunggah:' points: 'Poin/Titik:' start_coord: 'Koordinat awal:' map: peta @@ -1587,7 +1603,7 @@ id: visibility: Visibilitas visibility_help: apa artinya ini? trace_form: - upload_gpx: 'Upload File GPX:' + upload_gpx: 'Unggah File GPX:' description: Deskripsi tags: 'Tags:' tags_help: dipisahkan oleh koma @@ -1597,7 +1613,7 @@ id: help: Bantuan trace_header: upload_trace: Unggah jejak GPS - see_all_traces: Lihat semua dijitasi + see_all_traces: Lihat semua jejak see_your_traces: Melihat jejak Anda traces_waiting: one: Anda memiliki %{count} jejak GPS yang menunggu untuk diunggah. Harap @@ -1668,6 +1684,9 @@ id: georss: title: Jejak GPS OpenStreetMap description: + description_with_count: + one: Berkas GPX dengan %{count} titik dari %{user} + other: Berkas GPX dengan %{count} titik dari %{user} description_without_count: Berkas GPX dari %{user} application: require_cookies: @@ -1693,8 +1712,9 @@ id: allow_write_diary: membuat entri buku harian, komentar dan berteman. allow_write_api: memodifikasi peta. allow_read_gpx: baca jejak GPS pribadi Anda. - allow_write_gpx: Upload trek GPS + allow_write_gpx: unggah jejak GPS. allow_write_notes: memodifikasi catatan. + grant_access: Ijinkan Akses oauthorize_success: title: Permintaan otorisasi diperbolehkan allowed: Anda telah memberikan aplikasi %{app_name} akses ke akun Anda. @@ -1729,7 +1749,7 @@ id: allow_write_diary: membuat entri buku harian, komentar dan membuat pertemanan. allow_write_api: modifikasi peta. allow_read_gpx: baca jejak GPS pribadi mereka. - allow_write_gpx: upload trek GPS. + allow_write_gpx: unggah jejak GPS. allow_write_notes: memodifikasi catatan. index: title: Rincian OAuth saya @@ -1756,7 +1776,7 @@ id: allow_write_diary: membuat entri buku harian, komentar dan buat pertemanan. allow_write_api: modifikasi peta allow_read_gpx: baca jejak GPS pribadi mereka. - allow_write_gpx: upload trek GPS + allow_write_gpx: unggah jejak GPS. allow_write_notes: memodifikasi catatan. not_found: sorry: Maaf, %{type} tidak dapat ditemukan. @@ -1806,6 +1826,9 @@ id: windowslive: title: Masuk dengan Windows Live alt: Masuk dengan akun Windows Live + github: + title: Masuk dengan GitHub. + alt: Masuk dengan Akun GitHub. yahoo: title: Masuk log dengan Yahoo alt: Masuk log dengan Yahoo OpenID @@ -1842,8 +1865,8 @@ id: title: Mendaftar no_auto_account_create: Sayangnya saat ini kami tidak dapat membuatkan akun secara otomatis untuk Anda. - contact_webmaster: Silahkan kontak <a href="mailto:webmaster@openstreetmap.org">webmaster</a> - untuk mengatur sebuah akun untuk dibuat - kami akan mencoba menangani permintaan + contact_webmaster: Silahkan kontak <a href="%{webmaster}">webmaster</a> untuk + mengatur sebuah akun untuk dibuat - kami akan mencoba menangani permintaan ini secepat mungkin. about: header: Gratis dan dapat disunting @@ -1856,9 +1879,10 @@ id: kontributor</a>. email address: 'Alamat Email:' confirm email address: 'Konfirmasi Alamat Email:' - not displayed publicly: Tidak dipajangkan secara umum (Lihat <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" - title="wiki privacy policy including section on email addresses">kebijakan - privasi</a>) + not displayed publicly: Alamat Anda tidak dipajangkan secara umum, lihat <a + href="http://wiki.osmfoundation.org/wiki/Privacy_Policy" title="OSMF privacy + policy including section on email addresses">kebijakan privasi</a> kami untuk + informasi lebih lanjut display name: 'Tampilan Nama:' display name description: Username Anda yang ditampilkan pada publik. Anda dapat mengubahnya dalam pengaturan. @@ -1868,16 +1892,6 @@ id: use external auth: Atau, gunakan pihak ketiga untuk masuk auth no password: Dengan autentikasi pihak ketiga kata sandi tidak diperlukan, tetapi beberapa alat tambahan atau server mungkin memerlukannya. - auth association: |- - <p>ID Anda belum terhubung dengan akun OpenStreetMap.</p> - <ul> - <li>Jika Anda pengguna baru OpenStreetMap, mohon membuat akun baru dengan mengisi formulir di bawah.</li> - <li> - Jika Anda telah memiliki akun, Anda dapat masuk - dengan nama dan kata sandi kemudian menghubungkan akun - dengan ID Anda dalam pengaturan pengguna. - </li> - </ul> continue: Mendaftar terms accepted: Terima kasih telah menerima persyaratan kontributor yang baru! terms declined: Kami mohon maaf Anda tidak menerima Persyaratan Kontributor @@ -1891,7 +1905,7 @@ id: Anda yang sudah ada dan di masa yang akan datang. consider_pd: Sebagai tambahan perjanjian di atas, saya menganggap kontribusi saya berada di dalam Domain Publik - consider_pd_why: Apa ini? + consider_pd_why: apa ini? guidance: 'Informasi untuk membantu Anda memahami persyaratan ini: sebuah <a href="%{summary}">ringkasan yang mudah dibaca</a> dan beberapa <a href="%{translations}">terjemahan informal</a>' @@ -1903,12 +1917,13 @@ id: legale_names: france: Perancis italy: Italia - rest_of_world: Bagian Lainnya dari Dunia + rest_of_world: Bagian lain dari dunia no_such_user: title: Pengguna tersebut tidak ditemukan heading: Pengguna %{user} tidak dapat ditemukan body: Maaf, tidak ada pengguna dengan nama %{user}. Silahkan cek kembali ejaan, atau mungkin link yang Anda klik salah. + deleted: dihapus view: my diary: Catatan Harian Saya new diary entry: Entri baru catatan harian @@ -1961,16 +1976,16 @@ id: revoke: administrator: Mencabut akses administrator moderator: Mencabut akses moderator - block_history: blok diterima - moderator_history: blok yang diberikan + block_history: Blok Aktif + moderator_history: Blok yang Diberikan comments: Komentar - create_block: Blokir pengguna ini - activate_user: aktifkan pengguna ini - deactivate_user: nonaktifkan pengguna ini - confirm_user: konfirmasi pengguna ini - hide_user: sembunyikan pengguna ini - unhide_user: munculkan kembali pengguna ini - delete_user: hapus pengguna ini + create_block: Blokir Pengguna Ini + activate_user: Aktifkan Pengguna Ini + deactivate_user: Nonaktifkan Pengguna Ini + confirm_user: Konfirmasi Pengguna Ini + hide_user: Sembunyikan Pengguna Ini + unhide_user: Munculkan Kembali Pengguna Ini + delete_user: Hapus Pengguna Ini confirm: Konfirmasi friends_changesets: Telusuri semua set perubahan yang dibuat oleh teman-teman friends_diaries: Telusuri seluruh entri catatan harian oleh teman-teman @@ -2024,6 +2039,8 @@ id: gravatar: gravatar: Gunakan Gravatar link text: apa ini? + disabled: Gravatar telah dinonaktifkan. + enabled: Tampilan dari Gravatar Anda telah diaktifkan. new image: Tambahkan gambar keep image: Gunakan gambar saat ini delete image: Hapus gambar saat ini @@ -2059,8 +2076,8 @@ id: success: Kami telah mengirim catatan konfirmasi baru ke %{email} dan setelah Anda mengkonfirmasi akun, Anda akan dapat mulai melakukan pemetaan.<br /><br />Jika Anda menggunakan sistem anti spam yang mengirimkan permintaan konfirmasi - silahkan pastikan Anda memasukkan webmaster@openstreetmap.org ke dalam daftar - putih karena kami tidak dapat membalas permintaan konfirmasi Anda. + silahkan pastikan Anda memasukkan %{sender} ke dalam daftar putih karena kami + tidak dapat membalas permintaan konfirmasi Anda. failure: Pengguna %{name} tidak ditemukan. confirm_email: heading: Konfirmasi perubahan alamat email @@ -2110,9 +2127,17 @@ id: %{webmaster} jika Anda ingin mendiskusikannya.\n</p>" auth_failure: connection_failed: Hubungan dengan penyedia autentikasi gagal + invalid_credentials: Kredensial otentikasi tidak sah no_authorization_code: Tidak ada kode otorisasi unknown_signature_algorithm: Algoritma khas tidak dikenal invalid_scope: Cakupan tidak sah + auth_association: + heading: ID Anda tidak diasosiasikan dengan akun OpenStreetMap manapun. + option_1: Jika Anda baru menggunakan OpenStreetMap, silakan buat akun baru menggunakan + formulir di bawah. + option_2: Jika Anda sudah memiliki akun, Anda dapat masuk log ke akun Anda menggunakan + nama pengguna dan kata sandi Anda dan lalu asosiasikan akunnya dengan ID Anda + di pengaturan pengguna Anda. user_role: filter: not_an_administrator: Hanya administrator yang dapat melakukan peran manajemen @@ -2295,6 +2320,9 @@ id: center_marker: Tengahkan peta pada penanda paste_html: Tempel HTML untuk menyimpan di situs web view_larger_map: Lihat peta lebih besar + only_standard_layer: Hanya lapisan standar yang dapat diekspor sebagai gambar + embed: + report_problem: Laporkan masalah key: title: Kunci Peta tooltip: Kunci Peta @@ -2360,6 +2388,9 @@ id: mapquest_car: Mobil (MapQuest) mapquest_foot: Jalan Kaki (MapQuest) osrm_car: Mobil (OSRM) + mapzen_bicycle: Sepeda (Mapzen) + mapzen_car: Mobil (Mapzen) + mapzen_foot: Kaki (Mapzen) directions: Petunjuk Arah distance: Jarak errors: @@ -2368,11 +2399,21 @@ id: instructions: continue_without_exit: Lurus ke %{name} slight_right_without_exit: Kanan sedikit ke %{name} + offramp_right_without_exit: Ambil jalur ke kanan pada %{name} + onramp_right_without_exit: Belok kanan di jalur pada %{name} + endofroad_right_without_exit: Di ujung jalan belok kanan di %{name} + merge_right_without_exit: Gabung ke kanan ke %{name} + fork_right_without_exit: Di persimpangan belok kanan ke %{name} turn_right_without_exit: Belok kanan ke %{name} sharp_right_without_exit: Kanan tajam ke %{name} uturn_without_exit: Putar balik ke %{name} sharp_left_without_exit: Kiri tajam ke %{name} turn_left_without_exit: Belok kiri ke %{name} + offramp_left_without_exit: Ambil jalur di sebelah kiri ke %{name} + onramp_left_without_exit: Belok kiri di jalur ke %{name} + endofroad_left_without_exit: Di ujung jalan belok kiri ke %{name} + merge_left_without_exit: Gabung kiri ke %{name} + fork_left_without_exit: Di persimpangan belok kiri ke %{name} slight_left_without_exit: Kiri sedikit ke %{name} via_point_without_exit: (lewat tempat) follow_without_exit: Ikuti %{name} diff --git a/config/locales/is.yml b/config/locales/is.yml index 939b79a1c..a8d1323d0 100644 --- a/config/locales/is.yml +++ b/config/locales/is.yml @@ -1,19 +1,25 @@ # Messages for Icelandic (íslenska) # Exported from translatewiki.net # Export driver: phpyaml +# Author: Macofe # Author: Nemo bis # Author: Snævar +# Author: Sveinki +# Author: Sveinn í Felli # Author: Ævar Arnfjörð Bjarmason --- is: + html: + dir: ltr time: formats: - friendly: '%e .%B %Y kl. %H:%M' + friendly: '%e. %B %Y kl. %H:%M' + blog: '%e. %B %Y' activerecord: models: acl: Aðgangslisti - changeset: Breytingarsett - changeset_tag: Eigindi breytingarsetts + changeset: Breytingasett + changeset_tag: Merki breytingasetts country: Land diary_comment: Bloggathugasemd diary_entry: Bloggfærsla @@ -21,37 +27,37 @@ is: language: Tungumál message: Skilaboð node: Hnútur - node_tag: Eigindi hnúts + node_tag: Merki hnúts notifier: Tilkynnandi old_node: Gamall hnútur - old_node_tag: Eigindi gamals hnúts + old_node_tag: Merki gamals hnúts old_relation: Gömul vensl old_relation_member: Stak í gömlum venslum - old_relation_tag: Eigindi gamalla vensla - old_way: Gamall vegur - old_way_node: Hnútur í gömlum vegi - old_way_tag: Eigindi gamals vegs Tag + old_relation_tag: Merki gamalla vensla + old_way: Gömul leið + old_way_node: Hnútur í gamalli leið + old_way_tag: Merki gamallar leiðar relation: Vensl relation_member: Stak í venslum - relation_tag: Eigindi vensla + relation_tag: Merki vensla session: Seta trace: Ferill tracepoint: Ferilpunktur - tracetag: Eigindi ferils + tracetag: Merki ferils user: Notandi user_preference: Notandastillingar user_token: Leynistrengur notanda - way: Vegur - way_node: Veghnútur - way_tag: Vegeigindi + way: Leið + way_node: Leiðarhnútur + way_tag: Merki leiðar attributes: diary_comment: body: Texit diary_entry: user: Notandi - title: Titill - latitude: Lengdargráða - longitude: Breiddargráða + title: Fyrirsögn + latitude: Breiddargráða + longitude: Lengdargráða language: Tungumál friend: user: Notandi @@ -61,17 +67,17 @@ is: visible: Sýnileg name: Nafn size: Stærð - latitude: Lengdargráða - longitude: Breiddargráða - public: Sýnileg öllum + latitude: Breiddargráða + longitude: Lengdargráða + public: Opinbert description: Lýsing message: sender: Sendandi - title: Titill + title: Fyrirsögn body: Texti recipient: Móttakandi user: - email: Netfang + email: Tölvupóstfang active: Virkur display_name: Sýnilegt nafn description: Lýsing @@ -79,56 +85,136 @@ is: pass_crypt: Lykilorð printable_name: with_version: '%{id}, útgáfa %{version}' + with_name_html: '%{name} (%{id})' + editor: + default: Sjálfgefið (núna %{name}) + potlatch: + name: Potlatch 1 + description: Potlatch 1 (ritill í vafra) + id: + name: iD + description: iD (ritill í vafra) + potlatch2: + name: Potlatch 2 + description: Potlatch 2 (ritill í vafra) + remote: + name: Fjarstýring + description: Fjarstýring (JOSM eða Merkaartor) browse: + created: Búið til + closed: Lokað + created_html: Bjó til <abbr title='%{title}'>%{time} síðan</abbr> + closed_html: Lokað <abbr title='%{title}'> fyrir %{time} síðan</abbr> + created_by_html: Búið til <abbr title='%{title}'> fyrir %{time} síðan</abbr> af + %{user} + deleted_by_html: Eytt <abbr title='%{title}'> fyrir %{time} síðan</abbr> af %{user} + edited_by_html: Breytt <abbr title='%{title}'> fyrir %{time} síðan</abbr> af %{user} + closed_by_html: Lokað <abbr title='%{title}'> fyrir %{time} síðan</abbr> af %{user} + version: Útgáfa + in_changeset: Breytingasett + anonymous: nafnlaus + no_comment: (engin athugasemd) + part_of: Hluti af + download_xml: Sækja XML + view_history: Skoða feril + view_details: Skoða nánar + location: 'Staðsetning:' changeset: - title: Breytingarsett - changesetxml: Breytingarsetts XML sniði + title: 'Breytingasett: %{id}' + belongs_to: Höfundur + node: Hnútar (%{count}) + node_paginated: Hnútar (%{x}-%{y} af %{count}) + way: Leiðir (%{count}) + way_paginated: Leiðir (%{x}-%{y} af %{count}) + relation: Vensl (%{count}) + relation_paginated: Vensl (%{x}-%{y} af %{count}) + comment: Athugasemdir (%{count}) + hidden_commented_by: Falin umsögn frá %{user} <abbr title='%{exact_time}'>%{when} + síðan</abbr> + commented_by: Umsögn frá %{user} <abbr title='%{exact_time}'>%{when} síðan</abbr> + changesetxml: Breytingasetts XML sniði osmchangexml: osmChange XML sniði feed: - title: Breytingarsett %{id} - title_comment: Breytingarsett %{id} - %{comment} + title: Breytingasett %{id} + title_comment: Breytingasett %{id} - %{comment} + join_discussion: Skráðu þig inn til að taka þátt í umræðunni + discussion: Umræða + node: + title: 'Hnútur: %{name}' + history_title: 'Saga hnúts: %{name}' + way: + title: 'Leið: %{name}' + history_title: 'Saga leiðar: %{name}' + nodes: Hnútar + relation: + title: 'Vensl: %{name}' + history_title: 'Ferill vensla: %{name}' + members: Meðlimir relation_member: + entry: '%{type} %{name}' entry_role: '%{type} %{name} sem „%{role}“' type: - node: Hnúturinn - way: Vegurinn - relation: Venslin + node: Hnútur + way: Leið + relation: Vensl containing_relation: - entry: Venslunum %{relation_name} - entry_role: Venslunum %{relation_name} (sem „%{relation_role}“) + entry: Venslin %{relation_name} + entry_role: Venslin %{relation_name} (sem „%{relation_role}“) not_found: - sorry: Því miður %{type} með kennitöluna %{id}. + sorry: Því miður, %{type} með auðkennið %{id} fannst ekki. type: - node: fannst ekki hnútur - way: fannst ekki vegur - relation: fundust ekki vensli - changeset: fannst ekki breytingarsett + node: hnútur + way: leið + relation: vensl + changeset: fannst ekki breytingasett + note: minnispunktur timeout: sorry: Ekki var hægt að ná í gögn fyrir %{type} með kennitöluna %{id}, það tók of langann tíma að ná í gögnin. type: node: hnútinn - way: veginn + way: leiðina relation: venslin - changeset: breytingarsettið + changeset: breytingasettið + note: minnispunktur + redacted: + type: + node: hnút + way: leið + relation: venslum start_rjs: + feature_warning: Hleð inn %{num_features} fitjum (kortahlutum), sem gæti valdið + því að vafrinn þinn verði hægur eða svari ekki. Ertu viss um að þú viljir + birta þessi gögn? load_data: Hlaða inn gögnum loading: Hleð inn gögnum... tag_details: - tags: 'Eigindi:' + tags: Merki wiki_link: - key: Wiki-síðan fyrir %{key} lykilinn - tag: Wiki-síðan fyrir %{key}=%{value} eigindin + key: Wiki-síðan fyrir %{key} merkið + tag: Wiki-síðan fyrir %{key}=%{value} merkið + wikidata_link: Atriðið %{page} á Wikidata wikipedia_link: „%{page}“ greinin á Wikipedia + telephone_link: Hringja í %{phone_number} + note: + title: 'Minnispunktur: %{id}' + new_note: Nýr minnispunktur + description: Lýsing + hidden_title: 'Falinn minnispunktur #%{note_name}' + query: + title: Rannsaka fitjur + introduction: Smelltu á kortið til að finna fitjur í nágrenninu. + nearby: Nálægar fitjur + enclosing: Umlykjandi fitjur changeset: changeset_paging_nav: - showing_page: Sýni síðu %{page} + showing_page: Síða %{page} next: Næsta » - previous: « Fyrri + previous: « Fyrra changeset: - anonymous: Ónafngreindur + anonymous: Nafnlaus no_edits: (engar breytingar) - view_changeset_details: Skoða breytingarsett + view_changeset_details: Skoða breytingasett changesets: id: Kennitala saved_at: Vistað @@ -136,19 +222,27 @@ is: comment: Athugasemd area: Svæði list: - title: Breytingarsett + title: Breytingasett title_user: Breytingar eftir %{user} + load_more: Hlaða inn fleiri + rss: + commented_at_html: Uppfært fyrir %{when} síðan + commented_at_by_html: Uppfært fyrir %{when} síðan af %{user} + full: Öll umræðan diary_entry: new: title: Ný bloggfærsla + publish_button: Gefa út list: title: Blogg notenda + title_friends: Blogg vina + title_nearby: Blogg notenda í nágrenninu user_title: Blogg %{user} in_language_title: Bloggfærslur á %{language} new: Ný bloggfærsla new_title: Semja nýja færslu á bloggið þitt no_entries: Engar bloggfærslur - recent_entries: 'Nýlegar færslur:' + recent_entries: Nýlegar bloggfærslur older_entries: Eldri færslur newer_entries: Nýrri færslur edit: @@ -167,7 +261,7 @@ is: user_title: Blogg %{user} leave_a_comment: Bæta við athugasemd login_to_leave_a_comment: '%{login_link} til að bæta við athugasemd' - login: Innskráðu þig + login: Innskrá save_button: Vista no_such_entry: title: Þessi bloggfærsla er ekki til @@ -179,7 +273,8 @@ is: comment_link: Bæta við athugasemd reply_link: Senda höfund skilaboð comment_count: - one: 1 athugasemd + zero: Engar athugasemdir + one: '%{count} athugasemd' other: '%{count} athugasemdir' edit_link: Breyta þessari færslu hide_link: Fela þessa færslu @@ -194,36 +289,51 @@ is: edit: breyta feed: user: - title: OpenStreetMap dagbókarfærslur eftir %{user} - description: Nýjustu dagbókarfærslur eftir %{user} + title: OpenStreetMap bloggfærslur eftir %{user} + description: Nýjustu bloggfærslur eftir %{user} language: - title: OpenStreetMap dagbókarfærslur á %{language_name} - description: Nýjustu dagbókarfærslur frá OpenStreetMap á %{language_name} + title: OpenStreetMap bloggfærslur á %{language_name} + description: Nýjustu bloggfærslur frá notendum OpenStreetMap á %{language_name} all: - title: OpenStreetMap dagbókarfærslur - description: Nýjustu dagbókarfærslur frá OpenStreetMap + title: OpenStreetMap bloggfærslur + description: Nýjustu bloggfærslur frá notendum OpenStreetMap + comments: + has_commented_on: '%{display_name} gerði athugasemdir við eftirfarandi bloggfærslur' + post: Senda + when: Þegar + comment: Athugasemd + ago: fyrir %{ago} síðan + newer_comments: Nýrri athugasemdir + older_comments: Eldri athugasemdir export: + title: Flytja út start: area_to_export: Svæði til að niðurhala manually_select: Velja annað svæði á kortinu format_to_export: Skráasnið osm_xml_data: OpenStreetMap XML gögn + map_image: Kortamynd (sýnir staðallagið) embeddable_html: HTML til að bæta á vefsíðu licence: Leyfi - export_details: OpenStreetMap gögnin eru undir <a href="http://creativecommons.org/licenses/by-sa/2.0/">Creative - Commons Attribution-ShareAlike 2.0 leyfinu</a>. + export_details: OpenStreetMap gögnin eru með <a href="http://opendatacommons.org/licenses/odbl/1.0/">Open + Data Commons Open Database License</a> (ODbL) notkunarleyfi. too_large: - body: Svæðið sem þú ert að reyna að setja inn á OpenStreetMap á XML formi - er of stórt. Vinsamlegast þysjaðu inn eða veldu smærra svæði. + body: Svæðið sem þú ert að reyna að flytja út á OpenStreetMap á XML-sniði + er of stórt. Auktu aðdráttinn eða veldu smærra svæði, nú eða notaðu eina + af eftirfarandi leiðum til að flytja inn mikið magn gagna. + geofabrik: + title: Niðurhöl frá Geofabrik + other: + title: Aðrar heimildir options: Valmöguleikar - format: 'Snið:' - scale: Skali + format: Snið + scale: Kvarði max: hámark - image_size: 'Stærð myndar:' - zoom: Þys + image_size: Stærð myndar + zoom: Aðdráttur add_marker: Bæta punkti á kortið - latitude: 'Lengdargráða:' - longitude: 'Breiddargráða:' + latitude: 'Lengd:' + longitude: 'Breidd:' output: Úttak paste_html: Notaðu þennan HTML kóða til að bæta kortinu á vefsíðu export_button: Niðurhala @@ -238,170 +348,437 @@ is: osm_nominatim: Niðurstöður frá <a href="http://nominatim.openstreetmap.org/">OpenStreetMap Nominatim</a> geonames: Niðurstöður frá <a href="http://www.geonames.org/">GeoNames</a> + osm_nominatim_reverse: Niðurstöður frá <a href="http://nominatim.openstreetmap.org/">OpenStreetMap + Nominatim</a> + geonames_reverse: Niðurstöður frá <a href="http://www.geonames.org/">GeoNames</a> search_osm_nominatim: prefix_format: '%{name}:' prefix: + aerialway: + cable_car: Kláflyfta + chair_lift: Stólalyfta + drag_lift: Toglyfta + gondola: Eggjalyfta + aeroway: + aerodrome: Flugsvæði + apron: Flughlað + gate: Hlið + helipad: Þyrlupallur + runway: Flugbraut + taxiway: Akstursbraut + terminal: Flugstöð amenity: - atm: Hraðbankinn - bank: Bankinn - bar: Barinn + animal_shelter: Dýraheimili + arts_centre: Listamiðstöð + atm: Hraðbanki + bank: Banki + bar: Bar + bbq: Grill bench: Bekkur bicycle_parking: Hjólastæði - bicycle_rental: Reiðhjólaleigan - brothel: Hóruhúsið + bicycle_rental: Reiðhjólaleiga + biergarten: Bjórgarður + boat_rental: Bátaleiga + brothel: Hóruhús bureau_de_change: Gjaldeyrisskipti bus_station: Strætóstöð - cafe: Kaffihúsið + cafe: Kaffihús car_rental: Bílaleigan car_wash: Bílaþvottastöðin casino: Spilavíti - cinema: Kvikmyndarhúsið + charging_station: Hleðslustöð + childcare: Barnagæsla + cinema: Kvikmyndahús clinic: Heilsugæsla + clock: Klukka college: Framhaldskóli community_centre: Samfélagsmiðstöð courthouse: Dómshús crematorium: Bálstofa - dentist: Tannlæknirinn + dentist: Tannlæknir doctors: Læknar dormitory: Heimavist + drinking_water: Drykkjarvatn driving_school: Ökuskóli - embassy: Sendiráðið + embassy: Sendiráð emergency_phone: Neyðarsími - fast_food: Skyndibitastaðurinn - fire_hydrant: Brunahaninn + fast_food: Skyndibitastaður + ferry_terminal: Ferjustöð + fire_hydrant: Brunahani fire_station: Slökkvistöð fountain: Gosbrunnur fuel: Bensínstöð + gambling: Fjárhættuspil grave_yard: Kirkjugarður gym: Líkamsræktarstöð - hospital: Sjúkrahúsið - ice_cream: Ís + health_centre: Heilsumiðstöð + hospital: Sjúkrahús + hunting_stand: Skotvöllur + ice_cream: Ísbúð kindergarten: Leikskóli - library: Bókasafnið + library: Bókasafn market: Markaður marketplace: Markaður + monastery: Klaustur + motorcycle_parking: Mótorhjólastæði nightclub: Næturklúbbur + nursery: Skiptiborð + nursing_home: Hjúkrunarheimili office: Skrifstofa parking: Bílastæði - pharmacy: Apótek + parking_entrance: Aðgangur að bílastæði + pharmacy: Lyfjabúð + place_of_worship: Tilbeiðslustaður police: Lögreglustöð - post_box: Póstkassinn - post_office: Pósthúsið - prison: Fangelsið - pub: Pöbbinn + post_box: Póstkassi + post_office: Pósthús + preschool: Forskóli + prison: Fangelsi + pub: Krá public_building: Opinber bygging - restaurant: Veitingastaðurinn + reception_area: Móttökusvæði + recycling: Endurvinnsla + restaurant: Veitingastaður retirement_home: Elliheimili - sauna: Gufubaðið - school: Skólinn + sauna: Gufubað + school: Skóli shelter: Skýli - shop: Verslunin - studio: Stúdíó íbúð + shop: Verslun + shower: Steypibað + social_centre: Félagsmiðstöð + studio: Stúdíó + swimming_pool: Sundlaug taxi: Leigubílastöð telephone: Almenningssími - theatre: Leikhúsið + theatre: Leikhús toilets: Klósett + townhall: Ráðhús university: Háskóli vending_machine: Sjálfsali veterinary: Dýraspítali + village_hall: Hreppsskrifstofa waste_basket: Ruslafata + waste_disposal: Ruslsöfnun + youth_centre: Ungmennamiðstöð + boundary: + administrative: Stjórnsýslumörk + census: Manntalsmörk + national_park: Þjóðgarður + protected_area: Verndarsvæði + bridge: + aqueduct: Vatnsveitubrú + suspension: Hengibrú + swing: Snúningsbrú + viaduct: Dalbrú + "yes": Brú + building: + "yes": Bygging + craft: + brewery: Brugghús + carpenter: Trésmiður + electrician: Rafvirki + gardener: Garðyrkjumaður + painter: Málari + photographer: Ljósmyndari + plumber: Pípulagningamaður + shoemaker: Skósmiður + tailor: Klæðskeri + "yes": Handverkshús + emergency: + ambulance_station: Sjúkrabílastöð + defibrillator: Hjartastuðtæki + landing_site: Neyðarlending + phone: Neyðarsími highway: - bus_stop: Stoppustöð + abandoned: Ónotuð hraðbraut + bridleway: Reiðstígur + bus_stop: Strætisvagnabiðstöð + construction: Hraðbraut í byggingu cycleway: Hjólastígur + elevator: Lyfta footway: Göngustígur - ford: Vaðið + ford: Vað living_street: Vistgata motorway: Hraðbraut + path: Slóð + pedestrian: Gönguleið + platform: Kerfishögun primary: Stofnvegur primary_link: Stofnvegur - residential: Íbúðargatan + proposed: Tillaga um veglagningu + raceway: Keppnisbraut + residential: Íbúðagata + rest_area: Hvíldarsvæði + road: Vegur + secondary: Tengivegur + secondary_link: Tengivegur service: Þjónustuvegur + speed_camera: Hraðamyndavél + steps: Tröppur + street_lamp: Ljósastaur + track: Spor + traffic_signals: Umferðarljós + trail: Slóði + trunk: Stofnbraut + trunk_link: Stofnbraut + unclassified: Óflokkaður vegur + unsurfaced: Vegur án slitlags + "yes": Vegur historic: - castle: Kastalinn + archaeological_site: Fornminjar + battlefield: Orustuvöllur + building: Söguleg bygging + bunker: Sprengjubyrgi + castle: Kastali church: Kirkja + city_gate: Borgarhlið + citywalls: Borgarmúrar + fort: Virki + heritage: Sögulegur staður house: Hús + icon: Táknmynd + manor: Herragarður memorial: Minnismerki + mine: Náma + monument: Minnisvarði + roman_road: Rómverskur vegur + ruins: Rústir + stone: Steinn + tomb: Gröf + tower: Turn + wreck: Flak + junction: + "yes": Tenging landuse: - military: Hersvæðið + allotments: Úthlutuð svæði + basin: Lægð + cemetery: Grafreitur + commercial: Verslunarsvæði + farm: Býli + farmland: Akurlendi + forest: Skógur + garages: Verkstæði + grass: Gras + industrial: Iðnaðarsvæði + landfill: Landfylling + meadow: Skógarlundur + military: Hersvæði + mine: Náma + orchard: Trjágarður + quarry: Grjótnáma + railway: Lestarteinar + reservoir: Uppistöðulón + residential: Íbúðasvæði + vineyard: Vínekra + "yes": Landnotkun leisure: + bird_hide: Fuglaskoðunarhús + club: Klúbbur + common: Almenningur + fitness_centre: Líkamsræktarstöð + garden: Garður + golf_course: Golfvöllur + horse_riding: Hestaferðir ice_rink: Skautahöll - playground: Leikvöllurinn - sports_centre: Íþróttamiðstöðin - swimming_pool: Sundlaugin - water_park: Vatnsleikjagarðurinn + marina: Bátalægi + miniature_golf: Mínigolf + nature_reserve: Náttúruverndarsvæði + park: Almenningsgarður + pitch: Íþróttavöllur + playground: Leikvöllur + sauna: Gufubað + sports_centre: Íþróttamiðstöð + stadium: Íþróttaleikvangur + swimming_pool: Sundlaug + track: Hlaupabraut + water_park: Vatnsleikjagarður + "yes": Afþreying + man_made: + lighthouse: Viti + pipeline: Leiðsla + tower: Turn + works: Verksmiðja + "yes": Manngert + military: + airfield: Herflugvöllur + barracks: Herbúðir + bunker: Sprengjubyrgi + mountain_pass: + "yes": Fjallaskarð natural: - bay: Flóinn - beach: Ströndin + bay: Flói + beach: Strönd + cape: Höfði cave_entrance: Hellisop - crater: Gígurinn - fell: Fellið - fjord: Fjörðurinn - geyser: Goshverinn - glacier: Jökullinn - hill: Hæðin - island: Eyjan - peak: Fjallið eða tindurinn - reef: Rifið - tree: Tréð - valley: Dalurinn - volcano: Eldfjallið - water: Vatnið + cliff: Klettar + crater: Gígur + dune: Alda + fell: Fell + fjord: Fjörður + forest: Ræktaður skógur + geyser: Goshver + glacier: Jökull + grassland: Gresja + heath: Heiði + hill: Hæð + island: Eyja + land: Land + marsh: Votlendi + moor: Mýri + mud: Leir + peak: Tindur + point: Nes + reef: Sker + ridge: Hryggur + rock: Rokk + saddle: Söðull + sand: Sandur + scrub: Kjarr + spring: Lind + stone: Steinn + strait: Sund + tree: Tré + valley: Dalur + volcano: Eldfjall + water: Vatn wetland: Votlendi + wood: Skógur + office: + accountant: Bókari + administrative: Stjórnsýsla + architect: Arkítektar + company: Fyrirtæki + estate_agent: Fasteignasali + lawyer: Lögmaður + travel_agent: Ferðaskrifstofa + "yes": Skrifstofa place: + allotments: Úthlutuð svæði + block: Reitur airport: Flugvöllur city: Borg country: Land - county: Landið - farm: Sveitabærinn + county: Sýsla + farm: Býli + hamlet: Byggðakjarni house: Hús houses: Hús island: Eyja islet: Smáeyja + locality: Sveitarfélag + municipality: Sveitarfélag + neighbourhood: Nágrenni postcode: Póstnúmer - region: Svæðið + region: Hérað sea: Hafið state: Ríki - suburb: Hverfið + subdivision: Undirskipting + suburb: Úthverfi town: Bær - village: Þorpið + village: Þorp + "yes": Staður + railway: + light_rail: Smálest + station: Lestarstöð + subway: Neðanjarðarlest + tram: Sporvagn + tram_stop: Sporvagnastöð shop: - bakery: Bakaríið - bicycle: Hjólabúðin - books: Bókabúðin - butcher: Slátrarinn - car: Bílabúðin - carpet: Teppabúðin - clothes: Fatabúðin - computer: Tölvubúðin - electronics: Raftækjaverslunin - fish: Fiskbúðin - florist: Blómabúðin - food: Matbúðin - furniture: Húsgagnaverslunin - gift: Gjafabúðin - hardware: Verkfærabúðin - hifi: Hljómtækjabúðin - kiosk: Söluturninn - mobile_phone: Farsímaverslunin - outdoor: Útivistarbúðin - pet: Gæludýrabúðin + art: Listmunaverslun + bakery: Bakarí + bicycle: Hjólaverslun + books: Bókabúð + butcher: Slátrari + car: Bílavöruverslun + car_parts: Bílapartar + carpet: Teppabúð + clothes: Fataverslun + computer: Tölvuverslun + cosmetics: Snyrtivöruverslun + dry_cleaning: Þurrhreinsun + electronics: Raftækjaverslun + estate_agent: Fasteignasali + fashion: Tískuverslun + fish: Fiskbúð + florist: Blómabúð + food: Matvöruverslun + funeral_directors: Útfararstjóri + furniture: Húsgögn + gallery: Gallerí + garden_centre: Garðyrkja + general: Almenn verslun + gift: Gjafabúð + greengrocer: Grænmetissali + hairdresser: Hársnyrting + hardware: Verkfærabúð + hifi: Hljómtækjaverslun + insurance: Tryggingar + jewelry: Skartgripaverslun + kiosk: Söluturn + laundry: Þvottahús + mall: Verslunarkjarni + market: Markaður + mobile_phone: Farsímaverslun + motorcycle: Mótorhjólaverslun + music: Tónlistarverslun + newsagent: Blaðasali + optician: Sjóntækjafræðingur + organic: Verslun með lífrænt fæði + outdoor: Útivistarverslun + pet: Gæludýraverslun + pharmacy: Lyfjabúð + photo: Ljósmyndavöruverslun + salon: Snyrtistofa + second_hand: Verslun með notað shoes: Skóbúð - toys: Leikfangaverslunin - travel_agency: Ferðaskrifstofan - video: Videoleigan + shopping_centre: Verslunarmiðstöð + sports: Íþróttavöruverslun + stationery: Ritfangaverslun + supermarket: Kjörbúð + tailor: Klæðskeri + toys: Leikfangaverslun + travel_agency: Ferðaskrifstofa + video: Videoleiga + "yes": Verslun tourism: + alpine_hut: Fjallaskáli + apartment: Íbúð artwork: Listaverk - guest_house: Gesthús + bed_and_breakfast: BB-gisting og veitingar + cabin: Kofi + camp_site: Tjaldstæði + caravan_site: Hjólhýsastæði + chalet: Fjallakofi + gallery: Gallerí + guest_house: Gistihús + hostel: Farfuglaheimili hotel: Hótel information: Upplýsingar motel: Mótel museum: Safn + picnic_site: Nestisaðstaða + theme_park: Þemagarður + viewpoint: Útsýnisstaður zoo: Dýragarður + tunnel: + "yes": Göng waterway: + boatyard: Bátalægi + canal: Skipaskurður dam: Vatnsaflsvirkjunin - river: Áin - stream: Lækurinn - waterfall: Fossinn + ditch: Skurður + dock: Hafnarbakki + lock: Flóðgátt + lock_gate: Hlið í skipastiga + mooring: Bryggja + rapids: Flúðir + river: Á + stream: Lækur + waterfall: Foss + "yes": Siglingaleið + admin_levels: + level5: Héraðsmörk + level8: Borgarmörk description: title: osm_nominatim: Staðsetning frá <a href="http://nominatim.openstreetmap.org/">OpenStreetMap @@ -415,36 +792,55 @@ is: no_results: Ekkert fannst more_results: Fleiri niðurstöður layouts: + project_name: + title: OpenStreetMap + h1: OpenStreetMap logo: alt_text: OpenStreetMap merkið - home: heim - logout: útskrá - log_in: innskrá + home: Fara heim + logout: Skrá út + log_in: Skrá inn log_in_tooltip: Skráðu þig inn með aðgangi sem er þegar til - sign_up: búa til aðgang - sign_up_tooltip: Búaðu til aðgang til að geta breytt kortinu + sign_up: Nýskrá + start_mapping: Hefja kortlagningu + sign_up_tooltip: Stofnaðu aðgang til að geta breytt kortinu edit: Breyta - history: Breytingaskrá + history: Sagnfræði export: Niðurhala + data: Gögn + export_data: Flytja út gögn gps_traces: GPS ferlar gps_traces_tooltip: Sjá alla GPS ferla user_diaries: Blogg notenda user_diaries_tooltip: Sjá blogg notenda + edit_with: Breyta með %{editor} tag_line: Frjálsa wiki heimskortið + intro_header: Velkomin í OpenStreetMap! + intro_2_create_account: Búa til notandaaðgang + partners_partners: samstarfsaðilar + partners_url: http://wiki.openstreetmap.org/wiki/Partners osm_offline: OpenStreetMap gagnagrunnurinn er niðri vegna viðhalds. osm_read_only: Ekki er hægt að skrifa í OpenStreetMap gagnagrunninn í augnablikinu vegna viðhalds. donate: Hjálpaðu OpenStreetMap verkefninu með %{link} í vélbúnaðarsjóðinn. - copyright: Höfundaréttur & leyfi + help: Hjálp + about: Um + copyright: Höfundaréttur + community: Samfélag + community_blogs: Blogg félaga + community_blogs_title: Blogg frá meðlimum OpenStreetMap samfélagsins + foundation: Sjálfseignarstofnun + foundation_title: The OpenStreetMap Foundation make_a_donation: title: Hjálpaðu OpenStreetMap verkefninu með fjárframlagi - text: Fjárframlagssíða + text: Styrkja verkefnið + learn_more: Vita meira + more: Meira license_page: foreign: title: Um þessa þýðingu - text: |- - Stangist þessi þýðing á við %{english_original_link} gildir - hin síðari fram yfir íslenskuna. + text: Stangist þessi þýðing á við %{english_original_link}, gildir hin síðari + fram yfir íslenskuna. english_link: ensku útgáfuna native: title: Um þessa síðu @@ -457,17 +853,67 @@ is: legal_babble: title_html: Höfundaréttur og leyfi intro_1_html: |- - OpenStreetMap er <i>frjáls kortagrunnur</i> undir <a + OpenStreetMap<sup><a href="#trademarks">®</a></sup> er <i>opinn og frjáls kortagrunnur</i>, gefinn út með <a href="http://opendatacommons.org/licenses/odbl/">Open Data - Commons Open Database</a> leyfi. (ODbL). - intro_2_html: |2- - Þér er frjálst að afrita, dreifa, senda og aðlaga kortagrunninnn - og gögn hans, gegn því að þú viðurkennir rétt OpenStreetMap - og sjálfboðaliða þess. Ef þú breytir eða byggir á kortagrunninum - eða gögnum hans, þá verður þú að gefa niðurstöðuna út með - sama leyfi. <a - href="http://creativecommons.org/licenses/by-sa/2.0/legalcode">Leyfistextinn</a> - útskýrir réttindi þín og skyldur. + Commons Open Database License</a> (ODbL) notkunarleyfi frá <a + href="http://osmfoundation.org/">OpenStreetMap Foundation</a> (OSMF) sjálfseignarstofnuninni. + intro_2_html: |- + Þér er frjálst að afrita, dreifa, senda og aðlaga kortagrunninnn + og gögn hans, gegn því að þú vísar í og viðurkennir rétt OpenStreetMap + og sjálfboðaliða þess. Ef þú breytir eða byggir á kortagrunninum + eða gögnum hans, þá verður þú að gefa niðurstöðuna út með + sama leyfi. + <a href="http://opendatacommons.org/licenses/odbl/1.0/">Leyfistextinn</a> + útskýrir réttindi þín og skyldur. + trademarks_title_html: <span id="trademarks"></span>Vörumerki + welcome_page: + title: Velkomin! + whats_on_the_map: + title: Hvað er á kortinu + basic_terms: + tag_html: |- + <strong>Merki</strong> er dálítill gagnabútur varðandi leið eða annað atriði, til dæmis + nafn á veitingastað eða hraðatakmörk á vegi. + rules: + title: Reglur! + questions: + title: Einhverjar spurningar? + start_mapping: Hefja kortlagningu + fixthemap: + title: Tilkynna vandamál / Laga kortið + how_to_help: + title: Hvernig á að hjálpa til + join_the_community: + title: Ganga í hópinn + help_page: + title: Til að fá hjálp + welcome: + url: /velkomin + title: Velkomin í OSM + beginners_guide: + title: Byrjenda-leiðbeiningar + help: + url: https://help.openstreetmap.org/ + title: help.openstreetmap.org + mailing_lists: + title: Póstlistar + forums: + title: Spjallsvæði + irc: + title: IRC + switch2osm: + title: switch2osm + wiki: + url: http://wiki.openstreetmap.org/ + title: wiki.openstreetmap.org + about_page: + next: Næsta + copyright_html: <span>©</span>OpenStreetMap<br>þátttakendur + local_knowledge_title: Staðbundin þekking + community_driven_title: Samfélagsdrifið + open_data_title: Opin gögn + legal_title: Lagalegt + partners_title: Samstarfsaðilar notifier: diary_comment_notification: subject: '[OpenStreetMap] %{user} bætti við athugasemd á bloggfærslu þína' @@ -488,8 +934,8 @@ is: greeting: Hæ, your_gpx_file: GPX skráin þín with_description: 'með lýsinguna:' - and_the_tags: 'og eftirfarandi tögg:' - and_no_tags: og engin tögg. + and_the_tags: 'og eftirfarandi merki:' + and_no_tags: og engin merki. failure: subject: '[OpenStreetMap] Villa við að flytja inn GPX skrá' failed_to_import: 'Lenti í villu þegar átti að flytja hana inn, hérna er villan::' @@ -501,11 +947,14 @@ is: loaded_successfully: var innflutt með %{trace_points} punkta af %{possible_points} mögulegum. signup_confirm: - subject: '[OpenStreetMap] Staðfestu netfangið þitt' + subject: '[OpenStreetMap] Velkomin í OpenStreetMap' + greeting: Hæ þú! email_confirm: subject: '[OpenStreetMap] Staðfestu netfangið þitt' email_confirm_plain: greeting: Hæ, + hopefully_you: Einhver (vonandi þú) vill breyta netfanginu sínu á %{server_url} + í %{new_address}. click_the_link: Ef þú óskaðir eftir þessari breytingu fylgdu tenglinum hér fyrir neðan til að staðfesta breytinguna. email_confirm_html: @@ -518,6 +967,8 @@ is: subject: '[OpenStreetMap] Beðni um að endurstilla lykilorð' lost_password_plain: greeting: Hæ, + hopefully_you: Einhver (vonandi þú) hefur beðið um að endurstilla lykilorðið + á reikningnum með þetta netfang á openstreetmap.org click_the_link: Ef þú óskaðir eftir þessari endurstillingu fylgdu tenglinum hér fyrir neðan til að staðfesta breytinguna. lost_password_html: @@ -526,14 +977,19 @@ is: á reikningnum með þetta netfang á openstreetmap.org click_the_link: Ef þú óskaðir eftir þessari endurstillingu fylgdu tenglinum hér fyrir neðan til að staðfesta breytinguna. + note_comment_notification: + anonymous: Nafnlaus notandi + greeting: Hæ, + changeset_comment_notification: + greeting: Hæ, message: inbox: title: Innhólf - my_inbox: Mitt innhólf + my_inbox: Innhólfið mitt outbox: úthólf from: Frá subject: Titill - date: Dagsetning + date: Döðlur no_messages_yet: Þú hefur ekki fengið nein skilboð. Hví ekki að hafa samband við einhverja %{people_mapping_nearby_link}? people_mapping_nearby: nálæga notendur @@ -577,6 +1033,7 @@ is: date: Dags reply_button: Svara unread_button: Merkja sem ólesin + back: Til baka to: Til sent_message_summary: delete_button: Eyða @@ -592,11 +1049,15 @@ is: js_2: OpenStreetMap notar JavaScript til að útfæra gagnvirk kort. permalink: Varanlegur tengill shortlink: Varanlegur smátengill + createnote: Bæta við minnispunkti + license: + copyright: Höfundarréttur OpenStreetMap og þáttakendur, með opnu notkunarleyfi edit: not_public: Þú hefur ekki merkt breytingar þínar sem opinberar. not_public_description: Þú getur ekki lengur gert breytingar nema þær séu merktar opinberar, þú getur breytt þeim stillingum á %{user_page}. user_page_link: notandasíðunni þinni + anon_edits: (%{link}) anon_edits_link_text: Finndu út afhverju. flash_player_required: Þú þarft Flash spilara til að nota Potlatch ritilinn. Þú getur <a href="http://www.adobe.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash">sótt @@ -605,41 +1066,46 @@ is: potlatch_unsaved_changes: Þú ert með óvistaðar breytingar. Til að vista í Potlatch þarf að af-velja núverandi val ef þú ert í „Live“-ham, eða ýta á „Save“ hnappinn til að vista ef sá hnappur er sjáanlegur. + no_iframe_support: Því miður styður vafrinn þinn ekki HTML-iframes, sem er nauðsynlegt + ef nota á þennan eiginleika. sidebar: search_results: Leitarniðurstöður close: Loka search: search: Leita + get_directions: Fá leiðsögn + get_directions_title: Finna leiðir milli tveggja punkta + from: Frá + to: Til where_am_i: Hvar er ég? where_am_i_title: Notar leitarvélina til að lýsa núverandi staðsetningu á kortinu - submit_text: Ok + submit_text: Fara key: table: entry: motorway: Hraðbraut + main_road: Aðalbraut trunk: Stofnbraut (Hringvegurinn) primary: Stofnvegur secondary: Tengivegur unclassified: Héraðsvegur - unsurfaced: Óbundið slitlag track: Slóði - byway: Merkt (bresk) hjólaleið bridleway: Reiðstígur - cycleway: Hjólastígur - footway: Göngustígur + cycleway: Hjólaleið + footway: Gönguleið rail: Lestarteinar subway: Neðanjarðarlest tram: - Smálest - - „tram“ + - sporvagn cable: - - Skíðalyfta + - Kláflyfta - stólalyfta runway: - Flugbraut - akstursbraut apron: - - Flugbrautarhlað + - Flughlað - flugstöð admin: Stjórnsýslumörk forest: Ræktaður skógur @@ -647,7 +1113,6 @@ is: golf: Golfvöllur park: Almenningsgarður resident: Íbúðasvæði - tourist: Ferðamannasvæði common: - Almenningur - lundur @@ -676,10 +1141,26 @@ is: - tindur tunnel: Umkringt punktalínum = göng bridge: Umkringt svartri línu = brú - private: Í einkaeigu - permissive: Umferð leyfileg + private: Einkaaðgangur destination: Umferð leyfileg á ákveðinn áfangastað - construction: Vegur í byggingu + construction: Vegir í byggingu + richtext_area: + edit: Breyta + preview: Forskoðun + markdown_help: + title_html: Þáttað með <a href="http://daringfireball.net/projects/markdown/">Markdown</a> + headings: Fyrirsagnir + heading: Fyrirsögn + subheading: Undirfyrirsögn + unordered: Óraðaður listi + ordered: Raðaður listi + first: Fyrsta atriði + second: Annað atriði + link: Tengill + text: Texti + image: Mynd + alt: Alt-texti + url: Slóð (URL) trace: visibility: private: Prívat (aðeins deilt sem óauðkennanlegum, óröðuðum punktum) @@ -695,7 +1176,7 @@ is: edit: title: Breyti ferlinum %{name} heading: Breyti ferlinum %{name} - filename: 'Skráanafn:' + filename: 'Skráarheiti:' download: sækja uploaded_at: 'Hlaðið upp:' points: 'Punktar:' @@ -704,62 +1185,70 @@ is: edit: breyta owner: 'Eigandi:' description: 'Lýsing:' - tags: 'Tögg:' + tags: 'Merki:' tags_help: aðskilin með kommum save_button: Vista breytingar visibility: 'Sýnileiki:' visibility_help: hvað þýðir þetta? + visibility_help_url: http://wiki.openstreetmap.org/wiki/Visibility_of_GPS_traces trace_form: upload_gpx: 'Hlaða inn GPX skrá:' description: 'Lýsing:' - tags: Tögg - tags_help: aðskilin með kommum - visibility: Sýnileiki + tags: 'Merki:' + tags_help: aðskilið með kommum + visibility: 'Sýnileiki:' visibility_help: hvað þýðir þetta + visibility_help_url: http://wiki.openstreetmap.org/wiki/Visibility_of_GPS_traces upload_button: Senda help: Hjálp help_url: http://wiki.openstreetmap.org/index.php?title=Upload&uselang=is trace_header: + upload_trace: Senda inn feril see_all_traces: Sjá alla ferla see_your_traces: Sjá aðeins þína ferla - traces_waiting: Þú ert með %{count} ferla í bið. Íhugaðu að bíða með að senda - inn fleiri ferla til að aðrir notendur komist að. + traces_waiting: + one: Þú ert með %{count} feril í bið. Íhugaðu að bíða með að senda inn fleiri + ferla til að aðrir notendur komist að. + other: Þú ert með %{count} ferla í bið. Íhugaðu að bíða með að senda inn fleiri + ferla til að aðrir notendur komist að. trace_optionals: - tags: Tögg + tags: Merki view: title: Skoða ferilinn %{name} heading: Skoða ferilinn %{name} pending: Í BIÐ - filename: 'Skráarnafn:' + filename: 'Skráarheiti:' download: sækja - uploaded: 'Hlaðið upp:' + uploaded: 'Hlaðið inn:' points: 'Punktar:' start_coordinates: 'Byrjunarhnit:' map: kort edit: breyta owner: 'Eigandi:' description: 'Lýsing:' - tags: Tögg + tags: 'Merki:' none: engin edit_track: Breyta delete_track: Eyða trace_not_found: Þessi ferill fannst ekki! visibility: 'Sýnileiki:' trace_paging_nav: - showing_page: Sýni síðu %{page} + showing_page: Síða %{page} + older: Eldri ferlar + newer: Nýrri ferlar trace: pending: Í BIÐ count_points: '%{count} punktar' ago: '%{time_in_words_ago} síðan' more: upplýsingar trace_details: Sýna upplýsingar um ferilinn - view_map: Sjá kort + view_map: Skoða kort edit: breyta - edit_map: Breyta kortinu með ferilin til hliðsjónar - public: ALLIR SJÁ - identifiable: AUÐKENNANLEGUR - private: PRÍVAT - trackable: REKJANLEGUR + edit_map: Breyta korti + public: OPIÐ ÖLLUM + identifiable: AUÐKENNANLEGT + private: EINKA + trackable: REKJANLEGT by: eftir in: í map: kort @@ -767,7 +1256,8 @@ is: public_traces: Allir ferlar your_traces: Þínir ferlar public_traces_from: Ferlar eftir %{user} - tagged_with: ' með taggið %{tags}' + description: Skoða nýlega innsenda GPS-ferla + tagged_with: ' með merkið %{tags}' delete: scheduled_for_deletion: Þessum feril verður eitt make_public: @@ -777,6 +1267,10 @@ is: offline: heading: Ekki hægt að hlaða upp GPX message: Ekki er hægt að hlaða upp GPX í augnablikinu vegna viðhalds. + georss: + title: OpenStreetMap GPS-ferlar + description: + description_without_count: GPX-skrá frá %{user} application: require_cookies: cookies_needed: Þú virðist ekki vera með stuðning fyrir smákökur í vafranum @@ -787,24 +1281,34 @@ is: oauth: oauthorize: request_access: Forritið %{app_name} hefur óskað eftir að fá aðgang að OpenStreetMap - í gegnum notandann þinn. Hakaðu við hvað eiginleika þú vilt gefa forritinu - leyfi fyrir. Hægt er að haka við hvaða eiginleika sem er. + í gegnum notandaaðganginn þinn, %{user}. Merktu við hvað eiginleika þú vilt + gefa forritinu leyfi fyrir. Hægt er að haka við hvaða eiginleika sem er. allow_to: 'Leyfa forritinu að:' - allow_read_prefs: Lesa notandastillingarnar þínar. - allow_write_prefs: Breyta notandastillingunum þínum. - allow_write_diary: Búa til bloggfærslur, setja inn athugasemdir og bæta við + allow_read_prefs: lesa notandastillingarnar þínar. + allow_write_prefs: breyta notandastillingunum þínum. + allow_write_diary: búa til bloggfærslur, setja inn athugasemdir og bæta við vinum. - allow_write_api: Breyta kortagögnunum. - allow_write_gpx: Senda inn GPS ferla. + allow_write_api: breyta kortagögnunum. + allow_read_gpx: lesa einka-GPS-ferlana þína. + allow_write_gpx: senda inn GPS ferla. + allow_write_notes: breyta minnispunktum. + grant_access: Veita aðgang + oauthorize_success: + title: Auðkenningarbeiðni samþykkt + verification: Sannvottunarkóðinn er %{code}. + oauthorize_failure: + title: Auðkenningarbeiðni brást oauth_clients: new: title: Skrá nýtt forrit submit: Skrá edit: + title: Breyta forritinu þínu submit: Vista show: title: OAuth stillingar fyrir %{app_name} edit: Breyta þessari skráningu + confirm: Ertu viss? requests: 'Óska eftir eftirfarandi leyfum frá notendum:' allow_read_prefs: Lesa notandastillingar þeirra. allow_write_prefs: Breyta notandastillingum þeirra. @@ -812,8 +1316,10 @@ is: vinum. allow_write_api: Breyta kortagögnunum. allow_write_gpx: Senda inn GPS ferla. + allow_write_notes: breyta minnispunktum. index: title: OAuth stillingar + revoke: Eyða banninu my_apps: Mín forrit registered_apps: 'Þú hefur skráð eftirfarandi forrit:' register_new: Skrá nýtt forrit @@ -828,6 +1334,7 @@ is: vinum. allow_write_api: breyta kortagögnunum. allow_write_gpx: Senda inn GPS ferla. + allow_write_notes: breyta minnispunktum. create: flash: Nýtt OAuth forrit hefur verið skráð user: @@ -836,20 +1343,48 @@ is: heading: Innskrá email or username: 'Netfang eða notandanafn:' password: 'Lykilorð:' + openid: '%{logo} OpenID:' remember: 'Muna innskráninguna:' - lost password link: Gleymt lykilorð? + lost password link: Gleymdirðu lykilorðinu þínu? login_button: Innskrá + register now: Skrá þig núna + new to osm: Nýr í OpenStreetMap? + no account: Ertu ekki með aðgang? account not active: Þessi reikningur er ekki virkur.<br />Vinsamlegast smelltu á tengilinn í staðfestingarpóstinum sem þú fékkst til að virkja reikninginn, eða <a href="%{reconfirm}">óskaðu eftir nýjum staðfestingarpósti</a>. auth failure: Þetta notandanafn eða lykilorð er rangt. - openid_logo_alt: Innskrá með OpenID + openid_logo_alt: Skrá inn með OpenID-aðgangi + auth_providers: + openid: + title: Skrá inn með OpenID + alt: Skrá inn með OpenID-slóð + google: + title: Skrá inn með Google + alt: Skrá inn með Google OpenID-aðgangi + facebook: + title: Skrá inn með Facebook + alt: Skrá inn með Facebook-aðgangi + windowslive: + title: Skrá inn með Windows Live + alt: Skrá inn með Windows Live aðgangi + github: + title: Skrá inn með GitHub + yahoo: + title: Skrá inn með Yahoo + alt: Skrá inn með Yahoo OpenID-aðgangi + wordpress: + title: Skrá inn með Wordpress + alt: Skrá inn með Wordpress OpenID-aðgangi + aol: + title: Skrá inn með AOL + alt: Skrá inn með AOL OpenID-aðgangi logout: - title: Útskrá - heading: Útskrá - logout_button: Útskrá + title: Útskráning + heading: Skrá út úr OpenStreetMap + logout_button: Útskráning lost_password: - title: Gleymt lykilorð + title: Glatað lykilorð heading: Gleymt lykilorð? email address: 'Netfang:' new password button: Senda nýtt lykilorð á netfangið þitt @@ -869,11 +1404,12 @@ is: title: Nýskrá no_auto_account_create: Því miður getum við eki búið til reikning fyrir þig sjálfkrafa. - contact_webmaster: Hafðu samband við <a href="mailto:webmaster@openstreetmap.org">vefstjóra</a> - til að fá reikning búinn til. - license_agreement: Með því að búa til reikning samþykkiru að öll framlög þín - til verkefnisins falli undir <a href="http://creativecommons.org/licenses/by-sa/2.0/">Creative - Commons Attribution-Share Alike (BY-SA)</a> leyfið. + contact_webmaster: Hafðu samband við <a href="%{webmaster}">vefstjóra</a> til + að fá reikning búinn til. + about: + header: Frjálst og breytanlegt + license_agreement: Með því að staðfesta notandaaðgang, samþykkirðu <a href="http://www.osmfoundation.org/wiki/License/Contributor_Terms">skilmálana + vegna framlaga</a>. email address: 'Netfang:' confirm email address: 'Staðfestu netfang:' not displayed publicly: Ekki sýnt opinberlega (sjá <a href="http://wiki.openstreetmap.org/index.php?uselang=is&title=Privacy_Policy" @@ -883,13 +1419,22 @@ is: því síðar í stillingunum þínum. password: 'Lykilorð:' confirm password: 'Staðfestu lykilorðið:' - continue: Halda áfram + continue: Nýskrá + terms accepted: Bestu þakkir fyrir að samþykkja nýju skilmálana vegna framlags + þíns! + terms declined url: http://wiki.openstreetmap.org/wiki/Contributor_Terms_Declined terms: - heading: Notandaskilmálar - consider_pd: Ég afsala mér höfundarétt á mínum framlögum + title: Skilmálar vegna framlags + heading: Skilmálar vegna framlags + consider_pd: Til viðbótar við ofangreint samkomulag, lít ég svo á að framlög + mín verði í almenningseigu (Public Domain) consider_pd_why: hvað þýðir þetta? + consider_pd_why_url: http://www.osmfoundation.org/wiki/License/Why_would_I_want_my_contributions_to_be_public_domain agree: Samþykkja + declined: http://wiki.openstreetmap.org/wiki/Contributor_Terms_Declined decline: Hafna + you need to accept or decline: Endilega lestu og samþykktu eða hafnaðu nýju + skilmálunum vegna framlags þíns, áður en þú heldur áfram. legale_select: 'Staðfærð og þýdd útgáfa notandaskilmálanna:' legale_names: france: Frakkland @@ -900,38 +1445,50 @@ is: heading: Notandinn %{user} er ekki til body: Það er ekki til notandi með nafninu %{user}. Kannski slóstu nafnið rangt inn eða fylgdir ógildum tengli. + deleted: eytt view: - my diary: bloggið mitt + my diary: Bloggið mitt new diary entry: ný bloggfærsla - my edits: mínar breytingar - my traces: mínir ferlar - my settings: mínar stillingar + my edits: Breytingarnar mínar + my traces: Ferlarni mínir + my notes: Minnispunktarnir mínir + my messages: Skilaboðin mín + my profile: Notandasniðið mitt + my settings: Stillingarnar mínar + my comments: Athugasemdir mínar oauth settings: oauth stillingar - blocks on me: bönn gegn mér - blocks by me: bönn eftir mig - send message: senda póst - diary: blogg - edits: breytingar - traces: ferlar - remove as friend: fjarlægja sem vin - add as friend: bæta við sem vin + blocks on me: Bönn gegn mér + blocks by me: Bönn eftir mig + send message: Senda skilaboð + diary: Blogg + edits: Breytingar + traces: Ferlar + notes: Minnispunktar á korti + remove as friend: fjarlægja úr vinahópi + add as friend: bæta við sem vini mapper since: 'Notandi síðan:' ago: (%{time_in_words_ago} síðan) + ct status: 'Skilmálar vegna framlags:' + ct undecided: Óvíst + ct declined: Hafnað + ct accepted: Samþykkt fyrir %{ago} síðan + latest edit: 'Síðasta breyting %{ago}:' email address: 'Netfang:' created from: 'Búin til frá:' status: 'Staða:' - spam score: 'Spam einkunn:' + spam score: 'Ruslpóst-einkunn:' description: Lýsing user location: Staðsetning - if set location: Ef þú vistar staðsetningu þína mun kortasjá birtast hér fyrir - neðan með þér og nálægum notendum. Þú getur stillt staðsetninguna á %{settings_link}. - settings_link_text: stillingarsíðunni + if set location: Ef þú vistar staðsetningu þína á %{settings_link} mun kortasjá + birtast hér fyrir neðan með merki fyrir þig og nálæga notendur. + settings_link_text: stillingasíðunni your friends: Vinir þínir no friends: Þú átt enga vini km away: í %{count} km fjarlægð m away: í %{count} m fjarlægð - nearby users: 'Nálægir notendur:' - no nearby users: Engir notendur hafa stillt staðsetningu sína nálægt þér. + nearby users: Aðrir nálægir notendur + no nearby users: Engir notendur hafa stillt staðsetningu sína á korti nálægt + þér. role: administrator: Þessi notandi er möppudýr moderator: Þessi notandi er prófarkalesari @@ -941,18 +1498,19 @@ is: revoke: administrator: Svifta möppudýrsréttindum moderator: Svifta stjórnandaréttindum - block_history: bönn gegn þessum notanda - moderator_history: bönn eftir notandann - create_block: banna þennan notanda - activate_user: virkja þennan notanda - deactivate_user: óvirkja þennan notanda - confirm_user: staðfesta þennan notanda - hide_user: fela þennan notanda - unhide_user: af-fela þennan notanda - delete_user: eyða þessum notanda + block_history: Virk bönn + moderator_history: Úthlutuð bönn (eftir notandann) + comments: Athugasemdir + create_block: Banna þennan notanda + activate_user: Virkja þennan notanda + deactivate_user: Gera þennan notanda óvirkan + confirm_user: Staðfesta þennan notanda + hide_user: Fela þennan notanda + unhide_user: Af-fela þennan notanda + delete_user: Eyða þessum notanda confirm: Staðfesta popup: - your location: Þín staðsetning + your location: Staðsetning þín nearby mapper: Nálægur notandi friend: Vinur account: @@ -961,13 +1519,15 @@ is: current email address: 'Núverandi netfang:' new email address: 'Nýtt netfang:' email never displayed publicly: (aldrei sýnt opinberlega) + external auth: 'Ytri auðkenning:' openid: + link: http://wiki.openstreetmap.org/wiki/OpenID link text: hvað er openID? public editing: heading: 'Ónafngreindur notandi?:' enabled: Nei, nafngreindur og getur breytt gögnum. enabled link: http://wiki.openstreetmap.org/index.php?uselang=is&title=Anonymous_edits - enabled link text: nánar + enabled link text: Hvað er þetta? disabled: Óvirkur og getur ekki breytt gögnum, allar fyrri breytingar eru ónafngreindar. disabled link text: hví get ég ekki breytt neinu? @@ -977,9 +1537,25 @@ is: geta ekki sent þér skilaboð eða séð staðsetningu þína. Þú verður að vera nafngreind(ur) til að geta notað vefinn, sjá <a href="http://wiki.openstreetmap.org/wiki/Anonymous_edits">þessa síðu</a> fyrir frekari upplýsingar. + contributor terms: + heading: 'Skilmálar vegna framlags:' + agreed: Þú hefur samþykkt nýju skilmálana vegna framlags þíns. + not yet agreed: Þú hefur ekki ennþá samþykkt nýju skilmálana vegna framlags + þíns. + review link text: Þegar þér hentar skaltu endilega lesa og samþykkja nýju + skilmálana vegna framlags þíns. + agreed_with_pd: Þú hefur einnig lýst því yfir að breytingar þínar verði í + almenningseigu (Public Domain). + link: http://www.osmfoundation.org/wiki/License/Contributor_Terms + link text: Hvað er þetta? profile description: 'Lýsing á þér:' preferred languages: 'Viðmótstungumál:' + preferred editor: 'Uppáhaldsritill:' image: 'Mynd:' + gravatar: + gravatar: Nota Gravatar-merki + link: http://wiki.openstreetmap.org/wiki/Gravatar + link text: Hvað er þetta? new image: Bæta við mynd keep image: Halda þessari mynd delete image: Eyða þessari mynd @@ -998,7 +1574,7 @@ is: þitt verði staðfest. flash update success: Stillingarnar þínar voru uppfærðar. confirm: - heading: Staðfesta notanda + heading: Athuga með tölvupóstinn þinn! press confirm button: Hér getur þú staðfest að þú viljir búa til notanda.. button: Staðfesta success: Notandinn þinn hefur verið staðfestur. @@ -1006,21 +1582,30 @@ is: heading: Staðfesta breytingu á netfangi press confirm button: Hér getur þú staðfest breytingu á netfangi. button: Staðfesta - success: Netfangið þitt hefur verið staðfest. + success: Breyting á netfanginu þínu hefur verið staðfest. failure: Netfang hefur þegar verið staðfest með þessum lykli. set_home: flash success: Staðsetning þín hefur verið stillt go_public: flash success: Allar breytingar þínar eru nú opinberar, og þú getur breytt gögnum. make_friend: - success: '%{name} er núna vinur þinn.' + heading: Bæta %{user} við sem vini? + button: Bæta við sem vini + success: '%{name} er núna vinur þinn!' failed: Gat ekki bætt %{name} á vinalistann þinn. already_a_friend: '%{name} er þegar vinur þinn.' remove_friend: + button: fjarlægja úr vinahópi success: '%{name} er ekki lengur vinur þinn.' not_a_friend: '%{name} er ekki vinur þinn.' filter: not_an_administrator: Þú þarft að vera möppudýr til að framkvæma þessa aðgerð. + list: + title: Notendur + heading: Notendur + confirm: Staðfesta valda notendur + hide: Fela valda notendur + empty: Engir samsvarandi notendur fundust user_role: filter: not_an_administrator: Aðeins möppudýr geta sýslað með leyfi, og þú ert ekki @@ -1100,6 +1685,8 @@ is: status: Staða revoker_name: Eytt af not_revoked: (ekki eytt) + next: Næsta » + previous: « Fyrri helper: time_future: Endar eftir %{time} until_login: Virkt þangað til notandinn innskráir sig. @@ -1117,6 +1704,8 @@ is: heading: Notandinn „%{block_on}“ var bannaður af „%{block_by}“ time_future: Endar eftir %{time} time_past: Endaði fyrir %{time} síðan + created: Búið til + ago: Fyrir %{time} síðan status: Staða show: Sýna edit: Breyta banninu @@ -1126,8 +1715,113 @@ is: back: Listi yfir öll bönn revoker: 'Eytt af:' needs_view: Notandinn þarf að innskrá sig áður en bannið fellur úr gildi. + note: + description: + opened_at_html: Búið til fyrir %{when} síðan + rss: + opened: nýr minnispunktur (nálægt %{place}) + closed: lokaður minnispunktur (nálægt %{place}) + reopened: endurvirkjaður minnispunktur (nálægt %{place}) + entry: + comment: Athugasemd + full: Allur minnispunkturinn + mine: + heading: Minnispunktar frá %{user} + id: Auðkenni (ID) + creator: Búið til af + description: Lýsing + created_at: Búið til í + last_changed: Síðast breytt + ago_html: fyrir %{when} síðan javascripts: + close: Loka + share: + title: Deila + cancel: Hætta við + image: Mynd + link: Tengill eða HTML + long_link: Tengill + short_link: Stuttur tengill + embed: HTML + format: 'Snið:' + scale: 'Kvarði:' + download: Sækja + short_url: Stutt URL-slóð + paste_html: Notaðu þennan HTML kóða til að bæta kortinu á vefsíðu + view_larger_map: Skoða stærra kort + embed: + report_problem: Tilkynna vandamál map: + zoom: + in: Renna að + out: Renna frá + locate: + title: Birta staðsetningu mína + popup: Þú ert innan {distance} {unit} frá þessum punkti base: + standard: Staðlað cycle_map: Hjólakort + transport_map: Umferðarkort + hot: Hjálparstarf + layers: + header: Lög á korti + notes: Minnispunktar á korti + data: Gögn korts + title: Lög + copyright: © <a href='%{copyright_url}'>OpenStreetMap þátttakendur</a> + donate_link_text: <a class='donate-attr' href='%{donate_url}'>Styrkja verkefnið</a> + site: + edit_tooltip: Breyta kortinu + edit_disabled_tooltip: Renndu að til að breyta kortinu + createnote_tooltip: Bæta við minnispunkti á kortið + map_notes_zoom_in_tooltip: Renndu að til að sjá minnispunkta á kortinu + map_data_zoom_in_tooltip: Renndu að til að skoða gögn kortsins + queryfeature_tooltip: Rannsaka fitjur + queryfeature_disabled_tooltip: Renndu inn til að rannsaka fitjur + changesets: + show: + comment: Athugasemd + subscribe: Gerast áskrifandi + unsubscribe: Segja upp áskrift + hide_comment: fela + notes: + new: + add: Bæta við minnispunkti + show: + hide: Fela + resolve: Leysa + comment: Athugasemd + directions: + engines: + graphhopper_bicycle: Reiðhjól (GraphHopper) + graphhopper_foot: Fótgangandi (GraphHopper) + mapquest_bicycle: Reiðhjól (MapQuest) + mapquest_car: Bíll (MapQuest) + mapquest_foot: Fótgangandi (MapQuest) + osrm_car: Bíll (OSRM) + mapzen_bicycle: Reiðhjól (Mapzen) + mapzen_car: Bíll (Mapzen) + mapzen_foot: Fótgangandi (Mapzen) + directions: Stefnur + distance: Vegalengd + errors: + no_route: Gat ekki fundið leið á milli þessara tveggja staða. + no_place: Því miður, gat ekki fundið þennan stað. + time: Tími + query: + node: Hnútur + way: Leið + relation: Vensl + nothing_found: Engar fitjur fundust + redaction: + edit: + description: Lýsing + new: + description: Lýsing + show: + description: 'Lýsing:' + user: 'Gert af:' + confirm: Ertu viss? + update: + flash: Breytingar vistaðar. ... diff --git a/config/locales/it.yml b/config/locales/it.yml index f42df06dc..e82a2bd1e 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -11,6 +11,7 @@ # Author: Devid Farinelli # Author: Dieterdreist # Author: Efred +# Author: Einreiher # Author: Federico Mugnaini # Author: Frammm # Author: Fringio @@ -21,19 +22,24 @@ # Author: Lollo # Author: LucioGE # Author: Macofe +# Author: Margherita.mignanelli # Author: Massimo itaca # Author: McDutchie # Author: Nemo bis # Author: Od1n # Author: Ontsed # Author: Paolopoz +# Author: Partyfan +# Author: Purodha # Author: Raoli # Author: Ricordisamoa # Author: Rippitippi # Author: Ruila +# Author: Selven # Author: Shirayuki # Author: Simone # Author: SimoneSVC +# Author: Tuxfuzz # Author: Ximo17 # Author: ZioNicco --- @@ -101,7 +107,7 @@ it: sender: Mittente title: Soggetto body: Corpo del messaggio - recipient: Recipiente + recipient: Destinatario user: email: Email active: Attivo @@ -146,8 +152,8 @@ it: belongs_to: Autore node: Nodi (%{count}) node_paginated: Nodi (%{x}-%{y} di %{count}) - way: Ways (%{count}) - way_paginated: Ways (%{x}-%{y} di %{count}) + way: Percorsi (%{count}) + way_paginated: Percorsi (%{x}-%{y} di %{count}) relation: Relazioni (%{count}) relation_paginated: Relazioni (%{x}-%{y} di %{count}) comment: Commenti (%{count}) @@ -159,18 +165,18 @@ it: feed: title: Gruppo di modifiche %{id} title_comment: Gruppo di modifiche %{id} - %{comment} - join_discussion: Fai login per unirti alla discussione + join_discussion: Accedi per unirti alla discussione discussion: Discussione node: title: 'Nodo: %{name}' history_title: 'Cronologia nodo: %{name}' way: - title: 'Way: %{name}' - history_title: 'Cronologia way: %{name}' + title: 'Percorso: %{name}' + history_title: 'Cronologia percorso: %{name}' nodes: Nodi also_part_of: - one: parte di way %{related_ways} - other: parte di way %{related_ways} + one: parte del percorso %{related_ways} + other: parte dei percorsi %{related_ways} relation: title: 'Relazione: %{name}' history_title: 'Cronologia relazione: %{name}' @@ -191,6 +197,7 @@ it: way: percorso relation: relazione changeset: gruppo di modifiche + note: nota timeout: sorry: Ci rincresce, il reperimento di dati per %{type} con id %{id} ha richiesto troppo tempo. @@ -199,6 +206,7 @@ it: way: percorso relation: relazione changeset: gruppo di modifiche + note: nota redacted: redaction: Redazione %{id} message_html: La versione %{version} di questo %{type} non può essere mostrata @@ -287,6 +295,7 @@ it: diary_entry: new: title: Nuova voce del diario + publish_button: Pubblica list: title: Diari degli utenti title_friends: Diari degli amici @@ -315,7 +324,7 @@ it: user_title: Diario dell'utente %{user} leave_a_comment: Lascia un commento login_to_leave_a_comment: '%{login_link} per lasciare un commento' - login: Login + login: Accedi save_button: Salva no_such_entry: title: Nessuna voce del diario @@ -477,7 +486,7 @@ it: ferry_terminal: Terminal traghetti fire_hydrant: Pompa antincendio fire_station: Vigili del fuoco - food_court: Food Court + food_court: Area ristorazione fountain: Fontana fuel: Stazione di rifornimento gambling: Gioco d'azzardo @@ -495,7 +504,7 @@ it: motorcycle_parking: Parcheggio per Moto nightclub: Night Club nursery: Asilo nido - nursing_home: Asilo nido + nursing_home: Residenza sanitaria assistenziale office: Ufficio parking: Parcheggio parking_entrance: Entrata del parcheggio @@ -518,9 +527,9 @@ it: shop: Negozio shower: Doccia social_centre: Centro sociale - social_club: Centro Sociale + social_club: Associazione social_facility: Struttura sociale - studio: Studio + studio: Studio audio/video swimming_pool: Piscina taxi: Taxi telephone: Telefono pubblico @@ -593,7 +602,7 @@ it: secondary_link: Strada secondaria service: Strada di servizio services: Stazione di servizio - speed_camera: Autovelox fissi + speed_camera: Autovelox fisso steps: Scala street_lamp: Lampione tertiary: Strada terziaria @@ -784,7 +793,7 @@ it: state: Regione subdivision: Suddivisione suburb: Quartiere - town: Paese + town: Villaggio unincorporated_area: Area non inclusa village: Frazione "yes": Luogo @@ -832,7 +841,7 @@ it: chemist: Farmacia clothes: Negozio di abbigliamento computer: Negozio di computer - confectionery: Pasticceria + confectionery: Negozio di dolciumi convenience: Minimarket copyshop: Copisteria cosmetics: Negozio cosmetici @@ -932,13 +941,13 @@ it: weir: Sbarramento idrico "yes": Corso d'acqua admin_levels: - level2: Confine di paese - level4: Confine di stato - level5: Confine regionale - level6: Confine di Contea - level8: Confine di Città - level9: Confine Paese - level10: Confine Quartiere + level2: Confine Amministrativo 2^Livello - Stato Nazionale + level4: Confine amministrativo 4^livello - Subnazionale + level5: Confine amministrativo 5^livello - Area regionale + level6: Confine amministrativo 6^livello - Subregionale + level8: Confine amministrativo 8^livello - Città + level9: Confine amministrativo 9^livello - Subcittadino, borgo + level10: Confine amministrativo 10^livello - Subcittadino, quartiere description: title: osm_nominatim: Località da <a href="http://nominatim.openstreetmap.org/">OpenStreetMap @@ -949,7 +958,7 @@ it: towns: Città places: Luoghi results: - no_results: Nessun risultato + no_results: Nessun risultato trovato more_results: Altri risultati layouts: logo: @@ -1016,7 +1025,7 @@ it: legal_babble: title_html: Copyright e licenza intro_1_html: |- - OpenStreetMap è <i>open data</i>, e i suoi dati sono distribuiti con licenza <a + OpenStreetMap<sup><a href="#trademarks">®</a></sup> è <i>open data</i>, e i suoi dati sono distribuiti con licenza <a href="http://opendatacommons.org/licenses/odbl/">Open Data Commons Open Database License</a> (ODbL) dalla <a href="http://osmfoundation.org/">OpenStreetMap Foundation</a> (OSMF). intro_2_html: "Sei libero di copiare, distribuire, trasmettere e adattare i nostri dati, finché lo attribuisci a OpenStreetMap e ai suoi contributori. @@ -1044,10 +1053,10 @@ it: OSMF</a> e le <a href="http://wiki.openstreetmap.org/wiki/Legal_FAQ">Domande legali frequenti</a> della community. more_2_html: |- - Anche se i dati OpenStreetMap sono aperti, non possiamo fornire accesso alle API della mappa gratuitamente per gli sviluppatori di terze parti. - Vedi la nostra <a href="http://wiki.openstreetmap.org/wiki/API_usage_policy">Politica di utilizzo delle API</a>, la - <a href="http://wiki.openstreetmap.org/wiki/Tile_usage_policy">Politica di utilizzo delle tavole della mappa</a> - e la <a href="http://wiki.openstreetmap.org/wiki/Nominatim#Usage_Policy">Politica di utilizzo di Nominatim</a>. + Anche se i dati OpenStreetMap sono aperti, non possiamo fornire accesso alle API della mappa gratuitamente per terze parti. + Vedi la nostra <a href="https://operations.osmfoundation.org/policies/api/">Politica di utilizzo delle API</a>, la + <a href="https://operations.osmfoundation.org/policies/tiles/">Politica di utilizzo delle tavole della mappa</a> + e la <a href="https://operations.osmfoundation.org/policies/nominatim/">Politica di utilizzo di Nominatim</a>. contributors_title_html: Nostri collaboratori contributors_intro_html: 'I nostri contributori sono migliaia di individui. Includiamo anche dati distribuiti sotto licenze aperte provenienti da agenzie @@ -1108,6 +1117,11 @@ it: Se ritieni che materiale protetto da copyright sia stato impropriamente aggiunto al database di OpenStreetMap o a questo sito, consulta la nostra <a href="http://www.osmfoundation.org/wiki/License/Takedown_procedure">procedura di rimozione per violazione del copyright</a> o segnalacelo direttamente alla nostra <a href="http://dmca.openstreetmap.org/">pagina di segnalazione on-line</a>. + trademarks_title_html: <span id="trademarks"></span>Marchi registrati + trademarks_1_html: '"OpenStreetMap", il logo con la lente d''ingrandimento e + "State of the Map" sono marchi registrati della <i>Fondazione OpenStreetMap</i>. + Se avete domande sull''uso dei marchi, inviatele al <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">gruppo + di lavoro per le licenze</a>.' welcome_page: title: Benvenuto! introduction_html: Benvenuti in OpenStreetMap, la mappa del mondo libera e modificabile. @@ -1184,7 +1198,7 @@ it: gli argomenti di mappatura. welcome: url: /welcome - title: Benvenuti a OSM + title: Benvenuti in OSM description: Inizia con questa guida rapida che copre le basi di OpenStreetMap. beginners_guide: url: http://wiki.openstreetmap.org/wiki/IT:Beginners%27_guide @@ -1217,8 +1231,8 @@ it: about_page: next: Successivo copyright_html: <span>©</span>OpenStreetMap<br>contributors - used_by: '%{name} fornisce dati geografici su centinaia di siti web, app mobili - e dispositivi hardware' + used_by: '%{name} fornisce dati geografici su migliaia di siti web, applicazioni + mobili e dispositivi hardware' lede_text: OpenStreetMap è costruito da una comunità di mappatori che contribuiscono e mantengono i dati sulle strade, sentieri, caffè, stazioni ferroviarie e molto altro ancora, in tutto il mondo. @@ -1242,16 +1256,19 @@ it: legal_title: Note legali legal_html: "Questo sito e molti altri servizi correlati sono formalmente gestiti dalla \n<a href=\"http://osmfoundation.org/\">OpenStreetMap Foundation</a> (OSMF) - \nper conto della comunità.\n<br> \nSi prega di <a href=\"http://osmfoundation.org/Contact\">contattare + \nper conto della comunità. L'uso di tutti i servizi gestiti dalla OSMF è soggetto + \nalle nostre <a href=\"http://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy\">\nregole + di utilizzo accettabile</a> ed alla nostra <a href=\"http://wiki.osmfoundation.org/wiki/Privacy_Policy\">informativa + sulla privacy</a>\n<br> \nSi prega di <a href=\"http://osmfoundation.org/Contact\">contattare la OSMF</a> \nin caso di dubbi e problemi di licenza, copyright o altre questioni legali." partners_title: Partner notifier: diary_comment_notification: - subject: '[OpenStreetMap] %{user} ha commentato la tua voce del diario' - hi: Salve %{to_user}, - header: '%{from_user} ha commentato la tua recente voce del diario OpenStreetMap - con l''oggetto %{subject}:' + subject: '[OpenStreetMap] %{user} ha commentato una voce del diario' + hi: Ciao %{to_user}, + header: '%{from_user} ha commentato la voce del diario OpenStreetMap con l''oggetto + %{subject}:' footer: Puoi anche leggere il commento su %{readurl} e puoi commentare su %{commenturl} oppure rispondere su %{replyurl} message_notification: @@ -1347,6 +1364,7 @@ it: La nota si trova vicino a %{place}.' details: Ulteriori dettagli sulla nota possono essere trovati su %{url}. changeset_comment_notification: + hi: Ciao %{to_user}, greeting: Ciao, commented: subject_own: '[OpenStreetMap] %{commenter} ha commentato uno dei tuoi changeset' @@ -1360,6 +1378,8 @@ it: partial_changeset_without_comment: senza commento details: Ulteriori dettagli sul gruppo di modifiche possono essere trovati su %{url}. + unsubscribe: Per cancellarsi dagli aggiornamenti di questo insieme di modifiche, + visita %{url} e fai clic su "Cancellazione". message: inbox: title: Posta in arrivo @@ -1412,9 +1432,9 @@ it: di questi %{people_mapping_nearby_link}? people_mapping_nearby: persone che mappano nelle vicinanze reply: - wrong_user: Sei loggato come `%{user}', ma il messaggio al quale hai chiesto - di rispondere non era diretto a quell'utente. Se vuoi rispondere, per favore - loggati con l'utenza interessata. + wrong_user: Hai effettuato l'accesso come '%{user}', ma il messaggio al quale + hai chiesto di rispondere non era diretto a quell'utente. Se vuoi rispondere, + per favore accedi con l'utenza interessata. read: title: Leggi messaggio from: Da @@ -1424,9 +1444,9 @@ it: unread_button: Segna come non letto back: Indietro to: A - wrong_user: Sei loggato come `%{user}', ma il messaggio che hai chiesto di leggere - non era diretto a quell'utente. Se vuoi leggerlo, per favore loggati con l'utenza - interessata. + wrong_user: Hai effettuato l'accesso come '%{user}', ma il messaggio che hai + chiesto di leggere non era diretto a quell'utente. Se vuoi leggerlo, per favore + accedi con l'utenza interessata. sent_message_summary: delete_button: Cancella mark: @@ -1482,15 +1502,17 @@ it: table: entry: motorway: Autostrada + main_road: Strada principale trunk: Superstrada primary: Strada primaria secondary: Strada secondaria unclassified: Strada non classificata - unsurfaced: Strada non pavimentata track: Strada forestale o agricola - byway: Byway (UK) bridleway: Percorso per equitazione cycleway: Pista Ciclabile + cycleway_national: Pista ciclabile nazionale + cycleway_regional: Pista ciclabile regionale + cycleway_local: Pista ciclabile locale footway: Percorso pedonale rail: Ferrovia subway: Metropolitana @@ -1512,7 +1534,6 @@ it: golf: Campo da golf park: Parco resident: Zona residenziale - tourist: Attrazione turistica common: - Area comune - prato @@ -1542,9 +1563,11 @@ it: tunnel: Linea tratteggiata = tunnel bridge: Quadrettatura nera = ponte private: Accesso privato - permissive: Accesso permissivo destination: Servitù di passaggio construction: Strade in costruzione + bicycle_shop: Negozio di biciclette + bicycle_parking: Parcheggio per biciclette + toilets: Bagni pubblici richtext_area: edit: Modifica preview: Anteprima @@ -1707,6 +1730,7 @@ it: allow_read_gpx: Visualizza i tuoi tracciati GPS allow_write_gpx: carica tracciati GPS. allow_write_notes: modificare le note. + grant_access: Concedi l'accesso oauthorize_success: title: Richiesta di autorizzazione consentita allowed: Hai consentito l'accesso all'applicazione %{app_name} al tuo account. @@ -1812,6 +1836,18 @@ it: google: title: Accedi con Google alt: Accedi con un OpenID di Google + facebook: + title: Accedi con Facebook + alt: Accedi con un Account Facebook + windowslive: + title: Accedi con Windows Live + alt: Accedi con un Account Windows Live + github: + title: Accedi con GitHub + alt: Effettua l'acceso con un'utenza GitHub + wikipedia: + title: Accedi con Wikipedia + alt: Accedi con un'utenza Wikipedia yahoo: title: Accedi con Yahoo alt: Accedi con un OpenID di Yahoo @@ -1829,7 +1865,7 @@ it: title: password persa heading: Password dimenticata? email address: 'Indirizzo email:' - new password button: Spediscimi una nuova password + new password button: Reimposta password help_text: Inserire l'indirizzo email che si è utilizzato per l'iscrizione, a cui verrà inviato un collegamento che permetterà la reimpostazione della propria password. @@ -1850,8 +1886,8 @@ it: title: Registrati no_auto_account_create: Sfortunatamente in questo momento non è possibile creare automaticamente per te un profilo. - contact_webmaster: Si prega di contattare il <a href="mailto:webmaster@openstreetmap.org">webmaster</a> - affinchè faccia in modo di creare un profilo. Tenteremo di soddisfare la richiesta + contact_webmaster: Si prega di contattare il <a href="%{webmaster}">webmaster</a> + affinché faccia in modo di creare un profilo. Tenteremo di soddisfare la richiesta il più rapidamente possibile. about: header: Libero ed editabile @@ -1863,9 +1899,10 @@ it: per contribuire</a>. email address: 'Indirizzo email:' confirm email address: 'Conferma indirizzo email:' - not displayed publicly: Non visualizzato pubblicamente (vedi le <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" - title="wiki privacy policy including section on email addresses">norme sulla - privacy</a>) + not displayed publicly: Il tuo indirizzo non visualizzato pubblicamente, vedi + l'<a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy" title="OSMF + privacy policy including section on email addresses">informativa sulla privacy</a> + per ulteriori informazioni display name: 'Nome visualizzato:' display name description: Il proprio nome utente visualizzato pubblicamente. Può essere modificato più tardi nelle preferenze. @@ -1876,16 +1913,6 @@ it: auth no password: Con l'autenticazione tramite terze parti non è richiesta una password, ma alcuni strumenti o server aggiuntivi potrebbero ancora averne bisogno. - auth association: |- - <p>Il tuo ID non è ancora associato ad alcun profilo OpenStreetMap.</p> - <ul> - <li>Se sei nuovo in OpenStreetMap, crea un nuovo profilo utilizzando il form sottostante.</li> - <li> - Se possiedi già un profilo è possibile accedervi - utilizzando il proprio nome utente e password, e quindi associare il profilo - con il proprio ID all'interno delle impostazioni utente. - </li> - </ul> continue: Registrati terms accepted: Grazie di aver accettato le nuove regole per contribuire! terms declined: Siamo spiacenti che tu abbia deciso di non accettare i nuovi @@ -1899,7 +1926,7 @@ it: attuali e futuri. consider_pd: In aggiunta al contratto di cui sopra, considero che i miei contributi sono in Pubblico Dominio - consider_pd_why: che cos'è questo? + consider_pd_why: cos'è questo? guidance: 'Informazioni utili a capire questi termini: un <a href="%{summary}">riassunto leggibile</a> ed alcune <a href="%{translations}">traduzioni informali</a>' agree: Accetto @@ -1916,6 +1943,7 @@ it: heading: L'utente %{user} non esiste body: Spiacenti, non c'è alcun utente con il nome %{user}. Controllare la digitazione, o che il collegamento sul quale hai cliccato non sia errato. + deleted: cancellato view: my diary: Il mio diario new diary entry: nuova voce del diario @@ -1968,16 +1996,16 @@ it: revoke: administrator: Revoca l'accesso come amministratore moderator: Revoca l'accesso come moderatore - block_history: blocchi ricevuti - moderator_history: blocchi applicati + block_history: Blocchi attivi + moderator_history: Blocchi applicati comments: Commenti - create_block: blocca questo utente - activate_user: attiva questo utente - deactivate_user: disattiva questo utente - confirm_user: conferma questo utente - hide_user: nascondi questo utente - unhide_user: mostra questo utente - delete_user: elimina questo utente + create_block: Blocca questo utente + activate_user: Attiva questo utente + deactivate_user: Disattiva questo utente + confirm_user: Conferma questo utente + hide_user: Nascondi questo utente + unhide_user: Mostra questo utente + delete_user: Cancella questo utente confirm: Conferma friends_changesets: gruppi di modifiche degli amici friends_diaries: note dei diari degli amici @@ -2031,6 +2059,8 @@ it: gravatar: gravatar: Usa Gravatar link text: che cos'è questo? + disabled: Gravatar è stato disattivato. + enabled: La visualizzazione del vostro Gravatar è stata attivata. new image: Aggiungi un'immagine keep image: Mantieni l'immagine attuale delete image: Rimuovi l'immagine attuale @@ -2065,8 +2095,8 @@ it: success: È stato spedito un nuovo messaggio di conferma all'indirizzo %{email} e non appena verrà confermato il proprio profilo si sarà in grado di mappare.<br /><br />Se si utilizzano dei filtri antispam che spediscono richieste di conferma - assicurarsi di inserire l'indirizzo webmaster@openstreetmap.org nella whitelist, - altrimenti non siamo in grado di rispondere ad alcuna richiesta di conferma. + assicurarsi di inserire l'indirizzo %{sender} nella whitelist, altrimenti + non siamo in grado di rispondere ad alcuna richiesta di conferma. failure: Utente %{name} non trovato. confirm_email: heading: Conferma una variazione di indirizzo email @@ -2117,6 +2147,16 @@ it: auth_failure: connection_failed: Connessione al provider di autenticazione non riuscita invalid_credentials: Le credenziali di autenticazione non sono valide + no_authorization_code: Nessun codice di autorizzazione + unknown_signature_algorithm: Algoritmo di firma sconosciuto + invalid_scope: Ambito non valido + auth_association: + heading: Il tuo ID non è ancora associato ad un'utenza di OpenStreetMap. + option_1: Se sei nuovo su OpenStreetMap, crea una nuova utenza utilizzando il + modulo di seguito. + option_2: Se disponi già di un'utenza, puoi accedere ad essa utilizzando il + tuo nome utente e la password e quindi associare l'utenza con il tuo ID nelle + impostazioni. user_role: filter: not_an_administrator: Solo gli amministratori possono gestire i ruoli degli @@ -2233,6 +2273,8 @@ it: heading: '%{block_on} bloccato da %{block_by}' time_future: Termina fra %{time} time_past: Terminato %{time} fa + created: Creato + ago: '%{time} fa' status: Stato show: Mostra edit: Modifica @@ -2283,6 +2325,7 @@ it: link: Link o HTML long_link: Link short_link: Link breve + geo_uri: Geo URI embed: HTML custom_dimensions: Imposta dimensioni personalizzate format: 'Formato:' @@ -2294,10 +2337,13 @@ it: center_marker: Centra la mappa sul marcatore paste_html: Incolla l'HTML per incorporarlo nel sito web view_larger_map: Visualizza mappa ingrandita + only_standard_layer: Solo il livello standard può essere esportato come immagine + embed: + report_problem: Segnala un problema key: title: Legenda tooltip: Legenda - tooltip_disabled: La legenda è disponibile solo per il livello Standard + tooltip_disabled: La legenda non è disponibile per questo livello map: zoom: in: Zoom avanti @@ -2309,12 +2355,12 @@ it: standard: Standard cycle_map: Mappa ciclabile transport_map: Mappa dei trasporti - mapquest: MapQuest Open hot: Umanitario layers: header: Livelli mappa notes: Note sulla mappa data: Dati della mappa + gps: Tracciati GPS pubblici overlays: Abilita sovrapposizioni per la risoluzione dei problemi della mappa title: Livelli copyright: © <a href='%{copyright_url}'>OpenStreetMap contributors</a> @@ -2361,12 +2407,48 @@ it: mapquest_car: Auto (MapQuest) mapquest_foot: A piedi (MapQuest) osrm_car: Auto (OSRM) - directions: Direzioni + mapzen_bicycle: Bicicletta (Mapzen) + mapzen_car: Auto (Mapzen) + mapzen_foot: Piedi (Mapzen) + directions: Indicazioni distance: Distanza errors: no_route: Impossibile trovare un percorso fra questi due posti. no_place: Spiacenti, non è possibile trovare quel luogo. instructions: + continue_without_exit: Prosegui su %{name} + slight_right_without_exit: Svolta leggermente a destra in %{name} + offramp_right_without_exit: Prendi la rampa sulla destra in %{name} + onramp_right_without_exit: Gira a destra sulla rampa in %{name} + endofroad_right_without_exit: Alla fine della strada svolta a destra in %{name} + merge_right_without_exit: Immettiti a destra in %{name} + fork_right_without_exit: Al bivio svolta a destra in %{name} + turn_right_without_exit: Svolta a destra in %{name} + sharp_right_without_exit: Svolta tutto a destra in %{name} + uturn_without_exit: Effettua un'inversione a U lungo %{name} + sharp_left_without_exit: Svolta tutto a sinistra in %{name} + turn_left_without_exit: Svolta a sinistra in %{name} + offramp_left_without_exit: Prendi la rampa sulla sinistra in %{name} + onramp_left_without_exit: Gira a sinistra sulla rampa in %{name} + endofroad_left_without_exit: Alla fine della strada svolta a sinistra in %{name} + merge_left_without_exit: Immettiti a sinistra in %{name} + fork_left_without_exit: Al bivio svolta a sinistra in %{name} + slight_left_without_exit: Svolta leggermente a sinistra in %{name} + via_point_without_exit: (punto di passaggio) + follow_without_exit: Segui %{name} + roundabout_without_exit: Alla rotonda prendi %{name} + leave_roundabout_without_exit: Esci dalla rotonda - %{name} + stay_roundabout_without_exit: Rimani sulla rotonda - %{name} + start_without_exit: Inizia alla fine di %{name} + destination_without_exit: Raggiungi la destinazione + against_oneway_without_exit: Vai contro il senso unico in %{name} + end_oneway_without_exit: Fine del senso unico in %{name} + roundabout_with_exit: Alla rotonda prendi l'uscita n° %{exit} su %{name} + turn_left_with_exit: Alla rotonda svolta a sinistra in %{name} + slight_left_with_exit: Alla rotonda svolta leggermente a sinistra in %{name} + turn_right_with_exit: Alla rotonda svolta a destra in %{name} + slight_right_with_exit: Alla rotonda svolta leggermente a destra in %{name} + continue_with_exit: Alla rotonda prosegui dritto in %{name} unnamed: senza nome courtesy: Indicazioni per gentile concessione di %{link} time: Tempo @@ -2385,8 +2467,8 @@ it: title: Modifica revisione index: empty: Nessuna revisione disponibile. - heading: Lista Revisioni - title: Lista Revisioni + heading: Elenco di revisioni + title: Elenco di revisioni new: description: Descrizione heading: Inserire informazioni per una nuova revisione diff --git a/config/locales/ja.yml b/config/locales/ja.yml index 19708c8f0..e2123f320 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -8,6 +8,8 @@ # Author: Hiro884 # Author: Hosiryuhosi # Author: Iwai.masaharu +# Author: Los688 +# Author: Macofe # Author: Mage Whopper # Author: Mfuji # Author: Miya @@ -19,11 +21,14 @@ # Author: Rxy # Author: Schu # Author: Shirayuki +# Author: Suchichi02 # Author: Sudachi # Author: Sujiniku # Author: Surgical21 # Author: Tombi-aburage +# Author: Vigorous action # Author: Wrightbus +# Author: ネイ # Author: 青子守歌 # Author: 아라 --- @@ -81,7 +86,7 @@ ja: friend: 友達 trace: user: ユーザー - visible: 表示 + visible: 可視 name: 名前 size: サイズ latitude: 緯度 @@ -180,13 +185,15 @@ ja: way: ウェイ relation: リレーション changeset: 変更セット + note: 注記 timeout: - sorry: 申し訳ありませんが、ID %{id} の %{type} のデータは大きすぎるため取得できません。 + sorry: 申し訳ありませんが、ID %{id} の %{type} のデータは時間がかかりすぎたため取得できませんでした。 type: node: ノード way: ウェイ relation: リレーション changeset: 変更セット + note: 注記 redacted: redaction: 改訂 %{id} message_html: この %{type} の %{version} 版は、改訂されたため表示できません。詳細は %{redaction_link} @@ -247,8 +254,8 @@ ja: title: 変更セット title_user: '%{user} による変更セット' title_friend: 友達による変更セット - title_nearby: 周辺のユーザーによる変更セット - empty: 変更セットが見つかりません。 + title_nearby: 周辺の利用者による変更セット + empty: 変更セットが見つかりませんでした。 empty_area: この領域には変更セットはありません。 empty_user: このユーザーによる変更セットはありません。 no_more: 変更セットはこれ以上ありません。 @@ -256,7 +263,7 @@ ja: no_more_user: このユーザーによる変更セットはこれ以上ありません。 load_more: 続きを読み込む timeout: - sorry: 申し訳ありませんが、要求した変更セットの一覧は大きすぎるため取得できませんでした。 + sorry: 申し訳ありませんが、要求した変更セットの一覧は時間がかかりすぎたため取得できませんでした。 rss: title_all: OpenStreetMap変更セットの議論 title_particular: OpenStreetMap変更セット#%{changeset_id}の議論 @@ -267,10 +274,11 @@ ja: diary_entry: new: title: 日記エントリの新規作成 + publish_button: 公開 list: title: ユーザーの日記 title_friends: 友達の日記 - title_nearby: 周辺のユーザーの日記 + title_nearby: 周辺の利用者の日記 user_title: '%{user} の日記' in_language_title: '%{language} の日記エントリ' new: 日記エントリを新規作成 @@ -452,6 +460,7 @@ ja: food_court: フードコート fountain: 噴水 fuel: 燃料 + gambling: ギャンブル grave_yard: 墓地 gym: フィットネス センター/ジム health_centre: 保健所 @@ -462,10 +471,11 @@ ja: library: 図書館 market: 市場 marketplace: 市場 + monastery: 修道院 motorcycle_parking: バイクの駐輪場 nightclub: ナイト クラブ nursery: 保育所 - nursing_home: 特別養護老人ホーム + nursing_home: 老人ホーム office: オフィス parking: 駐車場 parking_entrance: 駐車場の入口 @@ -502,6 +512,7 @@ ja: veterinary: 獣医外科 village_hall: 役場 waste_basket: ごみ箱 + waste_disposal: ごみ集積所 youth_centre: 青少年センター boundary: administrative: 行政境界 @@ -517,12 +528,23 @@ ja: building: "yes": 建造物 craft: + brewery: 醸造所 + carpenter: 工務店 + electrician: 電気工 + gardener: 造園業 + painter: 塗装業 photographer: 撮影者 + plumber: 配管業 + shoemaker: 靴屋 + tailor: 仕立て屋 "yes": 手芸店 emergency: ambulance_station: 消防署 + defibrillator: 自動体外式除細動器 + landing_site: 緊急着陸地点 phone: 緊急電話 highway: + abandoned: 廃止鉄道 bridleway: 乗馬道 bus_guideway: 路面バス専用車線 bus_stop: バス停 @@ -571,14 +593,17 @@ ja: building: 歴史的な建物 castle: 城 church: 教会 + city_gate: 城門 citywalls: 城壁 fort: ç ¦ + heritage: 遺産 house: 住宅 icon: アイコン manor: 荘園 memorial: 記念碑 mine: 鉱山 monument: 記念碑 + roman_road: ローマ街道 ruins: 廃墟 stone: 岩石 tomb: 墓地 @@ -619,15 +644,19 @@ ja: road: 道路エリア village_green: 緑地広場 vineyard: Vineyard + "yes": 土地利用 leisure: beach_resort: ビーチ リゾート bird_hide: 観察小屋 club: クラブ common: 共有地 + dog_park: ドッグ・パーク fishing: 釣り場 + fitness_centre: フィットネスセンター fitness_station: フィットネス ステーション garden: 庭園 golf_course: ゴルフ場 + horse_riding: 乗馬 ice_rink: アイススケート場 marina: マリーナ miniature_golf: ミニチュア ゴルフ @@ -636,6 +665,9 @@ ja: pitch: 運動場 playground: 遊び場 recreation_ground: 遊園地 + resort: |2- + + リゾート sauna: サウナ slipway: 造船台 sports_centre: スポーツ センター @@ -643,9 +675,13 @@ ja: swimming_pool: 水泳用プール track: 陸上競技用トラック water_park: 親水公園 + "yes": レジャー man_made: + lighthouse: 灯台 + pipeline: パイプライン tower: 塔 works: 工房 + "yes": 人工 military: airfield: 軍用飛行場 barracks: バラック @@ -665,6 +701,7 @@ ja: forest: 森林 geyser: 間欠泉 glacier: æ°·æ²³ + grassland: 草地 heath: 荒れ地 hill: 丘陵 island: 島 @@ -677,6 +714,8 @@ ja: reef: 砂州 ridge: 海嶺 rock: 岩場 + saddle: 鞍部 + sand: 砂 scree: がれ場 scrub: 低木林 spring: 泉 @@ -703,6 +742,8 @@ ja: travel_agent: 旅行代理店 "yes": オフィス place: + allotments: 家庭菜園 + block: ブロック airport: 空港 city: 市 country: 国 @@ -830,6 +871,7 @@ ja: "yes": 店舗 tourism: alpine_hut: 高山小屋 + apartment: リゾートマンション artwork: 芸術作品 attraction: アトラクション bed_and_breakfast: 民宿(B&B) @@ -837,6 +879,7 @@ ja: camp_site: キャンプ場 caravan_site: オートキャンプ場 chalet: 別荘 + gallery: 美術館 guest_house: 民宿 hostel: ホステル hotel: ホテル @@ -868,6 +911,7 @@ ja: wadi: 涸れ川 waterfall: 滝 weir: ダム + "yes": æ°´è·¯ admin_levels: level2: 国境 level4: 都道府県・州境 @@ -966,16 +1010,16 @@ ja: title: 権利表示の例 more_title_html: 詳細を見る more_1_html: |- - データの利用についてやクレジット方法について、詳細は<a + データの利用やクレジット方法についての詳細は<a href="http://osmfoundation.org/Licence">OSMF Licence page</a> and the community <a href="http://wiki.openstreetmap.org/wiki/JA:Legal_FAQ">Legal FAQ</a>をお読みください。 more_2_html: OpenStreetMap はオープンデータですが、サードパーティーの開発者のための無料の地図 API は提供できません。 <a href="http://wiki.openstreetmap.org/wiki/API_usage_policy">API Usage Policy</a>、<a - href="http://wiki.openstreetmap.org/wiki/JA:タイル利用規約">タイル利用規約</a>、<a href="http://wiki.openstreetmap.org/wiki/JA:Nominatim#利用ポリシー">Nominatim + href="http://wiki.openstreetmap.org/wiki/JA:タイル利用規約">タイルの利用規約</a>、<a href="http://wiki.openstreetmap.org/wiki/JA:Nominatim#利用ポリシー">Nominatim Usage Policy</a>をお読みください。 contributors_title_html: 協力者 - contributors_intro_html: 協力者は数千人もの個人です。それに加え、国立の地図作成組織や、次のようなその他の情報源による公開できるライセンスによるデータを含みます。 + contributors_intro_html: 数千人もの個人が協力者となっています。それに加え、各国の地図作成機関や、以下のように、その他の情報源も含め、公開されたライセンスによるデータを含みます。 contributors_at_html: '<strong>オーストリア</strong>: <a href="http://data.wien.gv.at/">Stadt Wien</a> (ライセンス <a href="http://creativecommons.org/licenses/by/3.0/at/deed.de">CC BY</a>)、<a href="http://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm">Land @@ -991,11 +1035,11 @@ ja: contributors_nl_html: '<strong>オランダ</strong>: © AND データ、2007 (<a href="http://www.and.com">www.and.com</a>) を含みます。' contributors_nz_html: '<strong>ニュージーランド</strong>: Land Information New Zealand - によるデータを含みます。Crown が著作権を保持します。' + によるデータを含みます。著作権はクラウン・コピーライトになります。' contributors_za_html: '<strong>南アフリカ</strong>: <a href="http://www.ngi.gov.za/">Chief - Directorate: National Geo-Spatial Information</a>, State によるデータを含み、著作権を保持します。' - contributors_gb_html: '<strong>イギリス</strong>: 陸地測量データ © Crown copyright - and database right 2010-12 を含みます。' + Directorate: National Geo-Spatial Information</a>,政府によるデータを含み、著作権を保持します。' + contributors_gb_html: '<strong>イギリス</strong>: 陸地測量データ ©è‘—作権はクラウン・コピーライト及びdatabase + right 2010-12 を含みます。' contributors_footer_1_html: これらの詳細について、またOpenStreetMapの向上に使用されたその他のソースについては、OpenStreetMap Wikiの<a href="http://wiki.openstreetmap.org/wiki/JA:Contributors">協力者ページ</a>をご覧ください。 contributors_footer_2_html: OpenStreetMapのデータに含めることは、元データの提供者がOpenStreetMapを支持したり、何かしらの保証を行ったり、何かしらの責任を負ったりすることを意味するものではありません。 @@ -1005,6 +1049,7 @@ ja: infringement_2_html: もし著作権のある素材がOpenStreetMapのデータベースや本サイトに不正に追加されたとお考えの場合は、<a href="http://www.osmfoundation.org/wiki/License/Takedown_procedure">却下手順</a>をお読みになるか、<a href="http://dmca.openstreetmap.org/">on-line filing page</a>から直接申し立てを行ってください。 + trademarks_title_html: <span id="trademarks"></span>商標 welcome_page: title: ようこそ! introduction_html: フリーで編集可能な世界地図、OpenStreetMapへようこそ。サインアップしたので、マッピングの準備はすべて整いました。知っておかなければならない重要事項を簡単に説明します。 @@ -1019,6 +1064,8 @@ ja: node_html: <strong>ノード</strong>は地図上の点です。1 軒のレストランや 1 本の樹木が該当します。 way_html: <strong>ウェイ</strong>は線または領域です。道路、水路、湖、建物などが該当します。 tag_html: <strong>タグ</strong>はノードやウェイについて補足するデータです。レストランの名前、道路の制限速度などが該当します。 + rules: + title: ルール questions: title: 何か質問はありますか? paragraph_1_html: |- @@ -1058,10 +1105,15 @@ ja: beginners_guide: url: http://wiki.openstreetmap.org/wiki/JA:%E5%88%9D%E5%BF%83%E8%80%85%E3%82%AC%E3%82%A4%E3%83%89 title: 初心者向けの手引き + description: コミュニティは、初心者向けガイドが整備しています。 help: url: https://help.openstreetmap.org/ title: help.openstreetmap.org description: OSM の質問回答サイトで質問したり回答を検索したりする。 + mailing_lists: + title: メーリング リスト + forums: + title: フォーラム irc: title: IRC wiki: @@ -1086,9 +1138,9 @@ ja: partners_title: パートナー notifier: diary_comment_notification: - subject: '[OpenStreetMap] %{user} さんがあなたの日記エントリにコメントしました' + subject: '[OpenStreetMap] %{user} さんが日記エントリにコメントしました' hi: こんにちは、%{to_user} さん。 - header: 'あなたの最近の OpenStreetMap 日記エントリ (タイトル: %{subject}) に、%{from_user} がコメントしました。' + header: 'OpenStreetMap 日記エントリ (タイトル: %{subject}) に、%{from_user} がコメントしました。' footer: '%{readurl}でコメントを読むことができ、%{commenturl} でコメントするか、%{replyurl} で返信できます。' message_notification: hi: こんにちは、%{to_user} さん。 @@ -1160,6 +1212,8 @@ ja: details: メモについての詳細は %{url} を参照。 changeset_comment_notification: greeting: こんにちは、 + commented: + partial_changeset_without_comment: コメントなし message: inbox: title: 受信箱 @@ -1259,13 +1313,12 @@ ja: table: entry: motorway: 自動車専用道路 + main_road: 主要道 trunk: 国道 primary: 主要地方道 secondary: 一般県道 unclassified: 未分類の道路 - unsurfaced: 未舗装道路 track: 農道・林道 - byway: 路地 bridleway: 乗馬道 cycleway: 自転車道 footway: 歩道 @@ -1289,7 +1342,6 @@ ja: golf: ゴルフ場 park: 公園 resident: 住宅地 - tourist: 観光名所 common: - 共有地 - 牧草地 @@ -1319,9 +1371,11 @@ ja: tunnel: 点線の枠 = トンネル bridge: 黒枠 = 橋梁 private: 私的通行 - permissive: 許可制通行 destination: 目的通行 construction: 建設中の道路 + bicycle_shop: 自転車販売店 + bicycle_parking: 駐輪場 + toilets: トイレ richtext_area: edit: 編集 preview: プレビュー @@ -1468,6 +1522,7 @@ ja: allow_read_gpx: 自分の非公開GPSトレースを読み込む。 allow_write_gpx: GPSトレースをアップロードする。 allow_write_notes: メモを変更する。 + grant_access: アクセスを許可 oauthorize_success: title: 認証リクエストが成功しました allowed: アプリケーション %{app_name} によるあなたのアカウントへのアクセスを許可しました。 @@ -1549,6 +1604,7 @@ ja: login_button: ログイン register now: 今すぐ登録 with username: 'OpenStreetMap アカウントを既にお持ちですか? 自分のユーザー名とパスワードでログインしてください:' + with external: 'サードパーティのアカウントでもログインできます:' new to osm: OpenStreetMap は初めてですか? to make changes: OpenStreetMap データを変更するには、アカウントが必要です。 create account minute: アカウントを作成します。1分でできます。 @@ -1559,6 +1615,31 @@ ja: <a href="%{webmaster}">ウェブマスター</a>にご連絡ください。 auth failure: 申し訳ありませんが、入力した情報でログインできませんでした。 openid_logo_alt: OpenID でログイン + auth_providers: + openid: + title: OpenID を使用してログイン + alt: OpenID URL を使用してログイン + google: + title: Google を使用してログイン + alt: Google OpenID を使用してログイン + facebook: + title: Facebook を使用してログイン + alt: Facebook アカウントを使用してログイン + windowslive: + title: Windows Live を使用してログイン + alt: Windows Live アカウントを使用してログイン + github: + title: GitHubでログイン + alt: GitHubのアカウントでログイン + yahoo: + title: Yahoo を使用してログイン + alt: Yahoo OpenID を使用してログイン + wordpress: + title: Wordpress を使用してログイン + alt: Wordpress OpenID を使用してログイン + aol: + title: AOL を使用してログイン + alt: AOL OpenID を使用してログイン logout: title: ログアウト heading: OpenStreetMap からログアウト @@ -1582,7 +1663,7 @@ ja: new: title: ユーザー登録 no_auto_account_create: 残念ながら、現在、自動ではアカウントを作成できません。 - contact_webmaster: アカウントを作成できるよう、<a href="mailto:webmaster@openstreetmap.org">webmaster</a>に連絡してください。 + contact_webmaster: アカウントを作成できるよう、<a href="%{webmaster}">webmaster</a>に連絡してください。 できるだけ早期に、あなたの希望に対応するように努めます。 about: header: フリー、編集可能 @@ -1592,12 +1673,13 @@ ja: license_agreement: アカウントを確認するときには<a href="http://www.osmfoundation.org/wiki/License/Contributor_Terms">協力者規約</a>に同意する必要があります。 email address: 'メール アドレス:' confirm email address: 'メール アドレスの確認:' - not displayed publicly: 非公開です (詳細は <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" - title="メール アドレスの節を含む、ウィキのプライバシー ポリシー">プライバシー ポリシー</a>を参照してください) + not displayed publicly: あなたのアドレスは非公開です。詳細は弊財団の<a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy" + title="メール アドレスの節を含む、OSMFのプライバシーポリシー">プライバシーポリシー</a>をご参照ください display name: '表示名:' display name description: 自分の公開ユーザー名です。あとで設定ページで変更できます。 password: 'パスワード:' confirm password: 'パスワードの確認:' + use external auth: サードパーティのアカウントでもログインできます continue: ユーザー登録 terms accepted: 新しい協力者規約に同意いただき、ありがとうございます! terms declined: 新しい協力者規約に同意いただけず残念です。詳しい情報は、<a href="%{url}">このウィキページ</a>をご覧ください。 @@ -1623,6 +1705,7 @@ ja: title: 存在しないユーザーです heading: ユーザー %{user} は存在しません body: 申し訳ありませんが、%{user} という名前のユーザーは存在しません。スペルを確認してください。またはクリックしたリンクが間違っている可能性があります。 + deleted: 削除済 view: my diary: 自分の日記 new diary entry: 新しい日記エントリ @@ -1673,12 +1756,12 @@ ja: revoke: administrator: 管理者権限を剥奪 moderator: モデレーター権限を剥奪 - block_history: 受けたブロック + block_history: 有効なブロック moderator_history: 実行したブロック comments: コメント create_block: このユーザーをブロック - activate_user: このユーザーを有効にする - deactivate_user: このユーザーを無効にする + activate_user: このユーザーを有効化 + deactivate_user: このユーザーを無効化 confirm_user: このユーザーを確認 hide_user: このユーザーを隠す unhide_user: このユーザーを再表示 @@ -1698,6 +1781,7 @@ ja: current email address: '現在のメール アドレス:' new email address: '新しいメール アドレス:' email never displayed publicly: (非公開) + external auth: '外部認証:' openid: link: http://wiki.openstreetmap.org/wiki/JA:OpenID?uselang=ja link text: これは何ですか? @@ -1754,8 +1838,8 @@ ja: unknown token: この確認コードは期限切れ、または存在しません。 reconfirm_html: 確認メールを再送する必要がある場合は、<a href="%{reconfirm}">ここをクリック</a>してください。 confirm_resend: - success: ' %{email}に確認メッセージを再送信しました。メールを確認してアカウントを有効にし次第、編集を開始できます。<br /><br - />あなたの指定したアドレスに確認メールが届くまであなたはログインできません。メールボックスでスパムフィルターを使用している場合は webmaster@openstreetmap.org + success: '%{email}に確認メッセージを再送信しました。メールを確認してアカウントを有効にし次第、編集を開始できます。<br /><br + />あなたの指定したアドレスに確認メールが届くまであなたはログインできません。メールボックスでスパムフィルターを使用している場合は %{sender} からの確認メールを受信できるようホワイトリストを設定してください。' failure: '%{name}というアカウントは登録されていません。' confirm_email: @@ -1764,6 +1848,7 @@ ja: button: 確認 success: メール アドレスが変更されたことを確認しました。 failure: このトークンは、メール アドレスの確認に使用済みです。 + unknown_token: その確認コードは期限切れ、または存在しません。 set_home: flash success: ホーム地点を保存しました。 go_public: @@ -1803,6 +1888,8 @@ ja: <p> この処置については近々管理者が確認をいたしますが、ご相談がある場合は%{webmaster} にご連絡いただいてもかまいません。 </p> + auth_failure: + invalid_scope: 無効な範囲 user_role: filter: not_an_administrator: ユーザー権限の管理を行えるのは管理者だけですが、あなたは管理者ではありません。 @@ -1901,6 +1988,8 @@ ja: heading: '%{block_by} が %{block_on} をブロックしました' time_future: '%{time} に終了' time_past: '%{time}前に終了しました' + created: 作成済み + ago: '%{time}前' status: 状態 show: 表示 edit: 編集 @@ -1962,10 +2051,12 @@ ja: center_marker: マーカーを地図の中心にする paste_html: 以下の HTML をあなたのサイトに貼り付けてください view_larger_map: 大きな地図を表示 + embed: + report_problem: 問題を報告 key: title: 凡例 tooltip: 凡例 - tooltip_disabled: 凡例(標準レイヤーのみ利用可) + tooltip_disabled: このレイヤーでは凡例が使えません map: zoom: in: 拡大 @@ -1993,9 +2084,13 @@ ja: createnote_disabled_tooltip: メモを地図に追加するには拡大してください map_notes_zoom_in_tooltip: 地図メモを閲覧するには拡大してください map_data_zoom_in_tooltip: 地図データを閲覧するには拡大してください + queryfeature_tooltip: 地物を検索 + queryfeature_disabled_tooltip: 検索した地物にズーム changesets: show: comment: コメント + subscribe: 購読 + unsubscribe: 購読停止 hide_comment: 非表示 unhide_comment: 非表示を解除 notes: @@ -2011,10 +2106,30 @@ ja: comment: コメント edit_help: 編集したい位置に移動してズームインしてから、ここをクリックしてください。 directions: + engines: + graphhopper_bicycle: 自転車 + graphhopper_foot: 歩行 + mapquest_bicycle: 自転車 + mapquest_car: 自動車 + mapquest_foot: 歩行 + osrm_car: 自動車 + mapzen_bicycle: 自転車 + mapzen_car: 自動車 + mapzen_foot: 歩行 + directions: 方向 distance: 距離 + errors: + no_route: 2点間のルートが見つかりません。 + no_place: 残念ながら、その場所は見つかりませんでした。 instructions: + continue_without_exit: '%{name}を続行' + turn_right_without_exit: 右に曲がって%{name}へ + turn_left_without_exit: 左に曲がって%{name}へ unnamed: 名前なし query: + node: ノード + way: ウェイ + relation: リレーション nothing_found: 地物が見つかりませんでした redaction: edit: diff --git a/config/locales/ka.yml b/config/locales/ka.yml index dab202715..06e40b852 100644 --- a/config/locales/ka.yml +++ b/config/locales/ka.yml @@ -12,6 +12,8 @@ ka: activerecord: models: acl: ხელმისაწვდომობის შეზღუდვის სია + changeset: ცვლილებების პაკეტი + changeset_tag: ცვლილებების პაკეტის ტეგი country: ქვეყანა diary_comment: დღიურის კომენტარი diary_entry: დღიურის ჩანაწერი @@ -19,24 +21,35 @@ ka: language: ენა message: შეტყობინება node: კვანძი + node_tag: წერტილის ტეგი notifier: გამაფრთხილებელი old_node: ძველი კვანძი + old_node_tag: წერტილის ძველი ტეგი + old_relation: ძველი ურთიერთობა + old_relation_member: ურთიერთობის ძველი წევრი + old_relation_tag: ურთიერთობის ძველი ტეგი old_way: ძველი გზა old_way_node: ძველი გზის კვანძი + old_way_tag: ხაზის ძველი ტეგი relation: ურთიერთობა + relation_member: ურთიერთობის წევრი + relation_tag: ურთიერთობის ტეგი session: სესია trace: ბილიკი tracepoint: ბილიკის წერტილი + tracetag: მარშრუტის ტეგი user: მომხმარებელი user_preference: მომხმარებლის კონფიგურაცია + user_token: მომხმარებლის სანიშნი way: გზა way_node: გზის კვანძი + way_tag: ხაზის ტეგი attributes: diary_comment: body: ტექსტი diary_entry: user: მომხმარებელი - title: სათაური + title: თემა latitude: განედი longitude: გრძედი language: ენა @@ -54,7 +67,7 @@ ka: description: აღწერა message: sender: გამგზავნი - title: სათაური + title: თემა body: ტექსტი recipient: მიმღები user: @@ -69,6 +82,9 @@ ka: potlatch: name: Potlatch 1 description: Potlatch 1 (ბრაუზერის რედაქტორი) + id: + name: iD + description: iD (ბრაუზერის რედაქტორი) potlatch2: name: Potlatch 2 description: Potlatch 2 (ბრაუზერის რედაქტორი) @@ -76,12 +92,53 @@ ka: name: დისტანციური მართვა description: დისტანციური მათვა (JOSM, ან Merkaartor) browse: + created: შეიქმნა + closed: დახურულია + created_html: შეიქმნა <abbr title='%{title}'>%{time} წინ</abbr> + closed_html: დაიხურა <abbr title='%{title}'>%{time} წინ</abbr> + created_by_html: შეიქმნა <abbr title='%{title}'>%{time} წინ</abbr> ავტორი %{user} + deleted_by_html: წაიშალა <abbr title='%{title}'>%{time} წინ</abbr> ავტორი %{user} + edited_by_html: დარედაქტირდა <abbr title='%{title}'>%{time} წინ</abbr> ავტორი + %{user} + closed_by_html: დაიხურა <abbr title='%{title}'>%{time} წინ</abbr> ავტორი %{user} + version: ვერსია + in_changeset: ცვლილებების პაკეტი + anonymous: ანონიმი + no_comment: (უკომენტარო) + download_xml: XML-ის ჩამოტვირთვა + view_history: ისტორიის ნახვა + view_details: დეტალების ნახვა + location: 'მდებარეობა:' changeset: - title: ცვლილებების პაკეტი + title: 'ცვლილებების პაკეტი: %{id}' + belongs_to: ავტორი + node: წერტილები (%{count}) + node_paginated: წერტილები (%{x}-%{y} %{count}-დან) + way: ხაზები (%{count}) + way_paginated: ხაზები (%{x}-%{y} %{count}-დან) + relation: ურთიერთობები (%{count}) + relation_paginated: ურთიერთობები (%{x}-%{y} %{count}-დან) + comment: კომენტარები (%{count}) + hidden_commented_by: დამალული კომენტარები %{user}-სგან <abbr title='%{exact_time}'>%{when} + წინ</abbr> + commented_by: კომენატარი %{user}-სგან <abbr title='%{exact_time}'>%{when} წინ</abbr> changesetxml: ცვლილებების პაკეტის XML + osmchangexml: osmChange XML feed: title: ცვლილებების პაკეტი %{id} title_comment: ცვლილებების პაკეტი %{id} - %{comment} + discussion: განხილვა + node: + title: 'წერტილი: %{name}' + history_title: 'წერტილის ისტორია: %{name}' + way: + title: 'ხაზი: %{name}' + history_title: 'ხაზის ისტორია: %{name}' + nodes: წერტილები + relation: + title: 'ურთიერთობა: %{name}' + history_title: 'ურთიერთობის ისტორია: %{name}' + members: წევრები relation_member: entry_role: '%{type} %{name} როგორც %{role}' type: @@ -92,12 +149,13 @@ ka: entry: ურთიერთობა %{relation_name} entry_role: ურთიერთობა %{relation_name} (როგორც %{relation_role}) not_found: - sorry: უკაცრავად, %{type} იდენტიფიკატორით %{id}, ვერ მოიძებნა. + sorry: 'სამწუხაროდ, %{type} #%{id} ვერ მოიძებნა.' type: node: კვანძი way: გზა relation: ურთიერთობა changeset: ცვლილებების პაკეტი + note: შენიშვნა timeout: sorry: უკაცრავად, მონაცემები %{type}-თვის იდენტიფიკატორით %{id}, საკმაოდ გრძელია საპოვნელად. @@ -106,7 +164,9 @@ ka: way: გზა relation: ურთიერთობა changeset: ცვლილებების პაკეტი + note: შენიშვნა redacted: + redaction: რედაქცია %{id} type: node: კვანძი way: გზა @@ -116,9 +176,14 @@ ka: loading: იტვირთება... tag_details: wikipedia_link: სტატია %{page} ვიკიპედიაში + telephone_link: დარეკეთ %{phone_number} note: - title: შენიშვნა - description: 'აღწერა:' + title: 'შენიშვნა: %{id}' + new_note: ახალი შენიშვნა + description: აღწერა + open_title: 'დაუმუშავებელი შენიშვნა #%{note_name}' + closed_title: 'დამუშავებული შენიშვნა #%{note_name}' + hidden_title: 'დამალული შენიშვნა #%{note_name}' changeset: changeset_paging_nav: showing_page: გვერდი %{page} @@ -135,9 +200,15 @@ ka: area: ტერიტორია list: title: ცვლილებების პაკეტი + load_more: მეტის ჩატვირთვა + rss: + commented_at_html: განახლდა %{when} წინ + commented_at_by_html: განაახლა %{when} წინ მომხმარებელმა %{user} + full: სრული განხილვა diary_entry: new: title: დღიურში ახალი ჩანაწერის გაკეთება + publish_button: გამოქვეყნება list: title: მომხმარებლების დღიურები title_friends: მეგობრების დღიურები @@ -192,6 +263,7 @@ ka: newer_comments: ახალი კომენტარები older_comments: ძველი კომენტარები export: + title: ექსპორტი start: area_to_export: ტერიტორია ექსპორტისათვის manually_select: სხვა რეგიონის გამოყოფა ხელით @@ -199,6 +271,9 @@ ka: osm_xml_data: OpenStreetMap XML–ის მონაცემები map_image: რუკის სურათი (სტანდარტული ფენის ჩვენება) licence: ლიცენზია + too_large: + planet: + title: პლანეტა OSM options: პარამეტრები format: ფორმატი scale: მასშტაბი @@ -223,12 +298,17 @@ ka: geonames: <a href="http://www.geonames.org/">GeoNames</a>–ის შედეგები search_osm_nominatim: prefix: + aerialway: + cable_car: საბაგირო გზა + station: საბაგირო გზის სადგური aeroway: aerodrome: აეროდრომი gate: გასასვლელი + helipad: ვერტმფრენის დასაჯდომი runway: ასაფრენ-დასაფრენი ბილიკი terminal: ტერმინალი amenity: + animal_shelter: ცხოველთა თავშესაფარი arts_centre: ხელოვნების ცენტრი atm: ბანკომატი bank: ბანკი @@ -238,15 +318,19 @@ ka: bicycle_parking: ველოსიპედების სადგომი bicycle_rental: ველოსიპედების გაქირავება biergarten: ლუდის ბაღი + boat_rental: ნავების გაქირავება brothel: საროსკიპო bureau_de_change: ვალუტის გადაცვლა bus_station: ავტობუსის გაჩერება cafe: კაფე car_rental: მანქანის გაქირავება + car_sharing: მანქანების გაქირავება car_wash: ავტოსამრეცხაო casino: სამორინე + charging_station: დასამუხტი სადგური cinema: კინოთეატრი clinic: პოლიკლინიკა + clock: საათი college: კოლეჯი community_centre: საზოგადოებრივი ცენტრი courthouse: სასამართლო @@ -274,11 +358,13 @@ ka: library: ბიბლიოთეკა market: მაღაზია marketplace: ბაზარი + monastery: მონასტერი nightclub: ღამის კლუბი nursery: პანსიონატი nursing_home: მოხუცებულთა თავშესაფარი office: ოფისი parking: ავტოსადგომი + parking_entrance: სადგომის შესასვლელი pharmacy: აფთიაქი place_of_worship: რელიგიური ადგილი police: პოლიცია @@ -297,6 +383,7 @@ ka: shelter: თავშესაფარი shop: მაღაზია shower: შხაპი + social_centre: საზოგადოებრივი ცენტრი social_club: საზოგადოებრივი თავშეყრის ადგილი studio: სტუდია swimming_pool: საცურაო აუზი @@ -312,20 +399,40 @@ ka: youth_centre: ახალგაზრდული ცენტრი boundary: administrative: ადმინისტრაციული საზღვარი + census: აღწერის რაიონის საზღვარი national_park: ეროვნული პარკი protected_area: დაცული ტერიტორია bridge: aqueduct: აკვედუკი suspension: დაკიდებული ხიდი swing: რეგულირებადი ხიდი + viaduct: ვიადუკი "yes": ხიდი building: "yes": შენობა + craft: + brewery: ლუდსახარში + carpenter: დურგალი + electrician: ელექტრიკოსი + gardener: მებაღე + painter: მხატვარი + photographer: ფოტოგრაფი + plumber: სანტექნიკოსი + shoemaker: მეწაღე + tailor: დალაქი + "yes": სახელოსნო + emergency: + ambulance_station: სასწრაფო დახმარების სადგური + defibrillator: დეფიბრილატორი + landing_site: ავარიული დაშვების ადგილი + phone: საგანგებო კავშირის ტელეფონი highway: + abandoned: მიტოვებული გზა bridleway: საცხენოსნო გზა bus_stop: ავტობუსის გაჩერება construction: გზის სარემონტო სამუშაოები cycleway: ველოსიპედის გზა + elevator: ლიფტი emergency_access_point: სასწრაფო დახმარების პუნქტი footway: ტროტუარი living_street: საცხოვრებელი ქუჩა @@ -336,6 +443,8 @@ ka: platform: ბაქანი primary: მთავარი გზა primary_link: მთავარი გზა + proposed: პროექტირებადი გზა + raceway: სარბოლო ტრასა residential: საცხოვრებელი ქუჩა rest_area: მოსასვენებელი ტერიტორია road: გზა @@ -343,27 +452,40 @@ ka: secondary_link: მეორადი გზა speed_camera: სიჩქარის მაკონტროლებელი კამერა steps: საფეხურები + street_lamp: ქუჩის სანათი tertiary: მესამე კლასის გზა + tertiary_link: მესამე კლასის გზა track: ბილიკი + traffic_signals: შუქნიშანი trail: ბილიკი unclassified: ადგილობრივი გზა unsurfaced: უზედაპირო გზა + "yes": გზა historic: archaeological_site: არქეოლოგიური გათხრები battlefield: ბრძოლის ველი boundary_stone: სასაზღვრო ქვა - building: შენობა + building: ისტორიული შენობა + bunker: ბუნკერი castle: ციხე-სიმაგრე church: ეკლესია + city_gate: ქალაქის კარიბჭე + citywalls: ქალაქის კედლები fort: ფორტი + heritage: კულტურული მემკვიდრეობის ობიექტი house: სახლი icon: ხატულა manor: მამული memorial: მემორიალი mine: მაღარო monument: მონუმენტი + roman_road: რომაული გზა ruins: ნანგრევები + stone: ქვა + tomb: აკლდამა tower: კოშკი + junction: + "yes": გზაჯვარედინი landuse: basin: აუზი brownfield: მიტოვებული ადგილი @@ -391,8 +513,13 @@ ka: retail: სავაჭრო ტერიტორია village_green: მწვანე სოფელი vineyard: ვენახი + "yes": მიწათსარგებლობა leisure: + club: კლუბი + dog_park: ძაღლების პარკი fishing: სათევზაო ტერიტორია + fitness_centre: ფიტნეს-ცენტრი + fitness_station: ფიტნეს-სადგური garden: ბაღი golf_course: გოლფის მოედანი ice_rink: ყინულის მოედანი @@ -403,16 +530,25 @@ ka: pitch: სპორტული გაზონი playground: სათამაშო მოედანი recreation_ground: რეკრეაციული ზონა + resort: კურორტი sauna: საუნა sports_centre: სპორტული ცენტრი stadium: სტადიონი swimming_pool: საცურაო აუზი track: სარბენი ბილიკი water_park: აკვაპარკი + man_made: + lighthouse: შუქურა + pipeline: მილსადენი + tower: კოშკი + works: ფაბრიკა + "yes": ხელოვნური military: airfield: სამხედრო აეროდრომი barracks: ყაზარმები bunker: ბუნკერი + mountain_pass: + "yes": უღელტეხილი natural: bay: ყურე beach: პლაჟი @@ -426,6 +562,7 @@ ka: forest: ტყე geyser: გეიზერი glacier: მყინვარი + grassland: მდელო hill: ბორცვი island: კუნძული land: ხმელეთი @@ -437,6 +574,8 @@ ka: reef: რიფი ridge: ქედი rock: კლდე + saddle: უღელტეხილი + sand: ქვიშა scree: კლდეზვავი scrub: ბუჩქნარი spring: წყარო @@ -449,15 +588,21 @@ ka: wetland: ჭარბტენიანი ტერიტორია wood: ტყე office: + accountant: ბუღალტერი + administrative: ადმინისტრაცია architect: არქიტექტორი company: კომპანია + employment_agency: დასაქმების სააგენტო estate_agent: უძრავი ქონების აგენტი government: სამთავრობო ოფისი + insurance: სადაზღვევო ოფისი + lawyer: იურისტი ngo: არასამთავრობო ორგანიზაციის ოფისი telecommunication: სატელეკომუნიკაციო ოფისი travel_agent: ტურისტული სააგენტო "yes": ოფისი place: + block: კვარტალი airport: აეროპორტი city: ქალაქი country: ქვეყანა @@ -470,6 +615,7 @@ ka: islet: პატარა კუნძული moor: ტორფნარი municipality: მუნიციპალიტეტი + neighbourhood: სამეზობლო postcode: საფოსტო ინდექსი region: რეგიონი sea: ზღვა @@ -487,10 +633,15 @@ ka: funicular: ფუნიკულიორი halt: მატარებლის გაჩერება historic_station: ისტორიული რკინიგზის სადგური + level_crossing: სარკინიგზო გადასასვლელი + light_rail: მსუბუქი რკინიგზა monorail: მონორელსი platform: რკინიგზის ბაქანი + preserved: ისტორიული რკინიგზა + proposed: პროექტირებადი რკინიგზა station: რკინიგზის სადგური - subway: მეტროსადგური + stop: სარკინიგზო გაჩერება + subway: მეტრო subway_entrance: მეტროში შესასვლელი switch: სარკინიგზო ისარი tram: ტრამვაი @@ -503,6 +654,7 @@ ka: beverages: სასმელების მაღაზია bicycle: ველოსიპედების მაღაზია books: წიგნის მაღაზია + boutique: ბუტიკი butcher: საყასბო car: ავტოსალონი car_parts: ავტონაწილები @@ -512,16 +664,22 @@ ka: clothes: ტანსაცმლის მაღაზია computer: კომპიუტერების მაღაზია confectionery: საკონდიტრო + convenience: სასურსათო მაღაზია cosmetics: კოსმეტიკის მაღაზია + dry_cleaning: ქიმწმენდა electronics: ელექტროტექნიკის მაღაზია estate_agent: უძრავი ქონების აგენტი fashion: მოდური ტანსაცმლის მაღაზია fish: თევზების მაღაზია florist: ყვავილების მაღაზია food: საკვების მაღაზია + funeral_directors: დამკრძალავი ბიურო furniture: ავეჯი gallery: გალერეა gift: საჩუქრების მაღაზია + greengrocer: ხილ-ბოსტნეულის მაღაზია + hairdresser: საპარიკმახერო + insurance: სადაზღვევო jewelry: საიუველირო მაღაზია kiosk: ჯიხური laundry: სამრეცხაო @@ -534,19 +692,28 @@ ka: optician: ოპტიკა organic: ორგანული საკვების მაღაზია pet: ზოომაღაზია + pharmacy: აფთიაქი photo: ფოტომაღაზია salon: სალონი + second_hand: მეორადების მაღაზია shoes: ფეხსაცმლის მაღაზია shopping_centre: სავაჭრო ცენტრი sports: სპორტული მაღაზია stationery: საკანცელარიო მაღაზია supermarket: სუპერმარკეტი + tailor: დალაქი toys: სათამაშოების მაღაზია travel_agency: ტურისტული სააგენტო video: ვიდეო მაღაზია + wine: ღვინის მაღაზია + "yes": მაღაზია tourism: + alpine_hut: ალპური სახლი + apartment: ბინა + artwork: ხელოვნების ნიმუში attraction: ატრაქციონი camp_site: ბანაკის ადგილი + gallery: გალერეა guest_house: სასტუმრო სახლი hostel: ჰოსტელი hotel: სასტუმრო @@ -559,12 +726,23 @@ ka: tunnel: "yes": გვირაბი waterway: + artificial: ხელოვნური წყალსადენი canal: არხი dam: კაშხალი + derelict_canal: დამშრალი არხი dock: ნავსადგური river: მდინარე stream: ნაკადული + wadi: დამშრალი კალაპოტი waterfall: ჩანჩქერი + admin_levels: + level2: ქვეყნის საზღვარი + level4: შტატის საზღვარი + level5: რეგიონის საზღვარი + level6: ოლქის საზღვარი + level8: ქალაქის საზღვარი + level9: სოფლის საზღვარი + level10: გარეუბნის საზღვარი description: title: osm_nominatim: მდებარეობა <a href="http://nominatim.openstreetmap.org/">OpenStreetMap @@ -580,7 +758,7 @@ ka: layouts: logo: alt_text: OpenStreetMap-ის ლოგო - home: სახლი + home: საწყის ადგილზე დაბრუნება logout: გასვლა log_in: შესვლა sign_up: რეგისტრაცია @@ -596,7 +774,7 @@ ka: partners_partners: პარტნიორები partners_url: http://wiki.openstreetmap.org/wiki/Partners help: დახმარება - copyright: საავტორო უფლები და ლიცენზია + copyright: საავტორო უფლები community: თანასაზოგადოება community_blogs: თანასაზოგადოების ბლოგები foundation: ფონდი @@ -732,9 +910,7 @@ ka: primary: მაგისტრალური საერთაშორისო მნიშვნელობის გზა secondary: სახელმწიფო მნიშვნელობის გზა unclassified: ადგილობრივი მნიშვნელობის გზა - unsurfaced: ყამირი გზა track: სოფლის გზა - byway: ბილიკი bridleway: საცხენოსნო გზა cycleway: ველოსიპედის გზა footway: საფეხმავლო გზა @@ -754,7 +930,6 @@ ka: golf: გოლფის მოედანი park: პარკი resident: საცხოვრებელი ტერიტორია - tourist: ღირსშესანიშნაობა commercial: კომერციული ტერიტორია lake: - ტბა @@ -881,13 +1056,13 @@ ka: confirm password: 'პაროლის დადასტურება:' flash changed: თქვენი პაროლი შეიცვალა. new: - title: ანგარიშის შექმნა + title: რეგისტრაცია email address: 'ელ. ფოსტის მისამართი:' confirm email address: 'ელ. ფოსტის მისამართის დადასტურება:' display name: 'სახელი ეკრანზე:' password: 'პაროლი:' confirm password: 'პაროლის დადასტურება:' - continue: გაგრძელება + continue: რეგისტრაცია terms: consider_pd_why: რა არის ეს? agree: მიღება @@ -902,7 +1077,7 @@ ka: view: my diary: ჩემი დღიური new diary entry: დღიურში ახალი ჩანაწერის გაკეთება - my edits: ჩემი რედაქტირებები + my edits: ჩემი რედაქტირება my settings: ჩემი პარამეტრები my comments: ჩემი კომენტარები send message: შეტყობინების გაგზავნა @@ -959,7 +1134,7 @@ ka: save changes button: ცვლილებების შენახვა return to profile: პროფილში დაბრუნება confirm: - heading: მომხმარებლის ანგარიშის დადასტურება + heading: შეამოწმეთ თქვენი ელ.ფოსტა! button: დადასტურება confirm_resend: failure: მომხმარებელი %{name} ვერ მოიძებნა. diff --git a/config/locales/ko.yml b/config/locales/ko.yml index 714acccaa..a8fb1cb3c 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -2,19 +2,27 @@ # Exported from translatewiki.net # Export driver: phpyaml # Author: Alex00728 +# Author: Asdfqwer51 # Author: B891202 # Author: Freebiekr # Author: Hym411 # Author: IRTC1015 +# Author: Idh0854 +# Author: Jerrykim306 # Author: Kwj2772 +# Author: Macofe # Author: Priviet # Author: Revi # Author: Ruila # Author: SeoJeongHo # Author: Stleamist +# Author: Sukjong0406 # Author: Twotwo2019 # Author: Wrightbus +# Author: Ykhwong # Author: Ysjbserver +# Author: 고솜 +# Author: 밥풀떼기 # Author: 아라 --- ko: @@ -24,32 +32,32 @@ ko: blog: '%Y년 %B %e일' activerecord: models: - acl: 통행 제한 목록 + acl: 접근 제어 목록 changeset: 바뀜집합 changeset_tag: 바뀜집합 태그 country: 국가 - diary_comment: 일기 덧글 + diary_comment: 일기 댓글 diary_entry: 일기 항목 friend: 친구 language: 언어 message: 메시지 - node: 노드 - node_tag: 노드 태그 + node: 교점 + node_tag: 교점 태그 notifier: 알리미 - old_node: 이전 노드 - old_node_tag: 이전 노드 태그 + old_node: 이전 교점 + old_node_tag: 이전 교점 태그 old_relation: 이전 관계 old_relation_member: 이전 관계 구성 요소 old_relation_tag: 이전 관계 태그 old_way: 이전 길 - old_way_node: 이전 길 노드 + old_way_node: 이전 길 교점 old_way_tag: 이전 길 태그 relation: 관계 relation_member: 관계 구성 요소 relation_tag: 관계 태그 session: 세션 trace: 추적 - tracepoint: 추적 지점 + tracepoint: 추적 점 tracetag: 추적 태그 user: 사용자 user_preference: 사용자 환경 설정 @@ -86,7 +94,7 @@ ko: user: email: 이메일 active: 활성 - display_name: 보여줄 이름 + display_name: 표시할 이름 description: 설명 languages: 언어 pass_crypt: 비밀번호 @@ -109,14 +117,14 @@ ko: closed: 닫힘 created_html: <abbr title='%{title}'>%{time} 전</abbr>에 만들어짐 closed_html: <abbr title='%{title}'>%{time} 전</abbr>에 닫힘 - created_by_html: <abbr title='%{title}'>%{time} 전</abbr>에 %{user} 사용자가 만듦 - deleted_by_html: <abbr title='%{title}'>%{time} 전</abbr>에 %{user} 사용자가 삭제함 - edited_by_html: <abbr title='%{title}'>%{time} 전</abbr>에 %{user} 사용자가 편집함 - closed_by_html: <abbr title='%{title}'>%{time} 전</abbr>에 %{user} 사용자가 닫음 + created_by_html: <abbr title='%{title}'>%{time} 전</abbr>에 %{user}님이 만듦 + deleted_by_html: <abbr title='%{title}'>%{time} 전</abbr>에 %{user}님이 삭제함 + edited_by_html: <abbr title='%{title}'>%{time} 전</abbr>에 %{user}님이 편집함 + closed_by_html: <abbr title='%{title}'>%{time} 전</abbr>에 %{user}님이 닫음 version: 버전 in_changeset: 바뀜집합 anonymous: 익명 - no_comment: (의견 없음) + no_comment: (댓글 없음) part_of: '다음의 일부:' download_xml: XML 다운로드 view_history: 역사 보기 @@ -131,11 +139,11 @@ ko: way_paginated: 길 (%{count} 중 %{x}-%{y}) relation: 관계 (%{count}) relation_paginated: 관계 (%{count} 중 %{x}-%{y}) - comment: 의견 (%{count}) - hidden_commented_by: '%{user} 사용자가 <abbr title=''%{exact_time}''>%{when} 전</abbr>에 - 남긴 숨겨진 덧글' - commented_by: '%{user} 사용자가 <abbr title=''%{exact_time}''>%{when} 전</abbr>에 - 덧글을 남김' + comment: 댓글 (%{count}) + hidden_commented_by: '%{user}님이 <abbr title=''%{exact_time}''>%{when} 전</abbr>에 + 남긴 숨겨진 댓글' + commented_by: '%{user}님이 <abbr title=''%{exact_time}''>%{when} 전</abbr>에 댓글을 + 남김' changesetxml: 바뀜집합 XML osmchangexml: osmChange XML feed: @@ -167,12 +175,13 @@ ko: entry: 관계 %{relation_name} entry_role: (%{relation_role}로서) 관계 %{relation_name} not_found: - sorry: '죄송하지만, %{type} #%{id}(을)를 찾지 못했습니다.' + sorry: '죄송하지만, %{type} #%{id}을(를) 찾지 못했습니다.' type: node: 노드 way: 길 relation: 관계 changeset: 바뀜집합 + note: 참고 timeout: sorry: 죄송합니다, %{id} id인 %{type}에 대한 데이터를 얻는데 너무 오래 걸립니다. type: @@ -180,10 +189,11 @@ ko: way: 길 relation: 관계 changeset: 바뀜집합 + note: 참고 redacted: redaction: 개정 %{id} - message_html: 이 %{type}의 %{version}판은 비공개 처리되었기 때문에 ë³¼ 수 없습니다. 자세한 내용은 %{redaction_link}(을)를 - 참고하세요. + message_html: 이 %{type}의 %{version}판은 비공개 처리되었기 때문에 ë³¼ 수 없습니다. 자세한 내용은 %{redaction_link}을(를) + 참조하세요. type: node: 노드 way: 길 @@ -200,32 +210,31 @@ ko: tag: '%{key}=%{value} 태그에 대한 위키 설명 문서' wikidata_link: 위키데이터 %{page} 항목 wikipedia_link: 위키백과 %{page} 문서 - telephone_link: '%{phone_number}로 전화 걸기' + telephone_link: '%{phone_number}(으)로 전화 걸기' note: title: '참고: %{id}' - new_note: 새 참고 + new_note: 새로운 참고 description: 설명 open_title: '해결되지 않은 참고 #%{note_name}' closed_title: '해결된 참고 #%{note_name}' hidden_title: '숨겨진 참고 #%{note_name}' - open_by: '%{user} 사용자가 <abbr title=''%{exact_time}''>%{when} 전</abbr>에 만듦' - open_by_anonymous: 익명 사용자가 <abbr title='%{exact_time}'>%{when} 전</abbr>에 만듦 - commented_by: '%{user} 사용자가 <abbr title=''%{exact_time}''>%{when} 전</abbr>에 - 덧글을 남김' - commented_by_anonymous: 익명 사용자가 <abbr title='%{exact_time}'>%{when} 전</abbr>에 - 덧글을 남김 - closed_by: '%{user} 사용자가 <abbr title=''%{exact_time}''>%{when} 전</abbr>에 해결함' - closed_by_anonymous: 익명 사용자가 <abbr title='%{exact_time}'>%{when} 전</abbr>에 해결함 - reopened_by: '%{user} 사용자가 <abbr title=''%{exact_time}''>%{when} 전</abbr>에 다시 - 활성화함' - reopened_by_anonymous: 익명 사용자가 <abbr title='%{exact_time}'>%{when} 전</abbr>에 - 다시 활성화함 - hidden_by: '%{user} 사용자가 <abbr title=''%{exact_time}''>%{when} 전</abbr>에 숨김' + open_by: '%{user}님이 <abbr title=''%{exact_time}''>%{when} 전</abbr>에 만듦' + open_by_anonymous: 익명이 <abbr title='%{exact_time}'>%{when} 전</abbr>에 만듦 + commented_by: '%{user}님이 <abbr title=''%{exact_time}''>%{when} 전</abbr>에 댓글을 + 남김' + commented_by_anonymous: 익명이 <abbr title='%{exact_time}'>%{when} 전</abbr>에 댓글을 + 남김 + closed_by: '%{user}님이 <abbr title=''%{exact_time}''>%{when} 전</abbr>에 해결함' + closed_by_anonymous: 익명이 <abbr title='%{exact_time}'>%{when} 전</abbr>에 해결함 + reopened_by: '%{user}님이 <abbr title=''%{exact_time}''>%{when} 전</abbr>에 다시 활성화함' + reopened_by_anonymous: 익명이 <abbr title='%{exact_time}'>%{when} 전</abbr>에 다시 + 활성화함 + hidden_by: '%{user}님이 <abbr title=''%{exact_time}''>%{when} 전</abbr>에 숨김' query: title: 지물 정보 introduction: 근처의 지물을 찾으려면 지도에서 클릭하세요. nearby: 근처 지물 - enclosing: 둘러싸는 지물 + enclosing: 근접 지역 내 지물 changeset: changeset_paging_nav: showing_page: 페이지 %{page} @@ -239,11 +248,11 @@ ko: id: ID saved_at: 저장된 시간 user: 사용자 - comment: 덧글 - area: 지역 + comment: 댓글 + area: 구역 list: title: 바뀜집합 - title_user: '%{user} 사용자의 바뀜집합' + title_user: '%{user}님의 바뀜집합' title_friend: 내 친구의 바뀜집합 title_nearby: 근처 사용자의 바뀜집합 empty: 찾은 바뀜집합이 없습니다. @@ -258,13 +267,14 @@ ko: rss: title_all: OpenStreetMap 바뀜집합 토론 title_particular: 'OpenStreetMap 바뀜집합 #%{changeset_id} 토론' - comment: '바뀜집합 #%{changeset_id}에 %{author}님이 새 덧글을 남김' + comment: '바뀜집합 #%{changeset_id}에 %{author}님이 새 댓글을 남김' commented_at_html: '%{when} 전에 업데이트함' - commented_at_by_html: '%{user} 사용자가 %{when} 전에 업데이트함' + commented_at_by_html: '%{user}님이 %{when} 전에 업데이트함' full: 전체 토론 diary_entry: new: title: 새 일기 항목 + publish_button: 발행 list: title: 사용자의 일기 title_friends: 친구의 일기 @@ -291,28 +301,28 @@ ko: view: title: '%{user}의 일기 | %{title}' user_title: '%{user}의 일기' - leave_a_comment: 덧글 남기기 - login_to_leave_a_comment: 덧글을 남기려면 로그인해야 합니다. %{login_link} + leave_a_comment: 댓글 남기기 + login_to_leave_a_comment: 댓글을 남기려면 로그인해야 합니다. %{login_link} login: 로그인 save_button: 저장 no_such_entry: title: 이러한 일기 항목이 없음 heading: 'id에 항목 없음: %{id}' - body: 죄송합니다, %{id} id로 된 일기 항목이나 덧글이 없습니다. 맞춤법이나 클릭한 링크가 잘못됐는지 확인하세요. + body: 죄송합니다, %{id} id로 된 일기 항목이나 댓글이 없습니다. 맞춤법이나 클릭한 링크가 잘못됐는지 확인하세요. diary_entry: - posted_by: '%{link_user} 사용자가 %{language_link}로 %{created}에 게시함' - comment_link: 이 항목에 덧글 남기기 + posted_by: '%{link_user}님이 %{language_link}로 %{created}에 게시함' + comment_link: 이 항목에 댓글 남기기 reply_link: 이 항목에 답변하기 comment_count: - zero: 덧글 없음 - one: 덧글 %{count}개 - other: 덧글 %{count}개 + zero: 댓글 없음 + one: 댓글 %{count}개 + other: 댓글 %{count}개 edit_link: 이 항목 편집 hide_link: 이 항목 숨기기 confirm: 확인 diary_comment: - comment_from: '%{comment_created_at}에 %{link_user}에 대한 덧글' - hide_link: 이 덧글 숨기기 + comment_from: '%{comment_created_at}에 %{link_user}에 대한 댓글' + hide_link: 이 댓글 숨기기 confirm: 확인 location: location: '위치:' @@ -320,8 +330,8 @@ ko: edit: 편집 feed: user: - title: '%{user} 사용자에 대한 OpenStreetMap 일기 항목' - description: '%{user} 사용자의 최근 OpenStreetMap 일기 항목' + title: '%{user}님의 OpenStreetMap 일기 항목' + description: '%{user}님의 최근 OpenStreetMap 일기 항목' language: title: '%{language_name}의 OpenStreetMap 일기 항목' description: '%{language_name}로 된 OpenStreetMap 최근 일기 항목' @@ -329,13 +339,13 @@ ko: title: OpenStreetMap 일기 항목 description: OpenStreetMap의 사용자의 최근 일기 항목 comments: - has_commented_on: '%{display_name} 사용자가 다음 일기 항목에 덧글을 남겼습니다' + has_commented_on: '%{display_name}님이 다음 일기 항목에 댓글을 남겼습니다' post: 게시물 when: 날짜 - comment: 덧글 + comment: 댓글 ago: '%{ago} 전' - newer_comments: 새 덧글 - older_comments: 이전 덧글 + newer_comments: 새 댓글 + older_comments: 이전 댓글 export: title: 내보내기 start: @@ -350,8 +360,8 @@ ko: 데이터 커먼즈 오픈 데이터베이스 라이선스</a>(ODbL)에 따라 사용할 수 있습니다. too_large: advice: '위의 내보내기가 실패하면, 아래에 나열된 원본 중 하나를 사용하는 것을 고려해주세요:' - body: '이 지역은 OpenStreetMap XML 데이터로 내보내는 데 너무 넓습니다. 확대하거나 작은 지역을 선택하거나, 대량 - 데이터 다운로드에 대한 다음 소스 중 하나를 사용하세요:' + body: 이 지역은 OpenStreetMap XML 데이터로 내보내는 데 너무 넓습니다. 확대하거나 작은 지역을 선택하거나, 대량 + 데이터 다운로드에 대한 아래에 나열된 자료 중 하나를 사용하세요. planet: title: 플래닛 OSM description: 완전한 OpenStreetMap 데이터베이스가 정기적으로 업데이트되는 복사본 @@ -367,7 +377,7 @@ ko: other: title: 다른 원본 description: OpenStreetMap 위키에 나와있는 추가 원본 - options: 설정 + options: 옵션 format: 형식 scale: 축척 max: 최대 @@ -400,7 +410,7 @@ ko: chair_lift: 체어 리프트 drag_lift: 드래그 리프트 gondola: 곤돌라 리프트 - station: 삭도장 + station: 케이블 ì¹´ 정류장 aeroway: aerodrome: 비행장 apron: 에이프런 @@ -410,39 +420,39 @@ ko: taxiway: 유도로 terminal: 터미널 amenity: - animal_shelter: 동물 쉼터 - arts_centre: 예술 회관 + animal_shelter: 동물 보호소 + arts_centre: 아트 센터 atm: ATM bank: 은행 bar: 주점 - bbq: BBQ + bbq: 바베큐 bench: 벤치 bicycle_parking: 자전거 주차장 bicycle_rental: 자전거 대여 - biergarten: 비어 가든 - boat_rental: 보트 대여 + biergarten: 옥외 탁자 + boat_rental: 보트 대여점 brothel: 매음굴 bureau_de_change: 환전소 - bus_station: 버스 정류장 + bus_station: 버스 터미널 cafe: 카페 - car_rental: 자동차 대여 + car_rental: 자동차 대여점 car_sharing: ì¹´ 셰어링 car_wash: 세차장 casino: 카지노 - charging_station: 충전 스테이션 + charging_station: 전기 자동차 충전소 childcare: 육아 cinema: 영화관 - clinic: 진료소 + clinic: 의원 clock: 시계 - college: 전문대학 - community_centre: 커뮤니티 센터 + college: 대학 + community_centre: 주민센터 courthouse: 법원 crematorium: 화장장 dentist: 치과 doctors: 의원 dormitory: 기숙사 - drinking_water: 식수 - driving_school: 운전 학교 + drinking_water: 음수대 + driving_school: 운전 학원 embassy: 대사관 emergency_phone: 긴급 전화 fast_food: 패스트 푸드 @@ -457,18 +467,18 @@ ko: gym: 피트니스 센터 / 체육관 health_centre: 보건소 hospital: 병원 - hunting_stand: 사냥 스탠드 + hunting_stand: 사냥장 ice_cream: 아이스크림 kindergarten: 유치원 library: 도서관 market: 시장 marketplace: 시장 monastery: 수도원 - motorcycle_parking: 모터사이클 주차장 + motorcycle_parking: 오토바이 주차장 nightclub: 나이트 클럽 nursery: 보육원 nursing_home: 복지관 - office: 사무실 + office: 사옥 parking: 주차장 parking_entrance: 주차장 입구 pharmacy: 약국 @@ -480,7 +490,7 @@ ko: prison: 교도소 pub: 술집 public_building: 공공 건물 - reception_area: 리셉션 지역 + reception_area: 접수 구역 recycling: 재활용장 restaurant: 음식점 retirement_home: 노인정 @@ -508,7 +518,7 @@ ko: youth_centre: 청소년 센터 boundary: administrative: 행정 구역 경계 - census: 국세 조사 경계 + census: 국세조사 구역 경계 national_park: 국립 공원 protected_area: 보호 구역 bridge: @@ -520,7 +530,7 @@ ko: building: "yes": 건물 craft: - brewery: 주조공 + brewery: 맥주 공장 carpenter: 목수 electrician: 전기공 gardener: 정원사 @@ -529,9 +539,9 @@ ko: plumber: 배관공 shoemaker: 구두공 tailor: 재단사 - "yes": 공예 가게 + "yes": 공예품점 emergency: - ambulance_station: 구급차 스테이션 + ambulance_station: 구급 의료 센터 defibrillator: 제세동기 landing_site: 비상 착륙지 phone: 긴급 전화 @@ -541,29 +551,29 @@ ko: bus_guideway: 가이드 버스 차선 bus_stop: 버스 정류장 construction: 건설 중인 고속도로 - cycleway: 자전거로 + cycleway: 자전거 전용도로 elevator: 엘리베이터 - emergency_access_point: 긴급 접근 지점 + emergency_access_point: 긴급 액세스 포인트 footway: 보도 ford: 여울 - living_street: 주택가 + living_street: 주택가 도로 milestone: 이정표 motorway: 고속도로 motorway_junction: 고속도로 교차점 motorway_link: 고속도로 - path: 경로 - pedestrian: 보행자 길 - platform: 플랫폼 - primary: 주요 도로 + path: 보행로 + pedestrian: 보행자 도로 + platform: 승강장 + primary: 대로 또는 국도, 지방도 primary_link: 주요 도로 - proposed: 제안 도로 + proposed: 제안된 도로 raceway: 경마장 - residential: 주거 도로 + residential: 길 또는 주거 지역 도로 rest_area: 휴게소 road: 도로 - secondary: ë³´ì¡° 도로 + secondary: 로 급의 ë³´ì¡° 도로 secondary_link: ë³´ì¡° 도로 - service: 취부 도로 + service: 관내 도로 services: 고속도로 휴게소 speed_camera: 속도 카메라 steps: 계단 @@ -573,31 +583,31 @@ ko: track: 추적 traffic_signals: 교통 신호 trail: 샛길 - trunk: 간선 도로 + trunk: 대로 또는 간선 도로 trunk_link: 간선 도로 - unclassified: 분류하지 않은 도로 + unclassified: 분류되지 않은 도로 unsurfaced: 비포장 도로 "yes": 도로 historic: - archaeological_site: 고고학장 + archaeological_site: 유적지 battlefield: 전쟁터 boundary_stone: 경계석 - building: 사적 건물 + building: 역사적 건물 bunker: 벙커 castle: 성 church: 교회 city_gate: 성문 citywalls: 성벽 fort: 성채 - heritage: 문화 유산지 + heritage: 문화 유산 house: 주택 icon: 아이콘 manor: 장원 - memorial: 기념관 + memorial: 기념비 mine: 광산 monument: 기념물 roman_road: 로마 도로 - ruins: 유적 + ruins: 폐허 stone: 돌 tomb: 무덤 tower: 탑 @@ -608,14 +618,14 @@ ko: "yes": 분기점 landuse: allotments: 텃밭 - basin: 웅덩이 + basin: 유역 brownfield: 재개발지역 cemetery: 묘지 commercial: 상업 지역 conservation: ë³´ì¡´ - construction: 공사중 + construction: 공사 중 farm: 농장 - farmland: 농토 + farmland: 농지 farmyard: 농지 forest: 숲 garages: 차고 @@ -624,7 +634,7 @@ ko: industrial: 산업 지역 landfill: 매립지 meadow: 목초지 - military: 군사지 + military: 군사 지역 mine: 광산 orchard: 과수원 quarry: 채석장 @@ -640,10 +650,10 @@ ko: "yes": 토지 이용 leisure: beach_resort: 해수욕장 - bird_hide: 조류 관찰지 + bird_hide: 조류 관찰소 club: 클럽 common: 공유지 - dog_park: 개 공원 + dog_park: 반려견 공원 fishing: 낚시터 fitness_centre: 피트니스 센터 fitness_station: 피트니스 스테이션 @@ -651,9 +661,9 @@ ko: golf_course: 골프장 horse_riding: 승마 ice_rink: 아이스 링크 - marina: 마리나 + marina: 정박지 miniature_golf: 미니어처 골프 - nature_reserve: 자연 보호구 + nature_reserve: 자연 보호구역 park: 공원 pitch: 운동장 playground: 놀이터 @@ -687,8 +697,8 @@ ko: cliff: 절벽 crater: 크레이터 dune: 모래 언덕 - fell: 황야 - fjord: 피요르드 + fell: 언덕 + fjord: 피오르드 forest: 숲 geyser: 간헐천 glacier: 빙하 @@ -700,14 +710,14 @@ ko: marsh: 습지 moor: 습지 mud: 진흙 - peak: 산정상 - point: 지점 + peak: 봉우리 + point: 점 reef: 암초 ridge: 산등성이 rock: 바위 saddle: 안부 sand: 모래 - scree: 급사면 + scree: 자갈 비탈 scrub: 우거진 숲 spring: 온천 stone: 돌 @@ -719,19 +729,19 @@ ko: wetland: 습지 wood: 산림 office: - accountant: 회계 사무소 + accountant: 공인회계사 사무소 administrative: 관리 - architect: 건축사 + architect: 건축가 company: 회사 employment_agency: 직업 소개소 estate_agent: 부동산 중개 - government: 관청 - insurance: 보험 사무소 + government: 정부 기관 + insurance: 보험 회사 사옥 lawyer: 변호사 사무실 - ngo: NGO 사무실 - telecommunication: 통신 사무실 + ngo: 비정부 기구 사무실 + telecommunication: 통신 회사 사옥 travel_agent: 여행사 - "yes": 사무실 + "yes": 사옥 place: allotments: 텃밭 block: 벽돌 @@ -749,7 +759,7 @@ ko: locality: 지역 moor: 습지 municipality: 시정촌 - neighbourhood: 인근 지역 + neighbourhood: 마을 postcode: 우편 번호 region: 지역 sea: 바다 @@ -757,20 +767,20 @@ ko: subdivision: 구분 suburb: 교외 town: 마을 - unincorporated_area: 비법인 지역 + unincorporated_area: 비인가 지역 village: 마을 "yes": 장소 railway: - abandoned: 버려진 철도 + abandoned: 폐선된 철도 construction: 건설 중인 철도 disused: 폐선된 철도 - disused_station: 폐선된 철도역 + disused_station: 폐역된 철도역 funicular: 케이블 ì¹´ halt: 기차 정지 historic_station: 역사적인 철도역 junction: 철도 분기점 level_crossing: 건널목 - light_rail: 경철도 + light_rail: 경전철 miniature: 미니어처 철도 monorail: 모노레일 narrow_gauge: 협궤 철도 @@ -780,15 +790,15 @@ ko: spur: 지선 station: 철도역 stop: 철도 정거장 - subway: 지하철역 - subway_entrance: 지하철 입구 + subway: 지하철 + subway_entrance: 지하철역 출입구 switch: 철도 분기 - tram: 전차 + tram: 전차 선로 tram_stop: 전차 정거장 shop: alcohol: 주점 antiques: 골동품 상점 - art: 예술 상점 + art: 예술품 가게 bakery: 제과점 beauty: 미용실 beverages: 음료 가게 @@ -801,14 +811,14 @@ ko: car_repair: 자동차 수리점 carpet: 카펫 가게 charity: 자선 가게 - chemist: 화학품점 + chemist: 약국 clothes: 의류 상점 computer: 컴퓨터 상점 confectionery: 과자 가게 convenience: 편의점 copyshop: 복사점 cosmetics: 화장품 상점 - deli: 델리 + deli: 델리카트슨 department_store: 백화점 discount: 할인점 doityourself: Do-It-Yourself @@ -828,7 +838,7 @@ ko: gift: 선물 가게 greengrocer: 청과상 grocery: 식료품 상점 - hairdresser: 이발소 + hairdresser: 미용실 hardware: 철물점 hifi: 고급 오디오 insurance: 보험 @@ -838,7 +848,7 @@ ko: mall: 쇼핑몰 market: 시장 mobile_phone: 휴대폰 상점 - motorcycle: 모터사이클 상점 + motorcycle: 이륜자동차(오토바이) 상점 music: 음반 가게 newsagent: 신문 판매소 optician: 안경점 @@ -851,7 +861,7 @@ ko: second_hand: 중고품 가게 shoes: 신발 가게 shopping_centre: 쇼핑 센터 - sports: 스포츠 상점 + sports: 스포츠용품점 stationery: 문구점 supermarket: 수퍼마켓 tailor: 양복점 @@ -861,15 +871,15 @@ ko: wine: 주점 "yes": 상점 tourism: - alpine_hut: 고산장 + alpine_hut: 산장 apartment: 아파트먼트 artwork: 예술 작품 attraction: 견인 - bed_and_breakfast: 잠자기와 아침 식사(민박) + bed_and_breakfast: 민박 cabin: 오두막 camp_site: 캠프장 caravan_site: 캐러밴 사이트 - chalet: 별장 + chalet: 샬렛 gallery: 갤러리 guest_house: 게스트 하우스 hostel: 호스텔 @@ -886,11 +896,11 @@ ko: "yes": 터널 waterway: artificial: 인공 수로 - boatyard: 보트야드 + boatyard: 조선소 canal: 운하 dam: 댐 - derelict_canal: 버려진 운하 - ditch: 구거 + derelict_canal: 사용 중단된 운하 + ditch: 배수로 dock: 부두 drain: 배수로 lock: 갑문 @@ -898,7 +908,7 @@ ko: mooring: 계선 rapids: 급류 river: 강 - stream: 개울 + stream: 하천 wadi: 와디 waterfall: 폭포 weir: 어량 @@ -926,7 +936,7 @@ ko: layouts: logo: alt_text: OpenStreetMap 로고 - home: 집 위치로 가기 + home: 현재 위치로 가기 logout: 로그아웃 log_in: 로그인 log_in_tooltip: 기존 계정으로 로그인 @@ -943,7 +953,7 @@ ko: user_diaries: 사용자 일기 user_diaries_tooltip: 사용자 일기 보기 edit_with: '%{editor}(으)로 편집' - tag_line: 우리 모두의 위키 세계 지도 + tag_line: 우리 모두의 세계지도 위키 intro_header: OpenStreetMap에 오신 것을 환영합니다! intro_text: OpenStreetMap은 여러분과 같은 사람들이 만들고 자유롭게 오픈 라이선스에 따라 사용할 수 있는, 세계 지도입니다. intro_2_create_account: 사용자 계정을 만드세요 @@ -960,7 +970,7 @@ ko: copyright: 저작권 community: 커뮤니티 community_blogs: 커뮤니티 블로그 - community_blogs_title: OpenStreetMap 커뮤니티의 구성원에서의 블로그 + community_blogs_title: OpenStreetMap 커뮤니티의 회원에서의 블로그 foundation: 재단 foundation_title: OpenStreetMap 재단 make_a_donation: @@ -982,20 +992,20 @@ ko: legal_babble: title_html: 저작권 및 라이선스 intro_1_html: |- - OpenStreetMap은 <i>오픈 데이터</i>로 <a + OpenStreetMap<sup><a href="#trademarks">®</a></sup>은 <i>오픈 데이터</i>로 <a + href="http://osmfoundation.org/">OpenStreetMap 재단</a> (OSMF)의 <a href="http://opendatacommons.org/licenses/odbl/">오픈 데이터 커먼즈 오픈 데이터베이스 라이선스</a>(ODbL)에 따라 사용할 수 있습니다. intro_2_html: |- - 당신은 가능하면 OpenStreetMap 제작진과 기여로 - 자유롭게 복사, 배포, 전송 및 데이터를 적용할 수 있습니다. + OpenStreetMap 기여자를 명시하는 한, OpenStreetMap 데이터를 자유롭게 복사, 배포, 전송 및 적용할 수 있습니다. 데이터를 바꾸거나 데이터에 기초로 할 때는 오로지 같은 라이선스에 따라서만 결과를 배포할 수 있습니다. <a href="http://opendatacommons.org/licenses/odbl/1.0/">전문</a>은 당신의 권리와 책임을 설명합니다. intro_3_html: |- - 지도 타일의 지도 제작과 설명서는 + 지도 타일의 지도 제작과 설명문서는 <a href="http://creativecommons.org/licenses/by-sa/2.0/">크리에이티브 - 커먼즈 저작자표시-동일조건변경허락 2.0</a> 라이선스(CC-BY-SA)에 따라 사용할 수 있습니다. + 커먼즈 저작자표시-동일조건변경허락 2.0</a> 라이선스(CC BY-SA)에 따라 사용할 수 있습니다. credit_title_html: OpenStreetMap 제작진 넣는 방법 credit_1_html: |- “© OpenStreetMap 기여자”로 제작진을 넣어야 @@ -1024,13 +1034,13 @@ ko: more_2_html: |- OpenStreetMap은 오픈 데이터이지만 타사 개발자를 위한 지도 API는 무료로 제공할 수 없습니다. - <a href="http://wiki.openstreetmap.org/wiki/API_usage_policy">API 사용 정책</a>, - <a href="http://wiki.openstreetmap.org/wiki/Tile_usage_policy">타일 사용 정책</a>ê³¼ - <a href="http://wiki.openstreetmap.org/wiki/Nominatim#Usage_Policy">Nominatim(이름) 사용 정책</a>를 참고하세요. + <a href="https://operations.osmfoundation.org/wiki/policies/api/">API 사용 정책</a>, + <a href="https://operations.osmfoundation.org/policies/tiles/">타일 사용 정책</a>ê³¼ + <a href="https://operations.osmfoundation.org/policies/nominatim/">Nominatim(이름) 사용 정책</a>를 참조하세요. contributors_title_html: 우리의 기여자 contributors_intro_html: |- - 우리의 기여자는 수천 명의 개인입니다. 또한 국립지도 제작 기관과 - 같은 다른 소스의 공개 가능한 라이센스의 데이터를 포함합니다: + 우리의 기여자는 수천 명입니다. 또한 국립지도 제작 기관과 + 같은 다른 소스의 공개 라이선스의 데이터를 포함하고 있습니다: contributors_at_html: |- <strong>오스트리아</strong>: <a href="http://data.wien.gv.at/">Stadt Wien</a> (<a href="http://creativecommons.org/licenses/by/3.0/at/deed.de">CC BY</a>에 따름), @@ -1056,6 +1066,10 @@ ko: contributors_nz_html: |- <strong>뉴질랜드</strong>: Land Information New Zealand에서의 데이터를 포함합니다. Crown이 저작권을 소유합니다. + contributors_si_html: |- + <strong>슬로베니아</strong>: <a href="http://www.gu.gov.si/en/">Surveying and Mapping Authority</a>와 + <a href="http://www.mkgp.gov.si/en/">Ministry of Agriculture, Forestry and Food</a> + (슬로베니아의 공개 정보)에서의 데이터를 포함합니다. contributors_za_html: |- <strong>남아프리카 공화국</strong>: <a href="http://www.ngi.gov.za/">Chief Directorate: National Geo-Spatial Information</a>에서의 데이터를 @@ -1068,7 +1082,7 @@ ko: 자세한 내용과 OpenStreetMap을 개선하는 데 도움이 되는 데 사용한 기타 자료에 대해서는 OpenStreetMap 위키에 있는 <a href="http://wiki.openstreetmap.org/wiki/Contributors">기여자 문서</a> - 를 참고하세요. + 를 참조하세요. contributors_footer_2_html: |- OpenStreetMap에 포함된 데이터는 원래 데이터 제공자가 OpenStreetMap을 보증하거나 어떠한 보증도 제공하거나 @@ -1083,6 +1097,10 @@ ko: 추가되었다고 생각하면 <a href="http://www.osmfoundation.org/wiki/License/Takedown_procedure">게시 중단 절차</a>를 참고하거나 <a href="http://dmca.openstreetmap.org/">온라인 신고 페이지</a>에서 직접 제출하세요. + trademarks_title_html: <span id="trademarks"></span>등록 상표 + trademarks_1_html: OpenStreetMap, 돋보기 로고, 스테이트 오브 맵은 OpenStreetMap 재단의 등록상표입니다. + 상표의 사용에 대해 의문이 있는 경우, 관련된 질문을 <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">라이선싱 + 작업 그룹</a>으로 보내 주세요. welcome_page: title: 환영합니다! introduction_html: |- @@ -1092,25 +1110,27 @@ ko: whats_on_the_map: title: 지도는 무엇입니까 on_html: |- - OpenStreetMap은 <em>현실과 현재</em> 둘 다를 매핑하기 위한 장소입니다 - - 장소에 대한 건물, 도로와 기타 자세한 수백만 정보를 포함합니다. 흥미있는 + OpenStreetMap은 <em>현실과 현재</em>를 전부 매핑하기 위한 장소입니다 - + 장소에 대한 건물, 도로, 그리고 그밖의 자세한 수백만 가지 정보를 포함합니다. 흥미있는 현실 세계 지물은 무엇이든 매핑할 수 있습니다. off_html: |- - 평점, 역사적이거나 가설적인 기능, 그리고 저작권이 있는 데이터와 같은 - 고집된 데이터는 포함되지 <em>않습니다</em>. 특별한 허가가 없으면, - 온라인이나 종이 지도에서 복사하지 마십시오. + 장소에 대한 평가, 역사에 관한 것이나 추측에 의한 정보, 그리고 저작권이 있는 정보처럼 + 독단적인 데이터는 들어갈 수 <em>없습니다</em>. 특별히 허용받지 않으셨다면 + 온라인 지도나 종이 지도에서 복사해오지 마십시오. basic_terms: - title: 매핑에 대한 기본 용어 - paragraph_1_html: OpenStreetMap은 자신의 용어 중 일부가 있습니다. 여기에 편리하게 사용할 수 있는 몇 가지 핵심 - 단어가 있습니다. + title: 매핑하는데 필요한 기본 용어 + paragraph_1_html: OpenStreetMap에서는 자체 용어가 몇 가지 사용됩니다. 여기에 편리하게 사용할 수 있는 몇 가지 + 핵심 단어가 있습니다. editor_html: <strong>편집기</strong>는 지도를 편집하는 데 사용할 수 있는 프로그램이나 웹사이트입니다. - node_html: <strong>노드</strong>는 음식점 한 곳이나 나무와 같은, 지도에 있는 지점입니다. - way_html: <strong>길</strong>은 도로, 개울, 호수나 건물과 같은, 선이나 지역입니다. - tag_html: |- - <strong>태그</strong>는 음식점의 이름이나 도로의 속도 제한과 같은, - 노드나 길에 대한 보충하는 데이터입니다. + node_html: <strong>노드</strong>는 지도상의 어느 한 지점으로, 음식점 한 곳이나 나무 한 그루 같은 것을 말합니다. + way_html: <strong>길</strong>은 지도상의 선이나 구역을 말하며, 도로, 개울, 호수나 건물을 나타냅니다. + tag_html: <strong>태그</strong>는 노드나 길을 보충하는 데이터로, 음식점의 이름이나 도로의 속도 제한 같은 것을 말합니다. rules: - title: 규칙 + title: 여기서 규칙! + paragraph_1_html: "OpenStreetMap은 몇 가지 형식적인 규칙이 있지만 우리는 모든 참가자가 협력하고, 공동체와 소통하기를 + 바랍니다.\n여러분이 직접 편집하지 않는 다른 활동을 고려한다면, \n<a href='http://wiki.openstreetmap.org/wiki/Import/Guidelines'>가져오기</a>와 + \n<a href='http://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct'>자동화된 + 편집</a>에서의\n다음 가이드라인을 읽고 따라주시기 바랍니다." questions: title: 질문 있나요? paragraph_1_html: |- @@ -1121,8 +1141,8 @@ ko: add_a_note: title: 편집할 시간이 없습니까? 참고를 추가하세요! paragraph_1_html: |- - 작은 무언가를 고치기를 원하고 가입하고 편집하는 방법을 배울 시간이 없다면, - 참고를 추가하는 것은 쉽습니다. + 그냥 한 가지 간단한 것이 ê³ ì¹  게 있다거나 가입하면서 편집하는 방법을 배우기에 시간이 없다면, + 참고를 추가하는 것이 낫습니다. paragraph_2_html: |- <a href='%{map_url}'>지도</a>로 가고 나서 참고 아이콘을 클릭하세요: <span class='icon note'></span>. 드래그하여 이동할 수 있는 표시가 지도에 추가됩니다. @@ -1166,10 +1186,16 @@ ko: description: OSM의 질문 및 답변 사이트에서 질문하거나 답변을 찾아보세요. mailing_lists: title: 메일링 리스트 + description: 국소 또는 지역의 메일링 리스트의 넓은 범위에서 관심사에 대해 질문하거나 토론을 합니다. forums: title: 포럼들 + description: 게시판 스타일 인터페이스를 선호하는 것에 대한 질문과 토론입니다. irc: title: IRC + description: 다양한 주제에서 많은 다른 언어로 된 대화형 채트입니다. + switch2osm: + title: switch2osm + description: 회사나 단체가 OpenStreetMap와 다른 서비스를 기반으로 전환하는 것에 도움을 주십시오. wiki: url: http://wiki.openstreetmap.org/ title: wiki.openstreetmap.org @@ -1183,8 +1209,8 @@ ko: 기여하고 유지하는 매퍼 공동체에 의해 구축됩니다. local_knowledge_title: 지역 지식 local_knowledge_html: |- - OpenStreetMap은 지역 지식을 강조합니다. 기여자는 OSM이 정확하고 - 최신으로 검증하기 위해 항공 영상, GPS 장치와, 낮은 기술 분야 지도를 + OpenStreetMap은 지역 지식을 강조합니다. 기여자는 OSM이 정확하고 최신 정보로 + 유지된다는 것을 검증하기 위해 항공 영상, GPS 장치와, 낮은 기술 분야 지도를 사용합니다. community_driven_title: 공동체 주도 community_driven_html: |- @@ -1193,21 +1219,28 @@ ko: 재해 피해를 입은 지역을 매핑하는 인도주의자, 그리고 더 많은 기여자를 포함합니다. 공동체에 대해 더 알아보려면, <a href='%{diary_path}'>사용자 일기</a>, - <a href='http://blogs.openstreetmap.org/'>공동체 블로그</a>와, <a href='http://www.osmfoundation.org/'>OSM 재단</a> 웹사이트를 참고하세요. + <a href='http://blogs.openstreetmap.org/'>공동체 블로그</a>와, <a href='http://www.osmfoundation.org/'>OSM 재단</a> 웹사이트를 참조하세요. open_data_title: 오픈 데이터 open_data_html: |- - OpenStreetMap은 <i>오픈 데이터</i>입니다: OpenStreetMapê³¼ 기여자를 제작진으로 - 어떤 목적으로도 자유롭게 사용할 수 있습니다. 특정 방법으로 바꾸거나 + OpenStreetMap은 <i>오픈 데이터</i>입니다: OpenStreetMap 기여자를 제작진으로 + 명시하는 한 어떤 목적으로도 자유롭게 사용할 수 있습니다. 특정 방법으로 바꾸거나 데이터에 빌드한다면, 동일한 라이선스에 따라 결과를 배포할 수 있습니다. 자세한 내용은 <a href='%{copyright_path}'>저작권 및 라이선스 페이지</a>를 - 참고하세요. + 참조하세요. + legal_title: 법률 + legal_html: |- + 이 사이트와 많은 다른 관련 사이트는 공동체를 대표하여 <a href='http://osmfoundation.org/'>OpenStreetMap 재단</a> (OSMF) + 에 의해 운영됩니다. OSMF가 운영하는 서비스의 사용은 <a href="http://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy"> + 허용 가능한 사용 정책</a>ê³¼ <a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy">개인정보 정책</a>에 의해 규율됩니다. + <br> + 라이선싱, 저작권, 기타 다른 법률적 문제가 있다면 <a href='http://osmfoundation.org/Contact'>OSMF에 연락</a>하기 바랍니다. partners_title: 파트너 notifier: diary_comment_notification: - subject: '[OpenStreetMap] %{user}님이 당신의 일기 항목에 덧글을 남겼습니다' + subject: '[OpenStreetMap] %{user}님이 당신의 일기 항목에 댓글을 남겼습니다' hi: 안녕하세요 %{to_user}님, - header: '%{from_user}님이 %{subject} 제목의 OpenStreetMap 일기 항목에 덧글을 남겼습니다:' - footer: '%{readurl}에서도 덧글을 확인할 수 있습니다. %{commenturl}에서 덧글을 남기거나 %{replyurl}에서 + header: '%{from_user}님이 %{subject} OpenStreetMap의 일기 항목에 댓글을 남겼습니다:' + footer: '%{readurl}에서도 댓글을 확인할 수 있습니다. %{commenturl}에서 댓글을 남기거나 %{replyurl}에서 답글을 남길 수 있습니다.' message_notification: hi: 안녕하세요 %{to_user}님, @@ -1216,7 +1249,7 @@ ko: friend_notification: subject: '[OpenStreetMap] %{user}님이 당신을 친구로 추가했습니다' had_added_you: '%{user}님이 당신을 OpenStreetMap 친구로 추가했습니다.' - see_their_profile: '%{userurl} 에서 그들의 프로필을 ë³¼ 수 있습니다.' + see_their_profile: '%{userurl}에서 그들의 프로필을 ë³¼ 수 있습니다.' befriend_them: 또한 %{befriendurl}에서 친구로 추가할 수 있습니다. gpx_notification: greeting: 안녕하세요, @@ -1231,8 +1264,7 @@ ko: more_info_2: '다음에서 찾을 수 있습니다:' success: subject: '[OpenStreetMap] GPX 가져오기 성공' - loaded_successfully: 가능한 %{possible_points} 지점 중 %{trace_points} 지점을 성공적으로 - 불러왔습니다. + loaded_successfully: 가능한 %{possible_points} 점 중 %{trace_points} 점을 성공적으로 불러왔습니다. signup_confirm: subject: '[OpenStreetMap] OpenStreetMap에 오신 것을 환영합니다' greeting: 안녕하세요! @@ -1244,11 +1276,11 @@ ko: subject: '[OpenStreetMap] 이메일 주소 확인' email_confirm_plain: greeting: 안녕하세요, - hopefully_you: 누군가가 아마 자신이 %{server_url} 에 %{new_address} 로 이메일 주소를 바꾸고 싶습니다. + hopefully_you: 누군가가 아마 자신이 %{server_url} 에 %{new_address} (으)로 이메일 주소를 바꾸고 싶습니다. click_the_link: 만약 당신이라면 바뀜을 확인하기 위해 아래 링크를 클릭하세요. email_confirm_html: greeting: 안녕하세요, - hopefully_you: 누군가가 아마 자신이 %{server_url} 에 %{new_address} 로 이메일 주소를 바꾸고 싶습니다. + hopefully_you: 누군가가 아마 자신이 %{server_url} 에 %{new_address} (으)로 이메일 주소를 바꾸고 싶습니다. click_the_link: 만약 당신이라면 바뀜을 확인하기 위해 아래 링크를 클릭하세요. lost_password: subject: '[OpenStreetMap] 비밀번호 재설정 요청' @@ -1264,35 +1296,36 @@ ko: anonymous: 익명 사용자 greeting: 안녕하세요, commented: - subject_own: '[OpenStreetMap] %{commenter} 사용자가 당신의 참고에 덧글을 남겼습니다' - subject_other: '[OpenStreetMap] %{commenter} 사용자가 당신이 관심 있는 참고에 덧글을 남겼습니다' - your_note: '%{commenter} 사용자가 %{place} 근처의 당신의 지도에 덧글을 남겼습니다.' - commented_note: '%{commenter} 사용자가 당신이 덧글을 남긴 지도 참고에 덧글을 남겼습니다. 참고는 %{place} + subject_own: '[OpenStreetMap] %{commenter}님이 당신의 참고 중 하나에 댓글을 남겼습니다' + subject_other: '[OpenStreetMap] %{commenter}님이 당신이 관심 있는 참고에 댓글을 남겼습니다' + your_note: '%{commenter}님이 %{place} 근처의 당신의 지도 중 하나에 댓글을 남겼습니다.' + commented_note: '%{commenter}님이 당신이 댓글을 남긴 지도 참고에 댓글을 남겼습니다. 참고는 %{place} 근처에 있습니다.' closed: - subject_own: '[OpenStreetMap] %{commenter} 사용자가 당신의 참고 중 하나를 해결했습니다' - subject_other: '[OpenStreetMap] %{commenter} 사용자가 당신이 관심 있는 참고를 해결했습니다' - your_note: '%{commenter} 사용자가 %{place} 근처의 당신의 지도 참고 중 하나를 해결했습니다.' - commented_note: '%{commenter} 사용자가 당신이 덧글을 남긴 지도 참고를 해결했습니다. 참고는 %{place} - 근처에 있습니다.' + subject_own: '[OpenStreetMap] %{commenter}님이 당신의 참고 중 하나를 해결했습니다' + subject_other: '[OpenStreetMap] %{commenter}님이 당신이 관심 있는 참고를 해결했습니다' + your_note: '%{commenter}님이 %{place} 근처의 당신의 지도 참고 중 하나를 해결했습니다.' + commented_note: '%{commenter}님이 당신이 댓글을 남긴 지도 참고를 해결했습니다. 참고는 %{place} 근처에 + 있습니다.' reopened: - subject_own: '[OpenStreetMap] %{commenter} 사용자가 당신의 참고 중 하나를 다시 활성했습니다' - subject_other: '[OpenStreetMap] %{commenter} 사용자가 당신이 관심 있는 참고를 다시 활성했습니다' - your_note: '%{commenter} 사용자가 %{place} 근처의 당신의 지도 참고 중 하나를 다시 활성했습니다.' - commented_note: '%{commenter} 사용자가 당신이 덧글을 남긴 지도 참고를 다시 활성했습니다. 참고는 %{place} + subject_own: '[OpenStreetMap] %{commenter}님이 당신의 참고 중 하나를 다시 활성했습니다' + subject_other: '[OpenStreetMap] %{commenter}님이 당신이 관심 있는 참고를 다시 활성했습니다' + your_note: '%{commenter}님이 %{place} 근처의 당신의 지도 참고 중 하나를 다시 활성했습니다.' + commented_note: '%{commenter}님이 당신이 댓글을 남긴 지도 참고를 다시 활성했습니다. 참고는 %{place} 근처에 있습니다.' - details: 참고에 대한 자세한 사항은 %{url} 에서 찾을 수 있습니다. + details: 참고에 대한 자세한 사항은 %{url}에서 찾을 수 있습니다. changeset_comment_notification: + hi: 안녕하세요 %{to_user}님, greeting: 안녕하세요, commented: - subject_own: '[OpenStreetMap] %{commenter} 사용자가 당신의 바뀜집합에 덧글을 남겼습니다' - subject_other: '[OpenStreetMap] %{commenter} 사용자가 당신이 관심 있는 바뀜집합에 덧글을 남겼습니다' - your_changeset: '%{commenter} 사용자가 당신이 %{time}에 만든 바뀜집합에 덧글을 달았습니다' - commented_changeset: '%{commenter} 사용자가 %{changeset_author}이 %{time}에 만든, - 주시 중인 지도 바뀜집합에 덧글을 달았습니다' - partial_changeset_with_comment: '''%{changeset_comment}'' 덧글로' - partial_changeset_without_comment: 덧글 없이 - details: 바뀜집합에 대한 자세한 사항은 %{url} 에서 찾을 수 있습니다. + subject_own: '[OpenStreetMap] %{commenter}님이 당신의 바뀜집합 중 하나에 댓글을 남겼습니다' + subject_other: '[OpenStreetMap] %{commenter}님이 당신이 관심 있는 바뀜집합에 댓글을 남겼습니다' + your_changeset: '%{commenter}님이 당신이 %{time}에 만든 바뀜집합 중 하나에 댓글을 달았습니다' + commented_changeset: '%{commenter}님이 %{changeset_author}이 %{time}에 만든, 주시 + 중인 지도 바뀜집합에 댓글을 달았습니다' + partial_changeset_with_comment: '''%{changeset_comment}'' 댓글로' + partial_changeset_without_comment: 댓글 없이 + details: 바뀜집합에 대한 자세한 사항은 %{url}에서 찾을 수 있습니다. message: inbox: title: 받은 쪽지함 @@ -1323,7 +1356,7 @@ ko: body: 본문 send_button: 보내기 back_to_inbox: 받은 쪽지함으로 돌아가기 - message_sent: 보낸 메시지 + message_sent: 메시지를 보냈습니다 limit_exceeded: 최근에 많은 메시지를 보냈습니다. 더 보내려면 잠시 기다려주세요. no_such_message: title: 메시지가 없습니다. @@ -1344,7 +1377,7 @@ ko: 찾아보는 것은 어떨까요? people_mapping_nearby: 근처에 매핑한 사람 reply: - wrong_user: '''%{user}'' 사용자로 로그인하고 있지만 답장을 요청한 메시지가 해당 사용자에게 보내지지 않았습니다. 답장을 + wrong_user: '''%{user}''님으로 로그인하고 있지만 답장을 요청한 메시지가 해당 사용자에게 보내지지 않았습니다. 답장을 하려면 올바른 사용자로 로그인하세요.' read: title: 메시지 읽기 @@ -1355,7 +1388,7 @@ ko: unread_button: 읽지 않음으로 표시 back: 뒤로 to: 받는이 - wrong_user: '''%{user}'' 사용자로 로그인하고 있지만 읽기를 요청한 메시지가 해당 사용자에게 보내지지 않았습니다. 읽으려면 + wrong_user: '''%{user}''님으로 로그인하고 있지만 읽기를 요청한 메시지가 해당 사용자에게 보내지지 않았습니다. 읽으려면 올바른 사용자로 로그인하세요.' sent_message_summary: delete_button: 삭제 @@ -1366,7 +1399,7 @@ ko: deleted: 메시지가 삭제됨 site: index: - js_1: 자바스크립트를 지원하지 않는 브라우저이거나, 자바스크립트가 활성화 되어 있지 않습니다. + js_1: 자바스크립트를 지원하지 않는 브라우저를 사용 중이거나, 자바스크립트가 활성화되어 있지 않습니다. js_2: OpenStreetMap은 매끄러운 지도를 위해 자바스크립트를 사용합니다. permalink: 고유링크 shortlink: 짧은링크 @@ -1385,7 +1418,7 @@ ko: 플래시 플레이어를 다운로드</a>할 수 있습니다. <a href="http://wiki.openstreetmap.org/wiki/Editing">몇 가지 다른 설정</a> 또한 OpenStreetMap 편집을 위해 사용할 수 있습니다. potlatch_unsaved_changes: 바뀜을 저장하지 않았습니다. (Potlatch에 저장하려면 라이브 모드에서 편집하는 경우, - 현재의 방식이나 지점을 선택을 해제하거나 저장 버튼이 있다면 저장을 클릭해야 합니다.) + 현재 길이나 점을 선택을 해제하거나 저장 버튼이 있다면 저장을 클릭해야 합니다.) potlatch2_not_configured: Potlatch 2가 설정되지 않았습니다 - 자세한 정보는 http://wiki.openstreetmap.org/wiki/The_Rails_Port potlatch2_unsaved_changes: 바뀜을 저장하지 않았습니다. (Potlatch 2에서 저장하려면 저장을 클릭해야 합니다.) id_not_configured: iD가 설정되지 않았습니다 @@ -1396,7 +1429,7 @@ ko: search: search: 검색 get_directions: 길 찾기 - get_directions_title: 두 지점 사이의 길 찾기 + get_directions_title: 두 점 사이의 길 찾기 from: 출발지 to: 도착지 where_am_i: 내가 어디있나요? @@ -1406,20 +1439,22 @@ ko: table: entry: motorway: 고속도로 + main_road: 주요 도로 trunk: 간선 도로 - primary: 주요 도로 + primary: 대로 또는 국도, 지방도 secondary: ë³´ì¡° 도로 - unclassified: 분류하지 않은 도로 - unsurfaced: 비포장 도로 + unclassified: 분류되지 않은 도로 track: 추적 - byway: 옆길 bridleway: 승마로 - cycleway: 자전거로 + cycleway: 자전거 도로 + cycleway_national: 국립 자전거 도로 + cycleway_regional: 지역별 자전거 도로 + cycleway_local: 일반 자전거 도로 footway: 보도 rail: 철도 subway: 지하철 tram: - - 경철도 + - 경전철 - 노면 전차 cable: - 케이블 ì¹´ @@ -1428,7 +1463,7 @@ ko: - 공항 활주로 - 공항 유도로 apron: - - 공항 에이프런 + - 공항 계류장 - 터미널 admin: 행정 구역 경계 forest: 숲 @@ -1436,7 +1471,6 @@ ko: golf: 골프장 park: 공원 resident: 주거 지역 - tourist: 관광 명소 common: - 공유지 - 목초지 @@ -1453,22 +1487,24 @@ ko: allotments: 텃밭 pitch: 운동장 centre: 스포츠 센터 - reserve: 자연 보호구 - military: 군사지 + reserve: 자연 보호구역 + military: 군사 지역 school: - 학교 - 대학교 - building: 중요한 건물 + building: 주요 건물 station: 철도역 summit: - 산꼭대기 - - 산정상 + - 봉우리 tunnel: 점선 테두리 = 터널 bridge: 검은 테두리 = 다리 private: 개인 통행 - permissive: 허용 통행 destination: 목적 통행 construction: 공사 중인 도로 + bicycle_shop: 자전거 가게 + bicycle_parking: 자전거 주차장 + toilets: 화장실 richtext_area: edit: 편집 preview: 미리 보기 @@ -1489,10 +1525,10 @@ ko: url: URL trace: visibility: - private: 비공개 (익명으로만 공유, 정렬하지 않은 지점) - public: 공개 (익명으로 추적 목록 보임, 정렬하지 않은 지점) - trackable: 추적 가능 (익명으로만 공유, 시간 기록으로 정렬한 지점) - identifiable: 식별 가능 (식별 가능한 추적 목록 보임, 시간 기록으로 정렬한 지점) + private: 비공개 (익명으로만 공유, 정렬하지 않은 점) + public: 공개 (익명으로 추적 목록 보임, 정렬하지 않은 점) + trackable: 추적 가능 (익명으로만 공유, 시간 기록으로 정렬한 점) + identifiable: 식별 가능 (식별 가능한 추적 목록 보임, 시간 기록으로 정렬한 점) create: upload_trace: GPS 추적 올리기 trace_uploaded: GPX 파일을 올리고 있으며 데이터베이스에 삽입을 기다리고 있습니다. 이 작업은 보통 반 시간 내에 수행하며 @@ -1503,7 +1539,7 @@ ko: filename: '파일 이름:' download: 다운로드 uploaded_at: '올려짐:' - points: '지점:' + points: '점:' start_coord: '시작 좌표:' map: 지도 edit: 편집 @@ -1541,7 +1577,7 @@ ko: filename: '파일 이름:' download: 다운로드 uploaded: '올려짐:' - points: '지점:' + points: '점:' start_coordinates: '시작 좌표:' map: 지도 edit: 편집 @@ -1559,7 +1595,7 @@ ko: newer: 다음 추적 trace: pending: 보류 중 - count_points: '%{count} 지점' + count_points: 점 %{count}개 ago: '%{time_in_words_ago} 전' more: 더 보기 trace_details: 추적 자세한 정보 보기 @@ -1576,9 +1612,9 @@ ko: list: public_traces: 공개 GPS 추적 your_traces: 내 GPS 추적 - public_traces_from: '%{user} 사용자의 공중 GPS 추적' + public_traces_from: '%{user}님의 공개 GPS 추적' description: 최근 GPS 추적 올리기 찾아보기 - tagged_with: '%{tags}로 태그함' + tagged_with: '%{tags}(으)로 태그함' empty_html: 여기에 아직 아무 것도 없습니다. <a href='%{upload_link}'>새 추적을 올리거나</a> <a href='http://wiki.openstreetmap.org/wiki/Beginners_Guide_1.2'>위키 문서</a>에 GPS 추적에 대한 자세한 내용을 알아보세요. delete: @@ -1594,8 +1630,8 @@ ko: title: OpenStreetMap GPS 추적 description: description_with_count: - one: '%{user}에서의 %{count} 지점으로 된 GPX 파일' - other: '%{user}에서의 %{count} 지점으로 된 GPX 파일' + one: '%{user}에서의 점 %{count}개로 된 GPX 파일' + other: '%{user}에서의 점 %{count}개으로 된 GPX 파일' description_without_count: '%{user}에서의 GPX 파일' application: require_cookies: @@ -1605,7 +1641,7 @@ ko: setup_user_auth: blocked: API에 대한 접근을 차단했습니다. 자세한 내용을 알아보려면 웹 인터페이스에 로그인하세요. need_to_see_terms: API에 대한 접근을 일시적으로 중지했습니다. 기여자 약관을 보려면 웹 인터페이스에 로그인하세요. 기여자 - 약관에 동의 할 필요는 없습니다만 기여자 약관을 보아야 합니다. + 약관에 동의할 필요는 없습니다만 기여자 약관을 보아야 합니다. oauth: oauthorize: title: 내 계정에 접근 인증 @@ -1614,11 +1650,12 @@ ko: allow_to: '다음 클라이언트 애플리케이션을 허용합니다:' allow_read_prefs: 사용자 환경 설정을 읽습니다. allow_write_prefs: 사용자 환경 설정을 수정합니다. - allow_write_diary: 일기 항목을 만들고 덧글을 달고 친구를 만듭니다. + allow_write_diary: 일기 항목을 만들고 댓글을 달고 친구를 만듭니다. allow_write_api: 지도를 수정합니다. allow_read_gpx: 비공개 GPS 추적을 읽습니다. allow_write_gpx: GPS 추적을 올립니다. allow_write_notes: 참고를 수정합니다. + grant_access: 권한 부여 oauthorize_success: title: 인증 요청이 허가됨 allowed: 내 계정에 %{app_name} 애플리케이션 접근이 부여되었습니다. @@ -1647,10 +1684,10 @@ ko: edit: 자세한 사항 편집 delete: 클라이언트 삭제 confirm: 확실합니까? - requests: '사용자가 다음 권한을 요청합니다:' + requests: '사용자로부터 다음 권한을 요청합니다:' allow_read_prefs: 사용자 환경 설정을 읽습니다. allow_write_prefs: 사용자 환경 설정을 수정합니다. - allow_write_diary: 일기 항목을 만들고 덧글을 달고 친구를 만듭니다. + allow_write_diary: 일기 항목을 만들고 댓글을 달고 친구를 만듭니다. allow_write_api: 지도를 수정합니다. allow_read_gpx: 비공개 GPS 추적을 읽습니다. allow_write_gpx: GPS 추적을 올립니다. @@ -1673,16 +1710,16 @@ ko: url: 주요 애플리케이션 URL callback_url: 연락 URL support_url: 지원 URL - requests: '사용자가 다음 권한을 요청합니다:' + requests: '사용자로부터 다음 권한을 요청합니다:' allow_read_prefs: 사용자 환경 설정을 읽습니다. allow_write_prefs: 사용자 환경 설정을 수정합니다. - allow_write_diary: 일기 항목을 만들고 덧글을 달고 친구를 만듭니다. + allow_write_diary: 일기 항목을 만들고 댓글을 달고 친구를 만듭니다. allow_write_api: 지도를 수정합니다. allow_read_gpx: 비공개 GPS 추적을 읽습니다. allow_write_gpx: GPS 추적을 올립니다. allow_write_notes: 참고를 수정합니다. not_found: - sorry: 죄송합니다, 해당 %{type}(을)를 찾을 수 없습니다. + sorry: 죄송합니다, 해당 %{type}을(를) 찾을 수 없습니다. create: flash: 성공적으로 정보를 등록했습니다 update: @@ -1725,6 +1762,12 @@ ko: windowslive: title: 윈도 라이브로 로그인하기 alt: 윈도 라이브 계정으로 로그인하기 + github: + title: GitHub로 로그인 + alt: GitHub 계정으로 로그인 + wikipedia: + title: 위키백과로 로그인하기 + alt: 위키백과 계정으로 로그인 yahoo: title: 야후로 로그인 alt: Yahoo OpenID로 로그인하기 @@ -1739,7 +1782,7 @@ ko: heading: OpenStreetMap에서 로그아웃 logout_button: 로그아웃 lost_password: - title: 잊어버진 비밀번호 + title: 잊어버린 비밀번호 heading: 비밀번호를 잊으셨나요? email address: '이메일 주소:' new password button: 비밀번호 재설정 @@ -1748,7 +1791,7 @@ ko: notice email cannot find: 이메일 주소를 찾지 못해 죄송합니다. reset_password: title: 비밀번호 재설정 - heading: '%{user} 사용자 비밀번호 재설정' + heading: '%{user}의 비밀번호 재설정' password: '비밀번호:' confirm password: 비밀번호 확인 reset: 비밀번호 재설정 @@ -1757,8 +1800,8 @@ ko: new: title: 가입하기 no_auto_account_create: 불행하게도 현재로서는 자동으로 계정을 만들 수 없습니다. - contact_webmaster: 계정을 만들 수 있도록 <a href="mailto:webmaster@openstreetmap.org">웹마스터</a>에게 - 문의하세요. 희망에 대응하기 위해 노력하고 가능한 빨리 요청을 처리합니다. + contact_webmaster: 계정을 만들 수 있도록 <a href="%{webmaster}">웹마스터</a>에게 문의하세요. 희망에 + 대응하기 위해 노력하고 가능한 빨리 요청을 처리합니다. about: header: 자유롭고 편집 가능 html: |- @@ -1769,28 +1812,20 @@ ko: 약관</a>에 동의해야합니다. email address: '이메일 주소:' confirm email address: '이메일 주소 확인:' - not displayed publicly: 공개적으로 보이지 않습니다 (<a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" - title="이메일 주소에 대한 부분을 포함한 위키 개인 정보 정책">개인 정보 정책</a>을 참고하세요) - display name: '보여줄 이름:' - display name description: 공개적으로 보여질 사용자 이름입니다. 나중에 환경 설정에서 바꿀 수 있습니다. + not displayed publicly: 당신의 주소는 공개되지 않습니다. 자세한 내용은 <a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy" + title="OSMF privacy policy including section on email addresses">개인정보 정책</a>을 + 참조하시기 바랍니다. + display name: '표시 이름:' + display name description: 공개적으로 표시되는 사용자 이름입니다. 나중에 환경 설정에서 바꿀 수 있습니다. external auth: '제3자 인증:' password: '비밀번호:' confirm password: '비밀번호 확인:' use external auth: 다른 제3자 로그인 방식 사용하기 - auth association: |- - <p>당신의 계정은 아직 오픈스트리트맵 계정과 연동되어 있지 않습니다.</p> - <ul> - <li>오픈스트리트맵에 처음이라면, 아래 폼을 이용하여, 새 계정을 만들어주세요.</li> - <li> - 이미 계정이 있으시다면, 로그인할 수 있습니다. - 당신의 사용자명과 비밀번호를 사용하여 계정을 연동할 수 있습니다. - 당신의 사용자 설정에 있는 당신의 ID와 함께 - </li> - </ul> + auth no password: 제3자 인증은 비밀번호가 필요하지 않지만, 일부 추가 도구나 서버는 여전히 필요할 수 있습니다. continue: 가입하기 - terms accepted: 새 기여자 약관에 동의하셔서 감사합니다! + terms accepted: 새 기여자 약관에 동의해 주셔서 감사합니다! terms declined: 새 기여자 약관에 동의하지 않은 것으로 결정했기에 죄송합니다. 자세한 정보에 대해서는 <a href="%{url}">이 - 위키 문서</a>를 참고하세요. + 위키 문서</a>를 참조하세요. terms: title: 기여자 약관 heading: 기여자 약관 @@ -1811,6 +1846,7 @@ ko: title: 이러한 사용자는 없습니다 heading: '%{user} 사용자는 존재하지 않습니다' body: 죄송합니다, %{user} 이름으로 된 사용자가 없습니다. 맞춤법이나 클릭한 링크가 잘못됐는지 확인하세요. + deleted: 삭제됨 view: my diary: 내 일기 new diary entry: 새 일기 항목 @@ -1820,7 +1856,7 @@ ko: my messages: 내 메시지 my profile: 내 프로필 my settings: 프로필 설정 - my comments: 내 덧글 + my comments: 내 댓글 oauth settings: oauth 설정 blocks on me: 나를 차단 blocks by me: 나한테 차단 @@ -1861,9 +1897,9 @@ ko: revoke: administrator: 관리자 권한 해제 moderator: 운영자 권한 해제 - block_history: 사용자가 차단을 받았습니다 - moderator_history: 사용자가 차단을 주었습니다 - comments: 덧글 + block_history: 활성화된 차단 + moderator_history: 실행된 차단 + comments: 댓글 create_block: 이 사용자를 차단 activate_user: 이 사용자 활성화 deactivate_user: 이 사용자 비활성화 @@ -1886,7 +1922,7 @@ ko: current email address: '현재 이메일 주소:' new email address: '새 이메일 주소:' email never displayed publicly: (절대 공개하지 않습니다) - external auth: '외부 인증:' + external auth: '바깥 인증:' openid: link: http://wiki.openstreetmap.org/wiki/OpenID link text: 이게 뭐죠? @@ -1902,8 +1938,8 @@ ko: text: 현재 편집은 익명으로 나타나며, 다른 사람에게서 메시지를 받을 수 없고 자신의 위치가 공개되지 않습니다. 자신이 편집한 것을 드러내고 다른 사람이 웹 사이트를 통해 연락할 수 있게 하려면 아래 버튼을 클릭하세요. <b>0.6 API 개편 이후 공개 사용자만 지도 데이터를 편집할 수 있습니다</b>. (<a href="http://wiki.openstreetmap.org/wiki/Anonymous_edits">이유 - 알아보기</a>).<ul><li>공개 사용자가 되더라도 이메일 주소는 공개되지 않습니다.</li><li>이 조치는 취소할 수 없으며, - 모든 신규 사용자는 현재 기본적으로 공개 계정입니다.</li></ul> + 알아보기</a>).<ul><li>공개 사용자가 되더라도 이메일 주소는 공개되지 않습니다.</li><li>이 동작은 취소할 수 없으며, + 모든 새로운 사용자는 현재 기본적으로 공개 계정입니다.</li></ul> contributor terms: heading: '기여자 약관:' agreed: 새 기여자 약관에 동의했습니다. @@ -1918,6 +1954,8 @@ ko: gravatar: gravatar: Gravatar 사용 link text: 이게 뭐죠? + disabled: 그라바타가 비활성화되었습니다. + enabled: 그라바타의 표시가 활성화되었습니다 new image: 그림 추가 keep image: 현재 그림 유지 delete image: 현재 그림 제거 @@ -1928,7 +1966,7 @@ ko: latitude: '위도:' longitude: '경도:' update home location on click: 지도에서 클릭하면 집 위치로 업데이트할까요? - save changes button: 바뀜 저장 + save changes button: 변경사항 저장 make edits public button: 내 편집을 공개하기 return to profile: 프로필로 돌아가기 flash update success confirm needed: 사용자 정보를 성공적으로 업데이트했습니다. 새 이메일 주소를 확인하기 @@ -1945,9 +1983,8 @@ ko: unknown token: 확인 코드가 만료되었거나 존재하지 않습니다. reconfirm_html: 확인 이메일을 다시 보낼 필요가 있다면, <a href="%{reconfirm}">여기를 클릭하세요</a>. confirm_resend: - success: '%{email} 로 새 확인 쪽지를 보냈는데 즉시 계정을 확인하는 대로 매핑을 할 수 있습니다.<br /><br />확인 - 요청을 보낼 때 스팸 방지 시스템을 사용한다면 어떤 확인 요청에 답변할 수 없으므로 화이트리스트에 webmaster@openstreetmap.org - 가 있는지 확인하세요.' + success: '%{email}(으)로 새 확인 쪽지를 보냈는데 즉시 계정을 확인하는 대로 매핑을 할 수 있습니다.<br /><br />확인 + 요청을 보낼 때 스팸 방지 시스템을 사용한다면 어떤 확인 요청에 답변할 수 없으므로 화이트리스트에 %{sender}이(가) 있는지 확인하세요.' failure: '%{name} 사용자를 찾을 수 없습니다.' confirm_email: heading: 이메일 주소 바꾸기 확인 @@ -1961,26 +1998,26 @@ ko: go_public: flash success: 지금 모든 편집을 공개하고, 편집을 허용하지 않습니다. make_friend: - heading: '%{user} 사용자를 친구로 추가할까요?' + heading: '%{user}님을 친구로 추가할까요?' button: 친구 추가 - success: '%{name} 사용자는 이제 친구입니다!' - failed: 죄송합니다, %{name} 사용자를 친구로 추가하는 데 실패했습니다. - already_a_friend: 이미 %{name} 사용자와 친구입니다. + success: '%{name}님은 이제 친구입니다!' + failed: 죄송합니다, %{name}님을 친구로 추가하는 데 실패했습니다. + already_a_friend: 이미 %{name}님과 친구입니다. remove_friend: - heading: '%{user} 사용자를 친구 제거할까요?' + heading: '%{user}님을 친구 제거할까요?' button: 친구 제거 - success: '%{name} 사용자를 친구에서 제거했습니다.' - not_a_friend: '%{name} 사용자는 친구가 아닙니다.' + success: '%{name}님을 친구에서 제거했습니다.' + not_a_friend: '%{name}님은 친구 중 하나가 아닙니다.' filter: not_an_administrator: 해당 동작을 수행하려면 관리자 권한이 필요합니다. list: title: 사용자 heading: 사용자 showing: - one: 페이지 %{page} (%{items} 중 %{first_item}) - other: 페이지 %{page} (%{items} 중 %{first_item}-%{last_item}) - summary: '%{name}(이)가 %{date}에 %{ip_address}에서 만들어짐' - summary_no_ip: '%{name}(이)가 %{date}에 만들어짐' + one: '%{page}페이지 (%{items} 중 %{first_item})' + other: '%{page}페이지 (%{items} 중 %{first_item}-%{last_item})' + summary: '%{name}님이 %{date}에 %{ip_address}에서 만들어짐' + summary_no_ip: '%{name}이(가) %{date}에 만들어짐' confirm: 선택한 사용자 확인 hide: 선택한 사용자 숨기기 empty: 일치하는 사용자를 찾을 수 없습니다 @@ -1998,9 +2035,16 @@ ko: 이 문제를 토론하려면 %{webmaster}에게 문의할 수 있습니다. </p> auth_failure: - connection_failed: 인증 서버와의 연결에 실패했습니다. + connection_failed: 인증 제공자와 연결하는 데 실패했습니다 + invalid_credentials: 잘못된 인증 자격 증명 no_authorization_code: 인증 코드가 없습니다. unknown_signature_algorithm: 알려지지 않은 인증 알고리즘 + invalid_scope: 잘못된 범위 + auth_association: + heading: 당신의 아이디는 아직 오픈스트리트맵에 등록되지 않았습니다. + option_1: 만약 당신이 오픈스트리트맵에 처음 이라면, 밑의 양식을 써서 새 계정을 만들어 주세요. + option_2: 만약 당신이 이미 계정을 가지고 있다면, 당신은 당신의 사용자 이름과 비밀번호를 사용해 로그인할 수 있고 당신의 아이디를 + 사용자 설정에서 등록할 수 있습니다. user_role: filter: not_an_administrator: 관리자만 사용자 역할 관리를 수행할 수 있습니다, ​​당신은 관리자가 아닙니다. @@ -2010,15 +2054,15 @@ ko: grant: title: 역할 부여 확인 heading: 역할 부여 확인 - are_you_sure: '''%{name}'' 사용자한테 ''%{role}'' 역할을 부여하겠습니까?' + are_you_sure: '''%{name}'' 사용자에게 ''%{role}'' 역할을 부여하겠습니까?' confirm: 확인 fail: '''%{name} 사용자에게 ''%{role}'' 역할을 부여할 수 없습니다. 사용자와 역할이 모두 올바른지 확인하세요.' revoke: title: 역할 해제 확인 heading: 역할 해제 확인 - are_you_sure: '''%{name}'' 사용자한테 ''%{role}'' 역할을 해제하겠습니까?' + are_you_sure: '''%{name}'' 사용자로부터 ''%{role}'' 역할을 해제하겠습니까?' confirm: 확인 - fail: '''%{name} 사용자에게 ''%{role}'' 역할을 해제할 수 없습니다. 사용자와 역할이 모두 올바른지 확인하세요.' + fail: '''%{name} 사용자로부터 ''%{role}'' 역할을 해제할 수 없습니다. 사용자와 역할이 모두 올바른지 확인하세요.' user_block: model: non_moderator_update: 차단을 만들거나 바꾸려면 운영자여야 합니다. @@ -2029,9 +2073,9 @@ ko: new: title: '%{name} 사용자 차단' heading: '%{name} 사용자 차단' - reason: '%{name} 사용자를 차단한 이유입니다. 메시지가 대중에 공개적으로 보여지기 때문에, 상황에 대해 가능한 한 냉정하고 - 합리적으로 최대한 정중하게 상황을 설명하도록 하세요. 모든 사용자가 공동체 내에서의 전문 용어를 이해하고 있는 것인 아니기 때문에 알기 - 쉬운 용어를 사용하도록 노력하세요.' + reason: '%{name}님을 차단한 이유입니다. 메시지가 대중에 공개적으로 보이기 때문에, 상황에 대해 가능한 한 냉정하고 합리적으로 + 최대한 정중하게 상황을 설명하도록 하세요. 모든 사용자가 공동체 내에서의 전문 용어를 이해하고 있는 것인 아니기 때문에 알기 쉬운 용어를 + 사용하도록 노력하세요.' period: 사용자가 지금부터 얼마나 오랫동안 API에서 차단하나요. submit: 차단 만들기 tried_contacting: 사용자에게 연락하여 이를 멈추도록 요청했습니다. @@ -2041,8 +2085,8 @@ ko: edit: title: '%{name} 사용자에 대한 차단 편집' heading: '%{name} 사용자에 대한 차단 편집' - reason: '%{name} 사용자를 차단한 이유입니다. 상황에 대해 가능한 한 냉정하고 합리적으로 최대한 정중하게 상황을 설명하도록 - 하세요. 모든 사용자가 공동체 내에서의 전문 용어를 이해하고 있는 것인 아니기 때문에 알기 쉬운 용어를 사용하도록 노력하세요.' + reason: '%{name}님을 차단한 이유입니다. 상황에 대해 가능한 한 냉정하고 합리적으로 최대한 정중하게 상황을 설명하도록 하세요. + 모든 사용자가 공동체 내에서의 전문 용어를 이해하고 있는 것인 아니기 때문에 알기 쉬운 용어를 사용하도록 노력하세요.' period: 사용자가 지금부터 얼마나 오랫동안 API에서 차단하나요. submit: 차단 업데이트 show: 이 차단 보기 @@ -2092,18 +2136,20 @@ ko: until_login: 사용자가 로그인할 때까지 활성합니다. time_past: '%{time} 전에 끝났습니다.' blocks_on: - title: '%{name} 사용자에 대해 차단' + title: '%{name}님에 대해 차단' heading: '%{name} 사용자에 대한 차단 목록' - empty: '%{name} 사용자는 아직 차단되지 않았습니다.' + empty: '%{name}님은 아직 차단되지 않았습니다.' blocks_by: - title: '%{name} 사용자에 의해 차단' + title: '%{name}님에 의해 차단' heading: '%{name} 사용자에 의한 차단 목록' - empty: '%{name} 사용자는 아직 어떠한 차단도 하지 않았습니다.' + empty: '%{name}님은 아직 어떠한 차단도 하지 않았습니다.' show: - title: '%{block_on} 사용자가 %{block_by} 사용자에 의해 차단됨' - heading: '%{block_on} 사용자가 %{block_by} 사용자에 의해 차단됨' + title: '%{block_on}님이 %{block_by}님에 의해 차단됨' + heading: '%{block_on}님이 %{block_by}님에 의해 차단됨' time_future: '%{time}에 끝남' time_past: '%{time} 전에 끝남' + created: 만들어짐 + ago: '%{time} 전' status: 상태 show: 보기 edit: 편집 @@ -2116,29 +2162,29 @@ ko: note: description: opened_at_html: '%{when} 전에 만듦' - opened_at_by_html: '%{user} 사용자가 %{when} 전에 만듦' + opened_at_by_html: '%{user}님이 %{when} 전에 만듦' commented_at_html: '%{when} 전에 바꿈' - commented_at_by_html: '%{user} 사용자가 %{when} 전에 바꿈' + commented_at_by_html: '%{user}님이 %{when} 전에 업데이트함' closed_at_html: '%{when} 전에 해결함' - closed_at_by_html: '%{user} 사용자가 %{when} 전에 해결함' + closed_at_by_html: '%{user}님이 %{when} 전에 해결함' reopened_at_html: '%{when} 전에 다시 활성화함' - reopened_at_by_html: '%{user} 사용자가 %{when} 전에 다시 활성화함' + reopened_at_by_html: '%{user}님이 %{when} 전에 다시 활성화함' rss: title: OpenStreetMap 참고 description_area: 내 지역[(%{min_lat}|%{min_lon}) -- (%{max_lat}|%{max_lon})]에 - 참고, 덧글 또는 닫힌 참고 목록 + 참고, 댓글 또는 닫힌 참고 목록 description_item: '%{id} 참고에 대한 RSS 피드' opened: 새 참고 (%{place} 근처) - commented: 새 덧글 (%{place} 근처) + commented: 새 댓글 (%{place} 근처) closed: 닫힌 참고 (%{place} 근처) reopened: 다시 활성된 참고 (%{place} 근처) entry: - comment: 덧글 + comment: 댓글 full: 전체 참고 mine: - title: '%{user} 사용자가 제출했거나 덧글을 남긴 참고' + title: '%{user}님이 제출했거나 댓글을 남긴 참고' heading: '%{user}의 참고' - subheading: '%{user} 사용자가 제출했거나 덧글을 남긴 참고' + subheading: '%{user}님이 제출했거나 댓글을 남긴 참고' id: ID creator: 만든이 description: 설명 @@ -2154,6 +2200,7 @@ ko: link: 링크 또는 HTML long_link: 링크 short_link: 짧은 링크 + geo_uri: 지리 URI embed: HTML custom_dimensions: 사용자 지정 치수 설정 format: '형식:' @@ -2165,17 +2212,20 @@ ko: center_marker: 표시의 가운데 지도 paste_html: HTML을 붙여 넣어 웹사이트에 포함시키세요 view_larger_map: 큰 지도 보기 + only_standard_layer: 표준 레이어만 그림으로 내보낼 수 있습니다 + embed: + report_problem: 문제점 ë³´ê³  key: title: 범례 tooltip: 범례 - tooltip_disabled: 범례는 표준 레이어에서만 사용할 수 있습니다 + tooltip_disabled: 맵 키는 이 레이어에 사용할 수 없습니다 map: zoom: in: 확대 out: 축소 locate: title: 내 위치 보기 - popup: 이 지점의 {distance} {unit} 안에 있습니다 + popup: 이 점의 {distance} {unit} 안에 있습니다 base: standard: 표준 cycle_map: 사이클 지도 @@ -2185,6 +2235,7 @@ ko: header: 지도 레이어 notes: 지도 참고 data: 지도 데이터 + gps: 공개 GPS 추적 overlays: 지도 문제를 해결하기 위해 오버레이를 활성화 title: 레이어 copyright: © <a href='%{copyright_url}'>OpenStreetMap 기여자</a> @@ -2197,17 +2248,17 @@ ko: map_notes_zoom_in_tooltip: 지도 참고를 보려면 확대 map_data_zoom_in_tooltip: 지도 데이터를 보려면 확대 queryfeature_tooltip: 지물 정보 - queryfeature_disabled_tooltip: 지물 정보를 확인하려면 지도를 확대하세요 + queryfeature_disabled_tooltip: 지물 정보를 확인하려면 확대 changesets: show: - comment: 덧글 + comment: 댓글 subscribe: 구독 unsubscribe: 구독 해지 hide_comment: 숨기기 unhide_comment: 숨기기 취소 notes: new: - intro: 실수했거나 없는 무언가를 발견했나요? 다른 매퍼에게 알려주어 ê³ ì¹  수 있게 해주세요. 마커를 올바른 위치로 옮기고, 참고를 + intro: 실수했거나 없는 무언가를 발견했나요? 다른 매퍼에게 알려주어 ê³ ì¹  수 있게 해주세요. 마커를 올바른 위치로 이동하고, 참고를 남겨 문제를 설명해주세요. (개인 정보나 저작권이 있는 지도나 디렉터리 목록에서의 정보를 입력하지 마세요.) add: 참고 추가 show: @@ -2215,8 +2266,8 @@ ko: hide: 숨기기 resolve: 해결 reactivate: 다시 활성화 - comment_and_resolve: 덧글 & 해결 - comment: 덧글 + comment_and_resolve: 댓글 & 해결 + comment: 댓글 edit_help: 편집하려는 위치에 지도를 이동하고 확대한 다음, 여기를 클릭하세요. directions: engines: @@ -2226,14 +2277,50 @@ ko: mapquest_car: 자동차 (MapQuest) mapquest_foot: 도보 (MapQuest) osrm_car: 자동차 (OSRM) + mapzen_bicycle: 자전거 (Mapzen) + mapzen_car: 자동차 (Mapzen) + mapzen_foot: 도보 (Mapzen) directions: 길 distance: 거리 errors: no_route: 두 장소 사이의 경로를 찾을 수 없습니다. no_place: 죄송합니다 - ê·¸ 장소를 찾을 수 없습니다. instructions: - unnamed: 이름 없음 - courtesy: '%{link}의 길 풍습' + continue_without_exit: '%{name}(으)로 계속 가세요' + slight_right_without_exit: '%{name}을(를) 따라 오른쪽으로 완만하게 도세요' + offramp_right_without_exit: '%{name}을(를) 향해 램프로 우회전' + onramp_right_without_exit: 경사로에서 %{name}(으)로 우회전 + endofroad_right_without_exit: 길 끝쪽에서 %{name}(으)로 우회전 + merge_right_without_exit: '%{name}을(를) 따라 우회전' + fork_right_without_exit: 분기점에서 %{name}(으)로 우회전 + turn_right_without_exit: '%{name}을(를) 따라 오른쪽으로 도세요' + sharp_right_without_exit: '%{name}을(를) 따라 오른쪽으로 꺾으세요' + uturn_without_exit: '%{name}을(를) 따라 유턴하세요' + sharp_left_without_exit: '%{name}을(를) 따라 왼쪽으로 꺾으세요' + turn_left_without_exit: '%{name}을(를) 따라 왼쪽으로 도세요' + offramp_left_without_exit: '%{name}을(를) 향해 램프로 좌회전' + onramp_left_without_exit: 경사로에서 %{name}(으)로 좌회전 + endofroad_left_without_exit: 길 끝쪽에서 %{name}(으)로 좌회전 + merge_left_without_exit: '%{name}을(를) 따라 좌회전' + fork_left_without_exit: 분기점에서 %{name}(으)로 좌회전 + slight_left_without_exit: '%{name}을(를) 따라 왼쪽으로 완만하게 도세요' + via_point_without_exit: (점을 통해) + follow_without_exit: '%{name}을(를) 따라가세요' + roundabout_without_exit: '%{name}의 회전교차로에서' + leave_roundabout_without_exit: 회전교차로를 떠나세요 - %{name} + stay_roundabout_without_exit: 회전교차로에 머무세요 - %{name} + start_without_exit: '%{name}의 끝에서 시작' + destination_without_exit: 목적지에 도달합니다 + against_oneway_without_exit: '%{name}(으)로 한 방향으로 가세요' + end_oneway_without_exit: '%{name}에서의 한 방향의 끝' + roundabout_with_exit: '%{name}에서의 회전교차로에서 %{exit} 출구로 떠나세요' + turn_left_with_exit: 로터리에서 %{name}(으)로 좌회전 + slight_left_with_exit: 로터리에서 %{name}(으)로 약간 좌회전 + turn_right_with_exit: 로터리에서 %{name}(으)로 우회전 + slight_right_with_exit: 로터리에서 %{name}(으)로 약간 좌회전 + continue_with_exit: 로터리에서 %{name}(으)로 직진 + unnamed: 이름 없는 도로 + courtesy: '%{link}의 가는 방향' time: 시간 query: node: 노드 @@ -2268,7 +2355,7 @@ ko: create: flash: 교정을 만들었습니다. update: - flash: 바뀜을 저장했습니다. + flash: 변경된 사항을 저장했습니다. destroy: not_empty: 교정이 비어 있지 않습니다. 파기하기 전에 이 교정에 속하는 모든 판을 교정 취소하세요. flash: 교정을 파기했습니다. diff --git a/config/locales/lb.yml b/config/locales/lb.yml index 77a2f124f..d301cc85c 100644 --- a/config/locales/lb.yml +++ b/config/locales/lb.yml @@ -119,12 +119,14 @@ lb: way: Wee relation: Relatioun changeset: Set vun Ännerungen + note: Notiz timeout: type: node: Knuet way: Wee relation: Relatioun changeset: Set vun Ännerungen + note: Notiz redacted: type: node: Knuet @@ -190,6 +192,8 @@ lb: commented_at_by_html: Viru(n) %{when} vum %{user} aktualiséiert full: Komplett Diskussioun diary_entry: + new: + publish_button: Verëffentlechen list: title: Blogge vun de Benotzer edit: @@ -693,6 +697,7 @@ lb: greeting: Salut, details: Méi Detailer iwwer d'Notiz fannt Dir op %{url}. changeset_comment_notification: + hi: Salut %{to_user}, greeting: Salut, message: inbox: @@ -751,11 +756,14 @@ lb: table: entry: motorway: Autobunn + main_road: Haaptstrooss secondary: Niewestrooss unclassified: Net klasséiert Strooss - byway: Niewewee bridleway: Wee fir Päerd cycleway: Vëlospiste + cycleway_national: Nationale Vëloswee + cycleway_regional: Regionale Vëloswee + cycleway_local: Lokale Vëloswee footway: Fousswee rail: Eisebunn subway: Metro @@ -767,7 +775,6 @@ lb: wood: Bësch golf: Golfterrain park: Park - tourist: Touristenattraktioun industrial: Industriezone lake: - Séi @@ -780,6 +787,9 @@ lb: - Universitéit summit: - Spëtzt + bicycle_shop: Vëlosgeschäft + bicycle_parking: Vëlosparking + toilets: Toiletten richtext_area: edit: Änneren preview: Kucken ouni ofzespäicheren @@ -902,6 +912,12 @@ lb: windowslive: title: Mat Windows Live aloggen alt: Mat engem Windows-Live Benotzerkont aloggen + github: + title: Mat GitHub aloggen + alt: Mat engem GitHub-Konto aloggen + wikipedia: + title: Mat Wikipedia aloggen + alt: Mat engem Wikipedia-Benotzerkont aloggen yahoo: title: Alogge mat Yahoo alt: Alogge mat enger Yahoo OpenID @@ -936,6 +952,10 @@ lb: header: Fäi a verännerbar email address: 'E-Mail-Adress:' confirm email address: 'E-Mail-Adress confirméieren:' + not displayed publicly: Är Adress gëtt net ëffentlech gewisen, kuckt eis <a + href="http://wiki.osmfoundation.org/wiki/Privacy_Policy" title="OSMF privacy + policy including section on email addresses">Dateschutzrichtlinn</a> fir méi + Informatiounen display name: Numm weisen password: 'Passwuert:' confirm password: 'Passwuert confirméieren:' @@ -987,14 +1007,15 @@ lb: revoke: administrator: Administrateur-Zougang ofhuelen moderator: Moderateursrechter ewechhuelen + block_history: Aktiv Spären comments: Bemierkungen - create_block: dëse Benotzer spären - activate_user: dëse Benotzer aktivéieren - deactivate_user: dëse Benotzer desaktivéieren - confirm_user: dëse Benotzer confirméieren - hide_user: dëse Benotzer verstoppen - unhide_user: dëse Benotzer net méi verstoppen - delete_user: dëse Benotzer läschen + create_block: Dëse Benotzer spären + activate_user: Dëse Benotzer aktivéieren + deactivate_user: Dëse Benotzer desaktivéieren + confirm_user: Dëse Benotzer confirméieren + hide_user: Dëse Benotzer verstoppen + unhide_user: Dëse Benotzer net méi verstoppen + delete_user: Dëse Benotzer läschen confirm: Confirméieren popup: friend: Frënn @@ -1017,6 +1038,8 @@ lb: image: 'Bild:' gravatar: link text: wat ass dat? + disabled: Gravatar gouf desaktivéiert. + enabled: D'Weise vun Ärem Gravatar gouf aktivéiert. new image: E Bild derbäisetzen keep image: Dat aktuellt Bild behalen delete image: Dat aktuellt Bild ewechhuelen @@ -1056,13 +1079,16 @@ lb: list: title: Benotzer heading: Benotzer - confirm: Erausgesichte Benotzer confirméieren - hide: Erausgesichte Benotzer vrstoppen + confirm: Erausgesicht Benotzer confirméieren + hide: Erausgesicht Benotzer vrstoppen empty: Et goufe keng sou Benotzer fonnt suspended: webmaster: Webmaster auth_failure: no_authorization_code: Keen Autorisatiouns-Code + auth_association: + option_1: Wann Dir nei sidd bei OpenSrreetMap da leet w.e.g. e Benotzerkont + un andeem Dir de Formulaire hei drënner benotzt. user_role: filter: not_an_administrator: Nëmmen Administrateure kënnen d'Gestioun vun de Rolle @@ -1143,6 +1169,7 @@ lb: javascripts: close: Zoumaachen share: + title: Deelen cancel: Ofbriechen image: Bild link: Link oder HTML @@ -1154,6 +1181,8 @@ lb: download: Eroflueden short_url: Kuerz URL view_larger_map: Méi grouss Kaart weisen + embed: + report_problem: E Problem mellen map: locate: title: Weise wou ech sinn @@ -1162,6 +1191,8 @@ lb: standard: Standard cycle_map: Vëloskaart hot: Humanitär + layers: + gps: Ëffentlech GPS Spueren donate_link_text: <a class='donate-attr' href='%{donate_url}'>Maacht een Don</a> site: edit_tooltip: Kaart änneren @@ -1180,15 +1211,33 @@ lb: reactivate: Reaktivéieren comment: Bemierkung directions: + engines: + mapzen_bicycle: Vëlo (Mapzen) directions: Richtungen distance: Distanz instructions: continue_without_exit: Virun op %{name} + offramp_right_without_exit: Déi riets Opfaart op %{name} huelen + onramp_right_without_exit: Bei der Opfaart riets ofbéien op %{name} + endofroad_right_without_exit: Um Ënn vun der Strooss riets ofbéien op %{name} + merge_right_without_exit: Riets areien op %{name} + fork_right_without_exit: Um Ënn vun der Strooss riets ofbéien op %{name} sharp_right_without_exit: Schaarf riets op %{name} sharp_left_without_exit: Schaarf lénks op %{name} + offramp_left_without_exit: Déi lénks Opfaart op %{name} huelen + onramp_left_without_exit: Bei der Opfaart lénks ofbéien op %{name} + endofroad_left_without_exit: Um Ënn vun der Strooss lénks ofbéien op %{name} + merge_left_without_exit: Lénks areien op %{name} + fork_left_without_exit: Um Ënn vun der Strooss lénks ofbéien op %{name} via_point_without_exit: (iwwer de Punkt) + roundabout_without_exit: Am Kreesverkéier huelt %{name} leave_roundabout_without_exit: Aus dem Kreesverkéier erausgoen - %{name} stay_roundabout_without_exit: Am Kreesverkéier bleiwen - %{name} + turn_left_with_exit: Am Kreesverkéier lénks ofbéien op %{name} + slight_left_with_exit: Am Kreesverkéier liicht no lénks op %{name} ofbéien + turn_right_with_exit: Am Kreesverkéier riets ofbéien op %{name} + slight_right_with_exit: Am Kreesverkéier liicht no riets op %{name} ofbéien + continue_with_exit: Am Kreesverkéier riicht viru fueren op %{name} unnamed: Strooss ouni Numm time: Zäit query: diff --git a/config/locales/lt.yml b/config/locales/lt.yml index 1993a5bff..6aefd05b8 100644 --- a/config/locales/lt.yml +++ b/config/locales/lt.yml @@ -5,12 +5,15 @@ # Author: Cyklopas # Author: Eitvys200 # Author: Garas +# Author: Macofe # Author: Mantak111 # Author: Matasg # Author: Pauliuz # Author: Pdxx # Author: Perkunas # Author: Ruila +# Author: Techwebpd +# Author: Zygimantus --- lt: time: @@ -78,7 +81,7 @@ lt: body: Tekstas recipient: Gavėjas user: - email: E-paÅ¡tas + email: El. paÅ¡tas active: Aktyvus display_name: Rodomas vardas description: ApraÅ¡ymas @@ -171,6 +174,7 @@ lt: way: kelias relation: ryÅ¡ys changeset: pakeitimas + note: pastaba timeout: sorry: AtsipraÅ¡ome, bet duomenys objekto su id %{id} ir tipo %{type} buvo iÅ¡traukiami per ilgai. @@ -179,6 +183,7 @@ lt: way: kelias relation: ryÅ¡ys changeset: pakeitimas + note: pastaba redacted: redaction: Redakcija %{id} message_html: Versijos "%{version}" tipas %{type} negali bÅ«ti rodomas, kai jis @@ -264,6 +269,7 @@ lt: diary_entry: new: title: Naujas dienoraščio įraÅ¡as + publish_button: Publikuoti list: title: Naudotojo dienoraščiai title_friends: Draugų dienoraščiai @@ -1085,9 +1091,9 @@ lt: svetainėje</a> arba užpildykite <a href="http://dmca.openstreetmap.org/">šį pildymų lapą</a>. trademarks_title_html: <span id="trademarks"></span>Prekių ženklai - trademarks_1_html: OpenStreetMap ir lupos logotipas yra registruoti OpenStreetMap - fondo prekių ženklai. Jei turite klausimų apie Å¡ių ženklų naudojimą, siųskite - savo klausimus <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">Licencijavimo + trademarks_1_html: OpenStreetMap, lupos logotipas ir „State of the Map“ yra + registruoti OpenStreetMap fondo prekių ženklai. Jei turite klausimų apie Å¡ių + ženklų naudojimą, siųskite savo klausimus <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">Licencijavimo darbinei grupei</a>. welcome_page: title: Sveiki atvykę! @@ -1302,7 +1308,7 @@ lt: subject_own: '[OpenStreetMap] %{commenter} iÅ¡sprendė vieną iÅ¡ jÅ«sų pastabos' subject_other: '[OpenStreetMap] %{commenter} iÅ¡sprendė jÅ«sų dominančia pastaba' your_note: '%{commenter} iÅ¡sprendė vieną iÅ¡ jÅ«sų žemėlapio pastabų Å¡alia %{place}.' - commented_note: '%{commenter} iÅ¡sprendė žemėlapio pastabą, kurį jÅ«s pakomentavote. + commented_note: '%{commenter} iÅ¡sprendė žemėlapio pastabą, kurią jÅ«s pakomentavote. Pastaba yra Å¡alia %{place}.' reopened: subject_own: '[OpenStreetMap] %{commenter} aktyvavo vieną iÅ¡ jÅ«sų pastabų' @@ -1311,7 +1317,7 @@ lt: your_note: '%{commenter} aktyvavo vieną iÅ¡ jÅ«sų žemėlapio pastabų netoli %{place}.' commented_note: '%{commenter} aktyvavo žemėlapio pastabą, kurį jÅ«s pakomentavote. Pastaba yra netoli %{place}.' - details: Daugiau informacijos apie pastaba galima rasti %{url}. + details: Daugiau informacijos apie pastabą galima rasti %{url}. changeset_comment_notification: greeting: Labas, commented: @@ -1437,7 +1443,7 @@ lt: search_results: PaieÅ¡kos rezultatai close: Uždaryti search: - search: 'PaieÅ¡ka:' + search: PaieÅ¡ka get_directions: Gauti nurodymus get_directions_title: Rasti marÅ¡ruto nurodymus tarp dviejų taÅ¡kų from: IÅ¡ @@ -1449,15 +1455,15 @@ lt: table: entry: motorway: Automagistralė + main_road: Pagrindinis kelias trunk: Magistralinis kelias (kai kur – greitkelis) primary: Pirmosios reikÅ¡mės kelias secondary: Antros reikÅ¡mės kelias unclassified: Neklasifikuotas kelias - unsurfaced: Kelias be dangos track: Pėdsakas - byway: Keliukas bridleway: Takas galvijams varyti cycleway: Dviračių takas + cycleway_local: Vietinis dviračių takas footway: Pėsčiųjų takas rail: Geležinkelis subway: Metro @@ -1479,7 +1485,6 @@ lt: golf: Golfo laukas park: Parkas resident: Gyvenamoji zona - tourist: Turistų atrakcija common: - Bendras - pieva @@ -1509,9 +1514,11 @@ lt: tunnel: Punktyriniai kraÅ¡tai = tiltas bridge: TamsÅ«s kraÅ¡tai = tiltas private: Privati prieiga - permissive: Leidimo reikalaujantis įvažiavimas destination: Atvykimo susisiekimas construction: Statomi keliai + bicycle_shop: Dviračių parduotuvė + bicycle_parking: Dviračių stovėjimo aikÅ¡telė + toilets: Tualetai richtext_area: edit: Redaguoti preview: PeržiÅ«ra @@ -1671,6 +1678,7 @@ lt: allow_read_gpx: skaityti jÅ«sų asmeninius GPS pėdsakus. allow_write_gpx: įkelti GPS pėdsakus. allow_write_notes: modifikuoti pastabas. + grant_access: Suteikti prieigą oauthorize_success: title: Autorizavimo užklausa leista allowed: JÅ«s leidote aplikacijai %{app_name} prieiti prie savo paskyros. @@ -1782,6 +1790,12 @@ lt: windowslive: title: Prisijungti su Windows Live alt: Prisijungti su Windows Live paskyra + github: + title: Prisijungti su GitHub + alt: Prisijungti su GitHub Paskyra + wikipedia: + title: Prisijungti su Vikipedija + alt: Prisijungti su Vikipedija Paskyra yahoo: title: Prisijunkite su Yahoo alt: Prisijunkite su Yahoo OpenID @@ -1817,9 +1831,8 @@ lt: new: title: Sukurti paskyrą no_auto_account_create: Deja Å¡iuo metu negalime jums automatiÅ¡kai sukurti paskyros. - contact_webmaster: Kreipkitės į <a href="mailto:webmaster@openstreetmap.org">administratorių</a> - paskyros sukÅ«rimui organizuoti – mes mėginsime apdoroti užklausą kaip įmanoma - greičiau. + contact_webmaster: Kreipkitės į <a href="%{webmaster}">administratorių</a> paskyros + sukÅ«rimui organizuoti – mes mėginsime apdoroti užklausą kaip įmanoma greičiau. about: header: Laisvas ir redaguojamas html: <p>PrieÅ¡ingai nei kiti žemėlapiai, OpenStreetMap kuriamas vien tik žmonių, @@ -1841,16 +1854,6 @@ lt: use external auth: Alternatyviai, naudokite trečią Å¡alį prisijungimui auth no password: Naudojant trečios Å¡alies autentikaciją nereikia slaptažodžio, bet kai kuriems papildomiems įrankiams arba serveriui gali jo prireikti. - auth association: |- - <p>JÅ«sų ID dar nėra susietas su OpenStreetMap paskyra.</p> - <ul> - <li>Jei esate OpenStreetMap naujokas, sukurkite naują paskyrą, naudodami formą žemiau.</li> - <li> - Jei jau turite paskyrą, galite prisijungti prie paskyros - naudodami savo naudotojo vardą ir slaptažodį, tada susieti - paskyrą su savo ID naudotojo nustatymuose. - </li> - </ul> continue: Užsiregistruoti terms accepted: AčiÅ«, kad patvirtinote naująsias talkininkų sąlygas! terms declined: AtsipraÅ¡ome, jei nesutinkate su naujomis Talkininkų sąlygomis. @@ -1880,6 +1883,7 @@ lt: heading: Naudotojas %{user} neegzistuoja body: AtsipraÅ¡ome, bet čia nėra jokio naudotojo vardu „%{user}“. Pasitikrinkite raÅ¡ybą, arba nuoroda, kurią jÅ«s paspaudėte yra klaidinga. + deleted: iÅ¡trinta view: my diary: Mano dienoraÅ¡tis new diary entry: naujas dienoraščio įraÅ¡as @@ -1932,16 +1936,16 @@ lt: revoke: administrator: AtÅ¡aukti administratoriaus teises moderator: AtÅ¡aukti moderatoriaus teises - block_history: buvę užblokavimai - moderator_history: gauti užblokavimai + block_history: AktyvÅ«s blokavimai + moderator_history: Gauti užblokavimai comments: Komentarai - create_block: blokuoti šį naudotoją - activate_user: aktyvuoti šį naudotoją - deactivate_user: aktyvuoti šį naudotoją - confirm_user: patvirtinti šį naudotoją - hide_user: slėpti šį naudotoją - unhide_user: nebeslėpti Å¡io naudotojo - delete_user: paÅ¡alinti šį naudotoją + create_block: Blokuoti šį naudotoją + activate_user: Aktyvuoti šį naudotoją + deactivate_user: IÅ¡jungti šį vartotoją + confirm_user: Patvirtinti šį naudotoją + hide_user: Paslėpti šį naudotoją + unhide_user: Nebeslėpti Å¡io naudotojo + delete_user: PaÅ¡alinti šį naudotoją confirm: Patvirtinti friends_changesets: draugų keitimai friends_diaries: draugų dienoraščių įraÅ¡ai @@ -1995,6 +1999,7 @@ lt: gravatar: gravatar: Naudoti Gravatar link text: kas tai? + disabled: Gravatar buvo iÅ¡jungtas. new image: Pridėti nuotrauką keep image: Palikti dabartinę nuotrauką delete image: PaÅ¡alintį dabartinę nuotrauką @@ -2030,8 +2035,8 @@ lt: success: Mes nusiuntėme jums naują patvirtinimo praneÅ¡imą į %{email} ir ten patvirtinsite savo paskyrą, kad galėtumėte pradėti žymėti.<br /><br />Jei jÅ«s naudojate įvairias programas prieÅ¡ spam'ą, įtraukite į patikimų adresų - sąrašą (Whitelist) webmaster@openstreetmap.org, nes kitaip negalėsime jums - nusiųsti jokių patvirtinimo užklausų. + sąrašą (Whitelist) %{sender}, nes kitaip negalėsime jums nusiųsti jokių patvirtinimo + užklausų. failure: Naudotojas %{name} nerastas. confirm_email: heading: Patvirtinkite e-paÅ¡to adreso pakeitimą @@ -2083,6 +2088,15 @@ lt: no_authorization_code: Nėra prieigos suteikimo kodo unknown_signature_algorithm: Nežinomas paraÅ¡o algoritmas invalid_scope: Neteisinga sritis + auth_association: + heading: JÅ«sų ID dar nėra susieta su OpenStreetMap sąskaita. + option_1: |- + Jei esate naujokas OpenStreetMap, praÅ¡ome sukurti naują paskyrą + naudodami žemiau pateiktą formą. + option_2: |- + Jei jau turite sąskaitą, galite prisijungti prie savo sąskaitos + naudodami savo vartotojo vardą ir slaptažodį, ir tada susieti paskyrą + su savo ID, savo vartotojo nustatymuose. user_role: filter: not_an_administrator: Tik administratoriai gali valdyti roles, o jÅ«s nesate @@ -2263,6 +2277,10 @@ lt: center_marker: Centruoti žemėlapį ties žymekliu paste_html: Ä®kelkite HTML, kad įdėtumėte į svetainę view_larger_map: ŽiÅ«rėti didesniame žemėlapyje + only_standard_layer: Tik standartinis sluoksnis gali bÅ«ti eksportuojamas kaip + paveikslėlis + embed: + report_problem: PraneÅ¡ti apie problemą key: title: Sutartiniai ženklai tooltip: Sutartiniai ženklai @@ -2328,12 +2346,33 @@ lt: mapquest_car: MaÅ¡ina (MapQuest) mapquest_foot: Pėsčiomis (MapQuest) osrm_car: MaÅ¡ina (OSRM) + mapzen_bicycle: Dviratis (Mapzen) + mapzen_car: Automobilis (Mapzen) + mapzen_foot: Pėda (Mapzen) directions: Nurodymai distance: Atstumas errors: no_route: Nepavyko rasti marÅ¡ruto tarp Å¡ių dviejų vietų. no_place: AtsipraÅ¡ome - nerandame tokios vietos. instructions: + continue_without_exit: Tęskite kelionę %{name} + slight_right_without_exit: DeÅ¡iniau į %{name} + turn_right_without_exit: Sukite deÅ¡inėn į %{name} + sharp_right_without_exit: Staigus posÅ«kis deÅ¡inėn į %{name} + uturn_without_exit: Apsisukite ties %{name} + sharp_left_without_exit: Staigus posÅ«kis kairėn į %{name} + turn_left_without_exit: Sukite kairėn į %{name} + slight_left_without_exit: Kairiau į %{name} + via_point_without_exit: (per taÅ¡ką) + follow_without_exit: Sekite %{name} + roundabout_without_exit: Žiede iÅ¡važiuokite į %{name} + leave_roundabout_without_exit: IÅ¡važiuokite iÅ¡ žiedo - %{name} + stay_roundabout_without_exit: Likite žiede - %{name} + start_without_exit: Pradėkite %{name} pabaigoje + destination_without_exit: Pasiekite tikslą + against_oneway_without_exit: Važiuokite prieÅ¡ eismą %{name} + end_oneway_without_exit: Vienpusio eismo pabaiga %{name} + roundabout_with_exit: Žiede iÅ¡važiuokite %{exit} iÅ¡važiavime į %{name} unnamed: bevardis courtesy: Nuorodas pateikė %{link} time: Laikas diff --git a/config/locales/lv.yml b/config/locales/lv.yml index 849312e94..af6fc1dff 100644 --- a/config/locales/lv.yml +++ b/config/locales/lv.yml @@ -2,16 +2,20 @@ # Exported from translatewiki.net # Export driver: phpyaml # Author: Admresdeserv. +# Author: Bbot22 # Author: Cuu508 +# Author: Edgars2007 # Author: GreenZeb # Author: Jmg.cmdi # Author: Karlis # Author: Lafriks +# Author: Macofe # Author: Nemo bis # Author: Papuass # Author: PeterisP # Author: Raitisx # Author: Ruila +# Author: Silraks # Author: Ttdnet --- lv: @@ -133,6 +137,7 @@ lv: feed: title: Izmaiņu kopa %{id} title_comment: Izmaiņu kopa %{id} - %{comment} + join_discussion: Ieejiet sistēmā lai pievienotos diskusijai discussion: Diskusija node: title: 'Punkts: %{name}' @@ -164,6 +169,7 @@ lv: way: lÄ«nija relation: relācija changeset: izmaiņu kopa + note: piezÄ«me timeout: sorry: Diemžēl dati %{type} ar id %{id}, prasÄ«ja pārāk daudz laika, lai ielādētu. type: @@ -171,6 +177,7 @@ lv: way: lÄ«nija relation: relācija changeset: izmaiņu kopa + note: piezÄ«me redacted: redaction: Redakcijas %{id} message_html: Versija %{version} no Å¡Ä« %{type} nevar tikt parādÄ«ta, jo tika @@ -211,6 +218,11 @@ lv: reopened_by_anonymous: Atkal aktivizēja anonÄ«ms <abbr title='%{exact_time}'>%{when} atpakaļ</abbr> hidden_by: Paslēpa %{user} <abbr title='%{exact_time}'>%{when} atpakaļ</abbr> + query: + title: Vaicājuma funkcijas + introduction: NoklikÅ¡Ä·iniet uz kartes, lai atrastu tuvumā esoÅ¡os objektus. + nearby: Tuvējie objekti + enclosing: Ietvertās funkcijas changeset: changeset_paging_nav: showing_page: Rāda lapu %{page} @@ -242,10 +254,16 @@ lv: sorry: Atvainojiet, jÅ«su pieprasÄ«to izmaiņu kopu ielāde prasÄ«ja pārāk daudz laika. rss: + title_all: Diskusija par izmaiņām OpenStreetMap + title_particular: 'Diskusija par OpenStreetMap izmaiņām #%{changeset_id}' + comment: 'Jauni komentāri par autora: %{author} pārmaiņām %{changeset_id}' + commented_at_html: Atjaunots %{when} atpakaļ + commented_at_by_html: '%{user} atjaunoja %{when} atpakaļ' full: Pilna diskusija diary_entry: new: title: Jauns dienasgrāmatas ieraksts + publish_button: Publicēt list: title: Lietotāju dienasgrāmatas title_friends: Draugu dienasgrāmatas @@ -323,7 +341,7 @@ lv: export: title: Eksportēt start: - area_to_export: Kvadrants, kuru eksportēt + area_to_export: Apgabals, kuru eksportēt manually_select: Manuāli izvēlēties citu teritoriju format_to_export: Eksportēšanas formāts osm_xml_data: OpenStreetMap XML dati @@ -382,8 +400,10 @@ lv: search_osm_nominatim: prefix: aerialway: + cable_car: Kabeļu MaÅ¡Ä«na chair_lift: Krēslu Pacēlājs drag_lift: VilkÅ¡anas Pacēlājs + gondola: Gondola Lifts station: Pacēlāja Stacija aeroway: aerodrome: Lidlauks @@ -394,6 +414,7 @@ lv: taxiway: Manevrēšanas ceļš terminal: Terminālis amenity: + animal_shelter: DzÄ«vnieku patversme arts_centre: Mākslas centrs atm: Bankomāts bank: Banka @@ -403,6 +424,7 @@ lv: bicycle_parking: Velosipēdu novietne bicycle_rental: Velosipēdu noma biergarten: Alus dārzs + boat_rental: Laivu noma brothel: Bordelis bureau_de_change: ValÅ«tas maiņas punkts bus_station: Autoosta @@ -412,8 +434,10 @@ lv: car_wash: Automazgātava casino: Kazino charging_station: Uzlādēšanas stacija + childcare: Bērnu aprÅ«pe cinema: Kino clinic: KlÄ«nika + clock: Pulkstenis college: Koledža community_centre: Sabiedriskais centrs courthouse: Tiesa @@ -432,6 +456,7 @@ lv: food_court: Ēstuves fountain: StrÅ«klaka fuel: Degviela + gambling: Azartspēles grave_yard: Kapsēta gym: Fitnesa centrs / Sporta zāle health_centre: VeselÄ«bas centrs @@ -442,11 +467,14 @@ lv: library: Bibliotēka market: Tirgus marketplace: Tirgus + monastery: Klosteris + motorcycle_parking: Motociklu stāvvieta nightclub: Naktsklubs nursery: Pirmsskolas mācÄ«bu iestāde nursing_home: Pansionāts office: Birojs parking: Autostāvvieta + parking_entrance: Autostāvvietas iebrauktuve pharmacy: Aptieka place_of_worship: Dievnams police: Policija @@ -480,6 +508,7 @@ lv: veterinary: Veterinārā Ä·irurÄ£ija village_hall: Pagastmāja waste_basket: Atkritumu grozs + waste_disposal: Atkritumu izgāztuve youth_centre: JaunieÅ¡u centrs boundary: administrative: AdministratÄ«vā robeža @@ -494,14 +523,30 @@ lv: "yes": Tilts building: "yes": Ēka + craft: + brewery: Alus darÄ«tava + carpenter: Galdnieks + electrician: ElektriÄ·is + gardener: Dārznieks + painter: Krāsotājs + photographer: Fotogrāfs + plumber: SantehniÄ·is + shoemaker: Kurpnieks + tailor: Drēbnieks + "yes": Amatnieks emergency: + ambulance_station: Ātrās PalÄ«dzÄ«bas staciija + defibrillator: Defibrilators + landing_site: Avārijas nosēšanās vieta phone: Telefons ārkārtas situācijai highway: + abandoned: Pamests lielceļš bridleway: Izjādes taka bus_guideway: Vadāmais Autobuss bus_stop: Autobusa pietura construction: AutomaÄ£istrāle bÅ«vniecÄ«bas stadijā cycleway: Veloceliņš + elevator: Lifts emergency_access_point: Ārkārtas piekļuves punkts footway: Taka ford: Fjords @@ -517,7 +562,7 @@ lv: primary_link: Galvenais valsts ceļš proposed: Ieplānots Ceļš raceway: SacensÄ«bu trase - residential: DzÄ«vojamā zona + residential: DzÄ«vojamais ceļš rest_area: AtpÅ«tas zona road: Ceļš secondary: Sekundāras nozÄ«mes ceļš @@ -530,11 +575,13 @@ lv: tertiary: PaÅ¡valdÄ«bu autoceļi tertiary_link: PaÅ¡valdÄ«bu autoceļš track: Zemesceļš + traffic_signals: Satiksmes regulators trail: Taka trunk: MaÄ£istrālais ceļš trunk_link: MaÄ£istrālais ceļš unclassified: Neklasificēts ceļš unsurfaced: Ceļš bez seguma + "yes": Ceļš historic: archaeological_site: ArheoloÄ£isku izrakumu vieta battlefield: Kaujas lauks @@ -546,6 +593,7 @@ lv: city_gate: Pilsētas vārti citywalls: Pilsētas Sienas fort: Forts + heritage: KultÅ«ras mantojums house: Māja icon: Ikona manor: Muiža @@ -560,6 +608,8 @@ lv: wayside_cross: Krusts ceļmalā wayside_shrine: Ceļmalas svētnÄ«ca wreck: Vraks + junction: + "yes": Krustojums landuse: allotments: Mazdārziņi basin: Rezervuārs @@ -591,14 +641,19 @@ lv: road: Ceļa Apgabals village_green: Ciema Centrālais Parks vineyard: VÄ«na dārzs + "yes": Zemes izmantojums leisure: beach_resort: Pludmales kÅ«rorts bird_hide: Putnu Slēptuve + club: Klubs common: KoplietoÅ¡anas zeme + dog_park: Suņu laukums fishing: Zvejas apgabals + fitness_centre: Fitnesa centrs fitness_station: Fitnesa Stacija garden: Dārzs golf_course: Golfa laukums + horse_riding: Zirgu izjādes ice_rink: Ledus halle marina: Osta miniature_golf: Minigolfs @@ -607,6 +662,7 @@ lv: pitch: Sporta laukums playground: Spēļu laukums recreation_ground: AtpÅ«tas Zona + resort: KÅ«rorts sauna: Pirts slipway: Stāpelis sports_centre: Sporta centrs @@ -614,6 +670,13 @@ lv: swimming_pool: Peldbaseins track: Skrejceļš water_park: Ūdens atrakciju parks + "yes": AtpÅ«tas vieta + man_made: + lighthouse: Bāka + pipeline: Cauruļvads + tower: Tornis + works: RÅ«pnÄ«ca + "yes": Cilvēku radÄ«ts military: airfield: Militārais lidlauks barracks: Barakas @@ -633,6 +696,7 @@ lv: forest: Mežs geyser: Geizers glacier: Ledājs + grassland: Pļava heath: TÄ«relis hill: Kalns island: Sala @@ -645,6 +709,8 @@ lv: reef: Rifs ridge: Grēda rock: Klints + saddle: Segli + sand: Smiltis scree: Nogāze scrub: KrÅ«mājs spring: Avots @@ -658,6 +724,7 @@ lv: wood: Mežs office: accountant: Grāmatvedis + administrative: Administrācija architect: Arhitekts company: Uzņēmums employment_agency: NodarbinātÄ«bas aÄ£entÅ«ra @@ -670,6 +737,8 @@ lv: travel_agent: TÅ«risma aÄ£entÅ«ra "yes": Birojs place: + allotments: Mazdārziņi + block: Bloks airport: Lidosta city: Pilsēta country: Valsts @@ -694,6 +763,7 @@ lv: town: Pilsēta unincorporated_area: Neiekļauts apgabals village: Ciems + "yes": Vieta railway: abandoned: Pamests dzelzceļš construction: Dzelzceļš bÅ«vniecÄ«bas stadijā @@ -714,7 +784,7 @@ lv: spur: Dzelzceļa Atradze station: Dzelzceļa stacija stop: Dzelzceļa Pietura - subway: Metro stacija + subway: Metro subway_entrance: Metro ieeja switch: Dzelzceļa punkti tram: Tramvajs @@ -796,6 +866,7 @@ lv: "yes": Veikals tourism: alpine_hut: Kalnu bÅ«da + apartment: DzÄ«vokļi artwork: Mākslas darbs attraction: Atrakcija bed_and_breakfast: Guļamvieta un brokastis @@ -803,6 +874,7 @@ lv: camp_site: Nometnes vieta caravan_site: Kempings chalet: Kotedža + gallery: Galerija guest_house: Viesu nams hostel: Hostelis hotel: ViesnÄ«ca @@ -834,6 +906,7 @@ lv: wadi: Izkaltusi upes gultne waterfall: Ūdenskritums weir: Dambis + "yes": Ūdensceļš admin_levels: level2: Valsts robeža level4: Å tata robeža @@ -918,7 +991,7 @@ lv: legal_babble: title_html: AutortiesÄ«bas un Licence intro_1_html: |- - OpenStreetMap ir <i>atvērti dati</i>, kad licencēti zem <a + OpenStreetMap ir <i>atvērto datu</i>, kad licencēti zem <a href="http://opendatacommons.org/licenses/odbl/">Atvērtās Datu Kopas Atvērtās Datubāzes licences</a> (ODbL). intro_2_html: |- Tu vari kopēt, izplatÄ«t, nosÅ«tÄ«t un adaptēt mÅ«su kartes @@ -983,6 +1056,11 @@ lv: contributors_nz_html: |- <strong>Jaunzēlande</strong>: Ietver datus no Land Information New Zealand. Crown Copyright reserved. + contributors_si_html: |- + <strong>Slovēnija</strong>: Satur datus no + <a href="http://www.gu.gov.si/en/">Aptauju un kartogrāfijas aÄ£entÅ«ras</a> un + <a href="http://www.mkgp.gov.si/en/">LauksaimniecÄ«bas, mežsaimniecÄ«bass un pārtikas ministrijas</a> + (Slovēnijas publiskā informācija). contributors_za_html: |- <strong>Dienvidāfrika</strong>: Ietver datus no <a href="http://www.ngi.gov.za/">Chief Directorate: @@ -1010,6 +1088,11 @@ lv: mÅ«su <a href="http://www.osmfoundation.org/wiki/License/Takedown_procedure">noņemÅ¡anas procedÅ«ru</a> vai paziņo pa tieÅ¡o mums, izmantojot <a href="http://dmca.openstreetmap.org/">on-line ziņoÅ¡anas veidni</a>. + trademarks_title_html: <span id="trademarks"></span>ReÄ£istrētas preču zÄ«mes + trademarks_1_html: OpenStreetMap, lupa un Å¡tata karte ir reÄ£istrētas OpenStreetMap + fonda preču zÄ«mes. Ja jums ir jautājumi par mÅ«su logotipu lietoÅ¡anu, lÅ«dzu + sÅ«tiet jÅ«su jautājumus uz <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">Licence + Working Group</a>. welcome_page: title: Laipni lÅ«dzam! introduction_html: Sveicināts OpenStreetMap, bezmaksas un rediģējamā pasaules @@ -1035,6 +1118,14 @@ lv: vai māja. tag_html: <strong>Birka</strong> ir dati par punktu vai ceļu, kā restorāna nosaukums vai ceļa ātruma ierobežojums. + rules: + title: Noteikumi! + paragraph_1_html: OpenStreetMap ir tikai daži formālie noteikumi, bet mēs ceram, + ka visi dalÄ«bnieki sadarbosies un komunicēs ar mÅ«su kopienu un tās biedriem. + Ja jÅ«s apsverat citas iespējas, kas nav manuālā rediģēšana ar roku tad lÅ«dzu + izlasiet un sekojiet pamācÄ«bām <a href='http://wiki.openstreetmap.org/wiki/Import/Guidelines'>Importi</a> + un <a href='http://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct'>Automātiskā + rediģēšana</a>. questions: title: Kādi jautājumi? paragraph_1_html: NepiecieÅ¡ama palÄ«dzÄ«ba kartējot, vai nav skaidrs kā lietot @@ -1055,6 +1146,20 @@ lv: title: Kā palÄ«dzēt join_the_community: title: Pievienojies kopienai + explanation_html: Konstatējot problēmas ar mÅ«su kartes datiem, piemēram trÅ«kstoÅ¡u + ceļu vai adresi, labākais variants, kā rÄ«koties ir pievienoties OpenStreetMap + kopienai un pievienot vai atjaunot datus jums paÅ¡am. + add_a_note: + instructions_html: NoklikÅ¡Ä·iniet uz <a class='icon note'></a> vai arÄ« uz tās + paÅ¡as ikonas kartes displejā. Tādā veidā jÅ«s pievienosiet marÄ·ieri Å¡ai kartei, + kuru jÅ«s varēsiet izkustināt, 'velkot'. Pievienojiet savu ziņu un tad uzspiediet + 'Saglabāt' un pārējie lietotāji to izpētÄ«s. + other_concerns: + title: Citas bažas + explanation_html: "Ja jums ir bažas par to, kā mÅ«su dati tiek izmantoti, vai + par saturu, lÅ«dzu, skatiet mÅ«su\n<a href=\"/copyright\">autortiesÄ«bu lapu,</a> + lai iegÅ«tu juridisko informāciju, vai sazinieties ar atbilstoÅ¡o \n<a href=\"http://wiki.osmfoundation.org/wiki/Working_Groups\">OSMF + darba grupu</a>." help_page: title: PalÄ«dzÄ«bas saņemÅ¡ana introduction: OpenStreetMap ir vairāki resursi, lai uzzinātu par projektu, uzdotu @@ -1065,11 +1170,28 @@ lv: description: Sāc ar Å¡o Ä«so ceļvedi, kurÅ¡ aptver OpenStreetMap pamatus. beginners_guide: url: http://wiki.openstreetmap.org/wiki/Lv:Beginners%27_guide + title: Iesācēja Rokasgrāmata + description: Lietotāju uzturēta pamācÄ«ba priekÅ¡ iesācējiem. help: url: http://forum.openstreetmap.org/viewforum.php?id=59 title: help.openstreetmap.org description: Uzdod jautājumu vai atrodi atbildes iekÅ¡ OSM jautājumu un atbilžu lapas. + mailing_lists: + title: Adresātu Saraksti + description: Uzdodiet jautājumu vai apspriediet interesējošās tēmas par vispārējajiem + vai reÄ£ionālajiem adresātu sarakstiem. + forums: + title: Forumi + description: Jautājumi un diskusijas priekÅ¡ tiem, kuri dod priekÅ¡roku foruma-tipa + interfeisa stilam. + irc: + title: IRC + description: InteraktÄ«vais čats dažādās valodās par dažādām tēmām. + switch2osm: + title: switch2osm + description: PalÄ«dzÄ«ba uzņēmumiem un organizācijām, kuras pāriet uz OpenStreetMap + balstÄ«tajām kartēm un citiem pakalpojumiem. wiki: url: http://wiki.openstreetmap.org/ title: wiki.openstreetmap.org @@ -1098,6 +1220,11 @@ lv: veidotājiem. Ja tu maini vai bÅ«vē pa virtsu datiem dažādos veidos, tu vai tos izplatÄ«t tikai zem tās paÅ¡as licences. Apskati <a href=''%{copyright_path}''>AutortiesÄ«bu un Licences lapu</a> priekÅ¡ padziļinātas informācijas.' + legal_title: Juridiskie jautājumi + legal_html: "Å o vietni un daudzus citus ar to saistÄ«tos pakalpojumus oficiāli + pārvalda <a href='http://osmfoundation.org/'>OpenStreetMap fonds</a> (OSMF) + kopienas vārdā.\n<br> \nLÅ«dzu <a href='http://osmfoundation.org/Contact'>sazinieties + OSMF</a>, ja jums ir jautājumi par autortiesÄ«bām vai citiem juridiskajiem jautājumiem." partners_title: Partneri notifier: diary_comment_notification: @@ -1198,6 +1325,19 @@ lv: commented_note: '[OpenStreetMap] %{commenter} ir atkal aktivizējis kādu piezÄ«mi, kur esi komentējis. PiezÄ«me ir netālu no %{place}.' details: Vairāk informācijas par piezÄ«mēm var atrast %{url}. + changeset_comment_notification: + greeting: Sveicināti, + commented: + subject_own: '[OpenStreetMap] %{commenter} ir komentējis kādu no tavām izmaiņām' + subject_other: '[OpenStreetMap] %{commenter} ir komentējis kādu no izmaiņām, + kas jÅ«s interesē' + your_changeset: '%{commenter} komentēja vienu no jÅ«su izmaiņām, kas tika veiktas + %{time}' + commented_changeset: '%{commenter} komentēja kartes izmaiņu, kuru veica %{changeset_author} + %{time} un, kura jÅ«s interesē' + partial_changeset_with_comment: ar komentāru '%{changeset_comment}' + partial_changeset_without_comment: bez komentāra + details: Vairāk informācijas par izmaiņām varat atrast %{url}. message: inbox: title: iesÅ«tne @@ -1286,7 +1426,7 @@ lv: not_public: Tu neesi iestādÄ«jis, lai tavi labojumi bÅ«tu publiski. not_public_description: Tu vairs nevari rediģēt karti, ja vien tā neizdari. Tu vari uzstādÄ«t savus labojumus kā publiskus no savas %{user_page}s. - user_page_link: lietotāja lapa + user_page_link: dalÄ«bnieka lapa anon_edits_link_text: Uzzini, kāpēc tā notiek. flash_player_required: Jums nepiecieÅ¡ams Flash playeris lai izmantotu Potlatch - OpenStreetMap Flash redaktoru. JÅ«s varat <a href="http://www.adobe.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash">Lejupielādēt @@ -1307,6 +1447,10 @@ lv: close: Aizvērt search: search: Meklēt + get_directions: IegÅ«t norādÄ«jumus + get_directions_title: IegÅ«t norādÄ«jumus starp diviem punktiem + from: "No" + to: Uz where_am_i: Kur es esmu? where_am_i_title: Aprakstiet paÅ¡reizējo atraÅ¡anās vietu izmantojot meklētāju submit_text: OK @@ -1314,15 +1458,17 @@ lv: table: entry: motorway: AutomaÄ£istrāle + main_road: Galvenais ceļš trunk: MaÄ£istrālais ceļš primary: Galvenais valsts ceļš secondary: Sekundāras nozÄ«mes ceļš unclassified: Neklasificēts ceļš - unsurfaced: Ceļš bez seguma track: Zemesceļš - byway: Blakusceļš bridleway: Izjādes taka cycleway: Veloceliņš + cycleway_national: Valsts velosipēdceļš + cycleway_regional: ReÄ£ionālais velosipēdceļš + cycleway_local: Vietējais velosipēdceļš footway: Gājēju ceļš rail: Dzelzceļš subway: Metro @@ -1344,7 +1490,6 @@ lv: golf: Golfa laukums park: Parks resident: DzÄ«vojamā zona - tourist: TÅ«risma atrakcija common: - KoplietoÅ¡anas zeme - Pļava @@ -1374,9 +1519,11 @@ lv: tunnel: Tunelis bridge: Tilts private: Privāta pieeja - permissive: BrÄ«va pieeja destination: GalamērÄ·a pieeja construction: Ceļi bÅ«vniecÄ«bas stadijā + bicycle_shop: Velosipēdu veikals + bicycle_parking: Velosipēdu novietne + toilets: Tualetes richtext_area: edit: Labot preview: PriekÅ¡skatÄ«jums @@ -1536,6 +1683,7 @@ lv: allow_read_gpx: lasÄ«t jÅ«su privātās GPS trases. allow_write_gpx: augÅ¡upielādēt GPS trases. allow_write_notes: labot piezÄ«mes. + grant_access: PieÅ¡Ä·irt piekļuvi oauthorize_success: title: Autorizācijas pieprasÄ«jums atļauts allowed: Tu esi pieÅ¡Ä·Ä«ris tiesÄ«bas %{app_name} piekļūt tavam lietotājam. @@ -1620,6 +1768,7 @@ lv: register now: ReÄ£istrēties with username: 'Jau ir OpenStreetMap lietotājs? LÅ«dzu autorizējies ar savu lietotājvārdu un paroli:' + with external: AlternatÄ«vi, varat izmantot trešās puses 'ielogoÅ¡anās' opciju new to osm: Jauns iekÅ¡ OpenStreetMap? to make changes: Lai veiktu izmaiņas OpenStreetMap datos, jums jābÅ«t savam kontam. create account minute: Izveidojiet kontu. Tas aizņem mazāk par minÅ«ti. @@ -1632,6 +1781,34 @@ lv: pārzini</a>, ja tu vēlies Å¡o diskutēt. auth failure: Diemžēl nevarēja ieiet ar Å¡iem datiem openid_logo_alt: Pieteikties ar OpenID + auth_providers: + openid: + title: Pieslēgties ar OpenID + alt: Pieslēgties ar OpenID saiti + google: + title: Pieslēgties ar Google + alt: Pieslēgties ar Google OpenID + facebook: + title: Pieslēgties ar Facebook + alt: Pieslēgties ar Facebook kontu + windowslive: + title: Pieslēgties ar Windows Live + alt: Pieslēgties ar Windows Live kontu + github: + title: Pieslēgties ar GitHub + alt: Pieslēgties ar GitHub kontu + wikipedia: + title: Ieiet ar Vikipēdiju + alt: Ieiet ar Vikipēdijas kontu + yahoo: + title: Pieslēgties ar Yahoo + alt: Pieslēgties ar Yahoo OpenID + wordpress: + title: Pieslēgties ar WordPress + alt: Pieslēgties ar WordPress OpenID + aol: + title: Pieslēgties ar AOL + alt: Pieslēgties ar AOL OpenID logout: title: Iziet heading: Iziet no OpenStreetMap @@ -1657,9 +1834,9 @@ lv: new: title: ReÄ£istrēties no_auto_account_create: Diemžēl mēs Å¡obrÄ«d nevaram izveidot kontu automātiski. - contact_webmaster: LÅ«dzu kontaktējies ar <a href="mailto:webmaster@openstreetmap.org">tÄ«mekļa - pārzini</a>, lai organizētu lietotāja izveidi - mēs centÄ«simies un tiksim - galā ar tavu pieprasÄ«jumu, cik ātri vien iespējams. + contact_webmaster: LÅ«dzu kontaktējies ar <a href="%{webmaster}">tÄ«mekļa pārzini</a>, + lai organizētu lietotāja izveidi - mēs centÄ«simies un tiksim galā ar tavu + pieprasÄ«jumu, cik ātri vien iespējams. about: header: BrÄ«vs un rediģējams html: |- @@ -1676,8 +1853,12 @@ lv: display name: 'Rādāmais vārds:' display name description: Vārds, kas tiks rādÄ«ts publiski. JÅ«s to vēlāk varēsiet izmainÄ«t iestatÄ«jumos. + external auth: 'TreÅ¡o PuÅ¡u Autentifikācija:' password: 'Parole:' confirm password: 'Parole (pārbaudei):' + use external auth: AlternatÄ«vi, varat izmantot trešās puses 'ielogoÅ¡anās' opciju + auth no password: Ar trešās partijas autentifikāciju nav nepiecieÅ¡ama parole, + bet dažiem rÄ«kiem vai serveriem tā vēl joprojām varētu bÅ«t nepiecieÅ¡ama. continue: ReÄ£istrēties terms accepted: Paldies, ka pieņēmāt jaunos devuma noteikumus! terms declined: Mums žēl, ka tu izvēlējies nepieņemt jaunos Veidotāju Noteikumus. @@ -1707,15 +1888,16 @@ lv: heading: Lietotājs %{user} neeksistē body: Atvaino, nav lietotāja ar lietotājvārdu %{user}. LÅ«dzu pārbaudi pareizrakstÄ«bu, vai varbÅ«t saite, uz kuras Tu uzspiedi, ir nepareiza. + deleted: dzēsts view: - my diary: Mana Dienasgrāmata + my diary: Mana dienasgrāmata new diary entry: jauns dienasgrāmatas ieraksts - my edits: Mani Labojumi - my traces: Manas Trases - my notes: Manas kartes PiezÄ«mes - my messages: Manas Ziņas - my profile: Mans Profils - my settings: Mani IestatÄ«jumi + my edits: Mani labojumi + my traces: Manas pēdas + my notes: Manas piezÄ«mes + my messages: Manas ziņas + my profile: Mans profils + my settings: Mani iestatÄ«jumi my comments: Mani komentāri oauth settings: OAuth uzstādÄ«jumi blocks on me: Bloki uz mani @@ -1758,16 +1940,16 @@ lv: revoke: administrator: Atņemt administratora tiesÄ«bas moderator: Atņemt moderatora tiesÄ«bas - block_history: saņemtie bloķējumi + block_history: AktÄ«vie bloki moderator_history: dotie bloķējumi comments: Komentāri - create_block: bloķēt Å¡o lietotāju - activate_user: aktivizēt Å¡o lietotāju - deactivate_user: deaktivizēt Å¡o lietotāju - confirm_user: apstiprināt Å¡o lietotāju - hide_user: slēpt Å¡o lietotāju - unhide_user: parādÄ«t Å¡o lietotāju - delete_user: dzēst Å¡o lietotāju + create_block: Bloķēt Å¡o lietotāju + activate_user: Aktivizēt Å¡o lietotāju + deactivate_user: Deaktivizēt Å¡o lietotāju + confirm_user: Apstiprināt Å¡o lietotāju + hide_user: Slēpt Å¡o dalÄ«bnieku + unhide_user: ParādÄ«t Å¡o dalÄ«bnieku + delete_user: Dzēst Å¡o dalÄ«bnieku confirm: Apstiprināt friends_changesets: SkatÄ«t visas draugu izmaiņu kopas friends_diaries: SkatÄ«t visus draugu dienasgrāmatu ierakstus @@ -1783,6 +1965,7 @@ lv: current email address: 'PaÅ¡reizējā e-pasta adrese:' new email address: 'Jauna e-pasta adrese:' email never displayed publicly: (nekad netiek rādÄ«ta publiski) + external auth: 'Ārējā autentifikācija:' openid: link: http://wiki.openstreetmap.org/wiki/OpenID link text: Kas tas ir? @@ -1817,6 +2000,8 @@ lv: gravatar: gravatar: Izmantot Gravatar link text: kas Å¡is ir? + disabled: Gravatar ir atspējots. + enabled: JÅ«su Gravatar apskate ir iespējota new image: Pievienot attēlu keep image: Paturēt paÅ¡reizējo attēlu delete image: Novākt paÅ¡reizējo attēlu @@ -1849,7 +2034,7 @@ lv: confirm_resend: success: Mēs nosÅ«tÄ«jām jaunu pārbaudes e-pastu uz %{email} un tiklÄ«dz tu apstiprināsi savu lietotāju, tu varēti kartēt.<br /><br />Ja tu lieto pretmēstuļu sistēmu, - kura nosÅ«ta pārbaudes pieprasÄ«jumus, tad pārliecinies, ka esi ielicis webmaster@openstreetmap.org + kura nosÅ«ta pārbaudes pieprasÄ«jumus, tad pārliecinies, ka esi ielicis %{sender} baltajā sarakstā, jo mēs nevaram atbildēt uz pārbaudes pieprasÄ«jumiem. failure: Lietotājs %{name} nav atrasts. confirm_email: @@ -1857,8 +2042,10 @@ lv: press confirm button: Spied uz apstiprināšanas pogu zemāk, lai apstiprinātu savu jauno e-pasta adresi. button: Apstiprināt - success: JÅ«su e-pasta adrese ir apstiprināta, paldies par reÄ£istrēšanos! + success: Apstiprinājām jÅ«su epasta adreses maiņu! failure: E-pasta adrese jau ir apstiprināta ar Å¡o pilnvaru. + unknown_token: Å im apstiprinājuma kodam ir izbeidzies derÄ«guma termiņš vai arÄ« + tas neeksistē. set_home: flash success: Mājas atraÅ¡anās vieta veiksmÄ«gi saglabāta go_public: @@ -1900,6 +2087,18 @@ lv: Å o lēmumu drÄ«z pārskatÄ«s administrators, vai tu vari sazināties ar %{webmaster}, ja tu vēlies apspriesties par Å¡o. </p> + auth_failure: + connection_failed: Neizdevās savienoties ar autentifikācijas sniedzēju + invalid_credentials: NederÄ«gi autentifikācijas dati + no_authorization_code: Nav autorizācijas koda + unknown_signature_algorithm: Nezināms paraksta algoritms + invalid_scope: NederÄ«gs lauks + auth_association: + heading: JÅ«su ID nav vēl asociēts ar OpenStreetMap kontu. + option_1: Ja jÅ«s tikko iepazināties ar OpenStreetMap tad lÅ«dzu izveidojiet jaunu + kontu izmantojot zemāk esoÅ¡o formu. + option_2: Ja jums jau ir konts, jÅ«s varat ieiet savā kontā izmantojot jÅ«su lietotājvārdu + un paroli un tad sasaistÄ«t savu kontu ar jÅ«su ID lietotāja iestatÄ«jumos. user_role: filter: not_an_administrator: Tikai administratori var veikt lietotāju lomu pārvaldi, @@ -2014,6 +2213,8 @@ lv: heading: '%{block_on} bloķēts pēc %{block_by}' time_future: Beidzas %{time} time_past: Beidzās %{time} atpakaļ. + created: Izveidots + ago: '%{time} atpakaļ' status: Statuss show: RādÄ«t edit: Labot @@ -2064,6 +2265,7 @@ lv: link: Saite vai HTML long_link: Saite short_link: Īsā saite + geo_uri: Ä¢eo saite embed: HTML custom_dimensions: UzstādÄ«t pielāgotus izmērus format: 'Formāts:' @@ -2075,10 +2277,13 @@ lv: center_marker: Centrēt karti uz marÄ·ieri paste_html: IelÄ«mē HTML, lai ievietotu mājaslapā view_larger_map: SkatÄ«t lielāku karti + only_standard_layer: Tikai standarta slāni var eksportēt kā attēlu + embed: + report_problem: Ziņot par problēmu key: title: ApzÄ«mējumi tooltip: ApzÄ«mējumi - tooltip_disabled: Kartes leÄ£enda pieejama tikai Standarta slānim + tooltip_disabled: Kartes leÄ£enda Å¡im slānim nav pieejama map: zoom: in: Palielināt @@ -2106,17 +2311,24 @@ lv: createnote_disabled_tooltip: Pietuvini karti, lai pievienotu piezÄ«mi map_notes_zoom_in_tooltip: Pietuvināt, lai redzētu piezÄ«mes map_data_zoom_in_tooltip: Pietuvināt, lai redzētu kartes datus + queryfeature_tooltip: Vaicājuma funkcijas + queryfeature_disabled_tooltip: Tuvināt pie kārtas funkcijām changesets: show: + comment: Komentēt + subscribe: Abonēt + unsubscribe: Atteikties no abonējuma hide_comment: paslēpt + unhide_comment: parādÄ«t notes: new: intro: PiezÄ«mes domātas, lai norādÄ«tu uz kartes kļūdām. Ja vēlies pamēģināt pats ievietot informāciju, zÄ«mēt vai izlabot kļūdu, izmanto pogu "Labot" lapas augÅ¡pusē. PiezÄ«mes parādās citiem kartētājiem, tādēļ lÅ«dzu, cik vien iespējams precÄ«zāk un detalizētāk visu izklāsti, kā arÄ« marÄ·ieri novieto - pēc iespējas pareizākajā pozÄ«cijā. - add: Pievienot PiezÄ«mi + pēc iespējas pareizākajā pozÄ«cijā. (LÅ«dzu neizmantojiet personÄ«go informāciju + vai arÄ« informāciju no citām ar autortiesÄ«bām aizsargātām kartēm.) + add: Pievienot piezÄ«mi show: anonymous_warning: Å Ä« piezÄ«me ietver komentārus no anonÄ«miem lietotājiem, kurus nepiecieÅ¡ams pārbaudÄ«t neatkarÄ«gi. @@ -2126,6 +2338,61 @@ lv: comment_and_resolve: Komentēt un Atrisināt comment: Komentēt edit_help: Pārvieto karti un pietuvini vietai, kuru vēlies labot, tad spied Å¡eit. + directions: + engines: + graphhopper_bicycle: Ar velosipēdu (GraphHopper) + graphhopper_foot: Ar kājām (GraphHopper) + mapquest_bicycle: Ar velosipēdu (MapQuest) + mapquest_car: Ar maÅ¡Ä«nu (MapQuest) + mapquest_foot: Ar kājām (MapQuest) + osrm_car: Ar maÅ¡Ä«nu (OSRM) + mapzen_bicycle: Ar velosipēdu (Mapzen) + mapzen_car: Ar maÅ¡Ä«nu (Mapzen) + mapzen_foot: Ar kājām (Mapzen) + directions: Norādes + distance: Attālums + errors: + no_route: Nevarēja atrast marÅ¡rutu starp Å¡Ä«m divām vietām. + no_place: Atvainojiet - nevarēja atrast Å¡o vietu. + instructions: + continue_without_exit: Turpināt uz %{name} + slight_right_without_exit: Nedaudz pa labi uz %{name} + offramp_right_without_exit: Izmantojiet slÄ«pumu pa labi uz %{name} + onramp_right_without_exit: Pagriezieties pa labi uz slÄ«puma pie %{name} + endofroad_right_without_exit: Ceļa beigās nogriezieties pa labi uz %{name} + merge_right_without_exit: Izgriezieties uz %{name} + fork_right_without_exit: Krustojumā pagriezieties pa labi uz %{name} + turn_right_without_exit: Pagriezieties pa labi uz %{name} + sharp_right_without_exit: Pagriezieties strauji pa labi uz %{name} + uturn_without_exit: Griezieties atpakaļgaitā garām %{name} + sharp_left_without_exit: Nogriezieties strauji pa kreisi uz %{name} + turn_left_without_exit: Nogriezieties pa kreisi uz %{name} + offramp_left_without_exit: Izmantojiet slÄ«pumu pa kreisi uz %{name} + onramp_left_without_exit: Pagriezieties pa kreisi uz slÄ«puma pie %{name} + endofroad_left_without_exit: Ceļa beigās nogriezieties pa kreisi uz %{name} + merge_left_without_exit: Izgriezieties pa kreisi uz %{name} + fork_left_without_exit: Krustojumā pagriezieties pa kreisi uz %{name} + slight_left_without_exit: Iegriezieties nedaudz pa kreisi uz %{name} + via_point_without_exit: (caur punktu) + follow_without_exit: Sekot %{name} + roundabout_without_exit: Pie apkārtceļa griezieties pie %{name} + leave_roundabout_without_exit: Atstājiet apkārtceļu - %{name} + stay_roundabout_without_exit: Palieciet apkārtceļā - %{name} + start_without_exit: Startēt beigās pie %{name} + destination_without_exit: Sasniedziet galamērÄ·i + against_oneway_without_exit: Brauciet pret vienvirziena ceļu pie %{name} + end_oneway_without_exit: Vienvirziena ceļa beigas pie %{name} + roundabout_with_exit: Pēc apkārtceļa nogriezieties uz izejas %{exit} pie %{name} + unnamed: nenosaukts ceļš + courtesy: Virzienos, pieklājÄ«gi no %{link} + time: Laiks + query: + node: Punkts + way: Ceļš + relation: Relācija + nothing_found: Nav atrastas iespējas + error: 'Kļūda sazinoties ar %{server}: %{error}' + timeout: Saskares laiks pārsniedza %{server} redaction: edit: description: Apraksts diff --git a/config/locales/mk.yml b/config/locales/mk.yml index 03a7b271b..d247d1891 100644 --- a/config/locales/mk.yml +++ b/config/locales/mk.yml @@ -2,6 +2,7 @@ # Exported from translatewiki.net # Export driver: phpyaml # Author: Bjankuloski06 +# Author: Macofe # Author: Nemo bis --- mk: @@ -164,6 +165,7 @@ mk: way: пат relation: однос changeset: измени + note: белешка timeout: sorry: Жалиме, но добивањето на податоците за %{type} со id %{id} трае предолго. type: @@ -171,6 +173,7 @@ mk: way: пат relation: однос changeset: менувач + note: белешка redacted: redaction: Редакција %{id} message_html: Верзијата %{version} на оваа %{type} не може да се прикаже бидејќи @@ -180,12 +183,12 @@ mk: way: пат relation: однос start_rjs: - feature_warning: Вчитувам %{num_features} функции, што може да ви го забави + feature_warning: Вчитувам %{num_features} елементи, што може да ви го забави прелистувачот. Дали сте сигурни дека сакате да се прикажат овие податоци? load_data: Вчитај ги податоците loading: Вчитувам... tag_details: - tags: Ознакиж + tags: Ознаки wiki_link: key: Викистраницата за опис на ознаката %{key} tag: Вики-страницата за ознаката %{key}=%{value} @@ -211,10 +214,10 @@ mk: %{when}</abbr> hidden_by: Скриено од %{user} <abbr title='%{exact_time}'>пред %{when}</abbr> query: - title: Пребарување на особености - introduction: Стиснете на картата за да ги најдете особеностите во близина. - nearby: Особености во близина - enclosing: Обиколни особености + title: Пребарување на елементи + introduction: Стиснете на картата за да ги најдете елементите во близина. + nearby: Елементи во близина + enclosing: Обиколни елементи changeset: changeset_paging_nav: showing_page: Страница %{page} @@ -255,6 +258,7 @@ mk: diary_entry: new: title: Нова дневничка ставка + publish_button: Објави list: title: Дневници на корисници title_friends: Дневници на пријателите @@ -336,7 +340,7 @@ mk: format_to_export: Формат за извоз osm_xml_data: OpenStreetMap XML податоци map_image: Слика на картата (прикажува стандарден слој) - embeddable_html: Вметнат HTML код + embeddable_html: HTML-код за вметнување licence: Лиценца export_details: Податоците на OpenStreetMap се нудат под <a href="http://opendatacommons.org/licenses/odbl/1.0/">Лиценцата за отворени бази на Складиштето на отворени податоци</a> (ODbL, Open Data @@ -354,7 +358,7 @@ mk: title: Извршник „Надвозник“ description: Преземете ја оваа рамка од огледална база на базата на OpenStreetMap geofabrik: - title: Geofabrik + title: Преземања на Geofabrik description: Редовно подновувани извадоци од континенти, земји и избрани градови metro: @@ -366,7 +370,7 @@ mk: options: Нагодувања format: Формат scale: Размер - max: макс. + max: најв. image_size: Големина на сликата zoom: Приближи add_marker: Додај бележник на картата @@ -379,16 +383,16 @@ mk: search: title: latlon: <a href="http://openstreetmap.org/">Внатрешни резултати</a> - us_postcode: Резултати од <a href="http://geocoder.us/">Geocoder.us</a> - uk_postcode: Резултати од <a href="http://www.npemap.org.uk/">NPEMap / FreeThe + us_postcode: Исход од <a href="http://geocoder.us/">Geocoder.us</a> + uk_postcode: Исход од <a href="http://www.npemap.org.uk/">NPEMap / FreeThe Postcode</a> - ca_postcode: Резултати од <a href="http://geocoder.ca/">Geocoder.CA</a> - osm_nominatim: Резултати од <a href="http://nominatim.openstreetmap.org/">OpenStreetMap + ca_postcode: Исход од <a href="http://geocoder.ca/">Geocoder.CA</a> + osm_nominatim: Исход од <a href="http://nominatim.openstreetmap.org/">OpenStreetMap Nominatim</a> - geonames: Резултати од <a href="http://www.geonames.org/">GeoNames</a> - osm_nominatim_reverse: Резултати од <a href="http://nominatim.openstreetmap.org/">OpenStreetMap + geonames: Исход од <a href="http://www.geonames.org/">GeoNames</a> + osm_nominatim_reverse: Исход од <a href="http://nominatim.openstreetmap.org/">OpenStreetMap Nominatim</a> - geonames_reverse: Резултати од <a href="http://www.geonames.org/">GeoNames</a> + geonames_reverse: Исход од <a href="http://www.geonames.org/">GeoNames</a> search_osm_nominatim: prefix: aerialway: @@ -407,7 +411,7 @@ mk: terminal: Терминал amenity: animal_shelter: Засолниште за животни - arts_centre: Дом на уметности + arts_centre: Дом на уметноста atm: Банкомат bank: Банка bar: Бар @@ -421,8 +425,8 @@ mk: bureau_de_change: Менувачница bus_station: Автобуска станица cafe: Кафуле - car_rental: Рент-а-кар - car_sharing: Изнајмување автомобил + car_rental: Изнајмување автомобил + car_sharing: Заедничко патување car_wash: Автоперална casino: Казино charging_station: Напојна станица @@ -437,12 +441,12 @@ mk: dentist: Забар doctors: Доктори dormitory: Студентски дом - drinking_water: Питка вода + drinking_water: Пивка вода driving_school: Автошкола embassy: Амбасада emergency_phone: Итен телефон fast_food: Брза храна - ferry_terminal: Ферибот-терминал + ferry_terminal: Траектска станица fire_hydrant: Противпожарен хидрант fire_station: Пожарна food_court: Штандови за брза храна @@ -450,7 +454,7 @@ mk: fuel: Гориво gambling: Коцкање grave_yard: Гробишта - gym: Теретана / фитнес + gym: Фитнес/вежбалница health_centre: Здравствен центар hospital: Болница hunting_stand: Ловечка кула @@ -458,15 +462,15 @@ mk: kindergarten: Градинка library: Библиотека market: Пазар - marketplace: Пазар + marketplace: Пазариште monastery: Манастир motorcycle_parking: Паркиралиште за мотоцикли nightclub: Ноќен клуб nursery: Јасли nursing_home: Старечки дом office: Канцеларија - parking: Паркинг - parking_entrance: Влез на паркиралиште + parking: Паркиралиште + parking_entrance: Влез во паркиралиште pharmacy: Аптека place_of_worship: Верски објект police: Полиција @@ -483,7 +487,7 @@ mk: sauna: Сауна school: Училиште shelter: Засолниште - shop: Дуќан + shop: Продавница shower: Туш social_centre: Социјален центар social_club: Друштвен клуб @@ -598,7 +602,7 @@ mk: tomb: Гроб tower: Кула wayside_cross: Крајпатен крст - wayside_shrine: Параклис + wayside_shrine: Крајпатен параклис wreck: Бродолом junction: "yes": Раскрсница @@ -607,12 +611,12 @@ mk: basin: Котлина brownfield: Угар cemetery: Гробишта - commercial: Комерцијално подрачје + commercial: Стопанско подрачје conservation: Заштитено земјиште construction: Градилиште farm: Фарма - farmland: Обработливо земјиште - farmyard: Земјоделски двор + farmland: Земјоделско земјиште + farmyard: Селски двор forest: Шума garages: Гаража grass: Трева @@ -687,7 +691,7 @@ mk: fjord: Фјорд forest: Шума geyser: Гејзер - glacier: Глечер + glacier: Ледник grassland: Полјана heath: Голет hill: Рид @@ -716,7 +720,7 @@ mk: wood: Шума office: accountant: Сметководител - administrative: Администрација + administrative: Управа architect: Архитект company: Фирма employment_agency: Агенција за вработување @@ -725,7 +729,7 @@ mk: insurance: Служба за осигурување lawyer: Адвокат ngo: НВО-канцеларија - telecommunication: Телекомуникациска служба + telecommunication: Телекомуникациска канцеларија travel_agent: Туристичка агенција "yes": Канцеларија place: @@ -747,7 +751,7 @@ mk: municipality: Општина neighbourhood: Соседство postcode: Поштенски број - region: Регион + region: Област sea: Море state: Покраина subdivision: Админ. подрачје @@ -761,14 +765,14 @@ mk: construction: Железничка линија во изградба disused: Напуштена железничка линија disused_station: Напуштена железничка станица - funicular: Жичена железница + funicular: Искачница halt: Железничка постојка historic_station: Историска железничка станица junction: Железнички јазол level_crossing: Надвозник light_rail: Лека железница miniature: Минијатурна железница - monorail: Едношинска линија + monorail: Едношинска пруга narrow_gauge: Теснолинејка platform: Железнички перон preserved: Зачувана железничка линија @@ -811,7 +815,7 @@ mk: dry_cleaning: Хемиско чистење electronics: Електронска опрема estate_agent: Недвижности - farm: Земјоделски дуќан + farm: Земјоделска продавница fashion: Бутик fish: Рибарница florist: Цвеќара @@ -833,13 +837,13 @@ mk: laundry: Пералница mall: Трговски центар market: Пазар - mobile_phone: Мобилни телефони + mobile_phone: Мобиларница motorcycle: Моторцикли music: Музички дуќан newsagent: Весникара optician: Оптичар organic: Здрава храна - outdoor: Дуќан на отворено + outdoor: Продавница на отворено pet: Домашни миленици pharmacy: Аптека photo: Фотографски дуќан @@ -889,8 +893,8 @@ mk: ditch: Канач dock: Док drain: Одвод - lock: Превојница - lock_gate: Превојничка капија + lock: Преводница + lock_gate: Преводничка врата mooring: Сидриште rapids: Брзак river: Река @@ -918,13 +922,13 @@ mk: places: Места results: no_results: Не пронајдов ништо - more_results: Повеќе резултати + more_results: Повеќе ставки layouts: logo: - alt_text: Логотип на OpenStreetMap + alt_text: Лого на OpenStreetMap home: Оди на матичната местоположба logout: Одјава - log_in: најави ме + log_in: Најава log_in_tooltip: Најава со постоечка сметка sign_up: Регистрација start_mapping: Почнете да ги работите картите @@ -934,8 +938,8 @@ mk: export: Извези data: Податоци export_data: Извези податоци - gps_traces: GPS-траги - gps_traces_tooltip: Работа со GPS-траги + gps_traces: ГПС-траги + gps_traces_tooltip: Работа со ГПС-траги user_diaries: Кориснички дневници user_diaries_tooltip: Види кориснички дневници edit_with: Уреди со %{editor} @@ -1024,10 +1028,10 @@ mk: href="http://wiki.openstreetmap.org/wiki/Legal_FAQ">Правните ЧПП</a> на заедницата. more_2_html: |- Иако OpenStreetMap работи со отворени податоци, ние не можеме да понудиме - бесплатни извршници (API) за карти на трети програмери. - Погледајте ги <a href="http://wiki.openstreetmap.org/wiki/API_usage_policy">правилата за употреба на извршникот</a>, - <a href="http://wiki.openstreetmap.org/wiki/Tile_usage_policy">правилата за употреба на полињата</a> - и <a href="http://wiki.openstreetmap.org/wiki/Nominatim#Usage_Policy">Nominatim</a>. + бесплатни извршници (API) за карти на трети лица. + Погледајте ги <a href="https://operations.osmfoundation.org/policies/api/">правилата за употреба на извршникот</a>, + <a href="https://operations.osmfoundation.org/policies/tiles/">правилата за полињата</a> + и <a href="https://operations.osmfoundation.org/policies/nominatim/">за Nominatim</a>. contributors_title_html: Нашите учесници contributors_intro_html: |- Во нашиот проект учествуваат илјадници поединци. Користиме и @@ -1087,9 +1091,9 @@ mk: \nза отстранување</a> или поднесете жалба на \n<a href=\"http://dmca.openstreetmap.org/\">оваа наменска страница</a>." trademarks_title_html: <span id="trademarks"></span>Заштитни знаци - trademarks_1_html: OpenStreetMap и логото со лупа се заштитни знаци на фондацијата - OpenStreetMap. Ако имате прашања во врска со употребата на знаците, пишете - ѝ на <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">Работната + trademarks_1_html: OpenStreetMap, логото со лупа и „State of the Map“ („Состојба + на картата“) се заштитни знаци на задолжбината OpenStreetMap. Ако имате прашања + во врска со употребата на знаците, пишете ѝ на <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">Работната група за лиценци</a>. welcome_page: title: Добре дојдовте! @@ -1196,15 +1200,15 @@ mk: about_page: next: Следно copyright_html: <span>©</span>Учесници на<br>OpenStreetMap - used_by: '%{name} обезбедува картографски податоци на стотици мрежни места, мобилни - извршници и сметачки уреди' + used_by: '%{name} обезбедува картографски податоци на илјадници мрежни места, + мобилни прилози и сметачки уреди' lede_text: |- OpenStreetMap ја гради заедница од учесници што придонесуваат со свои содржини и ги одржуваат податоците за патишта, патеки, кафеани, железнички станици и многу друго ширум светот. local_knowledge_title: Месни сознанија local_knowledge_html: |- OpenStreetMap полага особена важност на месни сознија. Учесниците користат - воздушни снимки, GPS-уреди и пообични теренски карти + воздушни снимки, ГПС-уреди и пообични теренски карти со цел да се провери исправноста и актуелноста на OSM. community_driven_title: Проектот го работи заедницата @@ -1222,17 +1226,20 @@ mk: под истата лиценца. Повеќе ќе најдете на страницата <a href='%{copyright_path}'>Авторски права и лиценцирање</a>. legal_title: Правни работи legal_html: "Ова мрежно место и многу други поврзани услуги со кои раководи \n<a - href='http://osmfoundation.org/'>Фондацијата OpenStreetMap</a> (OSMF) \nво име - на заедницата.\n<br> \nВе молиме <a href='http://osmfoundation.org/Contact'>контактирајте + href='http://osmfoundation.org/'>Задолжбината OpenStreetMap</a> (OSMF) \nво + име на заедницата. Употребата на сите услуги што ги нуди OSMF подлежи на нашите + <a href=\"http://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy\">\nПравила + за прифатлива употреба</a> и <a href=\"http://wiki.osmfoundation.org/wiki/Privacy_Policy\">Правилата + за заштита на личните податоци</a>\n<br> \nВе молиме <a href='http://osmfoundation.org/Contact'>контактирајте ја OSMF</a> \nако имате прашања во врска со лиценцирањето, авторките права и други правни прашања и проблеми." partners_title: Партнери notifier: diary_comment_notification: - subject: '[OpenStreetMap] %{user} коментираше на вашата дневничка ставка' + subject: '[OpenStreetMap] %{user} коментираше на дневничка ставка' hi: Здраво %{to_user}, - header: '%{from_user} коментираше на вашата скорешна дневничка ставка на OpenStreetMap - со насловот %{subject}:' + header: '%{from_user} коментираше на дневничката ставка на OpenStreetMap со + наслов %{subject}:' footer: Можете да го прочитате коментарот и на %{readurl} и можете да коментирате на %{commenturl} или да одговорите на %{replyurl} message_notification: @@ -1324,6 +1331,7 @@ mk: Белешката се наоѓа близу %{place}.' details: Поподробно за белешката на %{url}. changeset_comment_notification: + hi: Здраво %{to_user}, greeting: Здраво, commented: subject_own: '[OpenStreetMap] %{commenter} искоментира на една од вашите промени' @@ -1336,6 +1344,8 @@ mk: partial_changeset_with_comment: со коментарот „%{changeset_comment}“ partial_changeset_without_comment: без коментар details: Поподробно за промената на %{url}. + unsubscribe: За да се отпишете од подновите на овие промени, посетете ја страницата + %{url} и стиснете на „Отпиши се“. message: inbox: title: Примени @@ -1443,7 +1453,7 @@ mk: no_iframe_support: Вашиот прелистувач не поддржува „иРамки“ (iframes) со HTML, без кои оваа можност не може да работи. sidebar: - search_results: Резултати од пребарувањето + search_results: Исход од пребарувањето close: Затвори search: search: Пребарај @@ -1457,15 +1467,17 @@ mk: table: entry: motorway: Автопат + main_road: Главен пат trunk: Главна сообраќајна артерија primary: Главен пат secondary: Спореден пат unclassified: Некласификуван пат - unsurfaced: Неасфалтиран пат track: Патека - byway: Спореден пат bridleway: Пешачко-влечен пат cycleway: Велосипедска патека + cycleway_national: Државна велосипедска патека + cycleway_regional: Регионална велосипедска патека + cycleway_local: Месна велосипедска патека footway: Пешачка патека rail: Железница subway: Метро @@ -1487,14 +1499,13 @@ mk: golf: Голф-терен park: Парк resident: Станбено подрачје - tourist: Туристичка атракција common: - Општествена земја - ливада retail: Трговско подрачје industrial: Индустриско подрачје commercial: Комерцијално подрачје - heathland: Голиште + heathland: Вресиште lake: - Езеро - резервоар @@ -1517,9 +1528,11 @@ mk: tunnel: Испрекината линија = тунел bridge: Црна линија = мост private: Доверлив пристап - permissive: Дозволив пристап destination: Пристап до одредницата construction: Патишта во изградба + bicycle_shop: Точкар + bicycle_parking: Паркирање велосипеди + toilets: Тоалет richtext_area: edit: Уреди preview: Преглед @@ -1546,7 +1559,7 @@ mk: identifiable: Препознатливо (се прикажува на списокот на траги како препознатливи, подредени точки со време) create: - upload_trace: Подигни GPS-трага + upload_trace: Подигни ГПС-трага trace_uploaded: Вашата GPX податотека е подигната и чека да биде вметната во базата на податоци. Ова обично се врши во рок од половина час, и откога ќе заврши, ќе ви биде испратена порака по е-пошта. @@ -1632,13 +1645,13 @@ mk: in: во map: карта list: - public_traces: Јавни GPS-траги - your_traces: Ваши GPS-траги - public_traces_from: Јавни GPS-траги од %{user} - description: Прелистување на скороподигнати GPS-траги + public_traces: Јавни ГПС-траги + your_traces: Ваши ГПС-траги + public_traces_from: Јавни ГПС-траги од %{user} + description: Прелистување на скороподигнати ГПС-траги tagged_with: ' означено со %{tags}' empty_html: Тука сè уште нема ништо. <a href='%{upload_link}'>Подигнете нова - трага</a> или дознајте повеќе за GPS-трагите на <a href='http://wiki.openstreetmap.org/wiki/Mk:Beginners_Guide_1.2'>нивната + трага</a> или дознајте повеќе за ГПС-трагите на <a href='http://wiki.openstreetmap.org/wiki/Mk:Beginners_Guide_1.2'>нивната викстраница</a>. delete: scheduled_for_deletion: Трагата е закажана за бришење @@ -1650,7 +1663,7 @@ mk: heading: GPX-складиштето е исклучено message: Системот за складирање и подигање на GPX-податотеки моментално е недостапен. georss: - title: GPS-траги од OpenStreetMap + title: ГПС-траги од OpenStreetMap description: description_with_count: one: GPX-податотека со %{count} точка од %{user} @@ -1679,9 +1692,10 @@ mk: allow_write_prefs: ги менува вашите кориснички прилагодувања. allow_write_diary: создава ставки во дневникот, пишува коментари и да се спријателува. allow_write_api: ја менува картата. - allow_read_gpx: ви ги чита вашите лични GPS-траги. - allow_write_gpx: подига GPS-траги. + allow_read_gpx: ви ги чита вашите лични ГПС-траги. + allow_write_gpx: подига ГПС-траги. allow_write_notes: измена на белешки. + grant_access: Дај пристап oauthorize_success: title: Барањето за овластување е дозволено allowed: На извршникот %{app_name} му дадовте пристап до вашата сметка. @@ -1703,9 +1717,9 @@ mk: title: OAuth податоци за %{app_name} key: 'Потрошувачки клуч:' secret: 'Потрошувачка тајна:' - url: 'Побарај URL-адреса на шифрата:' - access_url: 'URL-адреса на пристапата шифра:' - authorize_url: 'Дозволи URL адреса:' + url: 'Побарај URL на шифрата:' + access_url: 'URL на пристапата шифра:' + authorize_url: 'Дозволи URL:' support_notice: Поддржуваме потписи во HMAC-SHA1 (препорачано) и RSA-SHA1. edit: Измени подробности delete: Избриши клиент @@ -1715,8 +1729,8 @@ mk: allow_write_prefs: им ги менува корисничките прилагодувања. allow_write_diary: прави ставки во дневници, да коментира и да се сптијателува. allow_write_api: ја менува картата. - allow_read_gpx: им ги чита личните GPS-траги. - allow_write_gpx: подига GPS-траги. + allow_read_gpx: им ги чита личните ГПС-траги. + allow_write_gpx: подига ГПС-траги. allow_write_notes: измена на белешки. index: title: Мои OAuth податоци @@ -1734,16 +1748,16 @@ mk: form: name: Име required: Се бара - url: URL адреса на главната апликација - callback_url: URL-адреса за одѕив + url: URL на главниот прилог + callback_url: URL за одѕив support_url: URL поддршка requests: 'Побарај ги следниве дозволи од корисникот:' allow_read_prefs: им ги чита корисничките прилагодувања. allow_write_prefs: им ги менува корисничките прилагодувања. allow_write_diary: создава ставки во дневници, да коментира, и да се спријателува. allow_write_api: ја менува картата. - allow_read_gpx: им ги чита личните GPS-траги. - allow_write_gpx: подига GPS-траги. + allow_read_gpx: им ги чита личните ГПС-траги. + allow_write_gpx: подига ГПС-траги. allow_write_notes: измена на белешки. not_found: sorry: За жал, тој %{type} не е пронајден. @@ -1793,6 +1807,12 @@ mk: windowslive: title: Најава со Windows Live alt: Најава со сметка на Windows Live + github: + title: Најава со GitHub + alt: Најава со сметка на GitHub + wikipedia: + title: Најава со Википедија + alt: Најава со смета на Википедија yahoo: title: Најава со Yahoo alt: Најава со OpenID од Yahoo @@ -1828,8 +1848,8 @@ mk: title: Регистрација no_auto_account_create: За жал, моментално не можеме автоматски да ви создадеме сметка. - contact_webmaster: Контактирајте го <a href="mailto:webmaster@openstreetmap.org">управникот</a> - за да побарате создавање на сметка - ќе се потрудиме да ве услужиме во најкраток + contact_webmaster: Контактирајте го <a href="%{webmaster}">управникот</a> за + да побарате создавање на сметка - ќе се потрудиме да ве услужиме во најкраток можен рок. about: header: Слободна и уредлива @@ -1841,9 +1861,10 @@ mk: за учесници</a>. email address: 'Е-пошта:' confirm email address: 'Потврдете ја е-поштата:' - not displayed publicly: Не се прикажува јавно (видете <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" - title="wiki privacy policy including section on email addresses">правилникот - за приватност</a>) + not displayed publicly: Вашата адреса нема да се прикажува јавно. Повеќе информации + за ова ќе најдете во <a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy" + title="OSMF privacy policy including section on email addresses">Правилата + за заштита на личните податоци</a>. display name: 'Име за приказ:' display name description: Вашето јавно прикажано име. Можете да го смените подоцна во прилагодувањата. @@ -1853,16 +1874,6 @@ mk: use external auth: Во спротивно, најавете преку надворешно место auth no password: Ако користите надворешно место, тогаш не ви треба лозинка, но може да ја побараат некои дополнителни алатки или опслужувачот. - auth association: |- - <p>Вашата назнака сè уште не е здружен со сметка на OpenStreetMap.</p> - <ul> - <li>Ако сте нови на OpenStreetMap, тогаш направете сметка со долунаведениот образец.</li> - <li> - Ако веќе имате сметка, можете да се најавите со - корисничкото име и лозинката, а потоа во корисничките - нагдувања да ја здружите со вашата назнака. - </li> - </ul> continue: Регистрација terms accepted: Ви благодариме што ги прифативте новите услови за учество! terms declined: Жалиме што не се согласувате со новите Услови за учество. Повеќе @@ -1895,6 +1906,7 @@ mk: heading: Корисникот %{user} не постои. body: Жалиме, но не постои корисник по име %{user}. Проверете да не сте згрешиле во пишувањето, или пак да не сте стиснале на погрешна врска. + deleted: избришан view: my diary: Мојот дневник new diary entry: нова ставка во дневникот @@ -1947,16 +1959,16 @@ mk: revoke: administrator: Лиши од администраторски пристап moderator: Лиши од модераторски пристап - block_history: примени блокови - moderator_history: дадени блокови + block_history: Активни блокови + moderator_history: Зададени блокови comments: Коментари - create_block: блокирај го корисников - activate_user: активирај го корисников - deactivate_user: деактивирај го корисников - confirm_user: потврди го корисников - hide_user: скриј го корисников - unhide_user: покажи го корисникот - delete_user: избриши го корисников + create_block: Блокирај го корисников + activate_user: Активирај го корисников + deactivate_user: Деактивирај го корисников + confirm_user: Потврди го корисников + hide_user: Скриј го корисников + unhide_user: Покажи го корисников + delete_user: Избриши го корисников confirm: Потврди friends_changesets: измени на пријателите friends_diaries: дневнички записи на пријателите @@ -2012,6 +2024,8 @@ mk: gravatar: Користи Gravatar link: http://wiki.openstreetmap.org/wiki/Gravatar?uselang=mk link text: што е ова? + disabled: Граватарот е исклучен. + enabled: Вашиот граватар е вклучен. new image: Додај слика keep image: Задржи ја тековната слика delete image: Отстрани тековна слика @@ -2046,8 +2060,7 @@ mk: success: Испративме поврдна порака на %{email}, и штом ќе ја потврдите сметката, ќе можете да почнете со картографска работа.<br /><br />Ако користите систем против спам кој испраќа барања за потврда, тогаш ќе морате да ја дозволите - адресата webmaster@openstreetmap.org бидејќи ние немаме начин да одговараме - на такви потврди. + адресата %{sender} бидејќи ние немаме начин да одговараме на такви потврди. failure: Корисникот %{name} не е пронајден. confirm_email: heading: Потврди промена на е-пошта @@ -2104,6 +2117,13 @@ mk: no_authorization_code: Нема код за овластување unknown_signature_algorithm: Непознат алгоритам на потпис invalid_scope: Неважечки делокруг + auth_association: + heading: Вашата назнака сè уште не е здружена со сметка на OpenStreetMap. + option_1: Доколку сте нови на OpenStreetMap, направете сметка користејќи го + образецот подолу. + option_2: Ако веќе имате сметка, можете да се најавите на неа користејќи го + вашето презиме и лозинка, па во корисничките нагодувања да ја здружите сметката + со вашата назнака. user_role: filter: not_an_administrator: Само администраторите можат да раководат со улоги, а вие @@ -2283,10 +2303,13 @@ mk: center_marker: Сосред. картата на бележникот paste_html: Ископирајте го HTML-кодот за да го вметнете во страницата. view_larger_map: Преглед на поголема карта + only_standard_layer: Само стандардниот слој може да се извезува како слика + embed: + report_problem: Пријави проблем key: title: Легенда tooltip: Легенда - tooltip_disabled: Легендата е достапна само во Стандардниот слој + tooltip_disabled: Легендата не е достапна за овој слој map: zoom: in: Приближи @@ -2298,12 +2321,12 @@ mk: standard: Стандардна cycle_map: Велосипедска карта transport_map: Сообраќајна карта - mapquest: MapQuest Open hot: Хуманитарна layers: header: Слоеви на картата notes: Белешки на картата data: Податоци за картата + gps: Јавни ГПС-траги overlays: Овозможи облоги за утврдување грешки title: Слоеви copyright: © <a href='%{copyright_url}'>Учесници во OpenStreetMap</a> @@ -2315,13 +2338,13 @@ mk: createnote_disabled_tooltip: Приближете за да додадете белешка map_notes_zoom_in_tooltip: Приближете за да ги видите белешките map_data_zoom_in_tooltip: Приближете за да ги видите податоците - queryfeature_tooltip: Пребарување на особености - queryfeature_disabled_tooltip: Зголеми на пребарувањето на особеностите + queryfeature_tooltip: Пребарување на елементи + queryfeature_disabled_tooltip: Зголеми на пребарувањето на елементи changesets: show: comment: Коментар subscribe: Претплати се - unsubscribe: Откажи претплата + unsubscribe: Отпиши ме hide_comment: скриј unhide_comment: откриј notes: @@ -2350,6 +2373,9 @@ mk: mapquest_car: Автомобил (MapQuest) mapquest_foot: Пешки (MapQuest) osrm_car: Автомобил (OSRM) + mapzen_bicycle: Велосипед (Mapzen) + mapzen_car: Автомобил (Mapzen) + mapzen_foot: Пешки (Mapzen) directions: Насоки distance: Растојание errors: @@ -2357,13 +2383,23 @@ mk: no_place: За жал, не можев да го најдам тоа место. instructions: continue_without_exit: Продолжете на %{name} - slight_right_without_exit: Малку надесно во %{name} - turn_right_without_exit: Свртете десно во %{name} - sharp_right_without_exit: Остро надесно во %{name} + slight_right_without_exit: Малку надесно на %{name} + offramp_right_without_exit: На десниот исклучок, свртете на %{name} + onramp_right_without_exit: Исклучете се десно, одејќи на %{name} + endofroad_right_without_exit: На крајот од патот свртете десно на %{name} + merge_right_without_exit: Навлезете десно во %{name} + fork_right_without_exit: На разгранокот свртете десно на %{name} + turn_right_without_exit: Свртете десно на %{name} + sharp_right_without_exit: Остро надесно на %{name} uturn_without_exit: Полукружно свртете долж %{name} - sharp_left_without_exit: Остро налево во %{name} - turn_left_without_exit: Свртете лево во %{name} - slight_left_without_exit: Малку налево во %{name} + sharp_left_without_exit: Остро налево на %{name} + turn_left_without_exit: Свртете лево на %{name} + offramp_left_without_exit: На левиот исклучок, свртете на %{name} + onramp_left_without_exit: Исклучете се лево, одејќи на %{name} + endofroad_left_without_exit: На крајот од патот свртете лево на %{name} + merge_left_without_exit: Навлезете лево во %{name} + fork_left_without_exit: На разгранокот свртете лево на %{name} + slight_left_without_exit: Малку налево на %{name} via_point_without_exit: (преку точката) follow_without_exit: Следете го %{name} roundabout_without_exit: На кружниот тек свртете на %{name} @@ -2374,6 +2410,11 @@ mk: against_oneway_without_exit: Оди обратно во еднонасочната на %{name} end_oneway_without_exit: Крај на еднонасочната на %{name} roundabout_with_exit: На кружниот тек, свртете на %{exit} излегувајќи на %{name} + turn_left_with_exit: На кружниот тек свртете лево на %{name} + slight_left_with_exit: На кружниот тек благо лево на %{name} + turn_right_with_exit: На кружниот тек свртете десно на %{name} + slight_right_with_exit: На кружниот тек благо десно на %{name} + continue_with_exit: На кружниот тек продолжете право на %{name} unnamed: неименувано courtesy: Насоките ги добивте благодарение на %{link} time: Време @@ -2381,7 +2422,7 @@ mk: node: Јазол way: Пат relation: Однос - nothing_found: Не пронајдов ниедна особеност + nothing_found: Не пронајдов ниеден елемент error: 'Грешка при поврзувањето со %{server}: %{error}' timeout: Истече времето за поврзување со %{server} redaction: diff --git a/config/locales/mr.yml b/config/locales/mr.yml index 189662668..b64ef9c49 100644 --- a/config/locales/mr.yml +++ b/config/locales/mr.yml @@ -166,7 +166,7 @@ mr: changeset: बदलसंच redacted: redaction: लोपन %{id} - message_html: ह्या %{type}ची आवृत्ती क्र. %{version} दाखविली जाऊ शकत नाही कारण + message_html: या %{type}ची आवृत्ती क्र. %{version} दाखविली जाऊ शकत नाही कारण तिचे लोपन करण्यात आले आहे. कृपया तपशीलासाठी %{redaction_link} पहा. type: node: गाठी @@ -226,11 +226,11 @@ mr: title_friend: आपल्या मित्रांचे बदलसंच title_nearby: जवळपासच्या सदस्यांचे बदलसंच empty: बदलसंच सापडले नाहीत. - empty_area: ह्या भागात बदलसंच नाहीत. - empty_user: ह्या सदस्याचे बदलसंच नाहीत. + empty_area: या भागात बदलसंच नाहीत. + empty_user: या सदस्याचे बदलसंच नाहीत. no_more: अधिक बदलसंच सापडले नाहीत. - no_more_area: ह्या भागात अधिक बदलसंच नाहीत. - no_more_user: ह्या सदस्याचे अधिक बदलसंच नाहीत. + no_more_area: या भागात अधिक बदलसंच नाहीत. + no_more_user: या सदस्याचे अधिक बदलसंच नाहीत. load_more: अधिक प्रभारण करा timeout: sorry: क्षमा असावी, आपण मागितलेली बदलसंचाची यादी मिळविण्यास फार वेळ लागला. @@ -275,8 +275,8 @@ mr: दिली असेल. diary_entry: posted_by: '%{link_user}ने %{created} ला %{language_link} भाषेत लिहीले' - comment_link: ह्या नोंदीवर अभिप्राय लिहा - reply_link: ह्या नोंदीस उत्तर द्या + comment_link: या नोंदीवर अभिप्राय लिहा + reply_link: या नोंदीस उत्तर द्या comment_count: zero: अभिप्राय नाहीत one: '%{count} comment' @@ -877,13 +877,13 @@ mr: more: अधिक license_page: foreign: - title: ह्या भाषांतराबद्दल + title: या भाषांतराबद्दल text: या भाषांतरीत पानाच्या व %{english_original_link} यादरम्यान काही वादाचा प्रसंग उद्भवल्यास, मूळ इंग्लिश पानास प्राथमिकता राहील. english_link: मूळ इंग्लिश native: title: या पानाबद्दल - text: आपण प्रताधिकार पानाची इंग्रजी आवृत्ती पाहत आहात. आपण ह्या पानाच्या %{native_link}कडे + text: आपण या प्रताधिकार पानाची इंग्लिश आवृत्ती पहात आहात. आपण या पानाच्या %{native_link}कडे परत जाऊ शकता, किंवा प्रताधिकाराबद्दल वाचणे थांबवून %{mapping_link} सुरु करू शकता. native_link: मराठी आवृत्ती @@ -949,7 +949,7 @@ mr: partners_title: भागीदार notifier: diary_comment_notification: - subject: '[OpenStreetMap] %{user}ने आपल्या अनुदिनीतील नोंदीवर अभिप्राय दिला' + subject: '[OpenStreetMap] %{user}ने एका अनुदिनीतील नोंदीवर अभिप्राय दिला' message_notification: header: '%{from_user}ने ओपनस्ट्रीटमॅपद्वारे आपल्याला %{subject} अशा विषयाचा संदेश पाठविला' @@ -1084,9 +1084,7 @@ mr: primary: प्राथमिक रस्ता secondary: दुय्यम रस्ता unclassified: अवर्गीकृत रस्ता - unsurfaced: कच्चा रस्ता track: वाट - byway: उपमार्ग bridleway: अश्वमार्ग cycleway: सायकल मार्ग footway: पदपथ @@ -1110,7 +1108,6 @@ mr: golf: गोल्फ कोर्स park: उद्यान resident: निवासी क्षेत्र - tourist: पर्यटन आकर्षण common: - सार्वजनिक जमीन - कुरण @@ -1138,9 +1135,10 @@ mr: tunnel: तुटक कड = बोगदा bridge: काळी कड = पूल private: खाजगी प्रवेश - permissive: परवानगीने प्रवेश destination: केवळ गंतव्यासाठी प्रवेश construction: निर्माणाधीन रस्ते + bicycle_shop: सायकल दुकान + toilets: स्वच्छतागृह richtext_area: edit: संपादन करा preview: झलक @@ -1370,7 +1368,7 @@ mr: introduction_2: विपत्रातील दुव्यावर टिचकी मारुन आपली खातेनिश्चिती करा व आपण नकाशा काढणे सुरु करु शकता. button: खात्री करा - already active: ह्या खात्याची आधीच निश्चिती झाली आहे. + already active: या खात्याची आधीच निश्चिती झाली आहे. unknown token: तो निश्चिती संकेत कालबाह्य झाला आहे किंवा अस्तित्वात नाही. reconfirm_html: जर आपणास आम्ही पुन्हा विपत्र पाठविणे आवश्यक वाटते, तर<a href="%{reconfirm}">येथे टिचकी मारा</a>. diff --git a/config/locales/ms.yml b/config/locales/ms.yml index f5ef1b9c9..ecb0c7bcc 100644 --- a/config/locales/ms.yml +++ b/config/locales/ms.yml @@ -3,6 +3,7 @@ # Export driver: phpyaml # Author: Anakmalaysia # Author: Karmadunya9- +# Author: Macofe # Author: Nemo bis # Author: Pizza1016 --- @@ -1386,9 +1387,7 @@ ms: primary: Jalan utama secondary: Jalan sekunder unclassified: Jalan tidak terkelas - unsurfaced: Jalan tanpa turapan track: Laluan - byway: Jalan kecil bridleway: Lorong kuda cycleway: Lorong basikal footway: Laluan pejalan kaki @@ -1412,7 +1411,6 @@ ms: golf: Padang golf park: Taman resident: Kawasan perumahan - tourist: Tarikan pelancong common: - Tanah awam - padang rumput @@ -1442,7 +1440,6 @@ ms: tunnel: Kasing bertitik-titik = terowong bridge: Kasing hitam = jambatan private: Jalan masuk persendirian - permissive: Jalan masuk permisif destination: Jalan masuk destinasi construction: Jalan dalam pembinaan richtext_area: @@ -1573,7 +1570,8 @@ ms: georss: title: Jejak OpenStreetMap GPS description: - description_with_count: GPX fail dengan %{count} mata dari %{user} + description_with_count: + other: GPX fail dengan %{count} mata dari %{user} description_without_count: Fail GPX daripada %{user} application: require_cookies: @@ -1749,9 +1747,9 @@ ms: title: Daftar no_auto_account_create: Sayang sekali, kami tidak dapat membuka akaun secara automatik untuk anda buat masa ini. - contact_webmaster: Sila hubungi <a href="mailto:webmaster@openstreetmap.org">pentadbir - web</a> untuk membuat persediaan untuk membuka akaun - kami akan cuba menguruskan - permohonan itu secepat mungkin. + contact_webmaster: Sila hubungi <a href="%{webmaster}">pentadbir web</a> untuk + membuat persediaan untuk membuka akaun - kami akan cuba menguruskan permohonan + itu secepat mungkin. about: header: Bebas dan boleh disunting html: |- @@ -1952,8 +1950,8 @@ ms: success: Kami telah menghantar pesanan pengesahan kepada %{email}. Sebaik sahaja anda mengesahkan akaun anda, anda akan boleh menyunting peta.<br /><br />Jika anda menggunakan sistem anti-spam yang menghantar permohonan untuk pengesahan, - sila pastikan anda membenarkan webmaster@openstreetmap.org kerana kami tidak - dapat membalas sebarang permohonan untuk pengesahan. + sila pastikan anda membenarkan %{sender} kerana kami tidak dapat membalas + sebarang permohonan untuk pengesahan. failure: Pengguna %{name} tidak dijumpai. confirm_email: heading: Sahkan penukaran alamat e-mel @@ -2196,7 +2194,6 @@ ms: standard: Piawai cycle_map: Peta Basikal transport_map: Peta Pengangkutan - mapquest: MapQuest Dibuka hot: Kemanusiaan layers: header: Lapisan Peta diff --git a/config/locales/nb.yml b/config/locales/nb.yml index 294fc5813..5a581ec8d 100644 --- a/config/locales/nb.yml +++ b/config/locales/nb.yml @@ -9,11 +9,14 @@ # Author: Haakon K # Author: Hansfn # Author: Janhoy +# Author: Jon Harald Søby # Author: Kingu # Author: Laaknor +# Author: Macofe # Author: Nemo bis # Author: Nghtwlkr # Author: Oyvind +# Author: SuperPotato # Author: The real emj # Author: 6400 --- @@ -34,7 +37,7 @@ nb: message: Melding node: Node node_tag: Nodemerkelapp - notifier: Varsling + notifier: Varsler old_node: Gammel node old_node_tag: Gammel nodemerkelapp old_relation: Gammel relasjon @@ -42,7 +45,7 @@ nb: old_relation_tag: Gammel relasjonsmerkelapp old_way: Gammel vei old_way_node: Gammel veinode - old_way_tag: Gammel veimerkelapp + old_way_tag: Gammel Vei Merkelapp relation: Relasjon relation_member: Relasjonsmedlem relation_tag: Relasjonsmerkelapp @@ -172,6 +175,7 @@ nb: way: vei relation: relasjon changeset: endringsforløp + note: merknad timeout: sorry: Beklager, det tok for lang tid Ã¥ hente data for %{type} med ID %{id}. type: @@ -179,6 +183,7 @@ nb: way: vei relation: relasjon changeset: endringsforløp + note: merknad redacted: redaction: Maskering %{id} message_html: Versjon %{version} av denne %{type} kan ikke vises fordi den er @@ -188,8 +193,9 @@ nb: way: vei relation: relasjon start_rjs: - feature_warning: Laster %{num_features} funksjonalitetet som kan gjøre at nettleseren - blir treg eller stopper helt. Vil du vise frem disse dataene? + feature_warning: Henter %{num_features} kartkomponenter, noe som kan gjøre at + nettleseren blir treg eller stopper helt. Er du sikker pÃ¥ at du vil vise frem + disse dataene? load_data: Last inn data loading: Laster... tag_details: @@ -202,29 +208,30 @@ nb: telephone_link: Ring %{phone_number} note: title: 'Merknad: %{id}' - new_note: Ny notis + new_note: Ny merknad description: Beskrivelse open_title: 'Uavklart merknad #%{note_name}' closed_title: 'Avklart merknad: #%{note_name}' hidden_title: 'Skjult notis #%{note_name}' - open_by: Opprettet av %{user} <abbr title='%{exact_time}'>%{when} siden</abbr> - open_by_anonymous: Opprettet av anonym bruker <abbr title='%{exact_time}'>%{when} + open_by: Opprettet av %{user} for <abbr title='%{exact_time}'>%{when} siden</abbr> + open_by_anonymous: Opprettet av anonym bruker for <abbr title='%{exact_time}'>%{when} siden</abbr> - commented_by: Kommentar fra %{user} <abbr title='%{exact_time}'>%{when} siden</abbr> - commented_by_anonymous: Kommentar fra anonym bruker <abbr title='%{exact_time}'>%{when} + commented_by: Kommentar fra %{user} for <abbr title='%{exact_time}'>%{when} + siden</abbr> + commented_by_anonymous: Kommentar fra anonym bruker for <abbr title='%{exact_time}'>%{when} siden</abbr> - closed_by: Løst av %{user} <abbr title='%{exact_time}'>%{when} siden</abbr> - closed_by_anonymous: Løst av anonym bruker <abbr title='%{exact_time}'>%{when} + closed_by: Løst av %{user} for <abbr title='%{exact_time}'>%{when} siden</abbr> + closed_by_anonymous: Løst av anonym bruker for <abbr title='%{exact_time}'>%{when} siden</abbr> - reopened_by: Gjenaktivisert av %{user} <abbr title='%{exact_time}'>%{when} siden</abbr> - reopened_by_anonymous: Gjenaktivisert av anonym bruker <abbr title='%{exact_time}'>%{when} + reopened_by: GjenÃ¥pnet av %{user} for <abbr title='%{exact_time}'>%{when} siden</abbr> + reopened_by_anonymous: GjenÃ¥pnet av anonym bruker for <abbr title='%{exact_time}'>%{when} siden</abbr> - hidden_by: Skjult av %{user} <abbr title='%{exact_time}'>%{when} siden</abbr> + hidden_by: Skjult av %{user} for <abbr title='%{exact_time}'>%{when} siden</abbr> query: title: Forespørselsesfunksjoner - introduction: Klikk pÃ¥ kartet for Ã¥ finne nærliggende trekkplaster. - nearby: Nærliggende trekkplaster - enclosing: Regionstilhørighet + introduction: Klikk pÃ¥ kartet for Ã¥ finne nærliggende funksjoner. + nearby: Nærliggende funksjoner + enclosing: Regionsfunksjoner changeset: changeset_paging_nav: showing_page: Side %{page} @@ -236,16 +243,16 @@ nb: view_changeset_details: Vis detaljert endringsforløp changesets: id: ID - saved_at: Lagret + saved_at: Lagret den user: Bruker comment: Kommentar area: OmrÃ¥de list: - title: Endringsforløp + title: Endringssett title_user: Endringssett av %{user} - title_friend: Endringsforløp av dine venner + title_friend: Endringssett av dine venner title_nearby: Endringssett av brukere i nærheten - empty: Inget endringsforløp funnet. + empty: Inget endringssett funnet. empty_area: Ingen endringssett i dette omrÃ¥det. empty_user: Ingen endringssett fra denne brukeren. no_more: Ingen flere endringssett funnet. @@ -255,63 +262,64 @@ nb: timeout: sorry: Beklager, listen over endringssett som du ba om tok for lang tid Ã¥ hente. rss: - title_all: Openstreetmap endringsforløps-diskusjon - title_particular: 'OpenStreetMap endringsforløp #%{changeset_id} diskusjon' - comment: Ny kommentar til endringsforløp %{changeset_id} av %{author} - commented_at_html: Uppdatert %{when} siden - commented_at_by_html: Oppdatert %{when} siden, av %{user} + title_all: OpenStreetMap endringssett-diskusjon + title_particular: 'OpenStreetMap endringssett #%{changeset_id} diskusjon' + comment: Ny kommentar til endringssett %{changeset_id} av %{author} + commented_at_html: Oppdatert for %{when} siden + commented_at_by_html: Oppdatert for %{when} siden av %{user} full: Fullstendig diskusjon diary_entry: new: title: Ny dagbokoppføring + publish_button: Publiser list: title: Brukernes dagbøker title_friends: Dagbøkene til vennene dine title_nearby: Dagbøkene til nærliggende brukere - user_title: Dagboken for %{user} + user_title: Dagboken til %{user} in_language_title: Dagbokoppføringer pÃ¥ %{language} - new: Ny dagbokoppføring - new_title: Skriv en ny oppføring i i din brukerdagbok - no_entries: Ingen oppføringer i dagboka - recent_entries: Nye oppføringer i dagboka - older_entries: Eldre oppføringer - newer_entries: Nyere oppføringer + new: Ny Dagbokoppføring + new_title: Skriv et nytt innlegg i brukerdagboken din + no_entries: Ingen innlegg i dagboka + recent_entries: Nye innlegg i dagboka + older_entries: Eldre innlegg + newer_entries: Nyere innlegg edit: - title: Rediger oppføring i dagboka + title: Rediger dagbokinnlegg subject: 'Emne:' - body: 'Kropp:' + body: 'Brødtekst:' language: 'SprÃ¥k:' location: 'Posisjon:' latitude: 'Breddegrad:' longitude: 'Lengdegrad:' use_map_link: bruk kart save_button: Lagre - marker_text: Lokasjon for dagbokoppføring + marker_text: Lokalisasjonen for dagbokoppføring view: title: '%{user} sin dagbok | %{title}' - user_title: Dagboken for %{user} + user_title: Dagboken til %{user} leave_a_comment: Legg igjen en kommentar - login_to_leave_a_comment: '%{login_link} for Ã¥ legge igjen en kommentar' + login_to_leave_a_comment: '%{login_link} for Ã¥ legge inn en kommentar' login: Logg inn save_button: Lagre no_such_entry: title: Ingen slik dagbokoppføring - heading: Ingen oppføring med %{id} + heading: 'Intet innlegg med id: %{id}' body: Det er ingen dagbokinnlegg eller kommentar med ID %{id}. Sjekk om du har skrevet feil eller om lenka du klikket er feil. diary_entry: posted_by: Skrevet av %{link_user} %{created} pÃ¥ %{language_link} - comment_link: Kommenter denne oppføringen - reply_link: Svar pÃ¥ denne oppføringen + comment_link: Kommenter dette innlegget + reply_link: Svar pÃ¥ dette innlegget comment_count: one: '{count} kommentar' zero: Ingen kommentarer other: '%{count} kommentarer' - edit_link: Rediger denne oppføringen - hide_link: Skjul denne oppføringen + edit_link: Rediger innlegget + hide_link: Skjul innlegget confirm: Bekreft diary_comment: - comment_from: Kommentar fra %{link_user}, %{comment_created_at} + comment_from: Kommentar fra %{link_user} den %{comment_created_at} hide_link: Skjul denne kommentaren confirm: Bekreft location: @@ -320,16 +328,16 @@ nb: edit: Rediger feed: user: - title: Oppføringer i OpenStreetMap-dagboka for %{user} - description: Nye oppføringer i OpenStreetMap-dagboka til %{user} + title: Innlegg i OpenStreetMap-dagboka for %{user} + description: Nye innlegg i OpenStreetMap-dagboka til %{user} language: - title: Oppføringer i OpenStreetMap-dagbøker pÃ¥ %{language_name} - description: Nye oppføringer i dagbøkene til OpenStreetMap-brukere pÃ¥ %{language_name} + title: Innlegg i OpenStreetMap-dagbøker pÃ¥ %{language_name} + description: Nye innlegg i dagbøkene til OpenStreetMap-brukere pÃ¥ %{language_name} all: - title: Oppføringer OpenStreetMap-dagboka - description: Nye oppføringer i dagbøkene til OpenStreetMap-brukere + title: Innlegg i OpenStreetMap-dagboka + description: Nye innlegg i dagbøkene til OpenStreetMap-brukere comments: - has_commented_on: '%{display_name} har kommentert pÃ¥ følgende dagboksoppføring' + has_commented_on: '%{display_name} har kommentert følgende dagbokinnlegg' post: Skriv when: NÃ¥r comment: Kommentar @@ -341,7 +349,7 @@ nb: start: area_to_export: OmrÃ¥de som skal eksporteres manually_select: Velg et annet omrÃ¥de manuelt - format_to_export: Format for eksport + format_to_export: Eksportformat osm_xml_data: OpenStreetMap XML-data map_image: Kartbilde (viser standardlag) embeddable_html: HTML som kan bygges inn @@ -349,20 +357,20 @@ nb: export_details: Data fra OpenStreetMap er lisensiert under <a href="http://opendatacommons.org/licenses/odbl/1.0/">Open Data Commons Open Database License</a> (ODbL). too_large: - advice: 'Hvis eksporten over feiler, vær vennlig Ã¥ vurdere bruk av en av kildene - i listen under:' + advice: 'Hvis eksporten over skulle feile kan du forsøke Ã¥ bruke av en av + kildene i listen under:' body: Dette omrÃ¥det er for stort for Ã¥ bli eksportert som OpenStreetMap XML-data. - Forstørr utvalg eller velg et mindre omrÃ¥de. Eller du kan bruke en av kildene - angitt under for nedlasting av bulkdata. + Forstørr utvalg eller velg et mindre omrÃ¥de. Eller bruke en av kildene angitt + under for nedlasting av bulkdata. planet: - title: Planet-OSM + title: Planet OSM description: Regelmessig oppdaterte kopier av hele OpenStreetMap-databasen overpass: title: Overførings-API description: Last ned denne avgrensingsrammen fra et speil av OpenStreetMap-databasen geofabrik: title: Geofabrik-nedlastninger - description: Regelmessig oppdaterte utdrag av verdensdeler, land og utvalgte + description: Regelmessig oppdaterte utdrag av kontinenter, land og utvalgte byer metro: title: Metro-utdrag @@ -375,7 +383,7 @@ nb: scale: Skala max: maks image_size: Bildestørrelse - zoom: Forstørr + zoom: Zoom add_marker: Legg til en markør pÃ¥ kartet latitude: 'Bre:' longitude: 'Len:' @@ -411,7 +419,7 @@ nb: gate: Gate helipad: Helikopterplass runway: Rullebane - taxiway: Taksebane + taxiway: Taxibane terminal: Terminal amenity: animal_shelter: Dyrehospits @@ -456,7 +464,7 @@ nb: food_court: Serveringssteder fountain: Fontene fuel: Drivstoff - gambling: Hasard + gambling: Gambling grave_yard: Gravlund gym: Treningssenter health_centre: Helsesenter @@ -484,7 +492,7 @@ nb: prison: Fengsel pub: Pub public_building: Offentlig bygning - reception_area: OppsamlingsomrÃ¥de + reception_area: ResepsjonsomrÃ¥de recycling: Resirkuleringspunkt restaurant: Restaurant retirement_home: Gamlehjem @@ -525,7 +533,7 @@ nb: "yes": Bygning craft: brewery: Bryggeri - carpenter: Snekker + carpenter: Tømmermann electrician: Elektriker gardener: Gartner painter: Maler @@ -573,14 +581,14 @@ nb: steps: Trapper street_lamp: Gatelys tertiary: Tertiær vei - tertiary_link: Lokalvei - track: Sti + tertiary_link: Tertiær vei + track: Traktorvei traffic_signals: Trafikksignalering trail: Sti trunk: Hovedvei trunk_link: Hovedvei unclassified: Uklassifisert vei - unsurfaced: Vei uten dekke + unsurfaced: Uklassifisert vei "yes": Vei historic: archaeological_site: Arkeologisk plass @@ -609,7 +617,7 @@ nb: wayside_shrine: Veikant alter wreck: Vrak junction: - "yes": Korsvei + "yes": Kryss landuse: allotments: Kolonihager basin: ElveomrÃ¥de @@ -619,7 +627,7 @@ nb: conservation: Fredet construction: Kontruksjon farm: GÃ¥rd - farmland: Jordbruksland + farmland: Jorde farmyard: GÃ¥rdstun forest: Skog garages: Garasjer @@ -633,13 +641,13 @@ nb: orchard: Frukthage quarry: Steinbrudd railway: Jernbane - recreation_ground: Idrettsplass + recreation_ground: RekreasjonsomrÃ¥de reservoir: Reservoar reservoir_watershed: Magasinvannskille residential: BoligomrÃ¥de retail: Detaljsalg road: VeiomrÃ¥de - village_green: landsbypark + village_green: Landsbypark vineyard: VingÃ¥rd "yes": Urbant omrÃ¥de leisure: @@ -661,7 +669,7 @@ nb: park: Park pitch: Sportsarena playground: Lekeplass - recreation_ground: Idrettsplass + recreation_ground: RekreasjonsomrÃ¥de resort: Utfluktssted sauna: Sauna slipway: Slipp @@ -672,7 +680,7 @@ nb: water_park: Vannpark "yes": Fritid man_made: - lighthouse: Fyr + lighthouse: FyrtÃ¥rn pipeline: Rørgate tower: TÃ¥rn works: Fabrikk @@ -701,8 +709,8 @@ nb: hill: Ås island: Øy land: Land - marsh: Sump - moor: Myr + marsh: Myr + moor: Fjellhei mud: Gjørme peak: Topp point: Punkt @@ -751,7 +759,7 @@ nb: islet: Holme isolated_dwelling: Enslig bosted locality: Plass - moor: Myr + moor: Fjellhei municipality: Kommune neighbourhood: Naboskap postcode: Postnummer @@ -784,7 +792,7 @@ nb: spur: Jernbaneforgrening station: Jernbanestasjon stop: Jernbaneknutepunkt - subway: T-banestasjon + subway: T-bane subway_entrance: T-baneinngang switch: Sporveksel tram: Sporvei @@ -902,10 +910,10 @@ nb: mooring: Fortøyning rapids: Stryk river: Elv - stream: Strøm + stream: Bekk wadi: Elveleie waterfall: Foss - weir: Overløpskant \ + weir: Overløpskant "yes": Vannvei admin_levels: level2: Riksgrense @@ -969,7 +977,7 @@ nb: help: Hjelp about: Om copyright: Opphavsrett - community: Samfunnet + community: Fellesskap community_blogs: Fellesskapsblogger community_blogs_title: Blogger fra medlemmene i OpenStreetMap-felleskapet foundation: Stiftelse @@ -995,22 +1003,23 @@ nb: legal_babble: title_html: Opphavsrett og lisenser intro_1_html: |- - OpenStreetMap er <i>Ã¥pne data</i>, lisensiert under <a + OpenStreetMap<sup><a href="#trademarks">®</a></sup> er <i>Ã¥pne data</i>, lisensiert under <a href="http://opendatacommons.org/licenses/odbl/">Open Data - Commons Open Database License</a> (ODbL). - intro_2_html: Du stÃ¥r fritt til Ã¥ kopiere, distribuere, overføre og tilpasse - vÃ¥re kart og data, sÃ¥ lenge du krediterer OpenStreetMap og dens bidragsytere. - Hvis du endrer eller bygger videre pÃ¥ vÃ¥re kart eller data, mÃ¥ du distribuere - resultatet under samme lisens. Den fullstendige <a href="http://creativecommons.org/licenses/by-sa/2.0/legalcode">juridiske - teksten</a> beskriver rettigheter og ansvar. + Commons Open Database License</a> (ODbL) av <a href="http://osmfoundation.org/">OpenStreetMap Foundation</a> (OSMF). + intro_2_html: |- + Du stÃ¥r fritt til Ã¥ kopiere, distribuere, overføre og tilpasse vÃ¥re kart og data, + sÃ¥ lenge du krediterer OpenStreetMap og dens + bidragsytere. Hvis du endrer eller bygger videre pÃ¥ vÃ¥re kart eller data, mÃ¥ du + distribuere resultatet under samme lisens. Den + fullstendige <a href="http://creativecommons.org/licenses/by-sa/2.0/legalcode">juridiske teksten</a> beskriver rettigheter og ansvar. intro_3_html: |- Kartografien i vÃ¥re kartruter, samt dokumentasjonen, er lisensiert under <a href="http://creativecommons.org/licenses/by-sa/2.0/">Creative - Commons Attribution-ShareAlike 2.0</a> license (CC-BY-SA). + Commons Attribution-ShareAlike 2.0</a> lisensen (CC BY-SA). credit_title_html: Hvordan kreditere OpenStreetMap credit_1_html: Vi krever at du bruker godskrivinga «© OpenStreetMap-bidragsyterene». credit_2_html: "Du mÃ¥ ogsÃ¥ gjøre det klart at dataene er tilgjengelige under Open \nDatabase License, og dersom du bruker vÃ¥re kartfliser, at kartografien - er\n lisensert som CC-BY-SA. Du kan gjøre dette ved Ã¥ lenke til\n<a href=\"http://www.openstreetmap.org/copyright\">denne + er\n lisensert som CC BY-SA. Du kan gjøre dette ved Ã¥ lenke til\n<a href=\"http://www.openstreetmap.org/copyright\">denne siden om opphavsrett</a>. \nAlternativt, og som et krav, hvis du distribuerer OSM i et\n dataskjema, kan du navngi og opprette en hyperlink direkte til lisensene. I medier\n hvor hyperlenker ikke er mulig (f.eks. trykte verker) @@ -1022,13 +1031,15 @@ nb: attribution_example: alt: Eksempel pÃ¥ hvordan man angir OpenStreetMap som kartkilde pÃ¥ en nettside title: Eksempel pÃ¥ kildehenvisning - more_title_html: Finn ut mer - more_1_html: |2- - Les mer om hvordan du bruker vÃ¥re data i den <a href="http://wiki.openstreetmap.org/wiki/Legal_FAQ">juridiske - FAQ-en + more_title_html: Finner ut mer + more_1_html: Les mer om hvordan du kan bruke dataene vÃ¥re og hvordan du oppgir + oss som kilde pÃ¥ <a href="http://osmfoundation.org/Licence">siden om OSMF-lisensen</a> + og i den <a href="http://wiki.openstreetmap.org/wiki/Legal_FAQ">juridiske + FAQ-en</a>. more_2_html: |- - Selv om OpenStreetMap er Ã¥pne data, kan vi ikke bidra med gratiskart-API for tredjepartsutviklere. Nærmere informasjon finnes pÃ¥ <a href="http://wiki.openstreetmap.org/wiki/API_usage_policy">API Usage Policy</a>, - <a href="http://wiki.openstreetmap.org/wiki/Tile_usage_policy">Tile Usage Policy</a> og <a href="http://wiki.openstreetmap.org/wiki/Nominatim#Usage_Policy">Nominatim Usage Policy</a>. + Selv om OpenStreetMap er Ã¥pent data, kan vi ikke bidra med gratis kart-API for tredjepartsutviklere. + Se vÃ¥r <a href="https://operations.osmfoundation.org/policies/api/">API Usage Policy</a>, + <a href="https://operations.osmfoundation.org/policies/tiles/">Tile Usage Policy</a> og <a href="https://operations.osmfoundation.org/policies/nominatim/">Nominatim Usage Policy</a>. contributors_title_html: VÃ¥re bidragsytere contributors_intro_html: 'Vi har tusenvis av individuelle bidragsytere. Vi inkluderer ogsÃ¥ Ã¥pne datasett fra nasjonale karttjenester og andre kilder, blant annet @@ -1038,7 +1049,7 @@ nb: <a href="http://data.wien.gv.at/">Stadt Wien</a> under <a href="http://creativecommons.org/licenses/by/3.0/at/deed.de">CC BY</a>, <a href="http://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm">Land Vorarlberg</a> og - Land Tirol (under <a href="http://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/">CC-BY AT med tilføyelser</a>). + Land Tirol (under <a href="http://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/">CC BY AT med tilføyelser</a>). contributors_ca_html: |- <strong>Canada</strong>: Inneholder data fra GeoBase®, GeoGratis (© Department of Natural @@ -1057,6 +1068,11 @@ nb: contributors_nz_html: |- <strong>New Zealand</strong>: Inneholder data hentet fra Land Information New Zealand. Crown Copyright reservert. + contributors_si_html: |- + <strong>Slovenia</strong>: Inneholder data fra + <a href="http://www.gu.gov.si/en/">Geologisk undersøkelse og kartmyndighet</a> and + <a href="http://www.mkgp.gov.si/en/">Departemanget for jordbruk, skog og mat</a> + (offentlig informasjonsopphav fra Slovenia). contributors_za_html: '<strong>Sør-Afrika</strong>: Inneholder data fra <a href="http://www.ngi.gov.za/">Chief Directorate: National Geo-Spatial Information</a>, State copyright reservert.' contributors_gb_html: |- @@ -1078,6 +1094,12 @@ nb: lagt til OpenStreetMap-databasen eller dette nettstedet, ber vi deg se pÃ¥ vÃ¥r <a href="http://www.osmfoundation.org/wiki/License/Takedown_procedure">prosedyre for fjerning av materiale</a> eller send inn klagen direkte pÃ¥ <a href="http://dmca.openstreetmap.org/">nettsiden</a>. + trademarks_title_html: <span id="trademarks"></span>Varemerker + trademarks_1_html: OpenStreetMap, forstørrelsesglasslogoen og State of the Map + er registrerte varemerker beskyttet pÃ¥ vegne av OpenStreetMap Foundation. + Hvis du har spørsmÃ¥l vedrørende bruken av varemerkene, rett spørsmÃ¥l mot <a + href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">arbeidsgruppen + for lisenser</a>. welcome_page: title: Velkommen! introduction_html: Velkommen til OpenStreetMap, det fri brukerredigerte verdenskartet. @@ -1098,7 +1120,7 @@ nb: title: Grunnleggende termer paragraph_1_html: OpenStreetMap har sin egen sjargong. Her er en ordliste som kan være nyttig. - editor_html: En <strong>editor</strong> er et program eller en nettside som + editor_html: En <strong>redigerer</strong> er et program eller en nettside som kan brukes til Ã¥ redigere kartet. node_html: En <strong>node</strong> er et enkeltelement pÃ¥ kartet, f.eks. en restaurant eller et tre. @@ -1106,6 +1128,14 @@ nb: vei, elv, innsjø eller en bygning. tag_html: En <strong>tagg</strong> er et informasjonselement om en node eller strekning, f.eks. navnet pÃ¥ en restaurant eller fartsgrensen pÃ¥ en vei. + rules: + title: Regler! + paragraph_1_html: OpenStreetMap har fÃ¥ formelle regler, men vi forventer at + alle deltagere samarbeider og kommuniserer med fellesskapet. Hvis du er interessert + i andre aktiviteter enn manuell redigering, vennligst les og følg retningslinjene + for <a href='http://wiki.openstreetmap.org/wiki/Import/Guidelines'>import</a> + og <a href='http://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct'>automatiske + redigeringer</a>. questions: title: Noen spørsmÃ¥l? paragraph_1_html: |- @@ -1113,7 +1143,7 @@ nb: <a href='%{help_url}'>FÃ¥ hjelp her</a>. start_mapping: Start kartlegging add_a_note: - title: Har du ikke tid til at kartlegge selv? Legg inn en kommentar! + title: Har du ikke tid til Ã¥ kartlegge selv? Legg inn en kommentar! paragraph_1_html: Hvis du bare vil ha rettet en liten detalj, men ikke har tid til Ã¥ gjøre dette selv, kan du legge inn en kommentar. paragraph_2_html: |- @@ -1145,10 +1175,29 @@ nb: url: /velkommen title: Velkommen til OSM description: Start med denne hurtigguiden som dekker det grunnleggende om OpenStreetMap. + beginners_guide: + url: http://wiki.openstreetmap.org/wiki/Nn:Beginners%27_guide + title: Hjelp for nybegynnere + description: Dugnadsbasert guide for nybegynnere. help: url: https://help.openstreetmap.org/ title: help.openstreetmap.org description: Still spørsmÃ¥l eller sjekk svar pÃ¥ OSM sine spørsmÃ¥l- og svar-sider. + mailing_lists: + title: E-postlister + description: Still et spørsmÃ¥l eller diskuter interessante tema pÃ¥ en rekke + omrÃ¥de eller saksbestemte e-postlister. + forums: + title: Forumer + description: SpørsmÃ¥l og diskusjoner for de som foretrekker et oppslagstavlelignende + grensesnitt. + irc: + title: IRC + description: Interaktiv sludrekanal pÃ¥ flere ulike sprÃ¥k som dekker mange tema. + switch2osm: + title: switch2osm + description: Hjelp for bedrifter og organisasjoner som vil bytte til OpenStreetMap-baserte + kart og andre tjenester. wiki: url: http://wiki.openstreetmap.org/ title: wiki.openstreetmap.org @@ -1156,8 +1205,8 @@ nb: about_page: next: Neste copyright_html: <span>©</span>OpenStreetMap<br>bidragsytere - used_by: '%{name} fordeler kartdata til hundrevis av nettsteder, mobilapper og - maskinvareenheter' + used_by: Tusenvis av nettsteder, mobilapper og maskinvareenheter bruker kartdata + fra %{name} lede_text: OpenStreetMap er bygd av et fellesskap av kartleggere som oppretter og vedlikeholder data om veier, stier, kafeer, jernbanestasjoner og diverse annet, over hele verdien. @@ -1170,19 +1219,24 @@ nb: Gemenskapen i OpenStreetMap er mangfoldig, brennende, og den vokser for hver dag som gÃ¥r. I vÃ¥re rekker kan en finne entusiast-kartografer, GIS-proffer, ingeniører som kjører OSM-tjenere, humanister som kartlegger katestroferammede omrÃ¥der, og flere til. For Ã¥ lære mer om samholdet, sjekk ut <a href='%{diary_path}'>brukererkjennelser</a>, og <a href='http://www.osmfoundation.org/'>OSM-stiftelsens</a> nettside. - open_data_title: Åpne data + open_data_title: Åpne Data open_data_html: 'OpenStreetMap er <i>Ã¥pne data</i>: Du kan fritt bruke det for alle formÃ¥l, sÃ¥ lenge du krediterer OpenStreetMap og dets bidragsytere. Hvis du gjør endringer eller bygger pÃ¥ dataene pÃ¥ enkelte mÃ¥ter, kan du kun distribuere resultatet under samme lisens. Se <a href=''%{copyright_path}''>Opphavsrett og lisenssiden</a> for detaljer.' + legal_title: Juridisk + legal_html: |- + Dette nettstedet og mange tilknyttede tjenester drives formelt av <a href='http://osmfoundation.org/'>OpenStreetMap Foundation</a> (OSMF) pÃ¥ vegne av fellesskapet. Bruken av alle OSMF-drevne tjenester er gjenstand for vÃ¥r <a href="http://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy">politikk for akseptabel bruk</a> og vÃ¥r <a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy">personvernspolitikk</a> + <br> + Vennligst <a href='http://osmfoundation.org/Contact'>kontakt OSMF</a> om du har spørsmÃ¥l knyttet til lisensiering, opphavsrett eller andre juridiske spørsmÃ¥l. partners_title: Partnere notifier: diary_comment_notification: - subject: '[OpenStreetMap] %{user} kommenterte pÃ¥ en oppføring i dagboka di' + subject: '[OpenStreetMap] %{user} kommenterte et dagbokinnlegg' hi: Hei %{to_user}, - header: '%{from_user} har kommentert pÃ¥ ditt siste OpenStreetMap-dagbokinnlegg - med emnet %{subject}:' + header: '%{from_user} har kommentert pÃ¥ OpenStreetMap-dagbokinnlegget med emnet + %{subject}:' footer: Du kan ogsÃ¥ lese kommentaren pÃ¥ %{readurl} og du kan kommentere pÃ¥ %{commenturl} eller svare pÃ¥ %{replyurl} message_notification: @@ -1199,9 +1253,9 @@ nb: gpx_notification: greeting: Hei, your_gpx_file: Det ser ut som GPX-filen din - with_description: med beskrivelse - and_the_tags: 'og følgende merkelapper:' - and_no_tags: og ingen merkelapper. + with_description: med beskrivelsen + and_the_tags: 'og følgende tagger:' + and_no_tags: og ingen tagger. failure: subject: '[OpenStreetMap] Feil under import av GPX' failed_to_import: 'klarte ikke importere. Her er feilen:' @@ -1227,7 +1281,7 @@ nb: greeting: Hei, hopefully_you: Noen (forhÃ¥pentligvis deg) ønsker Ã¥ endre e-postadressen for %{server_url} til %{new_address}. - click_the_link: Hvis det er deg, klikk lenka nedenfor for Ã¥ bekrefte endringen. + click_the_link: Hvis dette er deg, klikk lenka nedenfor for Ã¥ bekrefte endringen. email_confirm_html: greeting: Hei, hopefully_you: Noen (forhÃ¥pentligvis deg) ønsker Ã¥ endre e-postadressen for @@ -1273,7 +1327,7 @@ nb: pÃ¥. Merknaden er i nærheten av %{place}.' details: Flere opplysninger om merknaden finner du pÃ¥ %{url}. changeset_comment_notification: - greeting: Heia, + greeting: Hei, commented: subject_own: '[OpenStreetMap] %{commenter} har kommentert en av dine endringer' subject_other: '[OpenStreetMap] %{commenter} har kommentert en endring du @@ -1302,7 +1356,7 @@ nb: date: Dato no_messages_yet: Du har ingen meldinger ennÃ¥. Kanskje du kan prøve Ã¥ komme i kontakt med %{people_mapping_nearby_link}? - people_mapping_nearby: folk i nærheten som lager kart + people_mapping_nearby: folk som kartlegger i nærheten message_summary: unread_button: Marker som ulest read_button: Marker som lest @@ -1316,7 +1370,7 @@ nb: send_button: Send back_to_inbox: Tilbake til innboks message_sent: Melding sendt - limit_exceeded: Du har sendt mange meldinger i det siste. Vent en stind før + limit_exceeded: Du har sendt mange meldinger i det siste. Vent en stund før du prøver Ã¥ sende flere. no_such_message: title: Ingen melding funnet @@ -1333,7 +1387,8 @@ nb: to: Til subject: Emne date: Dato - no_sent_messages: folk i nærheten som lager kart + no_sent_messages: Du har ikke sendt noen meldinger ennÃ¥. Hvorfor ikke bli kjent + med noen %{people_mapping_nearby_link}? people_mapping_nearby: folk i nærheten som lager kart reply: wrong_user: Du er logget inn som «%{user}», men meldingen du ønsker Ã¥ svare @@ -1348,7 +1403,7 @@ nb: back: Tilbake to: Til wrong_user: Du er logget inn som «%{user}», men meldingen du ønsker Ã¥ lese ble - ikke sendt til den brukeren. Logg inn som korrekt bruker for Ã¥ lese. + ikke sendt fra eller til den brukeren. Logg inn som korrekt bruker for Ã¥ lese. sent_message_summary: delete_button: Slett mark: @@ -1403,15 +1458,17 @@ nb: table: entry: motorway: Motorvei + main_road: Hovedvei trunk: Hovedvei primary: Primær vei secondary: Sekundær vei unclassified: Uklassifisert vei - unsurfaced: Vei uten dekke track: Spor - byway: Stikkvei bridleway: Ridevei cycleway: Sykkelvei + cycleway_national: Nasjonal sykkelsti + cycleway_regional: Regional sykkelsti + cycleway_local: Lokal sykkelsti footway: Gangvei rail: Jernbane subway: Undergrunnsbane @@ -1433,7 +1490,6 @@ nb: golf: Golfbane park: Park resident: BoligomrÃ¥de - tourist: Turistattraksjon common: - Vanlig - eng @@ -1463,9 +1519,11 @@ nb: tunnel: Streket kant = tunnel bridge: Sort kant = bru private: Privat tilgang - permissive: Betinget tilgang destination: Destinasjonstilgang construction: Veier under konstruksjon + bicycle_shop: Sykkelbutikk + bicycle_parking: Sykkelparkering + toilets: Toaletter richtext_area: edit: Rediger preview: ForhÃ¥ndsvisning @@ -1624,6 +1682,7 @@ nb: allow_read_gpx: lese dine private GPS-spor. allow_write_gpx: laste opp GPS-spor. allow_write_notes: endre merknader. + grant_access: Gi tilgang oauthorize_success: title: Autoriseringsforespørsel tillatt allowed: Du har gitt programmet %{app_name} tilgang til din konto. @@ -1708,6 +1767,7 @@ nb: register now: Registrer deg nÃ¥ with username: 'Har du allerede en OpenStreetMap-konto? Logg inn med brukernavnet og passordet ditt:' + with external: 'Alternativt kan du bruke en tredjepart til Ã¥ logge inn:' new to osm: Ny pÃ¥ OpenStreetMap? to make changes: For Ã¥ gjøre endringer pÃ¥ OpenStreetMap-data, mÃ¥ du ha en konto. create account minute: Opprett en konto. Det tar bare ett minutt. @@ -1720,6 +1780,34 @@ nb: du ønsker Ã¥ diskutere dette. auth failure: Beklager, kunne ikke logge inn med den informasjonen openid_logo_alt: Logg inn med en OpenID + auth_providers: + openid: + title: Logg inn med OpenID + alt: Logg inn med en OpenID-URL + google: + title: Logg inn med Google + alt: Logg inn med Google OpenID + facebook: + title: Logg inn med Facebook + alt: Logg inn med Facebook-konto + windowslive: + title: Logg inn med Windows Live + alt: Logg inn med en Windows Live-konto + github: + title: Logg inn med GitHub + alt: Logg inn med en GitHub-konto + wikipedia: + title: Logg inn med Wikipedia + alt: Logg inn med en Wikipedia-konto + yahoo: + title: Logg inn med Yahoo + alt: Logg inn med Yahoo OpenID + wordpress: + title: Logg inn med Wordpress + alt: Logg inn med Wordpress OpenID + aol: + title: Logg inn med AOL + alt: Logg inn med en AOL OpenID logout: title: Logg ut heading: Logg ut fra OpenStreetMap @@ -1746,9 +1834,8 @@ nb: title: Registrer deg no_auto_account_create: Beklageligvis kan vi for øyeblikket ikke opprette en konto for deg automatisk. - contact_webmaster: Kontakt <a href="mailto:webmaster@openstreetmap.org">webmaster</a> - for Ã¥ opprette en konto. Vi vil prøve Ã¥ behandle forespørselen sÃ¥ fort som - mulig. + contact_webmaster: Kontakt <a href="%{webmaster}">webmaster</a> for Ã¥ opprette + en konto. Vi vil prøve Ã¥ behandle forespørselen sÃ¥ fort som mulig. about: header: Gratis og redigerbar html: |- @@ -1757,14 +1844,18 @@ nb: license_agreement: NÃ¥r du bekrefter kontoen din mÃ¥ du godkjenne <a href="http://www.osmfoundation.org/wiki/License/Contributor_Terms">bidragsytervilkÃ¥rene</a>. email address: 'E-postadresse:' confirm email address: 'Bekreft e-postadresse:' - not displayed publicly: Ikke vist offentlig (se <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" + not displayed publicly: Adressa di vises ikke offentlig, se <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" title="Personvernpolitikk for Wiki-en inklusiv avsnitt om e-postadressser">vÃ¥r - personvernpolitikk</a>) + personvernpolitikk</a> for mer informasjon. display name: 'Visningsnavn:' display name description: Ditt offentlig fremviste brukernavn. Du kan endre dette senere i innstillingene. + external auth: 'Tredjepartsgodkjenning:' password: 'Passord:' confirm password: 'Bekreft passord:' + use external auth: Alternativt kan du bruke en tredjepart til Ã¥ logge inn + auth no password: Med tredjepartsbekreftelse er passord ikke pÃ¥krevd, men en + del ekstra verktøy og tjenere kan trenge det. continue: Registrer deg terms accepted: Takk for at du godtok de nye bidragsytervilkÃ¥rene! terms declined: Vi beklager at du har besluttet Ã¥ ikke akseptere de nye bidragsytervilkÃ¥rene. @@ -1794,6 +1885,7 @@ nb: heading: Brukeren %{user} finnes ikke body: Det er ingen bruker med navnet %{user}. Sjekk om du har skrevet navnet feil eller om lenka du klikket er feil. + deleted: slettet view: my diary: Min dagbok new diary entry: ny dagbokoppføring @@ -1846,15 +1938,15 @@ nb: revoke: administrator: Fjern administrator-tilgang moderator: fjern moderator-tilgang - block_history: mottatte blokkeringer - moderator_history: tildelte blokkeringer + block_history: Aktive Blokkeringer + moderator_history: Tildelte Blokkeringer comments: Kommentarer - create_block: blokker denne brukeren - activate_user: aktiver denne brukeren + create_block: Blokker Denne Brukeren + activate_user: Aktiver denne Brukeren deactivate_user: deaktiver denne brukeren confirm_user: bekreft denne brukeren hide_user: skjul denne brukeren - unhide_user: stopp Ã¥ skjule denne brukeren + unhide_user: slutt Ã¥ skjule denne brukeren delete_user: slett denne brukeren confirm: Bekreft friends_changesets: venners endringssett @@ -1871,6 +1963,7 @@ nb: current email address: 'NÃ¥værende e-postadresse:' new email address: 'Ny e-postadresse:' email never displayed publicly: ' (vises aldri offentlig)' + external auth: 'Ekstern bekreftelse:' openid: link: http://wiki.openstreetmap.org/wiki/OpenID link text: hva er dette? @@ -1908,6 +2001,8 @@ nb: gravatar: gravatar: Bruk Gravatar link text: hva er dette? + disabled: Gravatar har blitt slÃ¥tt av. + enabled: Visning av din Gravatar er slÃ¥tt pÃ¥. new image: Legg til et bilde keep image: Behold gjeldende bilde delete image: Fjern gjeldende bilde @@ -1940,14 +2035,15 @@ nb: success: Vi har sendt en ny bekreftelsesmelding til %{email} og sÃ¥ snart du bekrefter kontoen din kan du begynne Ã¥ lage kart.<br /><br />Om du bruker et antispamsystem som sender bekreftelsesforspørsler, kontroller at du har - hvitelistet webmaster@openstreetmap.org siden vi ikke kan svar pÃ¥ bekreftelsesforespørsler. + hvitelistet %{sender} siden vi ikke kan svar pÃ¥ bekreftelsesforespørsler. failure: Fant ikke brukeren %{name}. confirm_email: heading: Bekreft endring av e-postadresse press confirm button: Klikk bekreftknappen nedenfor for Ã¥ bekrefte din nye e-postadressse. button: Bekreft - success: E-postadressen din er bekreftet - takk for at du registrerte deg. + success: Bytte av e-postadresse bekreftet! failure: En e-postadresse er allerede bekreftet med denne nøkkelen. + unknown_token: Denne bekreftelseskoden finnes ikke eller har utløpt. set_home: flash success: Hjemmeposisjon lagret go_public: @@ -1986,6 +2082,17 @@ nb: </p> <p> Denne avgjørelsen vil bli gjennomgÃ¥tt av en administrator snart, eller du kan kontakte %{webmaster} hvis du ønsker Ã¥ diskutere dette. + auth_failure: + connection_failed: Tilkobling til bekreftelsestilbyder feilet + invalid_credentials: Ugyldige bekreftelsesopplysninger + no_authorization_code: Mangler bekreftelseskode + unknown_signature_algorithm: Ukjent signeringsalgoritme + invalid_scope: Ugyldig avgensning + auth_association: + heading: ID-en din er ikke tilknuttet en OpenStreetMap-konto enda. + option_1: Opprett konto i skjemaet nedenfor. + option_2: Logg inn med brukernavn og passord, du kan tilknytte kontoen til din + ID i brukerinnstillingene. user_role: filter: not_an_administrator: Kun administratorer kan forandre roller, og du er ikke @@ -2023,10 +2130,10 @@ nb: som mulig og gi sÃ¥ mange detaljer du kan om situasjonen, og husk pÃ¥ at meldingen blir synlig for offentligheten. Husk pÃ¥ at ikke alle brukere forstÃ¥r fellesskapssjargongen sÃ¥ prøv Ã¥ bruke lekmannsuttrykk. - period: Hvor lenge, fra nÃ¥, brukeren vil bli blokkert fra API-en. + period: Hvor lenge, fra nÃ¥, skal brukeren blokkeres fra API-en. submit: Opprett blokkering - tried_contacting: Jeg har kontaktet brukeren og bedt dem stoppe. - tried_waiting: Jeg har gitt brukeren rimelig med tid til Ã¥ svare pÃ¥ disse kommunikasjonene. + tried_contacting: Jeg har kontaktet brukeren og bedt vedkommende stoppe. + tried_waiting: Jeg har gitt brukeren rimelig med tid til Ã¥ svare pÃ¥ kommunikasjonen. needs_view: Brukeren mÃ¥ logge inn før denne blokkeringen blir fjernet. back: Vis alle blokkeringer edit: @@ -2035,7 +2142,7 @@ nb: reason: Årsaken til hvorfor %{name} blir blokkert. Vennligst vær sÃ¥ rolig og rimelig som mulig og oppgi sÃ¥ mange detaljer du kan om situasjonen. Husk at ikke alle brukere forstÃ¥r felleskapssjargongen sÃ¥ prøv Ã¥ bruke lekmannsuttrykk. - period: Hvor lenge, fra nÃ¥, brukeren vil bli blokkert fra API-en. + period: Hvor lenge, fra nÃ¥, brukeren skal bli blokkert fra API-en. submit: Oppdater blokkering show: Vis denne blokkeringen back: Vis alle blokkeringer @@ -2045,11 +2152,11 @@ nb: block_period: Blokkeringsperioden mÃ¥ være en av verdiene som kan velges fra rullegardinen. create: - try_contacting: Vennligst prøv Ã¥ kontakte brukeren før du blokkerer dem og gi - dem rimelig med tid til Ã¥ svare. - try_waiting: Vennligst prøv Ã¥ gi brukeren rimelig med tid til Ã¥ svare før du - blokkerer dem. - flash: Opprettet en blokkering av bruker %{name}. + try_contacting: Prøv Ã¥ kontakte brukeren før du blokkerer dem og gi dem rimelig + med tid til Ã¥ svare. + try_waiting: Prøv Ã¥ gi brukeren rimelig med tid til Ã¥ svare før du blokkerer + dem. + flash: Opprettet en blokkering av brukeren %{name}. update: only_creator_can_edit: Bare moderatoren som opprettet denne blokkeringen kan endre den. @@ -2061,8 +2168,8 @@ nb: revoke: title: Tilbakekaller blokkering pÃ¥ %{block_on} heading: Tilbakekaller blokkering pÃ¥ %{block_on} av %{block_by} - time_future: Denne blokkeringen ender i %{time} - past: Denne blokkeringen endte %{time} siden og kan ikke tilbakekalles nÃ¥. + time_future: Denne blokkeringen ender om %{time} + past: Denne blokkeringen endte for %{time} siden og kan ikke tilbakekalles nÃ¥. confirm: Er du sikker pÃ¥ at du vil tilbakekalle denne blokkeringen? revoke: Tilbakekall! flash: Denne blokkeringen har blitt tilbakekalt. @@ -2086,20 +2193,22 @@ nb: helper: time_future: Slutter om %{time}. until_login: Aktiv inntil brukeren logger inn. - time_past: Sluttet %{time} siden. + time_past: Sluttet for %{time} siden. blocks_on: title: Blokkeringer av %{name} heading: Liste over blokkeringer av %{name} empty: '%{name} har ikke blitt blokkert ennÃ¥.' blocks_by: title: Blokkeringer av %{name} - heading: Liste over blokkeringer av %{name} + heading: Liste over blokkeringer utført av %{name} empty: '%{name} har ikke blokkert noen ennÃ¥.' show: title: '%{block_on} blokkert av %{block_by}' heading: '%{block_on} blokkert av %{block_by}' time_future: Slutter om %{time} - time_past: Sluttet %{time} siden + time_past: Sluttet for %{time} siden + created: Opprettet + ago: for %{time} siden status: Status show: Vis edit: Rediger @@ -2117,8 +2226,8 @@ nb: commented_at_by_html: Oppdatert for %{when} siden av %{user} closed_at_html: Løst for %{when} siden closed_at_by_html: Løst for %{when} siden av %{user} - reopened_at_html: Reaktivert for %{when} siden - reopened_at_by_html: Reaktivert for %{when} siden av %{user} + reopened_at_html: GjenÃ¥pnet for %{when} siden + reopened_at_by_html: GjenÃ¥pnet for %{when} siden av %{user} rss: title: OpenStreetMap-merknader description_area: En liste over merknader, rapportert, kommentert pÃ¥ eller lukket @@ -2127,10 +2236,10 @@ nb: opened: ny merknad (nær %{place}) commented: ny kommentar (nær %{place}) closed: lukket merknad (nær %{place}) - reopened: reaktivert merknad (nær %{place}) + reopened: gjenÃ¥pnet merknad (nær %{place}) entry: comment: Kommentar - full: Full merknad + full: Fullstendig merknad mine: title: Merknader sendt inn eller kommentert pÃ¥ av %{user} heading: '%{user} sine merknader' @@ -2140,7 +2249,7 @@ nb: description: Beskrivelse created_at: Opprettet last_changed: Sist endret - ago_html: '%{when} siden' + ago_html: for %{when} siden javascripts: close: Lukk share: @@ -2150,6 +2259,7 @@ nb: link: Lenke eller HTML long_link: Lenke short_link: Kort lenke + geo_uri: Geo-URI embed: HTML custom_dimensions: Sett egendefinerte dimensjoner format: 'Format:' @@ -2161,27 +2271,30 @@ nb: center_marker: Sentrer kart pÃ¥ markøren paste_html: Lim inn HTML for Ã¥ inkluderes pÃ¥ webside view_larger_map: Vis større kart + only_standard_layer: Kun standardlaget kan eksporteres som bilde + embed: + report_problem: Rapporter et problem key: title: Kartsymbol tooltip: Kartsymbol - tooltip_disabled: Kartnøkkel bare tilgjengelig for standardlag + tooltip_disabled: Kartnøkkel ikke tilgjengelig for dette laget map: zoom: in: Forstørr utvalg out: Forminsk utvalg locate: - title: Vis min posisjon + title: Vis posisjonen min popup: Du er innenfor {distance} {unit} av dette punktet base: standard: Standard cycle_map: Sykkelkart transport_map: Transport-kart - mapquest: MapQuest Open hot: Humanitært layers: header: Kartlag notes: Kartmerknader data: Kartdata + gps: Offentlige GPS-sporinger overlays: Aktiver overlag for Ã¥ feilsøke kartet title: Lag copyright: © <a href='%{copyright_url}'>OpenStreetMap bidragsytere</a> @@ -2204,10 +2317,10 @@ nb: unhide_comment: vis notes: new: - intro: Oppdaget en feil eller noe som mangler? La andre kartleggere fÃ¥ vite - det sÃ¥ vi kan fikse det. Flytt markøren to korrekt posisjon og skriv merknad - som forklarer problemet. (Ikke oppgi personlig informasjon eller informasjon - fra opphavsrettsbeskyttede kart eller katalogoppføringer.) + intro: Funnet en feil eller noe som mangler? La andre kartleggere fÃ¥ vite + det sÃ¥ vi kan fikse det. Flytt markøren til riktig posisjon og skriv en + merknad som forklarer problemet. (Ikke oppgi personlig informasjon eller + informasjon fra opphavsrettsbeskyttede kart eller katalogoppføringer.) add: Legg til merknad show: anonymous_warning: Denne merknaden inneholder kommentarer fra anonyme brukere @@ -2221,12 +2334,15 @@ nb: sÃ¥ her. directions: engines: - graphhopper_bicycle: Trøsykket (GrapHopper) - graphhopper_foot: Til fots (GrapHopper) - mapquest_bicycle: Trøsykkel (MapQuest) + graphhopper_bicycle: Sykkel (GraphHopper) + graphhopper_foot: Til fots (GraphHopper) + mapquest_bicycle: Sykkel (MapQuest) mapquest_car: Bil (MapQuest) mapquest_foot: Til fots (MapQuest) osrm_car: Bil (OSRM) + mapzen_bicycle: Sykkel (Mapzen) + mapzen_car: Bil (Mapzen) + mapzen_foot: Fot (Mapzen) directions: Veianvisninger distance: Avstand errors: @@ -2234,6 +2350,38 @@ nb: no_place: Beklager - kunne ikke finne det stedet. instructions: continue_without_exit: Fortsett pÃ¥ %{name} + slight_right_without_exit: Slak høyre inn pÃ¥ %{name} + offramp_right_without_exit: Ta rampen til høyre til %{name} + onramp_right_without_exit: Ta til høyre til rampen til %{name} + endofroad_right_without_exit: Ved slutten av veien, ta til høyre inn pÃ¥ %{name} + merge_right_without_exit: Flett til høyre til %{name} + fork_right_without_exit: Ved veiskillet, ta til høyre inn pÃ¥ %{name} + turn_right_without_exit: Ta til høyre inn pÃ¥ %{name} + sharp_right_without_exit: Skarp høyresving inn pÃ¥ %{name} + uturn_without_exit: Helomvending pÃ¥ %{name} + sharp_left_without_exit: Skarp venstresving inn pÃ¥ %{name} + turn_left_without_exit: Ta til venstre inn pÃ¥ %{name} + offramp_left_without_exit: Ta rampen til venstre til %{name} + onramp_left_without_exit: Ta til venstre til rampen til %{name} + endofroad_left_without_exit: Ved slutten av veien, ta til venstre inn pÃ¥ %{name} + merge_left_without_exit: Flett til venstre til %{name} + fork_left_without_exit: Ved veiskillet, ta til venstre inn pÃ¥ %{name} + slight_left_without_exit: Slak venstre inn pÃ¥ %{name} + via_point_without_exit: (via punkt) + follow_without_exit: Følg %{name} + roundabout_without_exit: Ved rundkjøringen, ta til %{name} + leave_roundabout_without_exit: Forlat rundkjøringen - %{name} + stay_roundabout_without_exit: Bli i rundkjøringen - %{name} + start_without_exit: Begynn ved slutten av %{name} + destination_without_exit: NÃ¥ mÃ¥l + against_oneway_without_exit: Kjør mot enveiskjøring pÃ¥ %{name} + end_oneway_without_exit: Slutt pÃ¥ enveiskjøring pÃ¥ %{name} + roundabout_with_exit: Ved rundkjøring, ta utvei %{exit} mot %{name} + turn_left_with_exit: Ved rundkjøringen, ta til venstre inn pÃ¥ %{name} + slight_left_with_exit: Ved rundkjøringen, ta til venstre inn pÃ¥ %{name} + turn_right_with_exit: Ved rundkjøringen, ta til høyre inn pÃ¥ %{name} + slight_right_with_exit: Ved rundkjøringen, ta til høyre inn pÃ¥ %{name} + continue_with_exit: Ved rundkjøringen, fortsett rett fram pÃ¥ %{name} unnamed: ikke navngitt courtesy: Veianvisninger gitt av %{link} time: Tid diff --git a/config/locales/nl.yml b/config/locales/nl.yml index fbe3bf750..d67c74fa9 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -10,21 +10,30 @@ # Author: Greencaps # Author: HanV # Author: Hansmuller +# Author: JaapDeKleine # Author: Jochempluim +# Author: Joost schouppe # Author: Ldp +# Author: Lemondoge # Author: M!dgard +# Author: Macofe +# Author: Mainframe98 # Author: MatthiasS # Author: McDutchie # Author: MedShot +# Author: MrLeopold # Author: Pje335 +# Author: Robin van der Vliet # Author: Robin0van0der0vliet # Author: Romaine # Author: Ruila # Author: SPQRobin +# Author: Sanderd17 # Author: Shirayuki # Author: Siebrand # Author: Sjoerddebruin # Author: Southparkfan +# Author: Sven L # Author: Tjcool007 # Author: Trijnstel --- @@ -35,8 +44,8 @@ nl: activerecord: models: acl: Rechtenoverzicht - changeset: Set wijzigingen - changeset_tag: Label van set wijzigingen + changeset: Wijzigingenset + changeset_tag: Label van wijzigingenset country: Land diary_comment: Dagboekopmerking diary_entry: Dagboekbericht @@ -45,7 +54,7 @@ nl: message: Bericht node: Node node_tag: Nodelabel - notifier: Melding + notifier: Melder old_node: Oude node old_node_tag: Oud nodelabel old_relation: Oude relatie @@ -62,7 +71,7 @@ nl: tracepoint: Trackpunt tracetag: Tracklabel user: Gebruiker - user_preference: Gebruikersvoorkeuren + user_preference: Gebruikersvoorkeur user_token: Gebruikersnummer way: Weg way_node: Wegnode @@ -184,6 +193,7 @@ nl: way: weg relation: relatie changeset: set wijzigingen + note: opmerking timeout: sorry: Het ophalen van de gegevens voor de %{type} met het ID %{id} duurde te lang. @@ -192,6 +202,7 @@ nl: way: weg relation: relatie changeset: wijzigingenset + note: opmerking redacted: redaction: Redigering %{id} message_html: Versie %{version} van dit element van het type %{type} kan niet @@ -283,6 +294,7 @@ nl: diary_entry: new: title: Nieuw dagboekbericht + publish_button: Publiceren list: title: Gebruikersdagboeken title_friends: Dagboeken van vrienden @@ -350,7 +362,7 @@ nl: description: Recente dagboekberichten van OpenStreetMap-gebruikers comments: has_commented_on: '%{display_name} heeft gereageerd op het volgende dagboekbericht' - post: Opslaan + post: Dagboekbericht when: Wanneer comment: Reactie ago: '%{ago} geleden' @@ -445,11 +457,11 @@ nl: bicycle_parking: Fietsenstalling bicycle_rental: Fietsverhuur biergarten: Biertuin - boat_rental: Boot Verhuur + boat_rental: Bootverhuur brothel: Bordeel bureau_de_change: Wisselkantoor bus_station: Busstation - cafe: Café + cafe: Koffiehuis car_rental: Autoverhuur car_sharing: Autodelen car_wash: Autowasstraat @@ -489,13 +501,13 @@ nl: market: Markt marketplace: Marktplein monastery: Klooster - motorcycle_parking: Motorfiets Parkeerplaats + motorcycle_parking: Motorfietsparkeerplaats nightclub: Nachtclub nursery: Peuterspeelzaal nursing_home: Verpleeghuis office: Kantoor parking: Parkeren - parking_entrance: Parkeerplaats Ingang + parking_entrance: Ingang parkeerplaats pharmacy: Apotheek place_of_worship: Religieuze samenkomstplaats police: Politie @@ -554,14 +566,14 @@ nl: plumber: Loodgieter shoemaker: Schoenmaker tailor: Kleermaker - "yes": Ambachts-winkel + "yes": Ambachtswinkel emergency: - ambulance_station: Ambulance Post + ambulance_station: Ambulancepost defibrillator: Defibrillator landing_site: Noodlandingsbaan phone: Noodtelefoon highway: - abandoned: Verlaten weg + abandoned: Verlaten snelweg bridleway: Ruiterpad bus_guideway: Vrijliggende busbaan bus_stop: Bushalte @@ -595,7 +607,7 @@ nl: street_lamp: Straatlantaarn tertiary: Tertiaire weg tertiary_link: Tertiaire weg - track: Pad + track: Veld- of bosweg traffic_signals: Verkeerslichten trail: Pad trunk: Autosnelweg @@ -614,14 +626,14 @@ nl: city_gate: Stadspoort citywalls: Stadsmuren fort: Fort - heritage: Erfgoed + heritage: Erfgoedlocatie house: Huis icon: Pictogram manor: Landgoed memorial: Herdenkingsmonument mine: Mijn monument: Monument - roman_road: Romeinse Weg + roman_road: Romeinse weg ruins: Ruïne stone: Steen tomb: Graf @@ -630,7 +642,7 @@ nl: wayside_shrine: Altaar langs de weg wreck: Wrak junction: - "yes": Splitsing + "yes": Kruising landuse: allotments: Volkstuinen basin: Waterbekken @@ -742,7 +754,7 @@ nl: volcano: Vulkaan water: Water wetland: Moeras - wood: Bos + wood: Bomen office: accountant: Boekhouder administrative: Administratie @@ -887,7 +899,7 @@ nl: "yes": Winkel tourism: alpine_hut: Berghut - apartment: Afdeling + apartment: Appartement artwork: Kunst attraction: Attractie bed_and_breakfast: Pension @@ -954,10 +966,10 @@ nl: home: Naar thuislocatie gaan logout: Afmelden log_in: Aanmelden - log_in_tooltip: Aanmelden met bestaande gebruiker + log_in_tooltip: Aanmelden met bestaande account sign_up: Registreren start_mapping: Beginnen met kaarten maken - sign_up_tooltip: Gebruiker voor bewerken aanmaken + sign_up_tooltip: Account voor bewerken aanmaken edit: Bewerken history: Geschiedenis export: Exporteren @@ -1000,9 +1012,9 @@ nl: license_page: foreign: title: Over deze vertaling - text: In het geval deze taalversie en het %{english_original_link} elkaar tegenspreken, + text: In het geval deze taalversie en %{english_original_link} elkaar tegenspreken, hebben de bepalingen op de Engelstalige pagina voorrang. - english_link: Engelstalige origineel + english_link: het Engelstalige origineel native: title: Over deze pagina text: U bent de Engelstalige versie van de auteursrechtenpagina aan het bekijken. @@ -1013,63 +1025,63 @@ nl: legal_babble: title_html: Auteursrechten en licentie intro_1_html: |- - OpenStreetMap<sup><a href="#trademarks">®</a></sup> is <i>open data</i>, onder licentie van de <a - href="http: opendatacommons.org="" licenses="" odbl="" "="">Open Data + OpenStreetMap<sup><a href="#trademarks">®</a></sup> is <i>open data</i>, vrijgegeven onder de <a + href="http://opendatacommons.org/licenses/odbl/">Open Data Commons Open Database License</a> (ODbL) door de <a - href="http: osmfoundation.org="" "="">OpenStreetMap Foundation</a> (OSMF). + href="http://osmfoundation.org/">OpenStreetMap Foundation</a> (OSMF). intro_2_html: |- Het staat u vrij onze gegevens te kopiëren, te distribueren, - weer te geven en aan te passen, zo lang als u OpenStreetMap en haar + weer te geven en aan te passen, zo lang u OpenStreetMap en haar auteurs vermeldt. Als u onze kaarten of gegevens wijzigt of erop verder bouwt, - mag u de resultaten onder dezelfde licentie distribueren. In de + mag u het resultaat enkel onder dezelfde licentie distribueren. In de volledige <a href="http://opendatacommons.org/licenses/odbl/1.0/">juridische tekst</a> worden uw rechten en verantwoordelijkheden uitgelegd. intro_3_html: |- De cartografie in onze kaarttegels en onze documentatie zijn - gelicenseerd onder de licentie <a href="http://creativecommons.org/licenses/by-sa/2.0/">Creative - Commons Naamsvermelding-Gelijk delen 2.0</a> license (CC-BY-SA). + vrijgegeven onder de licentie <a href="http://creativecommons.org/licenses/by-sa/2.0/">Creative + Commons Naamsvermelding-Gelijk delen 2.0</a> (CC BY-SA). credit_title_html: Hoe OpenStreetMap te vermelden credit_1_html: |- - Wij vereisen dat u het volgende vermeld bij gebruik: - “Kaartgegevens © OpenStreetMap-auteurs”. + We vereisen dat u het volgende vermeldt bij gebruik: + “© OpenStreetMap-auteurs”. credit_2_html: "U moet ook duidelijk maken dat de gegevens beschikbaar zijn - onder de Open\nDatabase License en als u onze kaarttegels gebruikt, dat de - cartografie\nde licentie CC-BY-SA heeft. U kunt dit doen door te verwijzen - naar\n<a href=\"http://www.openstreetmap.org/copyright\">deze pagina over - auteursrechten</a>. \nAls alternatief, en verplicht als u de gegevens van - OSM distribueert, kunt u\ndirect verwijzen naar de licentie(s). In media waar\nverwijzen - niet mogelijk is, bijvoorbeeld in gedrukte werken, raden we u aan\nuw lezer - te verwijzen naar openstreetmap.org, mogelijk door \n\"OpenStreetMap\" hiernaar - uit te breiden, naar opendatacommons.org en\nals van toepassing, naar creativecommons.org." + onder de Open\nDatabase License, en als u onze kaarttegels gebruikt, dat de + cartografie\nde licentie CC BY-SA heeft. U kunt dit doen door te verwijzen + naar\n<a href=\"http://www.openstreetmap.org/copyright\">de auteursrechtenpagina</a>. + \nU kunt ook direct verwijzen naar de licentie(s). Dat laatste is verplicht + als u OSM in gegevensvorm distribueert. In media waar\nhyperlinks niet mogelijk + zijn, bijvoorbeeld in gedrukte werken, raden we u aan\nuw lezer te verwijzen + naar openstreetmap.org (mogelijk door de naam \"OpenStreetMap\" naar dit webadres + uit te breiden), naar opendatacommons.org en naar, indien van toepassing, + creativecommons.org." credit_3_html: |- - Voor een doorbladerbare kaart, moet de naamsvermelding in een hoek van de kaart weergegeven worden. + Voor een doorbladerbare, digitale kaart, moet de naamsvermelding in een hoek van de kaart weergegeven worden. Bijvoorbeeld: attribution_example: alt: Voorbeeld van hoe de naamsvermelding voor OpenStreetMap toe te passen op een webpagina title: Voorbeeld naamsvermelding more_title_html: Meer informatie - more_1_html: |- - Lees meer over het gebruik van onze gegevens, en hoe credit ons, op de <a - href="http: osmfoundation.org="" Licence"="">OSMF Licentie pagina</a> en de gemeenschap <a - href="http: wiki.openstreetmap.org="" wiki="" Legal_FAQ"="">Legaal - FAQ</a>. + more_1_html: Lees meer over het gebruik van onze gegevens, en hoe u OpenStreetMap + moet vermelden, op de <a href="http://osmfoundation.org/Licence">licentiepagina + van de OSMF</a> en de gemeenschapspagina <a href="http://wiki.openstreetmap.org/wiki/Legal_FAQ">vaak + gestelde juridische vragen</a> (Engelstalig). more_2_html: |- Hoewel OpenStreetMap open data is, kunnen we geen gratis kaart-API voor derde partijen aanbieden. - Zie ons <a href="http://wiki.openstreetmap.org/wiki/API_usage_policy">API-gebruikbeleid</a>, - <a href="http://wiki.openstreetmap.org/wiki/Tile_usage_policy">Tegelgebruikbeleid</a> - en <a href="http://wiki.openstreetmap.org/wiki/Nominatim#Usage_Policy">Nominatimgebruikbeleid</a>. + Zie ons <a href="https://operations.osmfoundation.org/policies/api/">API-gebruikbeleid</a>, + <a href="https://operations.osmfoundation.org/policies/tiles/">Tegelgebruikbeleid</a> + en <a href="https://operations.osmfoundation.org/policies/nominatim/">Nominatimgebruikbeleid</a>. contributors_title_html: Onze bijdragers contributors_intro_html: |- - Onze bijdragers zijn duizenden individuen. We bieden ook + Onze bijdragers zijn duizenden individuen. OSM bevat ook open gelicenseerde gegevens van nationale kaartenbureaus - en andere bronnen afkomstig zijn, waaronder: + en andere bronnen, waaronder: contributors_at_html: |- - <strong>Austria</strong>: Bevat gegevens van de + <strong>Oostenrijk</strong>: bevat gegevens van de <a href="http://data.wien.gv.at/">Stad Wenen</a> (onder <a href="http://creativecommons.org/licenses/by/3.0/at/deed.de">CC BY</a>), <a href="http://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm">Land Vorarlberg</a> en - Land Tirol (onder <a href="http://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/">CC-BY AT met aanvullingen</a>). + Land Tirol (onder <a href="http://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/">CC BY-AT met aanvullingen</a>). contributors_ca_html: |- <strong>Canada</strong>: Bevat gegevens van GeoBase®, GeoGratis (© Department of Natural @@ -1098,8 +1110,8 @@ nl: <a href="http://www.ngi.gov.za/">Chief Directorate: National Geo-Spatial Information</a>, auteursrechten voor de Staat voorbehouden. contributors_gb_html: |- - <strong>Verenigd Koninkrijk</strong>: Bevat gegevens van - de Ordnance Survey © Crown Copyright en databaserechten + <strong>Verenigd Koninkrijk</strong>: bevat gegevens van + Ordnance Survey © Crown Copyright en databaserechten 2010-2012. contributors_footer_1_html: |- Voor meer gegevens over deze en andere bronnen die gebruikt zijn @@ -1112,19 +1124,18 @@ nl: aansprakelijkheid aanvaardt. infringement_title_html: Auteursrechtenschending infringement_1_html: |- - Bijdragers aan OSM mogen nooit gegevens toevoegen + Bijdragers aan OSM horen nooit gegevens toe te voegen uit bronnen waarvan de licentie niet vrij is (bijvoorbeeld Google Maps of gedrukte kaarten) zonder expliciete toestemming van de auteursrechtenhouders. infringement_2_html: |- Als u van mening bent dat auteursrechtelijk beschermd en niet vrij gelicenseerd materiaal - ongeoorloofd aan de database van OpenStreetMap is toegevoegd, raadpleeg dan - onze <a href="http://www.osmfoundation.org/wiki/License/Takedown_procedure">takedownprocedure</a> + ongeoorloofd aan de database van OpenStreetMap of aan deze website is toegevoegd, raadpleeg dan + onze <a href="http://www.osmfoundation.org/wiki/License/Takedown_procedure">verwijderprocedure</a> of meld het direct en formeel via onze <a href="http://dmca.openstreetmap.org/">online claimpagina</a>. trademarks_title_html: <span id="trademarks"></span>Handelsmerken - trademarks_1_html: OpenStreetMap en de looking glass-logo zijn geregistreerde - handelsmerken van de OpenStreetMap Foundation. Als u vragen hebt over uw gebruik - van de merken, stuur uw vragen dan naar de <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">Vergunning - werkgroep</a>. + trademarks_1_html: OpenStreetMap, het vergrootglaslogo en State of the Map zijn + geregistreerde handelsmerken van de OpenStreetMap Foundation. Als u vragen + hebt over uw gebruik van deze merken, stuur dan uw vragen dan naar de <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">Licentiewerkgroep</a>. welcome_page: title: Welkom! introduction_html: Welkom bij OpenStreetMap, de open en te bewerken kaart van @@ -1163,8 +1174,8 @@ nl: questions: title: Nog vragen? paragraph_1_html: |- - Er zijn verschillende bronnen om te leren over OpenStreetMap, voor het stellen van vragen en het krijgen van antwoorden, en het samen overleggen en documenteren van onderwerpen die gaan over kaarten maken. - <a href='%{help_url}'>Hier vindt u meer informatie</a>. + Er zijn verschillende bronnen om te leren over OpenStreetMap, voor het stellen en beantwoorden van vragen, en het samen overleggen en documenteren van onderwerpen die gaan over kaarten maken. + <a href='%{help_url}'>Hier vind je meer informatie</a>. start_mapping: Beginnen met kaarten maken add_a_note: title: Geen tijd om te bewerken? Voeg een opmerking toe! @@ -1177,23 +1188,24 @@ nl: fixthemap: title: Een probleem melden / de kaart corrigeren how_to_help: - title: Hoe u kunt helpen + title: Hoe je kan helpen join_the_community: title: Word lid van onze gemeenschap - explanation_html: Als u een probleem met onze kaartgegevens hebt gevonden - (er ontbreekt bijvoorbeeld een weg of uw adres staat er niet in) dan kunt - u zich het beste bij OpenStreetMap inschrijven en de gegevens zelf toevoegen + explanation_html: Als je een probleem met onze kaartgegevens hebt gevonden + (er ontbreekt bijvoorbeeld een weg of je adres staat er niet in) dan kan + je je het best bij OpenStreetMap inschrijven en de gegevens zelf toevoegen of corrigeren. add_a_note: instructions_html: |- Klik op <a class='icon note'></a> of het hetzelfde pictogram op de kaartweergave. - Er wordt dan een markering toegevoegd aan de kaart, die u kunt verplaatsen door te slepen. - Voeg uw bericht toe, klik op opslaan, en andere kaartenmakers kijken dan naar uw melding. + Er wordt dan een markering toegevoegd aan de kaart, die je kan verslepen. + Voeg je bericht toe, klik op opslaan, en andere kaartenmakers kijken dan naar jouw melding. other_concerns: - title: Andere punten van zorg + title: Andere aangelegenheden explanation_html: |- - Als u vragen hebt over hoe onze gegevens worden gebruikt of over de inhoud, raadpleeg dan onze - <a href='/copyright'>auteursrechtenpagina</a> voor meer juridische informatie, of neem contact op met de betreffende <a href='http://wiki.osmfoundation.org/wiki/Working_Groups'>OSMF werkgroep</a>. + Als je vragen hebt over hoe onze gegevens worden gebruikt of over de inhoud, raadpleeg dan onze + <a href='/copyright'>auteursrechtenpagina</a> voor meer juridische informatie, of neem contact op met de betreffende + <a href='http://wiki.osmfoundation.org/wiki/Working_Groups'>OSMF-werkgroep</a>. help_page: title: Hulp krijgen introduction: Er zijn verschillende bronnen om meer te leren over OpenStreetMap, @@ -1207,26 +1219,26 @@ nl: beginners_guide: url: http://wiki.openstreetmap.org/wiki/NL:Beginnershandleiding title: Handleiding voor beginners - description: Gemeenschap onderhouden handleiding voor beginners. + description: Handleiding voor beginners, onderhouden door de gemeenschap. help: url: https://help.openstreetmap.org/ title: help.openstreetmap.org - description: Stel een vraag op zoek antwoorden op de vraag- en antwoordsite + description: Stel een vraag of zoek antwoorden op de vraag- en antwoordsite van OSM. mailing_lists: title: Mailinglijsten - description: Een vraag stellen of het bespreken van interessante zaken op een - breed scala van actuele of regionale mailinglijsten. + description: Stel een vraag of bespreek interessante zaken op een hele reeks + onderwerpsgebonden of regionale mailinglijsten. forums: title: Forums description: Vragen en overleg voor als u liever met een interface in bulletin - board-stijl werkt + boardstijl werkt. irc: title: IRC description: Interactieve chat in vele verschillende talen en over tal van onderwerpen. switch2osm: title: switch2osm - description: Hulp voor bedrijven en organisaties schakelen om op basis van OpenStreetMap + description: Hulp voor bedrijven en organisaties om over te schakelen op OpenStreetMap-gebaseerde kaarten en andere diensten. wiki: url: http://wiki.openstreetmap.org/ @@ -1235,7 +1247,7 @@ nl: about_page: next: Volgende copyright_html: <span>©</span>OpenStreetMap-<br />bijdragers - used_by: '%{name} levert gegevens voor honderden websites, mobiele apps en hardwareimplementaties' + used_by: '%{name} levert gegevens voor duizenden websites, mobiele apps en hardwareimplementaties' lede_text: OpenStreetMap wordt gemaakt door een gemeenschap van kaartenmakers die gegevens over wegen, paden, cafés, treinstations en nog veel meer, over de hele wereld bijdragen en onderhouden. @@ -1245,26 +1257,29 @@ nl: of OSM accuraat en bij de tijd is. community_driven_title: Communitygedreven community_driven_html: |- - De gemeenschap van OpenStreetMap is divers, gepassioneerd en groeiende dagelijks. Onder onze bijdragers zitten mensen die kaarten maken als hobby, GIS-professionals, IT-specialisten die de servers van OSM draaiende houden, filantropen die rampgebieden in kaart brengen en nog veel meer. - Bekijk de <a href='%{diary_path}'>gebruikersdagboeken</a> of de <a href='http://blogs.openstreetmap.org/'>gemeenschapsblogs</a> voor meer informatie over de gemeenschap of de website van de <a href='http://www.osmfoundation.org/'>OSM Foundation</a>.� + De gemeenschap van OpenStreetMap is divers, gepassioneerd en wordt elke dag groter. Onder onze bijdragers zitten mensen die kaarten maken als hobby, GIS-professionals, IT-specialisten die de servers van OSM draaiende houden, filantropen die rampgebieden in kaart brengen en nog veel meer. + Bekijk de <a href='%{diary_path}'>gebruikersdagboeken</a> of de <a href='http://blogs.openstreetmap.org/'>gemeenschapsblogs</a> voor meer informatie over de gemeenschap of de website van de <a href='http://www.osmfoundation.org/'>OSM Foundation</a>. open_data_title: Open data open_data_html: 'OpenStreetMap is <i>open data</i>: u mag de gegevens gebruiken voor ieder doel, als u de naam van OpenStreetMap en haar bijdragers maar vermeldt. Als u de gegevens wijzigt of uitbouwt op bepaalde manieren, dan mag u het resultaat alleen onder dezelfde licentie verder verspreiden. Zie de <a href=''%{copyright_path}''>pagina over Auteursrechten en Licentie</a> voor details.' - legal_title: Toegestaan - legal_html: "Deze site en tal van andere diensten zijn formeel bediend door \n<a - href=\"http://osmfoundation.org/\">OpenStreetMap Foundation</a> (OSMF) \nnamens - de gemeenschap.\n<br> \nNeem dan <a href=\"http://osmfoundation.org/Contact\">contact - op met de OSMF</a> \nals u licenties, auteursrechten of andere juridische vragen - en problemen." + legal_title: Juridisch + legal_html: "Deze site en tal van andere diensten worden formeel beheerd door + \n<a href=\"http://osmfoundation.org/\">OpenStreetMap Foundation</a> (OSMF) + \nnamens de gemeenschap. Het gebruik van alle door OSMF aangeboden diensten + is onderworpen\naan ons <a href=\"http://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy\">\nBeleid + voor aanvaardbaar gebruik</a> en ons <a href=\"http://wiki.osmfoundation.org/wiki/Privacy_Policy\">Privacybeleid</a>.\n<br> + \n<a href=\"http://osmfoundation.org/Contact\">Neem contact op met de OSMF</a> + \nals u vragen of problemen hebt in verband met licenties, auteursrechten of + andere juridische zaken." partners_title: Partners notifier: diary_comment_notification: subject: '[OpenStreetMap] %{user} heeft een reactie bij uw dagboek geplaatst' hi: Hallo %{to_user}, - header: '%{from_user} heeft een reactie geplaatst bij uw recente OpenStreetMap-dagboekbericht + header: '%{from_user} heeft een reactie geplaatst bij uw OpenStreetMap-dagboekbericht met het onderwerp %{subject}:' footer: U kunt de reactie ook lezen op %{readurl} en u kunt zelf ook reageren op %{commenturl} of antwoorden op %{replyurl} @@ -1335,7 +1350,7 @@ nl: anonymous: Een anonieme gebruiker greeting: Hallo, commented: - subject_own: '[OpenStreetMap] %{commenter} heeft gereageerd op een van jouw + subject_own: '[OpenStreetMap] %{commenter} heeft gereageerd op een van uw opmerkingen' subject_other: '[OpenStreetMap] %{commenter} heeft gereageerd op een opmerking waar u interesse in hebt' @@ -1418,7 +1433,7 @@ nl: outbox: Postvak UIT messages: one: U hebt één verzonden bericht - other: U hebt%{count} verzonden berichten + other: U hebt %{count} verzonden berichten to: Aan subject: Onderwerp date: Datum @@ -1496,17 +1511,19 @@ nl: table: entry: motorway: Snelweg + main_road: Hoofdweg trunk: Autoweg primary: Primaire weg secondary: Secundaire weg unclassified: Ongeclassificeerde weg - unsurfaced: Onverharde weg track: Spoor - byway: Ventweg bridleway: Ruiterpad cycleway: Fietspad - footway: Voetpad - rail: Spoor + cycleway_national: Nationale fietsroute + cycleway_regional: Regionale fietsroute + cycleway_local: Lokale fietsroute + footway: Wandelpad of voetpad + rail: Spoorweg subway: Metro tram: - Licht spoor @@ -1522,17 +1539,16 @@ nl: - terminal admin: Bestuurlijke grens forest: Bos - wood: Bos + wood: Bomen golf: Golfbaan park: Park resident: Bewoond gebied - tourist: Touristische attractie common: - - Algemeen + - Gemene grond - weide retail: Winkelgebied industrial: Industriegebied - commercial: Winkelgebied + commercial: Commercieel gebied heathland: Heide lake: - Meer @@ -1556,9 +1572,11 @@ nl: tunnel: Tunnel bridge: Brug private: Privétoegang - permissive: Beperkte toegang destination: Bestemmingsverkeer construction: Weg in aanbouw + bicycle_shop: Fietsenwinkel + bicycle_parking: Fietsparkeerplaats + toilets: Toiletten richtext_area: edit: Bewerken preview: Voorvertoning @@ -1707,7 +1725,7 @@ nl: niet te onderschijven, maar moet ze wel gezien hebben. oauth: oauthorize: - title: Geef toegang tot uw gebruiker + title: Geef toegang tot uw account request_access: De toepassing %{app_name} vraagt toegang tot uw gebruiker %{user}. Controleer of u deze toepassing de volgende mogelijkheden wilt bieden. U kunt zoveel of zo weinig rechten toewijzen als u wilt. @@ -1719,6 +1737,7 @@ nl: allow_read_gpx: uw persoonlijke GPS-tracks lezen allow_write_gpx: GPS-tracks uploaden allow_write_notes: opmerkingen wijzigen. + grant_access: Toegang verlenen oauthorize_success: title: Autorisatieaanvraag toegestaan allowed: U hebt de toepassing %{app_name} toegang verleend tot uw gebruiker. @@ -1825,11 +1844,17 @@ nl: title: Aanmelden met Google alt: Aanmelden met een Google OpenID facebook: - title: Login met Facebook - alt: Inloggen met een Facebook-Account + title: Aanmelden met Facebook + alt: Aanmelden met een Facebookaccount windowslive: - title: Login met Windows Live - alt: Inloggen met een Windows Live-Account + title: Aanmelden met Windows Live + alt: Aanmelden met een Windows Live-account + github: + title: Aanmelden met GitHub + alt: Aanmelden met een GitHub-account + wikipedia: + title: Aanmelden met Wikipedia + alt: Aanmelden met een Wikipedia account yahoo: title: Aanmelden met Yahoo alt: Aanmelden met een Yahoo OpenID @@ -1866,8 +1891,8 @@ nl: title: Registreren no_auto_account_create: Helaas is het niet mogelijk om automatisch een gebruiker voor u aan te maken. - contact_webmaster: Neem contact op met de <a href="mailto:webmaster@openstreetmap.org">webmaster</a> - om een gebruiker te laten maken. We proberen uw aanvraag dan zo snel mogelijk + contact_webmaster: Neem contact op met de <a href="%{webmaster}">webmaster</a> + om een account te laten maken. We proberen uw aanvraag dan zo snel mogelijk af te handelen. about: header: Open en te bewerken @@ -1879,8 +1904,9 @@ nl: voor bijdragen</a>. email address: 'E-mailadres:' confirm email address: 'E-mailadres bevestigen:' - not displayed publicly: Niet openbaar gemaakt. Zie <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" - title="wiki privacyovereenkomst met een sectie over e-mailadressen">Privacyovereenkomst</a>. + not displayed publicly: Uw adres wordt niet openbaar gemaakt, zie ons <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" + title="OSMF privacybeleid met een paragraaf over e-mailadressen">Privacybeleid</a> + voor meer informatie. display name: 'Weergavenaam:' display name description: Uw openbare gebruikersnaam. U kunt deze later in uw voorkeuren wijzigen. @@ -1890,15 +1916,6 @@ nl: use external auth: U kunt ook gebruik maken van een derde partij om aan te melden auth no password: Met derde partijverificatie is een wachtwoord niet verplicht, maar sommige extra hulpmiddelen of servers kunnen het nog steeds nodig hebben. - auth association: |- - <p>Uw ID is nog niet gekoppeld aan een OpenStreetMapgebruiker.</p> - <ul> - <li>Als u nieuw bent bij OpenStreetMap, maak dan een gebruiker aan met behulp van het onderstaande formulier.</li> - <li> - Als u al een gebruiker heeft, kunt u zich aanmelden met uw gebruikersnaam en wachtwoord - en daarna uw gebruiker koppelen aan uw OpenID in uw gebruikersinstellingen. - </li> - </ul> continue: Registreren terms accepted: Dank u wel voor het aanvaarden van de nieuwe bijdragersovereenkomst! terms declined: We vinden het jammer dat u hebt besloten de nieuwe Bijdragersvoorwaarden @@ -1929,16 +1946,17 @@ nl: heading: De gebruiker %{user} bestaat niet body: Er is geen gebruiker met de naam %{user}. Controleer de spelling, of misschien is de koppeling waarop u hebt geklikt onjuist. + deleted: verwijderd view: my diary: Dagboek new diary entry: nieuw dagboekbericht my edits: Bewerkingen my traces: Traces - my notes: Opmerkingen + my notes: Mijn opmerkingen my messages: Mijn berichten my profile: Profiel my settings: Instellingen - my comments: Opmerkingen + my comments: Mijn reacties oauth settings: Oauth-instellingen blocks on me: Blokkades voor u blocks by me: Blokkades door u @@ -1981,16 +1999,16 @@ nl: revoke: administrator: Beheerdersrechten intrekken moderator: Moderatorrechten intrekken - block_history: blokkades voor mij - moderator_history: ingestelde blokkades + block_history: Actieve blokkades + moderator_history: Uitgevoerde blokkades comments: Reacties - create_block: gebruiker blokkeren - activate_user: gebruiker actief maken - deactivate_user: gebruiker inactief maken - confirm_user: deze gebruiker bevestigen - hide_user: gebruikers verbergen - unhide_user: gebruiker weer zichtbaar maken - delete_user: gebruiker verwijderen + create_block: Deze gebruiker blokkeren + activate_user: Deze gebruiker activeren + deactivate_user: Deze gebruiker deactiveren + confirm_user: Gebruiker bevestigen + hide_user: Gebruiker verbergen + unhide_user: Gebruiker zichtbaar maken + delete_user: Deze gebruiker verwijderen confirm: Bevestigen friends_changesets: wijzigingensets van vrienden friends_diaries: dagboekberichten van vrienden @@ -2001,7 +2019,7 @@ nl: nearby mapper: Dichtbijzijnde mapper friend: Vriend account: - title: Gebruiker bewerken + title: Account bewerken my settings: Mijn instellingen current email address: 'Huidige e-mailadres:' new email address: 'Nieuw e-mailadres:' @@ -2045,6 +2063,8 @@ nl: gravatar: gravatar: Gravatar gebruiken link text: wat is dit? + disabled: Gravatar is uitgeschakeld. + enabled: Het weergeven van uw Gravatar is ingeschakeld. new image: Afbeelding toevoegen keep image: Huidige afbeelding behouden delete image: Huidige afbeelding verwijderen @@ -2070,15 +2090,15 @@ nl: press confirm button: Klik op de knop "Bevestigen" hieronder om uw gebruiker te activeren. button: Bevestigen - success: De gebruiker is geactiveerd. Dank u wel voor het registreren! - already active: Deze gebruiker is al bevestigd. + success: De account is geactiveerd. Dank u wel voor het registreren! + already active: Deze account is al bevestigd. unknown token: De opgegeven bevestigingscode is verlopen of bestaat niet. reconfirm_html: Als nodig, kunt u <a href="%{reconfirm}">de bevestigingscode opnieuw laten verzenden</a>. confirm_resend: success: Er is ter bevestiging een e-mail verstuurd naar %{email} en als u uw - gebruiker hebt bevestigd, kunt u gaan mappen.<br /><br />Als u een spamfilter - gebruikt die per e-mail een bevestiging stuurt, zorg er dan voor dat u webmaster@openstreetmap.org + account hebt bevestigd, kunt u gaan mappen.<br /><br />Als u een spamfilter + gebruikt die per e-mail een bevestiging stuurt, zorg er dan voor dat u %{sender} toestaat. Dit systeem stuurt geen antwoord op bevestigingsverzoeken. failure: De gebruiker %{name} is niet gevonden. confirm_email: @@ -2120,7 +2140,7 @@ nl: empty: Geen gebruikers gevonden suspended: title: Gebruiker opgeschort - heading: Gebruiker opgeschort + heading: Account opgeschort webmaster: webmaster body: |- <p>Uw gebruiker is automatisch opgeschort vanwege verdachte activiteit.</p> @@ -2130,7 +2150,13 @@ nl: invalid_credentials: Ongeldige verificatiereferenties no_authorization_code: Geen autorisatiecode unknown_signature_algorithm: Onbekend algoritme voor handtekening - invalid_scope: Ongeldige toepassingsgebied + invalid_scope: Ongeldig toepassingsgebied + auth_association: + heading: Uw ID is nog niet verbonden met een OpenStreetMap-account. + option_1: Indien u nieuw bent bij OpenStreetMap, kunt u met het onderstaande + formulier een account aanmaken. + option_2: Als u al een account hebt, kunt u hieronder met uw gebruikersnaam + en wachtwoord aanmelden en daarna uw ID met uw account verbinden in uw instellingen. user_role: filter: not_an_administrator: Alleen beheerders kunnen gebruikersrollen beheren. U bent @@ -2313,10 +2339,13 @@ nl: center_marker: Kaart centreren op de marker paste_html: Plak de HTML om op te nemen in website view_larger_map: Grotere kaart bekijken + only_standard_layer: Alleen de standaard laag kan worden geëxporteerd als afbeelding + embed: + report_problem: Probleem melden key: title: Legenda tooltip: Legenda - tooltip_disabled: Legenda is alleen beschikbaar voor standaardlaag + tooltip_disabled: Legenda is niet beschikbaar voor deze laag map: zoom: in: Inzoomen @@ -2328,12 +2357,12 @@ nl: standard: Standaard cycle_map: Fietskaart transport_map: Transport Map - mapquest: MapQuest Open hot: Humanitarian layers: header: Kaartlagen notes: Opmerkingen bij kaarten data: Kaartgegevens + gps: Openbare GPS-traces overlays: Overlays inschakelen om fouten in de kaart te kunnen identificeren title: Lagen copyright: © <a href='%{copyright_url}'>bijdragers OpenStreetMap</a> @@ -2374,25 +2403,38 @@ nl: er daarna op. directions: engines: - graphhopper_bicycle: Fiets (GraphHopper) - graphhopper_foot: Voet (GraphHopper) - mapquest_bicycle: Fiets (MapQuest) + graphhopper_bicycle: Fietsen (GraphHopper) + graphhopper_foot: Lopen (GraphHopper) + mapquest_bicycle: Fietsen (MapQuest) mapquest_car: Auto (MapQuest) - mapquest_foot: Voet (MapQuest) + mapquest_foot: Lopen (MapQuest) osrm_car: Auto (OSRM) + mapzen_bicycle: Fietsen (Mapzen) + mapzen_car: Auto (Mapzen) + mapzen_foot: Lopen (Mapzen) directions: Routebeschrijving distance: Afstand errors: no_route: Kon geen route vinden tussen deze twee plaatsen. - no_place: Sorry - kon deze plaats niet vinden. + no_place: Deze plaats kon helaas niet gevonden worden. instructions: continue_without_exit: Verder op %{name} slight_right_without_exit: Flauwe bocht naar rechts naar %{name} + offramp_right_without_exit: Neem de oprit aan de rechterkant naar %{name} + onramp_right_without_exit: Sla rechtsaf op de oprit naar %{name} + endofroad_right_without_exit: Sla rechtsaf aan het einde van de weg naar %{name} + merge_right_without_exit: Voeg rechts in naar %{name} + fork_right_without_exit: Sla rechtsaf bij de splitsing naar %{name} turn_right_without_exit: Sla rechtsaf naar %{name} sharp_right_without_exit: Scherp rechtsaf naar %{name} uturn_without_exit: U-bocht langs %{name} sharp_left_without_exit: Scherp linksaf naar %{name} turn_left_without_exit: Sla linksaf naar %{name} + offramp_left_without_exit: Neem de oprit aan de linkerkant naar %{name} + onramp_left_without_exit: Sla linksaf op de oprit naar %{name} + endofroad_left_without_exit: Sla linksaf bij het einde van de weg naar %{name} + merge_left_without_exit: Voeg links in naar %{name} + fork_left_without_exit: Sla linksaf bij de splitsing naar %{name} slight_left_without_exit: Flauwe bocht naar links naar %{name} via_point_without_exit: (via punt) follow_without_exit: Volg %{name} @@ -2403,7 +2445,12 @@ nl: destination_without_exit: Bestemming bereiken against_oneway_without_exit: Ga tegen het verkeer in op %{name} end_oneway_without_exit: Einde van eenrichtingsverkeer op %{name} - roundabout_with_exit: Neem op de rotonde de afslag %{exit} naar %{name} + roundabout_with_exit: Neem op de rotonde afslag %{exit} naar %{name} + turn_left_with_exit: Op de rotonde linksaf naar %{name} + slight_left_with_exit: Op de rotonde flauwe bocht naar links naar %{name} + turn_right_with_exit: Op de rotonde rechtsaf naar %{name} + slight_right_with_exit: Op de rotonde flauwe bocht naar rechts naar %{name} + continue_with_exit: Op de rotonde rechtdoor naar %{name} unnamed: naamloos courtesy: Routebeschrijving met dank aan %{link} time: Tijd diff --git a/config/locales/nn.yml b/config/locales/nn.yml index 4c784def7..a74c290e2 100644 --- a/config/locales/nn.yml +++ b/config/locales/nn.yml @@ -6,11 +6,13 @@ # Author: Gnonthgol # Author: Gunnernett # Author: Harald Khan +# Author: Macofe # Author: Nemo bis # Author: Nghtwlkr # Author: Njardarlogar # Author: Pladask # Author: Ruila +# Author: 6400 --- nn: html: @@ -1067,9 +1069,7 @@ nn: primary: Primærveg secondary: Sekundærveg unclassified: Uklassifisert veg - unsurfaced: Veg utan dekke track: Spor - byway: Stikkveg bridleway: Rideveg cycleway: Sykkelveg footway: Gangveg @@ -1093,7 +1093,6 @@ nn: golf: Golfbane park: Park resident: BoligomrÃ¥de - tourist: Turistattraksjon common: - Vanleg - snever @@ -1123,7 +1122,6 @@ nn: tunnel: Streka kant = tunnel bridge: Sort kant = bru private: Privat tilgjenge - permissive: Betinget tilgjenge destination: Destinasjonstilgang construction: Vegar under konstruksjon richtext_area: @@ -1390,9 +1388,8 @@ nn: title: Opprett konto no_auto_account_create: Beklagelegvis kan me for augneblunken ikkje opprette ein konto for deg automatisk. - contact_webmaster: Kontakt <a href="mailto:webmaster@openstreetmap.org">webmaster</a> - for Ã¥ opprette ein konto. Me vil prøve Ã¥ handsame førespurnaden sÃ¥ fort som - mogleg. + contact_webmaster: Kontakt <a href="%{webmaster}">webmaster</a> for Ã¥ opprette + ein konto. Me vil prøve Ã¥ handsame førespurnaden sÃ¥ fort som mogleg. license_agreement: NÃ¥r du stadfestar kontoen din mÃ¥ du godkjenne <a href="http://www.osmfoundation.org/wiki/License/Contributor_terms">bidragsytervilkÃ¥ra</a>. email address: 'E-postadresse:' confirm email address: 'Stadfest e-postadresse:' @@ -1576,7 +1573,7 @@ nn: success: Me har sendt ein ny bekreftelsesmelding til %{email} og sÃ¥ snart du stadfestar kontoen din kan du byrje Ã¥ lage kart.<br /><br />Om du brukar eit antispamsystem som sender bekreftelsesforspørsler, kontrollar at du har kvitelista - webmaster@openstreetmap.org sidan me ikkje kan svar pÃ¥ bekreftelsesforespørsler. + %{sender} sidan me ikkje kan svar pÃ¥ bekreftelsesforespørsler. failure: Fann ikkje brukaren %{name}. confirm_email: heading: Stadfest endring av e-postadresse @@ -1753,10 +1750,15 @@ nn: standard: Standard cycle_map: Sykkelkart transport_map: Transport-kart - mapquest: MapQuest Open site: edit_tooltip: Rediger kartet edit_disabled_tooltip: Zoom inn for Ã¥ redigere kartet + directions: + engines: + graphhopper_bicycle: Sykkel (GraphHopper) + graphhopper_foot: Til fots (GraphHopper) + mapquest_bicycle: Sykkel (MapQuest) + mapquest_foot: Til fots (MapQuest) redaction: edit: description: Skildring diff --git a/config/locales/oc.yml b/config/locales/oc.yml index 60d995994..158fc3140 100644 --- a/config/locales/oc.yml +++ b/config/locales/oc.yml @@ -2,6 +2,7 @@ # Exported from translatewiki.net # Export driver: phpyaml # Author: Cedric31 +# Author: Macofe --- oc: time: @@ -32,7 +33,7 @@ oc: relation: Relacion relation_member: Membre de la relacion relation_tag: Balisa de relacion - session: Sesilha + session: Session trace: Pista tracepoint: Punt de la traça tracetag: Balisa de la pista @@ -157,6 +158,7 @@ oc: way: camin relation: relacion changeset: grop de modificacions + note: nòta timeout: sorry: O planhèm, las donadas pel tipe %{type} amb l'id %{id} prenon tròp de temps per èsser recuperadas. @@ -165,6 +167,7 @@ oc: way: camin relation: relacion changeset: grop de modificacions + note: nòta redacted: redaction: Redaccion %{id} message_html: La version %{version} d'aqueste(-a) %{type} pòt pas èsser afichada @@ -251,6 +254,7 @@ oc: diary_entry: new: title: Novèla entrada del jornal + publish_button: Publicar list: title: Jornals dels utilizaires title_friends: Jornals dels amics @@ -336,7 +340,7 @@ oc: embeddable_html: HTML incorporable. licence: Licéncia export_details: Las donadas d’OpenStreetMap son publicadas jos la <a href="http://opendatacommons.org/licenses/odbl/1.0/">licéncia - Open Data Commons ­– Banca de donadas Dobèrta</a> (ODbL). + Open Data Commons ­– Basa de donadas Dobèrta</a> (ODbL). too_large: advice: 'Se l’expòrt çaisús fracassa, envisatjatz l’utilizacion d’una de las fonts listadas çaijòs :' @@ -345,18 +349,18 @@ oc: seguentas pel telecargament de donadas massivas :' planet: title: Planeta OSM - description: Còpias actualizadas regularament de la banca de donadas completa + description: Còpias actualizadas regularament de la basa de donadas completa d'OpenStreetMap overpass: title: API palanca description: Telecargar aqueste quadre englobant dempuèi un miralh de la - banca de donadas d'OpenStreetMap + basa de donadas d'OpenStreetMap geofabrik: title: Telecargaments de Geofabrik description: Extraccions regularament mesas a jorn de continents, païses e vilas seleccionadas metro: - title: Extraches de Metro + title: Extraccions de Metro description: Extraccions de las principalas vilas del mond e de lors environs other: title: Autras fonts @@ -371,7 +375,7 @@ oc: latitude: 'Lat :' longitude: 'Lon :' output: Sortida - paste_html: Pegatz lo còde HTML per incorporar dins un site web. + paste_html: Pegatz lo còdi HTML per incorporar dins un site web. export_button: Exportar geocoder: search: @@ -424,6 +428,7 @@ oc: car_wash: Lavatge de veitura casino: Casinò charging_station: Estacion de recarga + childcare: Gardariá cinema: Cinèma clinic: Clinica clock: Relòtge @@ -435,7 +440,7 @@ oc: doctors: Mètges dormitory: Dormitòri drinking_water: Aiga potabla - driving_school: Escòla de conducha + driving_school: Escòla de conduita embassy: Ambaissada emergency_phone: Telefòn d'urgéncia fast_food: Restauracion rapida @@ -457,11 +462,13 @@ oc: market: Mercat marketplace: Plaça del mercat monastery: Mostièr + motorcycle_parking: Parcatge de bicicleta nightclub: Discotèca nursery: Grépia nursing_home: Ostal de santat office: Burèu parking: Parcatge + parking_entrance: Entrada del parcatge pharmacy: Farmàcia place_of_worship: Luòc de culte police: Polícia @@ -495,6 +502,7 @@ oc: veterinary: Cirurgia veterinària village_hall: Sala comunala waste_basket: Escobilhièr + waste_disposal: Eliminacion de degalhs youth_centre: Centre per la joventud boundary: administrative: Limit administratiu @@ -510,6 +518,7 @@ oc: building: "yes": Bastiment craft: + brewery: Braçariá carpenter: Fustièr electrician: Electrician gardener: Jardinièr @@ -517,15 +526,21 @@ oc: photographer: Fotograf plumber: Plombièr shoemaker: Sabatièr + tailor: Sartre "yes": Botiga d'artesanat emergency: + ambulance_station: Depaus d'ambulància + defibrillator: Desfibrillador + landing_site: Terren d’aterrissatge d’urgéncia phone: Telefòn d'urgéncia highway: + abandoned: Autorota abandonada bridleway: Camin per cavalièrs bus_guideway: Via de bus guidada bus_stop: Arrèst de bus construction: Autorota en construccion cycleway: Pista ciclabla + elevator: Ascensor emergency_access_point: Punt d'accès d'urgéncia footway: Camin pietonièr ford: Ga @@ -554,11 +569,13 @@ oc: tertiary: Rota terciària tertiary_link: Rota terciària track: Pista + traffic_signals: Fuòcs de circulacion trail: Pista trunk: Via exprèssa trunk_link: Via exprèssa unclassified: Rota menora unsurfaced: Rota sens revestiment + "yes": Rota historic: archaeological_site: Site arqueologic battlefield: Camp de batalha @@ -567,20 +584,26 @@ oc: bunker: Bunker castle: Castèl church: Glèisa + city_gate: Pòrta de la vila citywalls: Muralhas de la vila fort: Fòrt + heritage: Site del patrimòni house: Ostal icon: Icòna manor: Castelet memorial: Memorial mine: Mina monument: Monument + roman_road: Via romana ruins: Roïnas + stone: Pèira tomb: Tombèl tower: Torre wayside_cross: Calvari wayside_shrine: Orador wreck: Varatge + junction: + "yes": Interseccion/Caireforc landuse: allotments: Òrts familials basin: Bacin @@ -612,14 +635,19 @@ oc: road: Zòna rotièra village_green: Zòna publica erborada vineyard: Vinhal + "yes": Usatge del terren leisure: beach_resort: Estacion belneara bird_hide: Obsevatòri ornitologic + club: Club common: Terrens comunals + dog_park: Parc canin fishing: Zòna de pesca + fitness_centre: Utilizacion de las tèrras fitness_station: Taulièr de percors de santat garden: Jardin golf_course: Terren de gòlf + horse_riding: Equitacion ice_rink: Pista de patinatge marina: Pòrt de plasença miniature_golf: Gòlf miniatura @@ -628,6 +656,7 @@ oc: pitch: Terren d'espòrt playground: Airal de jòcs recreation_ground: Terren de jòcs + resort: Vilegiatura sauna: Saunà slipway: Còta de lançament sports_centre: Centre esportiu @@ -635,6 +664,13 @@ oc: swimming_pool: Piscina track: Pista water_park: Pargue aqüatic + "yes": Lésers + man_made: + lighthouse: Far + pipeline: Pipeline + tower: Torre + works: Usina + "yes": Creat per l'òme military: airfield: Terren d'aviacion militara barracks: Casèrna @@ -654,6 +690,7 @@ oc: forest: Bòsc geyser: Geisèr glacier: Glacièr + grassland: Prada heath: Bruguièra hill: Puèg island: Illa @@ -666,11 +703,12 @@ oc: reef: Estèu ridge: Cresta rock: Ròca + sand: Sabla scree: Esbudèl scrub: Boissa spring: Font stone: Pèira - strait: Estrech + strait: Estreit tree: Arbre valley: Val volcano: Volcan @@ -679,6 +717,7 @@ oc: wood: Bòsc office: accountant: Comptable + administrative: Administracion architect: Arquitècte company: Societat employment_agency: Agéncia per l'emplec @@ -691,6 +730,8 @@ oc: travel_agent: Agéncia de viatge "yes": Burèu place: + allotments: Òrts familials + block: Blòt airport: Aeropòrt city: Vila country: País @@ -706,7 +747,7 @@ oc: moor: Maura municipality: Municipalitat neighbourhood: Quartièr - postcode: Còde postal + postcode: Còdi postal region: Region sea: Mar state: Estat / província @@ -715,6 +756,7 @@ oc: town: Vila unincorporated_area: Luòc pas organizat village: Vilatge + "yes": Luòc railway: abandoned: Via ferrada abandonada construction: Via ferrada en construccion @@ -728,7 +770,7 @@ oc: light_rail: Pichona via ferrada miniature: Via ferrada miniatura monorail: Monoralh - narrow_gauge: Camin de fèrre de via estrecha + narrow_gauge: Camin de fèrre de via estreita platform: Plataforma ferroviària preserved: Via ferrada conservada proposed: Projècte de camin de fèrre @@ -745,7 +787,7 @@ oc: antiques: Antiquari art: Botiga d'art bakery: Fornil - beauty: Magazin de produches de beutat + beauty: Magazin de produits de beutat beverages: Magazin de bevendas bicycle: Magazin de bicicletas books: Librariá @@ -756,7 +798,7 @@ oc: car_repair: Reparacion d'automobilas carpet: Magazin de tapisses charity: Magazin de benfasença - chemist: Magazin de produches d'igièna + chemist: Farmàcia clothes: Magazin de vestits computer: Magazin informatic confectionery: Confisariá @@ -770,7 +812,7 @@ oc: dry_cleaning: Netejatge a sec electronics: Magazin d'electronica estate_agent: Agent immobilièr - farm: Magazin de produches agricòls + farm: Magazin de produits agricòlas fashion: Magazin de mòda fish: Peissonariá florist: Florista @@ -817,6 +859,7 @@ oc: "yes": Botiga tourism: alpine_hut: Refugi + apartment: Apartament artwork: Òbra d'art attraction: Atraccion bed_and_breakfast: Jaç @@ -824,6 +867,7 @@ oc: camp_site: Campatge caravan_site: Site de caravana chalet: Chalet + gallery: Galariá guest_house: Ostal d'òste hostel: Albèrga hotel: Ostalariá @@ -855,6 +899,7 @@ oc: wadi: Oèd waterfall: Cascada weir: Barratge + "yes": Via navegabla admin_levels: level2: Frontièra del país level4: Frontièra de l’estat @@ -906,14 +951,14 @@ oc: partners_ic: lo Collègi Imperial de Londres partners_bytemark: Albergament Bytemark partners_partners: partenaris - osm_offline: La banca de donadas de OpenStreetMap es actualament fòra linha; una + osm_offline: La basa de donadas de OpenStreetMap es actualament fòra linha; una mantenença essenciala a son bon foncionament es en cors. - osm_read_only: La banca de donadas d'OpenStreetMap es actualament en mòde lectura + osm_read_only: La basa de donadas d'OpenStreetMap es actualament en mòde lectura sola ; una mantenença essenciala a son bon foncionament es en cors. donate: Sostenètz OpenStreetMap, %{link} al fons per melhorar lo material. help: Ajuda about: A prepaus - copyright: Dreches d’autor + copyright: Dreits d’autor community: Comunautat community_blogs: Blogs de la comunautat community_blogs_title: Blogs de membres de la comunautat OpenStreetMap @@ -940,15 +985,18 @@ oc: legal_babble: title_html: Copyright e Licéncia intro_1_html: |- - OpenStreetMap es un ensemble de <i>donadas dobèrtas</i>, disponiblas jos la licéncia <a + OpenStreetMap es un ensemble de <i>donadas dobèrtas</i>, disponiblas jos licéncia liura <a href="http://opendatacommons.org/licenses/odbl/">Open Data Commons Open Database License</a> (ODbL). intro_2_html: |2- Sètz liure de copiar, distribuir, transmetre e adaptar nòstras donadas, - a condicion que creditiatz OpenStreetMap e sos + a condicion que creditetz OpenStreetMap e sos contributors. Se modificatz o utilizatz nòstras donadas dins d’autras òbras derivadas, las podètz distribuir sonque jos la meteissa licéncia. Lo <a href="http://opendatacommons.org/licenses/odbl/1.0/">tèxte - legal</a> complet detalha vòstres dreches e responsabilitats. + legal</a> complet detalha vòstres dreits e responsabilitats. + intro_3_html: Nòstres carrèus de rendut cartografics, e tanben de nòstra documentacion, + son disponibles jos la licéncia <a href="http://creativecommons.org/licenses/by-sa/2.0/">Creative + Commons paternitat – partiment a l’identic 2.0</a> (CC-BY-SA). credit_title_html: Cossí creditar OpenStreetMap credit_1_html: Demandam que vòstre crèdit compòrta la mencion « © los contributors d’OpenStreetMap ». @@ -960,14 +1008,14 @@ oc: title: Exemple d'atribucion more_title_html: Per trobar mai d’informacions more_1_html: |- - Se volètz obténer mai d’informacions sus cossí reütilizar nòstras donadas e nos creditar, legissètz la <a - href="http://wiki.openstreetmap.org/wiki/Legal_FAQ">FAQ - legala</a>. + Per obténer mai d’informacions sus cossí reütilizar nòstras donadas e nos creditar, legissètz la <a + href="http://wiki.openstreetmap.org/wiki/Legal_FAQ">FAQ legala</a>. contributors_title_html: Nòstres contributors contributors_fr_html: |- <strong>França</strong> : conten de donadas de la <em>Direccion generala dels impòts</em>. - infringement_title_html: Violacion dels dreches d'autor + infringement_title_html: Violacion dels dreits d'autor + trademarks_title_html: <span id="marcas"></span>Marcas welcome_page: title: Benvenguda ! whats_on_the_map: @@ -989,6 +1037,8 @@ oc: tag_html: |- Un <strong>tag</strong> es una informacion a prepaus d'un nosèl o d'un camin, coma lo nom d'un restaurant o la velocitat limita d'una carrièra. + rules: + title: Règlas ! questions: title: De questions ? paragraph_1_html: |- @@ -1006,7 +1056,7 @@ oc: other_concerns: title: Autras preocupacions explanation_html: "Se sètz preocupat pel biais que nòstras donadas son utilizadas - o sus lor contengut, consultatz nòstra\n<a href='/copyright'>pagina de drech + o sus lor contengut, consultatz nòstra\n<a href='/copyright'>pagina de dreit d’autor</a> per d'informacions mai legalas, o contactar lo \n<a href='http://wiki.osmfoundation.org/wiki/Working_Groups'>grop de trabalh OSMF</a> apropriat." help_page: @@ -1018,15 +1068,29 @@ oc: url: /welcome title: Benvenguda a OSM description: Començar amb aqueste guida rapid que cobrís las basas d'OpenStreetMap. + beginners_guide: + url: http://wiki.openstreetmap.org/wiki/OC:Guida_del_debutant + title: Guida per debutants + description: Guida pels debutants mantengut per la comunautat. help: url: https://help.openstreetmap.org/ title: help.openstreetmap.org description: Pausar una question o cercar de responsas sul site questions-e-responsas d'OSM. + mailing_lists: + title: Listas de difusion + description: Pausar una question o discutir de questions interessantas sus un + larg ventalh de tematicas o de listas de difusion regionalas. + forums: + title: Forums + irc: + title: IRC + switch2osm: + title: switch2osm wiki: url: http://wiki.openstreetmap.org/ title: wiki.openstreetmap.org - description: Parcorrètz lo wiki per la documentacion aprigondida d’OSM + description: Pzrcorrètz lo wiki per la documentacion aprigondida d’OSM about_page: next: Seguent copyright_html: <span>©</span>Contributors<br /> d’OpenStreetMap @@ -1039,6 +1103,7 @@ oc: La comunautat d’OpenStreetMap es divèrsa, passionada e grossís cada jorn. Nòstres contributors incluisson de cartografes entosiastes, de professionals del GIS, d'ingenhiaires que menan los servidors OSM, d'umanitaris que cartografian las zònas devastadas per una catastròfa e plan mai encara. Per ne saber mai sus la comunautat, consultatz los <a href='%{diary_path}'>annuaris d’utilizaires</a>, <a href='http://blogs.openstreetmap.org/'>los blogs comunautaris</a> e lo site web de la <a href='http://www.osmfoundation.org/'>Fondacion OSM</a>. open_data_title: Donadas liuras + legal_title: Juridic partners_title: Partenaris notifier: diary_comment_notification: @@ -1122,6 +1187,11 @@ oc: commented_note: '%{commenter} a reactivat una nòta de mapa qu''avètz comentada. La nòta se tròba prèp de %{place}.' details: Mai de detalh sus la nòta pòt èsser obtengut a %{url}. + changeset_comment_notification: + greeting: Bonjorn, + commented: + partial_changeset_with_comment: amb lo comentari '%{changeset_comment}' + partial_changeset_without_comment: sens comentari message: inbox: title: Bóstia de recepcion @@ -1216,6 +1286,10 @@ oc: close: Tampar search: search: Recèrca + get_directions: Obténer las direccions + get_directions_title: Trobatz d'itineraris entre dos punts + from: De + to: A where_am_i: Ont soi ? where_am_i_title: Descriu la posicion actuala en utilizant lo motor de recèrca submit_text: Validar @@ -1223,15 +1297,17 @@ oc: table: entry: motorway: Autorota + main_road: Rota principala trunk: Via exprèssa primary: Rota principala secondary: Rota segondària unclassified: Rota pas classificada - unsurfaced: Rota sens revestiment track: Pista - byway: Camin bridleway: Camin per cavalièrs cycleway: Via ciclabla + cycleway_national: Via ciclista nacionala + cycleway_regional: Via ciclista regionala + cycleway_local: Via ciclista locala footway: Via pietonièra rail: Via ferrada subway: Linha de mètro @@ -1253,7 +1329,6 @@ oc: golf: Percors de gòlf park: Pargue resident: Zòna residenciala - tourist: Atraccion toristica common: - Espaci comun - prada @@ -1283,9 +1358,11 @@ oc: tunnel: Bòrd en puntilhats = tunèl bridge: Bòrd negre = pont private: Accès privat - permissive: Accès tolerat destination: Reservat als ribairencs construction: Rotas en construccion + bicycle_shop: Magazin de bicicletas + bicycle_parking: Parcatge de bicicleta + toilets: Comuns richtext_area: edit: Modificar preview: Apercebut @@ -1309,6 +1386,8 @@ oc: public: Public (afichat dins la lista de las traças e anonim, punts pas ordenats) trackable: Pistable (partejat unicament d'un biais anonim, punts ordenats amb las datas) + identifiable: Identificable (afichat dins la lista de las traças e identificable, + punts ordenats amb las datas) create: upload_trace: Mandar la traça GPS edit: @@ -1422,10 +1501,11 @@ oc: allow_read_gpx: legir vòstras traças GPS privadas. allow_write_gpx: mandar de traças GPS. allow_write_notes: modificar las nòtas. + grant_access: Acordar l’accès oauthorize_success: title: La demanda d’autorizacion es estada acceptada allowed: Avètz acordat a l’aplicacion %{app_name} l’accès a vòstre compte. - verification: Lo còde de verificacion es %{code}. + verification: Lo còdi de verificacion es %{code}. oauthorize_failure: title: La demanda d’autorizacion a fracassat denied: Avètz refusat a l’aplicacion %{app_name} l’accès a vòstre compte. @@ -1504,6 +1584,7 @@ oc: lost password link: Avètz perdut vòstre senhal ? login_button: Se connectar register now: S'inscriure ara + with external: 'A la plaça, utilizatz un tèrç per vos connectar :' new to osm: Novèl sus OpenStreetMap ? to make changes: Per aportar de modificacions a las donadas OpenStreetMap, vos cal possedir un compte. @@ -1512,6 +1593,31 @@ oc: auth failure: O planhèm, mas las informacions provesidas an pas permés de vos identificar. openid_logo_alt: Se connectar amb un OpenID + auth_providers: + openid: + title: Se connectar amb OpenID + alt: Se connectar amb una URL OpenID + google: + title: Se connectar amb Google + alt: Se connectar amb l'OpenID de Google + facebook: + title: Se connectar amb Facebook + alt: Se connectar amb un commpte Facebook + windowslive: + title: Se connectar amb Windows Live + alt: Se connectar amb un compte Windows Live + github: + title: Connexion amb GitHub + alt: Connexion amb un Compte GitHub + yahoo: + title: Se connectar amb Yahoo + alt: Se connectar amb l'OpenID de Yahoo + wordpress: + title: Se connectar amb Wordpress + alt: Se connectar amb l'OpenID de Wordpress + aol: + title: Se connectar amb AOL + alt: Se connectar amb l'OpenID d'AOL logout: title: Desconnexion heading: Desconnexion d'OpenStreetMap @@ -1534,8 +1640,8 @@ oc: flash token bad: Avètz pas trobat aqueste geton, avètz verificat l'URL ? new: title: S’inscriure - contact_webmaster: Contactatz lo <a href='mailto:webmaster@openstreetmap.org'>webmaster</a> - per que vos crèe un compte - ensajarem de tractar vòstra demanda lo mai rapidament + contact_webmaster: Contactatz lo <a href="%{webmaster}">webmaster</a> per que + vos crèe un compte - ensajarem de tractar vòstra demanda lo mai rapidament possible. about: header: Liure e modificable @@ -1544,16 +1650,24 @@ oc: display name: 'Nom afichat :' display name description: Vòstre nom d'utilizaire afichat publicament. Podètz cambiar aquò ulteriorament dins las preferéncias. + external auth: 'Autentificacion tèrça :' password: 'Senhal :' confirm password: 'Confirmatz lo senhal :' + use external auth: A la plaça, utilizatz un tèrç per vos connectar continue: S’inscriure terms accepted: Mercé d’aver acceptat los novèls tèrmes del contributor ! terms: title: Tèrmes del contributor heading: Tèrmes del contributor + consider_pd: En mai de l’acòrd çaisús, considèri mas contribucions coma essent + dins lo domeni public consider_pd_why: qu’es aquò ? + guidance: 'Per mai d''informacion sus aquestes tèrmes : un <a href="%{summary}">resumit + legible</a> e qualques <a href="%{translations}">traduccions informalas</a>' agree: Accèpti decline: Declinar + you need to accept or decline: Legissètz e puèi, siá acceptatz o refusatz las + novèlas condicions de contributor per contunhar. legale_select: 'País de residéncia :' legale_names: france: França @@ -1562,6 +1676,7 @@ oc: no_such_user: title: Utilizaire inexistent heading: L'utilizaire %{user} existís pas + deleted: suprimit view: my diary: Mon jornal new diary entry: novèla entrada dins lo jornal @@ -1612,16 +1727,16 @@ oc: revoke: administrator: Revocar l'accès administrator moderator: Revocar l'accès moderador - block_history: blòts recebuts - moderator_history: blòts provesits + block_history: Blocatges actius + moderator_history: Blocatges donats comments: Comentaris - create_block: blocar aqueste utilizaire - activate_user: activar aqueste utilizaire - deactivate_user: desactivar aqueste utilizaire - confirm_user: confirmar aqueste utilizaire - hide_user: amagar aqueste utilizaire - unhide_user: reafichar aqueste utilizaire - delete_user: suprimir aqueste utilizaire + create_block: Blocar aqueste utilizaire + activate_user: Activar aqueste utilizaire + deactivate_user: Desactivar aqueste utilizaire + confirm_user: Confirmar aqueste utilizaire + hide_user: Amagar aqueste utilizaire + unhide_user: Reafichar aqueste utilizaire + delete_user: Suprimir aqueste utilizaire confirm: Confirmar friends_changesets: Percórrer totes los gropes de modificacions dels amics friends_diaries: Entradas de jornal dels amics @@ -1638,6 +1753,7 @@ oc: current email address: 'Adreça de corrièr electronic actuala:' new email address: 'Novèla adreça de corrièr electronic :' email never displayed publicly: (pas jamai afichat publicament) + external auth: 'Autenticacion extèrna:' openid: link: http://wiki.openstreetmap.org/wiki/OpenID link text: qu’es aquò ? @@ -1661,6 +1777,7 @@ oc: gravatar: gravatar: Utilizar Gravatar link text: qu’es aquò ? + disabled: Gravatar es estat desactivat. new image: Apondre un imatge keep image: Gardar l'imatge actual delete image: Suprimir l'imatge actual @@ -1685,13 +1802,13 @@ oc: press confirm button: Quichar lo boton confirmar çaijós per activar vòstre compte. button: Confirmar already active: Aqueste compte es ja estat confirmat. - unknown token: Lo còde de confirmacion a expirat o existís pas. + unknown token: Lo còdi de confirmacion a expirat o existís pas. confirm_resend: failure: L’utilizaire %{name} es introbable. confirm_email: heading: Confirmar lo cambiament de vòstra adreça e-mail button: Confirmar - success: Adreça email confirmada, mercé de vos èsser enregistrat ! + success: Modificacion de vòstra adreça de corrièr electronic confirmada ! set_home: flash success: Emplaçament de mon domicili salvat amb succès make_friend: @@ -1722,6 +1839,13 @@ oc: title: Compte suspendut heading: Compte suspendut webmaster: webmèstre + auth_failure: + invalid_credentials: Informacions d’autentificacion invalidas + no_authorization_code: Sens còdi d'autorizacion + unknown_signature_algorithm: Algoritme de signatura desconegut + invalid_scope: Espandida invalida + auth_association: + heading: Vòstre ID es pas encara associat a un compte OpenStreetMap. user_role: filter: not_a_role: La cadena « %{role} » es un ròtle valid. @@ -1754,6 +1878,7 @@ oc: simples e precises. submit: Crear un blòt tried_contacting: Ai contactat l'utilizaire e li ai demandat d'arrestar. + needs_view: L’utilizaire se deu connectar abans qu'aqueste blocatge siá escafat back: Veire totes los blocatges edit: title: Modifica un blocatge sus %{name} @@ -1762,9 +1887,14 @@ oc: com possible, e de balhar tant de detalhs coma possible sus la situacion. Sapiatz que tot lo monde compren pas lo girgon de la comunautat, alara utilizatz de tèrmes simples e precises. + period: Quant de temps, a partir d'ara, l’utilizaire deu èsser blocat sus l’API + ? submit: Modificar lo blocatge show: Afichar aqueste blocatge back: Veire totes los blocatges + needs_view: L’utilizaire se deu connectar abans qu'aqueste blocatge expire ? + filter: + block_expired: Lo blocatge a ja expirat e pòt pas èsser modificat. create: flash: Blocatge creat sus l'utilizaire %{name}. update: @@ -1816,6 +1946,8 @@ oc: heading: '%{block_on} blocat per %{block_by}' time_future: S'acaba dins %{time} time_past: S'es acabat fa %{time} + created: Creat + ago: i a %{time} status: Estatut show: Afichar edit: Modificar @@ -1866,6 +1998,7 @@ oc: link: Ligam o HTML long_link: Ligam short_link: Ligam cort + geo_uri: URI geo embed: HTML custom_dimensions: Definir las dimensions personalizadas format: 'Format :' @@ -1875,8 +2008,10 @@ oc: short_url: URL corta include_marker: Inclure lo marcador center_marker: Centrar la mapa sul marcador - paste_html: Pegatz lo còde HTML a incorporar dins un site web. + paste_html: Pegatz lo còdi HTML a incorporar dins un site web. view_larger_map: Afichar una mapa mai granda + embed: + report_problem: Senhalar un problèma key: title: Legenda tooltip: Legenda @@ -1908,12 +2043,21 @@ oc: createnote_disabled_tooltip: Zoomar per apondre una nòta sus la mapa map_notes_zoom_in_tooltip: Zoomez per legir las nòtas sus la mapa map_data_zoom_in_tooltip: Zoomatz per veire las donadas sus la mapa + queryfeature_tooltip: Requèsta suls objèctes + queryfeature_disabled_tooltip: Zoomar mai per recercar d'objèctes + changesets: + show: + comment: Comentari + subscribe: S'inscriure + unsubscribe: Se desabonar + hide_comment: amagar + unhide_comment: desamagar notes: new: intro: Avètz trobat una error o una manca ? Fasètz-lo saber a d’autres cartografes per que i poscam remediar. Desplaçatz lo marcador a la posicion exacta e escrivètz una nòta per explicar lo problèma (Entretz pas aicí cap d’informacions - personalas o que provenon de mapas amb drech d’autor o de listas de repertòris). + personalas o que provenon de mapas amb dreit d’autor o de listas de repertòris). add: Apondre una nòta show: hide: Amagar @@ -1921,6 +2065,61 @@ oc: reactivate: Reactivar comment_and_resolve: Comentar e resòlvre comment: Comentari + directions: + engines: + graphhopper_bicycle: A bicicleta (GraphHopper) + graphhopper_foot: A pè (GraphHopper) + mapquest_bicycle: A bicicleta (MapQuest) + mapquest_car: En veitura (MapQuest) + mapquest_foot: A pè (MapQuest) + osrm_car: En veitura (OSRM) + mapzen_bicycle: A bicicleta (Mapzen) + mapzen_car: En veitura (Mapzen) + mapzen_foot: A pè (Mapzen) + directions: Itineraris + distance: Distància + errors: + no_route: Impossible de trobar una rota entre aqueles dos luòcs. + no_place: O planhèm, impossible de trobar aqueste luòc. + instructions: + continue_without_exit: Contunhar sus %{name} + slight_right_without_exit: Viratz leugièrament a dreita sus %{name} + offramp_right_without_exit: Prene la sortida a dreita sus %{name} + onramp_right_without_exit: Virar a dreita cap a la sortida sus %{name} + endofroad_right_without_exit: A la fin de la rota, virar a dreita sus %{name} + merge_right_without_exit: Rejónher a dreita sus %{name} + fork_right_without_exit: A la bifurcacion, virar a dreita sus %{name} + turn_right_without_exit: Viratz a dreita sus %{name} + sharp_right_without_exit: Viratz vivament a dreita sus %{name} + uturn_without_exit: Fasètz mièg torn sus %{name} + sharp_left_without_exit: Viratz vivament a esquèrra sus %{name} + turn_left_without_exit: Viratz a esquèrra cap a %{name} + offramp_left_without_exit: Prene la sortida d'esquèrra fins a %{name} + onramp_left_without_exit: Virar a esquèrra cap a la sortida sus %{name} + endofroad_left_without_exit: A la fin de la rota, virar a esquèrra cap a %{name} + merge_left_without_exit: Rejónher a esquèrra sus %{name} + fork_left_without_exit: A la bifurcacion, virar a esquèrra sus %{name} + slight_left_without_exit: Viratz leugièrament a esquèrra sus %{name} + via_point_without_exit: (pel punt) + follow_without_exit: Seguir %{name} + roundabout_without_exit: A la rotonda, prenètz %{name} + leave_roundabout_without_exit: Sortir de la rotonda %{name} + stay_roundabout_without_exit: Seguir la rotonda - %{name} + start_without_exit: Comença a la fin de %{name} + destination_without_exit: Atenhètz la destinacion + against_oneway_without_exit: Remontatz a contrasens sus %{name} + end_oneway_without_exit: Fin del sens unic a %{name} + roundabout_with_exit: A la rotonda, prene la sortida %{exit} sus %{name} + unnamed: via sens nom + courtesy: Itinerari peovesit per %{link} + time: Temps + query: + node: Nosèl + way: Camin + relation: Relacion + nothing_found: Cap d'objècte pas trobat + error: 'Error en contactant %{server}: %{error}' + timeout: Relambi depassat en contactant %{server} redaction: edit: description: Descripcion diff --git a/config/locales/pa.yml b/config/locales/pa.yml index d80d9c4c3..523c45e89 100644 --- a/config/locales/pa.yml +++ b/config/locales/pa.yml @@ -4,6 +4,7 @@ # Author: Aalam # Author: Babanwalia # Author: Jimidar +# Author: Tow --- pa: time: @@ -12,6 +13,8 @@ pa: activerecord: models: acl: ਅਸੈੱਸ ਕੰਟਰੋਲ ਲਿਸਟ + changeset: ਤਬਦੀਲੀ ਲੜੀ + changeset_tag: ਤਬਦੀਲੀ ਲੜੀ ਨਿਸ਼ਾਨ country: ਮੁਲਕ diary_comment: ਡਾਇਰੀ ਟਿੱਪਣੀ diary_entry: ਡਾਇਰੀ ਇੰਦਰਾਜ @@ -33,6 +36,9 @@ pa: relation_member: ਸਬੰਧ ਮੈਂਬਰ relation_tag: ਸਬੰਧ ਟੈਗ session: ਸੈਸ਼ਨ + trace: ਟਰੇਸ + tracepoint: ਟਰੇਸ ਪੁਆਇੰਟ + tracetag: ਟਰੇਸ ਨਿਸ਼ਾਨ user: ਵਰਤੋਂਕਾਰ user_preference: ਵਰਤੋਂਕਾਰ ਤਰਜੀਹਾਂ user_token: ਵਰਤੋਂਕਾਰ ਟੋਕਨ @@ -74,20 +80,32 @@ pa: pass_crypt: ਪਛਾਣ-ਸ਼ਬਦ editor: default: ਮੂਲ (ਮੌਜੂਦਾ %{name}) + id: + name: ਆਈਡੀ remote: name: ਰਿਮੋਟ ਕੰਟਰੋਲ browse: created: ਬਣਾਇਆ ਗਿਆ closed: ਬੰਦ ਹੋਇਆ created_html: <abbr title='%{title}'>%{time} ਪਹਿਲਾਂ ਬਣਾਇਆ ਗਿਆ</abbr> + version: ਵਰਜਨ + in_changeset: ਤਬਦੀਲੀਆਂ anonymous: ਬੇਪਛਾਣ no_comment: (ਕੋਈ ਟਿੱਪਣੀ ਨਹੀਂ) part_of: ਦਾ ਹਿੱਸਾ + download_xml: XML ਲਾਹੋ view_history: ਅਤੀਤ ਵੇਖੋ view_details: ਵੇਰਵੇ ਵੇਖੋ location: 'ਸਥਿਤੀ:' changeset: + title: 'ਤਬਦੀਲੀ ਲੜੀ: %{id}' belongs_to: ਲੇਖਕ + comment: ਟਿੱਪਣੀਆਂ (%{count}) + changesetxml: ਤਬਦੀਲੀ ਲੜੀ XML + feed: + title: ਤਬਦੀਲੀ ਲੜੀ %{id} + title_comment: ਤਬਦੀਲੀ ਲੜੀ %{id} - %{comment} + discussion: ਚਰਚਾ relation: members: ਜੀਅ relation_member: @@ -102,12 +120,14 @@ pa: way: ਰਾਹ relation: ਸਬੰਧ changeset: ਚੇਂਜ਼ਸੈੱਟ + note: ਟਿੱਪਣੀ timeout: type: node: ਨੋਡ way: ਰਾਹ relation: ਸਬੰਧ changeset: ਚੇਂਜ਼ਸੈੱਟ + note: ਟਿੱਪਣੀ redacted: type: node: ਨੋਡ @@ -118,8 +138,11 @@ pa: loading: ਲੋਡ ਹੋ ਰਿਹਾ ਹੈ… tag_details: tags: ਟੈਗ + wikipedia_link: '%{page} ਲੇਖ ਵਿਕਿਪੀਡਿਆ ਉੱਤੇ' + telephone_link: '%{phone_number} ਨੂੰ ਫੋਨ ਕਰੋ' note: title: 'ਟਿੱਪਣੀ: %{id}' + new_note: ਨਵੀੰ ਟਿੱਪਣੀ description: ਵੇਰਵਾ changeset: changeset_paging_nav: @@ -130,12 +153,19 @@ pa: anonymous: ਬੇਪਛਾਣ no_edits: (ਕੋਈ ਸੋਧ ਨਹੀਂ) changesets: + id: ਸ਼ਨਾਖ਼ਤ user: ਵਰਤੋਂਕਾਰ comment: ਟਿੱਪਣੀ area: ਇਲਾਕਾ + list: + title: ਤਬਦੀਲੀਆਂ + load_more: ਹੋਰ ਲੋਡ ਕਰੋ diary_entry: + new: + publish_button: ਛਾਪੋ edit: subject: 'ਵਿਸ਼ਾ:' + body: 'ਧੜ੍ਹ:' language: 'ਬੋਲੀ:' location: 'ਸਥਿਤੀ:' latitude: 'ਅਕਸ਼ਾਂਸ਼:' @@ -163,6 +193,7 @@ pa: view: ਵੇਖੋ edit: ਸੋਧੋ comments: + post: ਡਾਕ when: ਕਦੋਂ comment: ਟਿੱਪਣੀ ago: '%{ago} ਪਹਿਲਾਂ' @@ -210,6 +241,7 @@ pa: bicycle_parking: ਸਾਈਕਲ ਪਾਰਕਿੰਗ bicycle_rental: ਕਿਰਾਏ 'ਤੇ ਸਾਈਕਲ biergarten: ਬੀਅਰ ਬਾਗ਼ + boat_rental: ਕਿਸ਼ਤੀ ਕਿਰਾਇਆ brothel: ਕੋਠਾ bureau_de_change: ਮੁਦਰਾ ਵਟਾਂਦਰਾ bus_station: ਬਸ ਅੱਡਾ @@ -219,8 +251,10 @@ pa: car_wash: ਕਾਰ ਧੁਆਈ casino: ਕੈਸੀਨੋ charging_station: ਚਾਰਜਿੰਗ ਸਟੇਸ਼ਨ + childcare: ਬਾਲ ਸੰਭਾਲ cinema: ਸਿਨੇਮਾ clinic: ਕਲੀਨਿਕ + clock: ਘੜੀ college: ਕਾਲਜ community_centre: ਭਾਈਚਾਰਾ ਕੇਂਦਰ courthouse: ਕਚਹਿਰੀ @@ -239,6 +273,7 @@ pa: food_court: ਖਾਣਾ ਦਰਬਾਰ fountain: ਫ਼ੁਹਾਰਾ fuel: ਤੇਲ + gambling: ਜੂਆ grave_yard: ਕਬਰਿਸਤਾਨ gym: ਜਿਮ/ਦਰੁਸਤੀ ਕੇਂਦਰ health_centre: ਸਿਹਤ ਕੇਂਦਰ @@ -249,11 +284,14 @@ pa: library: ਪੁਸਤਕਾਲਾ market: ਮੰਡੀ marketplace: ਮੰਡੀ ਦੀ ਥਾਂ + monastery: ਮੱਠ + motorcycle_parking: ਮੋਟਰਸਾਈਕਲ ਪਾਰਕਿੰਗ nightclub: ਰਾਤ ਦਾ ਕਲੱਬ nursery: ਨਰਸਰੀ nursing_home: ਨਰਸਿੰਗ ਹੋਮ office: ਦਫ਼ਤਰ parking: ਪਾਰਕਿੰਗ + parking_entrance: ਪਾਰਕਿੰਗ ਪਰਵੇਸ਼ pharmacy: ਫ਼ਾਰਮੇਸੀ place_of_worship: ਭਗਤੀ ਦਾ ਘਰ police: ਪੁਲਿਸ @@ -274,6 +312,7 @@ pa: shower: ਸ਼ਾਵਰ social_centre: ਸਮਾਜਕ ਕੇਂਦਰ social_club: ਸਮਾਜਕ ਕਲੱਬ + social_facility: ਸਮਾਜਕ ਸਹੂਲਤ studio: ਸਟੂਡੀਉ swimming_pool: ਤੈਰਾਕੀ ਤਲਾਅ taxi: ਟੈਕਸੀ @@ -286,6 +325,7 @@ pa: veterinary: ਡੰਗਰਾਂ ਦਾ ਹਸਪਤਾਲ village_hall: ਪਿੰਡ ਦਾ ਹਾਲ waste_basket: ਕੂੜਾਦਾਨ + waste_disposal: ਕੂੜੇਦਾਨ youth_centre: ਨੌਜਵਾਨ ਕੇਂਦਰ boundary: administrative: ਪ੍ਰਸ਼ਾਸਕੀ ਸਰਹੱਦ @@ -300,13 +340,29 @@ pa: "yes": ਪੁਲ building: "yes": ਇਮਾਰਤ + craft: + brewery: ਬਰੂਅਰੀ + carpenter: ਤਰਖਾਣ + electrician: ਇਲੈਕਟਰੀਸ਼ਨ + gardener: ਮਾਲੀ + painter: ਚਿੱਤਰਕਾਰ + photographer: ਫ਼ੋਟੋਗ੍ਰਾਫ਼ਰ + plumber: ਨਲਸਾਜ਼ + shoemaker: ਮੋਚੀ + tailor: ਦਰਜੀ + "yes": ਕਰਾਫਟ ਦੁਕਾਨ emergency: + ambulance_station: ਐਂਬੂਲੈਂਸ ਸਟੇਸ਼ਨ + defibrillator: ਡੀਫਿਬ੍ਰੀਲੇਟਰ + landing_site: ਸੰਕਟਕਾਲੀਨ ਉਤਰ ਸਥਾਨ phone: ਐਮਰਜੈਂਸੀ ਫ਼ੋਨ highway: + abandoned: ਨਿਕਾਸੀ ਹਾਈਵੇਅ bridleway: ਘੋੜ-ਰਾਹ bus_stop: ਬੱਸ ਅੱਡਾ construction: ਉਸਾਰੀ ਹੇਠ ਹਾਈਵੇ cycleway: ਸਾਈਕਲ ਰਾਹ + elevator: ਲਿਫਟ emergency_access_point: ਐਮਰਜੈਂਸੀ ਪਹੁੰਚ ਬਿੰਦੂ footway: ਪੈਦਲ ਰਾਹ ford: ਫ਼ੋਰਡ @@ -321,7 +377,7 @@ pa: primary: ਮੁੱਢਲੀ ਸੜਕ primary_link: ਮੁੱਢਲੀ ਸੜਕ raceway: ਰੇਸਵੇ - residential: ਰਿਹਾਇਸ਼ੀ + residential: ਰਿਹਾਇਸ਼ੀ ਸੜਕ rest_area: ਅਰਾਮ ਖੇਤਰ road: ਸੜਕ secondary: ਸਕੈਂਡਰੀ ਸੜਕ @@ -330,17 +386,26 @@ pa: services: ਮੋਟਰਵੇ ਸੇਵਾਵਾਂ speed_camera: ਗਤੀ ਕੈਮਰਾ steps: ਪੌੜੀਆਂ + street_lamp: ਗਲੀ ਬੱਤੀ tertiary: ਤੀਜੇ ਪੱਧਰ ਦੀ ਸੜਕ tertiary_link: ਤੀਜੇ ਪੱਧਰ ਦੀ ਸੜਕ track: ਟਰੈਕ + traffic_signals: ਟਰੈਫਿਕ ਸਿਗਨਲ trail: ਡੰਡੀ trunk: ਟਰੰਕ ਸੜਕ trunk_link: ਟਰੰਕ ਸੜਕ + unclassified: ਅਵਰਗੀਕ੍ਰਿਤ ਰੋਡ + "yes": ਸੜਕ historic: - building: ਇਮਾਰਤ + archaeological_site: ਪੁਰਾਤੱਤਵ ਸਥਾਨ + battlefield: ਜੰਗ ਦਾ ਮੈਦਾਨ + building: ਇਤਿਹਾਸਕ ਇਮਾਰਤ castle: ਗੜ੍ਹੀ church: ਗਿਰਜਾ + city_gate: ਸ਼ਹਿਰ ਗੇਟ + citywalls: ਸ਼ਹਿਰ ਦੀਆੰ ਕੰਧਾੰ fort: ਕਿਲ਼ਾ + heritage: ਵਿਰਾਸਤ ਸਥਾਨ house: ਘਰ icon: ਆਈਕਨ manor: ਮੈਨਰ @@ -348,10 +413,14 @@ pa: mine: ਖਾਨ monument: ਸਮਾਰਕ ruins: ਖੰਡਰ + stone: ਪੱਥਰ tomb: ਮਕਬਰਾ tower: ਬੁਰਜ + junction: + "yes": ਜੰਕਸ਼ਨ landuse: basin: ਹੌਜ਼ੀ + cemetery: ਸ਼ਮਸ਼ਾਨ commercial: ਵਪਾਰਕ ਖੇਤਰ conservation: ਰੱਖ construction: ਉਸਾਰੀ @@ -367,14 +436,19 @@ pa: mine: ਖਾਨ orchard: ਬਗ਼ੀਚਾ railway: ਰੇਲਵੇ + recreation_ground: ਮਨੋਰੰਜਨ ਮੈਦਾਨ + reservoir: ਸਰੋਵਰ residential: ਰਿਹਾਇਸ਼ੀ ਇਲਾਕਾ retail: ਪਰਚੂਨ road: ਸੜਕ ਇਲਾਕਾ village_green: ਪੇਂਡੂ ਹਰਿਆਵਲ vineyard: ਅੰਗੂਰਾਂ ਦਾ ਬਾਗ਼ leisure: + club: ਕਲੱਬ common: ਸ਼ਾਮਲਾਟ + dog_park: ਕੁੱਤਾ ਪਾਰਕ fishing: ਮੱਛੀ-ਖੋਜ ਇਲਾਕਾ + fitness_centre: ਫਿੱਟਨੈੱਸ ਕੇੰਦਰ fitness_station: ਤੰਦਰੁਸਤੀ ਅੱਡਾ garden: ਬਾਗ਼ golf_course: ਗੋਲਫ਼ ਮੈਦਾਨ @@ -391,6 +465,11 @@ pa: swimming_pool: ਤੈਰਾਕੀ ਤਲਾਅ track: ਭੱਜਣ ਲਈ ਟਰੈਕ water_park: ਜਲ ਪਾਰਕ + man_made: + lighthouse: ਲਾਈਟਹਾਊਸ + pipeline: ਪਾਈਪਲਾਈਨ + tower: ਬੁਰਜ + works: ਫੈਕਟਰੀ military: airfield: ਫ਼ੌਜੀ ਉਡਾਣ-ਖੇਤਰ barracks: ਬੈਰਕ @@ -419,6 +498,7 @@ pa: reef: ਰੀਫ਼ ridge: ਰਿੱਜ rock: ਚਟਾਨ + sand: ਰੇਤ scree: ਰੇੜ੍ਹ scrub: ਝਾੜ ਬਰੋਟਾ spring: ਸੋਮਾ @@ -432,6 +512,7 @@ pa: wood: ਜੰਗਲ office: accountant: ਅਕਾਊਂਟੈਂਟ + administrative: ਪ੍ਰਸ਼ਾਸਨ architect: ਨਕਸ਼ਾਕਾਰ company: ਕੰਪਨੀ employment_agency: ਰੁਜ਼ਗਾਰ ਏਜੰਸੀ @@ -444,6 +525,7 @@ pa: travel_agent: ਟਰੈਵਲ ਏਜੰਸੀ "yes": ਦਫ਼ਤਰ place: + block: ਬਲਾਕ airport: ਹਵਾਈ ਅੱਡਾ city: ਸ਼ਹਿਰ country: ਮੁਲਕ @@ -468,6 +550,7 @@ pa: town: ਕਸਬਾ unincorporated_area: ਗ਼ੈਰ-ਸੰਮਿਲਤ ਇਲਾਕਾ village: ਪਿੰਡ + "yes": ਥਾੰ railway: abandoned: ਛੱਡਿਆ ਹੋਇਆ ਰੇਲਵੇ construction: ਉਸਾਰੀ ਹੇਠ ਰੇਲਵੇ @@ -483,11 +566,12 @@ pa: narrow_gauge: ਭੀੜੀ ਰੇਲ platform: ਰੇਲਵੇ ਪਲੇਟਫਾਰਮ station: ਰੇਲਵੇ ਸਟੇਸ਼ਨ - subway: ਸਬਵੇ ਸਟੇਸ਼ਨ + subway: ਸੱਬਵੇ subway_entrance: ਸਬਵੇ ਪ੍ਰਵੇਸ਼ tram: ਟਰਾਮਵੇ tram_stop: ਟਰਾਮ ਅੱਡਾ shop: + antiques: ਪ੍ਰਾਚੀਨ art: ਕਲਾ ਹੱਟੀ bakery: ਨਾਨਬਾਈ ਦੀ ਹੱਟੀ beauty: ਬਿਊਟੀ ਪਾਰਲਰ @@ -558,6 +642,7 @@ pa: video: ਵੀਡੀਓ ਦੀ ਦੁਕਾਨ "yes": ਹੱਟੀ tourism: + apartment: ਅਪਾਰਟਮੈਂਟ artwork: ਕਾਰੀਗਰੀ attraction: ਖਿੱਚ bed_and_breakfast: ਮੰਜਾ ਤੇ ਨਾਸ਼ਤਾ @@ -565,6 +650,7 @@ pa: camp_site: ਛਾਉਣੀ caravan_site: ਕਾਫ਼ਲਾ ਟਿਕਾਣਾ chalet: ਲੱਕੜ ਦਾ ਘਰ + gallery: ਗੈਲਰੀ guest_house: ਸਰਾਂ hostel: ਹੋਸਟਲ hotel: ਹੋਟਲ @@ -595,6 +681,7 @@ pa: wadi: ਬਰਸਾਤੀ ਨਾਲਾ waterfall: ਝਰਨਾ weir: ਬੰਨ੍ਹ + "yes": ਜਲਮਾਰਗ admin_levels: level2: ਦੇਸ਼ ਦੀ ਹੱਦ level4: ਰਾਜ ਦੀ ਹੱਦ @@ -626,8 +713,10 @@ pa: export: ਬਰਾਮਦ data: ਸਮੱਗਰੀ export_data: ਸਮੱਗਰੀ ਬਰਾਮਦ ਕਰੋ + edit_with: '%{editor} ਨਾਲ ਸੋਧੋ' intro_2_create_account: ਇੱਕ ਵਰਤੋਂਕਾਰ ਖਾਤਾ ਬਣਾਉ partners_ic: ਇੰਪੀਰੀਅਲ ਕਾਲਜ ਲੰਡਨ + partners_bytemark: ਬਾਈਟਮਾਰਕ ਹੋਸਟਿੰਗ partners_partners: ਜੋੜੀਦਾਰ help: ਮਦਦ about: ਬਾਬਤ @@ -647,6 +736,7 @@ pa: english_link: ਮੂਲ ਅੰਗਰੇਜ਼ੀ native: title: ਇਸ ਵਰਕੇ ਬਾਰੇ + native_link: ਪੰਜਾਬੀ ਵਰਜਨ mapping_link: ਨਕਸ਼ਾਬੰਦੀ ਸ਼ੁਰੂ ਕਰੋ legal_babble: title_html: ਨਕਲ-ਹੱਕ ਤੇ ਲਾਇਸੰਸ @@ -656,6 +746,8 @@ pa: title: ਜੀ ਆਇਆਂ ਨੂੰ! whats_on_the_map: title: ਨਕਸ਼ੇ ਉੱਤੇ ਕੀ ਹੈ + rules: + title: ਨਿਯਮ! questions: title: ਕੋਈ ਸੁਆਲ? start_mapping: ਨਕਸ਼ਾਬੰਦੀ ਸ਼ੁਰੂ ਕਰੋ @@ -674,9 +766,15 @@ pa: welcome: url: /ਜੀ ਆਇਆਂ ਨੂੰ title: ਓ.ਐੱਸ.ਐੱਮ. 'ਤੇ ਜੀ ਆਇਆਂ ਨੂੰ + beginners_guide: + title: ਸ਼ੁਰੂਆਤੀ ਗਾਈਡ help: url: https://help.openstreetmap.org/ title: help.openstreetmap.org + forums: + title: ਮੰਚ + irc: + title: ਆਈ.ਆਰ.ਸੀ wiki: url: http://wiki.openstreetmap.org/ title: wiki.openstreetmap.org @@ -684,17 +782,34 @@ pa: next: ਅੱਗੇ copyright_html: <span>©</span>ਓਪਨ-ਸਟਰੀਟ-ਮੈਪ<br>ਯੋਗਦਾਨੀ local_knowledge_title: ਸਥਾਨੀ ਗਿਆਨ + open_data_title: ਓਪਨ ਡਾਟਾ + legal_title: ਕਾਨੂੰਨੀ partners_title: ਸਾਂਝੀਦਾਰ notifier: gpx_notification: greeting: ਸਤਿ ਸ੍ਰੀ ਅਕਾਲ, signup_confirm: greeting: ਸਤਿ ਸ੍ਰੀ ਅਕਾਲ ਜੀ! + email_confirm_plain: + greeting: ਸਤਿ ਸ੍ਰੀ ਅਕਾਲ, + email_confirm_html: + greeting: ਸਤਿ ਸ੍ਰੀ ਅਕਾਲ, + lost_password_plain: + greeting: ਸਤਿ ਸ੍ਰੀ ਅਕਾਲ, + lost_password_html: + greeting: ਸਤਿ ਸ੍ਰੀ ਅਕਾਲ, note_comment_notification: anonymous: ਇੱਕ ਗੁੰਮਨਾਮ ਵਰਤੋਂਕਾਰ greeting: ਸਤਿ ਸ੍ਰੀ ਅਕਾਲ, + changeset_comment_notification: + greeting: ਸਤਿ ਸ੍ਰੀ ਅਕਾਲ, + commented: + partial_changeset_without_comment: ਬਿਨਾ ਟਿੱਪਣੀ message: inbox: + title: ਇਨਬਾਕਸ + my_inbox: ਮੇਰਾ ਇਨਬਾਕਸ + outbox: ਆਊਟਬਾਕਸ from: ਵੱਲੋਂ subject: ਵਿਸ਼ਾ date: ਮਿਤੀ @@ -704,12 +819,17 @@ pa: new: title: ਸੁਨੇਹਾ ਘੱਲੋ subject: ਵਿਸ਼ਾ + body: ਧੜ੍ਹ send_button: ਭੇਜੋ message_sent: ਸੁਨੇਹਾ ਭੇਜਿਆ ਗਿਆ no_such_message: title: ਅਜਿਹਾ ਕੋਈ ਸੁਨੇਹਾ ਨਹੀਂ heading: ਅਜਿਹਾ ਕੋਈ ਸੁਨੇਹਾ ਨਹੀਂ outbox: + title: ਆਊਟਬਾਕਸ + my_inbox: ਮੇਰਾ %{inbox_link} + inbox: ਇਨਬਾਕਸ + outbox: ਆਊਟਬਾਕਸ to: ਵੱਲ subject: ਵਿਸ਼ਾ date: ਮਿਤੀ @@ -728,6 +848,8 @@ pa: deleted: ਸੁਨੇਹਾ ਮਿਟਾਇਆ ਗਿਆ site: index: + permalink: ਪੱਕੀ ਕੜੀ + shortlink: ਛੋਟੀ ਕੜੀ createnote: ਟਿੱਪਣੀ ਜੋੜੋ edit: user_page_link: ਵਰਤੋਂਕਾਰ ਵਰਕਾ @@ -737,6 +859,9 @@ pa: close: ਬੰਦ ਕਰੋ search: search: ਖੋਜੋ + get_directions: ਦਿਸ਼ਾਵਾਂ ਪ੍ਰਾਪਤ ਕਰੋ + from: ਵੱਲੋਂ + to: ਵੱਲ where_am_i: ਮੈਂ ਕਿੱਥੇ ਹਾਂ? submit_text: ਜਾਉ key: @@ -747,7 +872,6 @@ pa: primary: ਮੁੱਢਲੀ ਸੜਕ secondary: ਸਕੈਂਡਰੀ ਸੜਕ track: ਟਰੈਕ - byway: ਬਾਈਵੇਅ bridleway: ਘੋੜ-ਰਾਹ cycleway: ਸਾਈਕਲ ਦਾ ਰਾਹ footway: ਪੈਦਲ ਰਾਹ @@ -771,7 +895,6 @@ pa: golf: ਗੋਲਫ਼ ਮੈਦਾਨ park: ਪਾਰਕ resident: ਰਿਹਾਇਸ਼ੀ ਇਲਾਕਾ - tourist: ਸੈਲਾਨੀ ਟਿਕਾਣਾ common: - ਸ਼ਾਮਲਾਟ - ਚਰਗਾਹ @@ -803,9 +926,14 @@ pa: headings: ਸਿਰਨਾਵੇਂ heading: ਸਿਰਨਾਵਾਂ subheading: ਉਪਸਿਰਨਾਵਾਂ + ordered: ਕ੍ਰਮਬੱਧ ਸੂਚੀ + first: ਪਹਿਲੀ ਚੀਜ਼ + second: ਦੂਜੀ ਚੀਜ਼ link: ਕੜੀ text: ਲਿਖਤ image: ਤਸਵੀਰ + alt: ਵਿਕਲਪਿਕ ਲਿਖਤ + url: ਯੂ.ਆਰ.ਐੱਲ. trace: edit: filename: 'ਫ਼ਾਈਲ ਦਾ ਨਾਂ:' @@ -818,6 +946,7 @@ pa: description: 'ਵੇਰਵਾ:' tags: 'ਟੈਗ:' save_button: ਤਬਦੀਲੀਆਂ ਸਾਂਭੋ + visibility: 'ਦਿੱਸਣਯੋਗਤਾ:' visibility_help: ਇਹਦਾ ਕੀ ਮਤਲਬ ਹੈ? trace_form: description: 'ਵੇਰਵਾ:' @@ -872,6 +1001,9 @@ pa: map: ਨਕਸ਼ਾ list: tagged_with: '%{tags} ਨਾਲ਼ ਨਿਸ਼ਾਨਦੇਹ' + oauth: + oauthorize: + allow_write_notes: ਟਿੱਪਣੀਆੰ ਸੋਧੋ। oauth_clients: new: title: ਕਿਸੇ ਨਵੀਂ ਅਰਜ਼ੀ ਦਾ ਇੰਦਰਾਜ ਕਰਾਉ @@ -883,11 +1015,14 @@ pa: edit: ਵੇਰਵੇ ਸੋਧੋ confirm: ਕੀ ਤੁਹਾਨੂੰ ਯਕੀਨ ਹੈ? allow_write_api: ਨਕਸ਼ੇ 'ਚ ਫੇਰ-ਬਦਲ ਕਰੋ + allow_write_notes: ਟਿੱਪਣੀਆੰ ਸੋਧੋ। index: + revoke: ਪਰਤਾਉ! register_new: ਆਪਣੀ ਅਰਜ਼ੀ ਦਾ ਇੰਦਰਾਜ ਕਰਾਓ form: name: ਨਾਂ required: ਲੋੜੀਂਦਾ + support_url: ਮਦਦ URL user: login: title: ਦਾਖ਼ਲਾ diff --git a/config/locales/pl.yml b/config/locales/pl.yml index 681ac8a01..262137999 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -1,6 +1,7 @@ # Messages for Polish (polski) # Exported from translatewiki.net # Export driver: phpyaml +# Author: "Behemot" # Author: Ajank # Author: Alan ffm # Author: Andrzej aa @@ -15,19 +16,27 @@ # Author: Deejay1 # Author: Ireun # Author: Kaligula +# Author: Kastanoto # Author: Kocio +# Author: M4sk1n +# Author: Macofe # Author: Maraf24 +# Author: Mateon1 # Author: Nemo bis # Author: Odie2 # Author: Pio387 # Author: Przemub +# Author: Psokol # Author: Py64 # Author: RafalR # Author: Rezonansowy # Author: RicoElectrico +# Author: Rmikke # Author: Ruila # Author: Soeb # Author: Sp5uhe +# Author: Teiron +# Author: The Polish # Author: Ty221 # Author: Woytecr # Author: Wpedzich @@ -35,17 +44,20 @@ # Author: Zbigniew.czernik --- pl: + html: + dir: ltr time: formats: friendly: '%e %B %Y o %H:%M' + blog: '%e.%m.%Y' activerecord: models: acl: Lista kontroli dostępu changeset: Zestaw zmian changeset_tag: Znacznik zestawu zmian country: Państwo - diary_comment: Komentarz dziennika - diary_entry: Wpis w dzienniku + diary_comment: Komentarz do dziennika + diary_entry: Wpis do dziennika friend: Znajomy language: Język message: Wiadomość @@ -53,20 +65,20 @@ pl: node_tag: Znacznik węzła notifier: Zgłaszający old_node: Wcześniejszy węzeł - old_node_tag: Tag wcześniejszego węzła + old_node_tag: Znacznik wcześniejszego węzła old_relation: Stara relacja old_relation_member: Członek starej relacji - old_relation_tag: Tag wcześniejszej relacji - old_way: Wcześniejsza droga + old_relation_tag: Znacznik wcześniejszej relacji + old_way: Wcześniejsza linia old_way_node: Węzeł starej linii - old_way_tag: Tag starej linii + old_way_tag: Znacznik starej linii relation: Relacja relation_member: Członek relacji relation_tag: Tag relacji session: Sesja trace: Ślad tracepoint: Punkt śladu - tracetag: Tag śladu + tracetag: Znacznik śladu user: Użytkownik user_preference: Preferencje użytkownika user_token: Token użytkownika @@ -106,6 +118,9 @@ pl: description: Opis languages: Języki pass_crypt: Hasło + printable_name: + with_version: '%{id}, wersja %{version}' + with_name_html: '%{name}(%{id})' editor: default: Domyślnie (obecnie %{name}) potlatch: @@ -118,8 +133,8 @@ pl: name: Potlatch 2 description: Potlatch 2 (w przeglądarce) remote: - name: Zdalne sterowanie - description: Zdalne sterowanie (JOSM lub Merkaartor) + name: Zewnętrzny edytor + description: Zdalny program (JOSM lub Merkaartor) browse: created: Utworzone closed: Zamknięte @@ -137,7 +152,7 @@ pl: download_xml: Pobierz XML view_history: Wyświetl historię view_details: Wyświetl szczegóły - location: 'Lokalizacja:' + location: 'Położenie:' changeset: title: 'Zestaw zmian: %{id}' belongs_to: Autor @@ -173,6 +188,7 @@ pl: history_title: 'Historia relacji: %{name}' members: Członkowie relation_member: + entry: '%{type} %{name}' entry_role: '%{type} %{name} jako %{role}' type: node: Węzeł @@ -182,12 +198,13 @@ pl: entry: Relacja %{relation_name} entry_role: Relacja %{relation_name} (jako %{relation_role}) not_found: - sorry: 'Przepraszamy, %{type} #%{id} nie został znaleziony.' + sorry: 'Niestety, nie odnaleziono %{type} #%{id}.' type: node: węzeł way: linia relation: relacja changeset: zestaw zmian + note: Uwaga timeout: sorry: Niestety, pobranie danych dla %{type} o identyfikatorze %{id} trwało zbyt długo. @@ -196,24 +213,25 @@ pl: way: linia relation: relacja changeset: zestaw zmian + note: Uwaga redacted: redaction: Poprawka %{id} - message_html: Ten %{type} w wersji %{version} nie może być pokazany, ponieważ - został poddany poprawce. Zapoznaj się z %{redaction_link}, aby uzyskać więcej + message_html: Ten %{type} w wersji %{version} nie może zostać wyświetlony, ponieważ + został poprawiony. Proszę zapoznać się z %{redaction_link}, aby uzyskać więcej informacji. type: node: węzeł way: linia relation: relacja start_rjs: - feature_warning: Ładowanie %{num_features} rzeczy, może spowolnić lub zawiesić - twoją przeglądarkę. Jesteś pewien, że chcesz wyświetlić te dane? + feature_warning: Wczytywanie %{num_features} obiektów, może spowolnić lub zawiesić + przeglądarkę. Wyświetlić te dane? load_data: Wczytaj dane loading: Wczytywanie... tag_details: tags: Tagi wiki_link: - key: 'Opis na wiki dla znacznika: %{key}' + key: Strona wiki dla znacznika %{key} tag: Strona wiki dla znacznika %{key}=%{value} wikidata_link: '%{page} element na Wikidata' wikipedia_link: Artykuł %{page} w Wikipedii @@ -230,19 +248,20 @@ pl: commented_by: Komentarz od %{user} <abbr title='%{exact_time}'>%{when} temu</abbr> commented_by_anonymous: Skomentowana anonimowo <abbr title='%{exact_time}'>%{when} temu</abbr> - closed_by: 'Zamknięta przez: %{user} <abbr title=''%{exact_time}''>%{when} temu</abbr>' + closed_by: 'Rozwiązana przez: %{user} <abbr title=''%{exact_time}''>%{when} + temu</abbr>' closed_by_anonymous: Rozwiązana anonimowo <abbr title='%{exact_time}'>%{when} temu</abbr> - reopened_by: Ponownie aktywowane przez %{user} <abbr title='%{exact_time}'>%{when} + reopened_by: Ponownie aktywowana przez %{user} <abbr title='%{exact_time}'>%{when} temu</abbr> - reopened_by_anonymous: Reaktywowana anonimowo <abbr title='%{exact_time}'>%{when} + reopened_by_anonymous: Ponownie aktywowana anonimowo <abbr title='%{exact_time}'>%{when} temu</abbr> hidden_by: Ukryte przez %{user} <abbr title='%{exact_time}'>%{when} temu</abbr> query: title: Dane obiektu - introduction: Kliknij na mapie, by sprawdzić obiekty w pobliżu + introduction: Kliknij na mapie, by wyszukać obiekty w pobliżu. nearby: Obiekty w pobliżu - enclosing: Większe, zakrywające obiekty + enclosing: Większe, otaczające obiekty changeset: changeset_paging_nav: showing_page: Strona %{page} @@ -263,16 +282,15 @@ pl: title_user: Zestawy zmian użytkownika %{user} title_friend: Zestawy zmian twoich znajomych title_nearby: Zestawy zmian pobliskich użytkowników - empty: Brak znalezionych zestawów zmian. - empty_area: Brak zestawów zmian w tym obszarze. + empty: Nie odnaleziono zestawów zmian. + empty_area: Brak zestawów zmian na tym obszarze. empty_user: Brak zestawów zmian tego użytkownika. - no_more: Nie znaleziono więcej zestawów zmian. - no_more_area: Brak zestawów zmian w tym obszarze. + no_more: Nie odnaleziono więcej zestawów zmian. + no_more_area: Brak zestawów zmian na tym obszarze. no_more_user: Brak zestawów zmian tego użytkownika. - load_more: Załaduj więcej + load_more: Wczytaj więcej timeout: - sorry: Niestety, pobieranie listy zestawów zmian, którą chciałeś zobaczyć, trwało - zbyt długo. + sorry: Niestety, pobieranie listy żądanych zestawów zmian trwało zbyt długo. rss: title_all: Dyskusja na temat zestawu zmian title_particular: 'Dyskusja na temat zestawu zmian #%{changeset_id}' @@ -283,14 +301,15 @@ pl: diary_entry: new: title: Nowy wpis do dziennika + publish_button: Opublikuj list: title: Dzienniki użytkowników title_friends: Dzienniki znajomych title_nearby: Dzienniki pobliskich użytkowników user_title: Dziennik użytkownika %{user} in_language_title: Wpisy w języku %{language} - new: Nowy wpis do dziennika - new_title: Stwórz nowy wpis w Twoim dzienniku użytkownika + new: Nowy wpis dziennika + new_title: Tworzy nowy wpis w dzienniku użytkownika no_entries: Brak wpisów dziennika recent_entries: Ostatnie wpisy do dziennika older_entries: Starsze wpisy @@ -315,17 +334,17 @@ pl: save_button: Zapisz no_such_entry: title: Nie ma takiego wpisu - heading: 'Brak wpisu o id: %{id}' - body: Niestety nie znaleziono wpisu dziennika / komentarza o id %{id}, sprawdź - pisownię. Byc może użyłeś(aś) linku który był niepoprawny. + heading: Brak wpisu o identyfikatorze %{id} + body: Niestety nie odnaleziono wpisu dziennika lub komentarza o identyfikatorze + %{id}. Proszę sprawdzić pisownię. Być może kliknięty odnośnik jest niepoprawny. diary_entry: - posted_by: Wpis od %{link_user} z %{created} w języku %{language_link} + posted_by: Opublikowany przez %{link_user}, %{created} w języku %{language_link} comment_link: Skomentuj ten wpis reply_link: Odpowiedz na ten wpis comment_count: - few: '%{count} komentarze' - one: 1 komentarz zero: Brak komentarzy + one: '%{count} komentarz' + few: '%{count} komentarze' other: '%{count} komentarzy' edit_link: Edytuj ten wpis hide_link: Ukryj ten wpis @@ -349,7 +368,7 @@ pl: title: Wpisy OpenStreetMap description: Ostatnie wpisy od użytkowników OpenStreetMap comments: - has_commented_on: '%{display_name} skomentował następujące wpisy dziennika' + has_commented_on: Użytkownik %{display_name} skomentował następujące wpisy dziennika post: Wpis when: Kiedy comment: Komentarz @@ -359,21 +378,21 @@ pl: export: title: Eksportuj start: - area_to_export: Obszar do eksportu + area_to_export: Obszar do wyeksportowania manually_select: Ręcznie zaznacz inny obszar format_to_export: Format eksportu osm_xml_data: Dane XML OpenStreetMap - map_image: Plik graficzny (standardowa warstwa) + map_image: Obraz mapy (standardowa warstwa) embeddable_html: Kod HTML do osadzenia licence: Licencja export_details: Dane OpenStreetMap udostępnione są na licencji <a href="http://opendatacommons.org/licenses/odbl/1.0/">Open Data Commons Open Database License</a> (ODbL). too_large: - advice: 'Jeśli eksport się nie powiedzie, rozważ użycie jedno z podanych niżej - źródeł:' + advice: 'Jeśli eksportowanie się nie uda, proszę rozważyć użycie jednego z + podanych zasobów:' body: 'Ten obszar jest zbyt duży, aby go wyeksportować jako dane XML OpenStreetMap. - Przybliż się, wybierz mniejszy obszar, lub użyj jednego ze następujących - źródeł aby objąć pobierane dane:' + Proszę przybliżyć widok, wybrać mniejszy obszar lub użyć jednego z następujących + zasobów, aby pobrać większą ilość danych:' planet: title: Planeta OSM description: Regularnie aktualizowane kopie całej bazy danych OpenStreetMap @@ -389,20 +408,20 @@ pl: title: Metro Extracts description: Migawki dużych miast i otaczających je obszarów other: - title: Inne źródła - description: Dodatkowe źródła wymienione w OpenStreetMap wiki + title: Inne zasoby + description: Dodatkowe zasoby wymienione w OpenStreetMap wiki options: Opcje format: Format scale: Skala - max: max - image_size: Rozmiar obrazka - zoom: Zoom - add_marker: Dodaj pinezkę na mapie + max: maks + image_size: Rozmiar obrazu + zoom: Przybliżenie + add_marker: Dodaj znacznik na mapie latitude: 'Szer:' longitude: 'Dł:' output: Wynik paste_html: Wklej podany kod HTML do swojej strony - export_button: Eksportuj + export_button: Wyeksportuj geocoder: search: title: @@ -418,6 +437,7 @@ pl: Nominatim</a> geonames_reverse: Wyniki z <a href="http://www.geonames.org/">GeoNames</a> search_osm_nominatim: + prefix_format: '%{name}' prefix: aerialway: cable_car: Kolejka linowa @@ -447,37 +467,37 @@ pl: boat_rental: Wypożyczalnia łodzi brothel: Dom publiczny bureau_de_change: Kantor - bus_station: Stacja autobusowa + bus_station: Dworzec autobusowy cafe: Kawiarnia car_rental: Wynajem samochodów car_sharing: Dzielenie się samochodami car_wash: Myjnia samochodowa casino: Kasyno - charging_station: Stacja paliw + charging_station: Stacja ładowania pojazdów elektrycznych childcare: Opieka nad dziećmi cinema: Kino clinic: Przychodnia clock: Zegar - college: Uczelnia + college: Szkoła policealna community_centre: Centrum społeczności courthouse: Sąd crematorium: Krematorium dentist: Gabinet dentystyczny doctors: Lekarze - dormitory: Bursa + dormitory: Akademik/internat drinking_water: Źródło wody pitnej - driving_school: Nauka jazdy + driving_school: Szkoła nauki jazdy embassy: Ambasada emergency_phone: Telefon alarmowy - fast_food: Fast Food + fast_food: Bar (fast food) ferry_terminal: Terminal promowy fire_hydrant: Hydrant fire_station: Remiza strażacka - food_court: Targ z żywnością + food_court: Współdzielone miejsce do spożywania posiłków fountain: Fontanna - fuel: Stacja benzynowa + fuel: Stacja paliw gambling: Hazard - grave_yard: Mniejszy cmentarz + grave_yard: Cmentarz przykościelny gym: Centrum Fitness / Sala Gimnastyczna health_centre: Ośrodek zdrowia hospital: Szpital @@ -497,11 +517,11 @@ pl: parking_entrance: Wjazd na parking pharmacy: Apteka place_of_worship: Miejsce kultu - police: Policja + police: Policja lub straż miejska/gminna post_box: Skrzynka pocztowa - post_office: Poczta + post_office: Poczta-urząd pocztowy preschool: Przedszkole - prison: Więzienie + prison: Więzienie/areszt pub: Pub public_building: Budynek publiczny reception_area: Recepcja @@ -509,8 +529,8 @@ pl: restaurant: Restauracja retirement_home: Dom seniora sauna: Sauna - school: Szkoła - shelter: Schron + school: Szkoła podstawowa, gimnazjum lub liceum + shelter: Schronienie shop: Sklep shower: Prysznic social_centre: Centrum społeczne @@ -522,16 +542,16 @@ pl: telephone: Budka telefoniczna theatre: Teatr toilets: Toaleta publiczna - townhall: Urząd miejski + townhall: Urząd miejski / Urząd gminy university: Uniwersytet vending_machine: Automat do sprzedaży veterinary: Weterynarz village_hall: Urząd gminy waste_basket: Kosz na śmieci - waste_disposal: Kosz na śmieci + waste_disposal: Śmietnik youth_centre: Centrum młodzieżowe boundary: - administrative: Granica administracyjna + administrative: Granica gminy census: Granica spisu ludności national_park: Park Narodowy protected_area: Obszar chroniony @@ -539,7 +559,7 @@ pl: aqueduct: Akwedukt suspension: Most wiszący swing: Most obrotowy - viaduct: Wiadukt + viaduct: Most wieloprzęsłowy "yes": Most building: "yes": Budynek @@ -565,16 +585,16 @@ pl: bus_guideway: Droga dla autobusów bus_stop: Przystanek autobusowy construction: Droga w trakcie budowy - cycleway: Ścieżka rowerowa + cycleway: Droga rowerowa elevator: Winda - emergency_access_point: Punkt awaryjny - footway: Chodnik + emergency_access_point: Miejsce zbiórki ewakuacyjnej + footway: Droga dla pieszych ford: Bród - living_street: Strefa zamieszkania - milestone: Punkt kontrolny - motorway: Autostrada - motorway_junction: Skrzyżowanie autostrad - motorway_link: Autostrada – dojazd + living_street: Strefa zamieszkania (znak D-40) + milestone: Słupek pikietażowy + motorway: autostrada + motorway_junction: Węzeł autostradowy + motorway_link: Autostrada - dojazd path: Ścieżka pedestrian: Droga dla pieszych platform: Miejsce oczekiwania dla pasażerów @@ -587,9 +607,9 @@ pl: road: Droga secondary: Droga drugorzędna secondary_link: Droga drugorzędna – dojazd - service: Droga serwisowa - services: Usługi autostrady - speed_camera: Radar + service: Droga serwisowa/dojazdowa + services: Miejsce Obsługi Podróżnych + speed_camera: Fotoradar steps: Schody street_lamp: Lampa uliczna tertiary: Droga trzeciorzędna @@ -597,8 +617,8 @@ pl: track: Droga polna lub leśna traffic_signals: Sygnalizacja świetlna trail: Szlak - trunk: Droga szybkiego ruchu - trunk_link: Droga szybkiego ruchu – dojazd + trunk: Droga główna/ekspresowa + trunk_link: Droga główna/ekspresowa – dojazd unclassified: Droga czwartorzędna unsurfaced: Droga polna lub leśna "yes": Droga @@ -617,22 +637,22 @@ pl: house: Dom icon: Ikona manor: Dwór - memorial: Mniejszy pomnik + memorial: Pomnik/miejsce pamięci (mały) mine: Kopalnia - monument: Pomnik + monument: Pomnik/miejsce pamięci (duży) roman_road: Droga rzymska ruins: Ruiny stone: Kamień tomb: Grób tower: Wieża wayside_cross: Przydrożny krzyż - wayside_shrine: Przydrożna kaplica - wreck: Wrak + wayside_shrine: Przydrożna kapliczka + wreck: Zatopiony statek junction: "yes": Funkcja landuse: allotments: Ogródki działkowe - basin: Dorzecze + basin: Basen-zbiornik brownfield: Grunty poprzemysłowe cemetery: Cmentarz commercial: Obszar handlowo-usługowy @@ -670,7 +690,7 @@ pl: dog_park: Park dla psów fishing: Łowisko fitness_centre: Centrum Fitness - fitness_station: Fitness + fitness_station: Siłownia zewnętrzna garden: Ogród golf_course: Pole golfowe horse_riding: Jazda konna @@ -681,7 +701,7 @@ pl: park: Park pitch: Boisko sportowe playground: Plac zabaw - recreation_ground: Pole rekreacyjne + recreation_ground: Obszar rekreacyjno-wypoczynkowy resort: Ośrodek wypoczynkowy sauna: Sauna slipway: Pochylnia @@ -722,7 +742,7 @@ pl: island: Wyspa land: Ląd marsh: Bagno - moor: Torfowisko + moor: Wrzosowisko mud: Muł peak: Szczyt point: Punkt @@ -732,16 +752,16 @@ pl: saddle: Przełęcz sand: Piasek scree: Piarg - scrub: Zagajnik - spring: Źródło - stone: Kamieniołom + scrub: Zarośla + spring: Źródło wodne + stone: Głaz strait: Cieśnina tree: Drzewo valley: Dolina volcano: Wulkan water: Woda wetland: Obszar podmokły - wood: Puszcza + wood: Drzewa office: accountant: Księgowy administrative: Administracja @@ -749,7 +769,7 @@ pl: company: Przedsiębiorstwo employment_agency: Urząd pracy estate_agent: Biuro nieruchomości - government: Biura rządowe + government: Biuro rządowe/samorządowe insurance: Biuro ubezpieczeń lawyer: Prawnik ngo: Biuro organizacji pozarządowych @@ -770,17 +790,17 @@ pl: island: Wyspa islet: Wysepka isolated_dwelling: Pojedynczy dom-gospodarstwo - locality: Miejsce niezaludnione + locality: Miejsce nazwane moor: Wrzosowisko municipality: Gmina neighbourhood: Sąsiedztwo postcode: Kod pocztowy region: Rejon sea: Morze - state: Stan + state: Województwo/stan/prowincja subdivision: Dzielnica suburb: Osiedle - town: Miasteczko + town: Miasto unincorporated_area: Obszar poza miejscowościami village: Wieś "yes": Miejsce @@ -807,7 +827,7 @@ pl: subway: Metro subway_entrance: Wejście na stację metra switch: Zwrotnica - tram: Linia tramwajowa + tram: Tory tramwajowe tram_stop: Przystanek tramwajowy shop: alcohol: Sklep monopolowy @@ -819,7 +839,7 @@ pl: bicycle: Sklep rowerowy books: Księgarnia boutique: Butik - butcher: Rzeźnik + butcher: Sklep mięsny car: Sklep samochodowy car_parts: Sklep z częściami samochodowymi car_repair: Naprawa samochodów @@ -829,7 +849,7 @@ pl: clothes: Sklep odzieżowy computer: Sklep komputerowy confectionery: Cukiernia - convenience: Mały sklep wielobranżowy + convenience: Sklep ogólnospożywczy copyshop: Ksero cosmetics: Sklep kosmetyczny deli: Delikatesy @@ -840,7 +860,7 @@ pl: electronics: Sklep elektroniczny estate_agent: Biuro nieruchomości farm: Sklep gospodarski - fashion: Sklep modelarski + fashion: Sklep z modą fish: Sklep rybny florist: Kwiaciarnia food: Sklep spożywczy @@ -887,7 +907,7 @@ pl: tourism: alpine_hut: Chata alpejska apartment: Mieszkanie - artwork: Sztuka + artwork: Dzieło sztuki attraction: Atrakcja turystyczna bed_and_breakfast: Bed and Breakfast cabin: Kabina @@ -931,9 +951,9 @@ pl: level2: Granica kraju level4: 'Granica:' level5: Granica regionu - level6: 'Granica:' + level6: 'Granica powiatu:' level8: Granica miejscowości - level9: Granica wsi + level9: Granica dzielnicy level10: Granica przedmieścia description: title: @@ -945,13 +965,16 @@ pl: towns: Miasta places: Miejsca results: - no_results: Nie znaleziono + no_results: Nie odnaleziono wyników more_results: Więcej wyników layouts: + project_name: + title: OpenStreetMap + h1: OpenStreetMap logo: alt_text: Logo OpenStreetMap - home: Przejdź do lokalizacji domu - logout: Wyloguj się + home: Przejdź do położenia domu + logout: Wyloguj log_in: Zaloguj się log_in_tooltip: Zaloguj się sign_up: Zarejestruj się @@ -959,13 +982,13 @@ pl: sign_up_tooltip: Załóż konto, aby edytować edit: Edycja history: Zmiany - export: Eksport + export: Eksportowanie data: Dane export_data: Eksportuj dane gps_traces: Ślady GPS gps_traces_tooltip: Zarządzanie śladami GPS - user_diaries: Dzienniczki - user_diaries_tooltip: Przeglądaj dzienniczki użytkownika + user_diaries: Dzienniki + user_diaries_tooltip: Przeglądaj dzienniki użytkownika edit_with: Edytuj w %{editor} tag_line: Wolna wikimapa świata intro_header: Witamy w OpenStreetMap! @@ -977,6 +1000,7 @@ pl: partners_ic: Imperial College London partners_bytemark: Hosting Bytemark partners_partners: partnerzy + partners_url: http://wiki.openstreetmap.org/wiki/partners osm_offline: Baza danych OpenStreetMap jest niedostępna na czas ważnych zadań administracyjnych, które są w tym momencie wykonywane. osm_read_only: Baza danych OpenStreetMap jest w trybie tylko-do-odczytu na czas @@ -1011,9 +1035,8 @@ pl: legal_babble: title_html: Prawa autorskie i licencja intro_1_html: |- - OpenStreetMap zawiera <i>wolne dane</i>, rozpowszechniane na licencji <a - href="http://opendatacommons.org/licenses/odbl/">Open Data - Commons Open Database License</a> (ODbL). + OpenStreetMap<sup><a href="#trademarks">®</a></sup> to projekt <i>open data</i>, rozpowszechniany na licencji <a href="http://opendatacommons.org/licenses/odbl/">Open Data Commons Open Database License</a> (ODbL) przez <a + href="http://osmfoundation.org/">OpenStreetMap Foundation</a> (OSMF). intro_2_html: Możesz swobodnie kopiować, rozpowszechniać, przekazywać innym i dostosowywać nasze dane, pod warunkiem podania OpenStreetMap i jego autorów jako źródło. Jeśli zmienisz, przekształcisz lub wykorzystasz nasze dane, wynik @@ -1039,16 +1062,17 @@ pl: alt: Przykład, jak przypisywać OpenStreetMap na stronie internetowej title: Przykład uznania autorstwa more_title_html: Dowiedz się więcej - more_1_html: Więcej informacji o możliwości wykorzystania danych OpenStreetMap - można znaleźć w <a href="http://wiki.openstreetmap.org/wiki/Legal_FAQ">Legal - FAQ</a>. + more_1_html: |- + Dowiedz się więcej o korzystaniu z naszych danych i o tym, jak określić nas jako źródło z którego pochodzą dane na <a + href="http://osmfoundation.org/License">stronie OSMF License</a> i <a + href="http://wiki.openstreetmap.org/wiki/Legal_FAQ">stronie odpowiedzi na pytania prawne</a>. more_2_html: Chociaż dane OpenStreetMap są otwarte, nie jesteśmy w stanie zapewnić nieograniczonego dostępu do naszego API wszystkim chętnym. Zapoznaj się z - naszą <a href="http://wiki.openstreetmap.org/wiki/API_usage_policy">Polityką - korzystania z API</a>, <a href="http://wiki.openstreetmap.org/wiki/Tile_usage_policy">Polityką - korzystania z kafelków</a> oraz <a href="http://wiki.openstreetmap.org/wiki/Nominatim#Usage_Policy">Polityką + naszą <a href="https://operations.osmfoundation.org/policies/api/">Polityką + korzystania z API</a>, <a href="https://operations.osmfoundation.org/policies/tiles/">Polityką + korzystania z kafelków</a> oraz <a href="https://operations.osmfoundation.org/policies/nominatim/">Polityką korzystania z Nominatima</a>. - contributors_title_html: Dane włączone do OpenStreetMap + contributors_title_html: Współtwórcy contributors_intro_html: 'Autorami są tysiące osób. Uwzględniamy również licencjonowane dane na otwartej zasadzie z krajowych agencji kartograficznych i innych źródeł, wśród nich:' @@ -1087,7 +1111,7 @@ pl: aby udoskonalić OpenStreetMap, są dostępne na stronie <a href="http://wiki.openstreetmap.org/wiki/Contributors">Contributors (en)</a>. contributors_footer_2_html: Włączenie danych do OpenStreetMap nie musi oznaczać, - że podmiot będący ich źródłem popiera OpenStreetMap, udziela jakiejkolwiek + że udostępniający je podmiot popiera OpenStreetMap, udziela jakiejkolwiek gwarancji lub ponosi jakąkolwiek odpowiedzialność. infringement_title_html: Naruszenia praw autorskich infringement_1_html: Użytkownicy OpenStreetMap powinni pamiętać, aby nigdy nie @@ -1099,8 +1123,12 @@ pl: usuwania danych</a> lub <a href="http://dmca.openstreetmap.org/">wypełnij formularz on-line</a>. trademarks_title_html: <span id="trademarks"></span>Znaki towarowe + trademarks_1_html: OpenStreetMap, logo i nazwa State of the Map są zastrzeżonymi + znakami towarowymi Fundacji OpenStreetMap. Jeśli masz pytania dotyczące ich + używania, prześlij swoje pytania do <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">grupy + roboczej ds. licencji</a>. welcome_page: - title: Witaj! + title: Witamy! introduction_html: Witamy w OpenStreetMap, wolnej mapie świata. Teraz gdy masz już konto, możesz przystąpić do mapowania. Oto krótki przewodnik z najważniejszymi rzeczami, o których musisz wiedzieć. @@ -1125,6 +1153,12 @@ pl: Nazwa ulicy lub jej ograniczenie prędkości. rules: title: Zasady! + paragraph_1_html: W OpenStreetMap jest kilka formalnych zasad, ale spodziewamy + się, że wszyscy uczestnicy będą współpracować i komunikować się ze społecznością. + Jeśli planujesz jakieś działania inne niż same edycje manualne, proszę przeczytaj + i dostosuj się do zaleceń dotyczących <a href="http://wiki.openstreetmap.org/wiki/Import/Guidelines">wytycznych</a> + i <a href="http://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct">automatycznych + edycji</a>. questions: title: Jakieś pytania? paragraph_1_html: OpenStreetMap ma wiele zasobów pomocnych w poznawaniu projektu, @@ -1159,7 +1193,7 @@ pl: explanation_html: "Jeśli masz obawy o jak nasze dane są używane lub zawartość proszę zapoznać się ze\n<a href='/copyright'>stroną o prawach autorskich</a> po więcej informacji prawnych lub skontaktować się z \n<a href='http://wiki.osmfoundation.org/wiki/Working_Groups'>grupą - rooboczą OSMF</a>." + roboczą OSMF</a>." help_page: title: Uzyskiwanie pomocy introduction: OpenStreetMap ma wiele zasobów pomocnych w poznawaniu projektu, @@ -1199,13 +1233,13 @@ pl: about_page: next: Dalej copyright_html: <span>©</span>Członkowie<br>OpenStreetMap - used_by: '%{name} dostarcza dane mapowe dla setek stron internetowych, aplikacji + used_by: '%{name} dostarcza dane mapowe dla tysięcy stron internetowych, aplikacji oraz urządzeń' lede_text: OpenStreetMap jest tworzony przez społeczność dodającą dane o drogach, ścieżkach, kawiarniach, dworcach i wielu innych, na całym świecie. local_knowledge_title: Wiedza lokalna local_knowledge_html: OpenStreetMap wyróżnia wiedzę lokalną. Członkowie używają - zdjęć satelitarnych, lotniczych, nawigacji GPS, i zwykłych map abyzweryfikować + zdjęć satelitarnych, lotniczych, nawigacji GPS, i zwykłych map aby zweryfikować czy dane w OSM są dokładne i aktualne. community_driven_title: Kontrolowany przez społeczność community_driven_html: |- @@ -1218,16 +1252,20 @@ pl: ale tylko na tej samej licencji. Zobacz <a href=''%{copyright_path}''>Prawa autorskie i licencja</a> by zobaczyć szczegóły.' legal_title: Pytania prawne + legal_html: |- + Ta strona internetowa i inne usługi z tym związane prowadzone są formalnie przez <a href="http://osmfoundation.org/">OpenStreetMap Foundation</a> (OSMF) w imieniu społeczeństwa. Korzystanie z wszystkich usług OSMF jest regulowane przez <a href="http://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy"> + Politykę użytkowania</a> i naszą <a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy">Politykę prywatności</a>.<br>Proszę, <a href="http://osmfoundation.org/Contact">skontaktuj się z OSMF</a>, jeśli masz problem z licencjami, prawami autorskimi lub innymi prawnymi problemami. partners_title: Partnerzy notifier: diary_comment_notification: - subject: '[OpenStreetMap] Użytkownik %{user} skomentował Twój wpis w pamiętniku' + subject: '[OpenStreetMap] Użytkownik %{user} skomentował wpis dziennika' hi: Witaj %{to_user}, - header: '%{from_user} zostawił(a) komentarz do twojego wpisu w dziennikach OpenStreetMap + header: '%{from_user} zostawił(a) komentarz do wpisu w dziennikach OpenStreetMap o temacie %{subject}:' footer: Możesz również przeczytać komentarz pod %{readurl}, skomentować go pod %{commenturl} lub odpowiedzieć pod %{replyurl} message_notification: + subject_header: '[OpenStreetMap] %{subject}' hi: Witaj %{to_user}, header: '%{from_user} wysłał do Ciebie wiadomość z OpenStreetMap o temacie %{subject}:' footer_html: Możesz również przeczytać wiadomość na %{readurl} i odpowiedzieć @@ -1239,19 +1277,20 @@ pl: befriend_them: Możesz również dodać go jako znajomego na %{befriendurl}. gpx_notification: greeting: Witaj, - your_gpx_file: Wygląda, ze Twój plik GPX + your_gpx_file: Wygląda na to, że plik GPX with_description: z opisem and_the_tags: i następujące tagi - and_no_tags: i brak znaczników + and_no_tags: i bez znaczników failure: - subject: '[OpenStreetMap] Błąd importu pliku GPX' - failed_to_import: 'nie udało się zaimportować. Komunikat błędu:' + subject: '[OpenStreetMap] Nieudane importowanie pliku GPX' + failed_to_import: 'nie został zaimportowany. Komunikat błędu:' more_info_1: Więcej informacji na temat błędów przesyłania danych GPX i sposobach ich more_info_2: 'uniknięcia można znaleźć na stronie:' + import_failures_url: http://wiki.openstreetmap.org/wiki/GPX_Import_Failures success: - subject: '[OpenStreetMap] Sukces importu pliku GPX' - loaded_successfully: udało się wczytać, wraz z %{trace_points} z %{possible_points} + subject: '[OpenStreetMap] Zaimportowano plik GPX' + loaded_successfully: wczytano wraz z %{trace_points} z %{possible_points} punktów łącznie. signup_confirm: subject: '[OpenStreetMap] Witamy w OpenStreetMap' @@ -1279,30 +1318,30 @@ pl: greeting: Cześć, hopefully_you: Ktoś (prawdopodobnie Ty) poprosił o zresetowanie hasła do konta w serwisie openstreetmap.org dla tego adresu e-mail. - click_the_link: Jeśli to ty, kliknij na poniższy link, aby zresetować hasło. + click_the_link: Jeśli to ty, kliknij poniższy odnośnik, aby wyczyścić hasło. lost_password_html: greeting: Witaj, hopefully_you: Ktoś – prawdopodobnie Ty – poprosił o zresetowanie hasła do konta w serwisie openstreetmap.org dla tego adresu e-mail. - click_the_link: Jeśli to Ty, kliknij na poniższy link, aby zresetować hasło. + click_the_link: Jeśli to Ty, kliknij poniższy odnośnik, aby wyczyścić hasło. note_comment_notification: anonymous: Anonimowy użytkownik greeting: Witaj, commented: - subject_own: '[OpenStreetMap] %{commenter} skomentował Twoją uwagę' + subject_own: '[OpenStreetMap] Użytkownik %{commenter} skomentował uwagę' subject_other: '[OpenStreetMap] %{commenter} skomentował interesującą Cię uwagę' your_note: '%{commenter} zostawił komentarz do jednej z Twoich uwag na mapie w lokalizacji: %{place}.' - commented_note: '%{commenter} zostawił komentarz do uwagę, którą skomentowałeś. - Znajduje się ona w lokalizacji: %{place}.' + commented_note: Użytkownik %{commenter} zostawił komentarz do skomentowanej + uwagi. Znajduje się ona w położeniu %{place}. closed: subject_own: '[OpenStreetMap] %{commenter} rozwiązał Twoją uwagę' subject_other: '[OpenStreetMap] %{commenter} rozwiązał interesującą Cię uwagę' your_note: '%{commenter} rozwiązał jedną z Twoich uwag na mapie w lokalizacji: %{place}.' - commented_note: '%{commenter} rozwiązał uwagę, którą skomentowałeś. Znajduje - się ona w lokalizacji: %{place}.' + commented_note: 'Użytkonik %{commenter} rozwiązał skomentowaną uwagę. Znajduje + się ona w położeniu: %{place}.' reopened: subject_own: '[OpenStreetMap] %{commenter} ponownie aktywował jedną z Twoich uwag' @@ -1310,10 +1349,11 @@ pl: Cię uwagę' your_note: '%{commenter} ponownie aktywował jedną z Twoich uwag na mapie w lokalizacji: %{place}' - commented_note: '%{commenter} ponownie aktywował uwagę, którą skomentowałeś. - Znajduje się ona w lokalizacji: %{place}.' + commented_note: Użytkownik %{commenter} ponownie aktywował skomentowaną uwagę. + Znajduje się ona w położeniu %{place}. details: 'Więcej informacji na temat uwagi można znaleźć pod adresem: %{url}.' changeset_comment_notification: + hi: Witaj %{to_user}, greeting: Cześć, commented: subject_own: '[OpenStreetMap] %{commenter} skomentował jeden z twoich zestawów @@ -1327,11 +1367,13 @@ pl: partial_changeset_without_comment: bez komentarza details: 'Więcej informacji na temat zestawu zmian można znaleźć pod adresem: %{url}.' + unsubscribe: Aby wypisać się z subskrypcji dotyczącej tego zestawu zmian, odwiedź + %{url} i kliknij "Nie obserwuj". message: inbox: title: Wiadomości odebrane my_inbox: skrzynka odbiorcza - outbox: nadawcza + outbox: skrzynka nadawcza messages: Masz %{new_messages} i %{old_messages} new_messages: few: '%{count} nowe wiadomości' @@ -1345,7 +1387,7 @@ pl: other: '%{count} starych wiadomości' from: Od subject: Temat - date: Nadano + date: Data no_messages_yet: Nie masz jeszcze wiadomości. Może skontaktujesz się z %{people_mapping_nearby_link}? people_mapping_nearby: użytkownikami z Twojej okolicy message_summary: @@ -1359,8 +1401,8 @@ pl: subject: Temat body: Treść send_button: Wyślij - back_to_inbox: Powrót do skrzynki - message_sent: Wiadomość wysłana + back_to_inbox: Wróć do skrzynki + message_sent: Wysłano wiadomość limit_exceeded: Masz ostatnio wiele wysłanych wiadomości. Proszę poczekać chwilę przed powtórzeniem wysłania. no_such_message: @@ -1368,13 +1410,14 @@ pl: heading: Nie ma takiej wiadomości body: Niestety, nie ma wiadomości o tym identyfikatorze. outbox: - title: Wiadomości wysłane - my_inbox: Moja skrzynka %{inbox_link} - inbox: odbiorcza - outbox: nadawcza + title: Wysłane + my_inbox: Wiadomości %{inbox_link} + inbox: odebrane + outbox: wysłane messages: - one: Masz %{count} wysłaną wiadomość - other: Masz %{count} wysłanych wiadomości + one: '%{count} wysłana wiadomość' + few: '%{count} wysłane wiadomości' + other: '%{count} wysłanych wiadomości' to: Do subject: Temat date: Nadano @@ -1395,8 +1438,8 @@ pl: back: Cofnij to: Do wrong_user: Jesteś zalogowany jako „%{user}”, ale wiadomość, którą chcesz przeczytać, - nie została wysłana przez ani do tego użytkownika. Zaloguj się jako właściwy - użytkownik, aby ją przeczytać. + nie została wysłana przez tego użytkownika ani do niego. Proszę zalogować + się jako właściwy użytkownik, aby ją przeczytać. sent_message_summary: delete_button: Usuń mark: @@ -1415,13 +1458,14 @@ pl: license: copyright: Prawa autorskie należą do OpenStreetMap i jego autorów na warunkach otwartej licencji - remote_failed: Edycja nie powiodła się – sprawdź, czy JOSM lub Merkaartor jest - uruchomiony i funkcja Remote Control jest włączona + remote_failed: Nieudane edytowanie – proszę sprawdzić czy program JOSM lub Merkaartor + jest uruchomiony i funkcja Remote Control jest włączona edit: - not_public: Nie wybrałeś(aś) by twoje edycje były publiczne. - not_public_description: W tym trybie nie można już zmieniać mapy. Możesz ustawić - je na publiczne na Twojej %{user_page}. + not_public: Nie ustalono, aby edycje były publiczne. + not_public_description: W tym trybie nie można już zmieniać mapy. Można zmienić + je na publiczne na %{user_page}. user_page_link: stronie użytkownika + anon_edits: (%{link}) anon_edits_link_text: Tu dowiesz się dlaczego. flash_player_required: Aby korzystać z Potlacza, edytora OpenStreetMap, niezbędna jest wtyczka Flash. Możesz <a href="http://www.adobe.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash">ściągnąć @@ -1435,34 +1479,36 @@ pl: potlatch2_unsaved_changes: Nie zapisałeś zmian. (Jeśli chcesz zapisać zmiany w Potlatch 2 powinieneś kliknąć przycisk „zapisz”.) id_not_configured: iD nie został skonfigurowany - no_iframe_support: Przeglądarka, której używasz nie obsługuje HTML iframes, - które są niezbędne dla tej funkcji. + no_iframe_support: Używana przeglądarka nie obsługuje HTML iframes, które są + niezbędne dla tej funkcji. sidebar: search_results: Wyniki wyszukiwania close: Zamknij search: - search: Szukaj + search: Wyszukiwanie get_directions: Wyznacz trasę - get_directions_title: Znajdź trasę pomiędzy dwoma punktami - from: Początek - to: Koniec + get_directions_title: Wyznacza trasę pomiędzy dwoma punktami + from: Początek trasy + to: Koniec trasy where_am_i: Gdzie jestem? where_am_i_title: Określ obecną lokalizację przy użyciu wyszukiwarki submit_text: → key: table: entry: - motorway: Autostrada - trunk: Droga szybkiego ruchu + motorway: autostrada + main_road: Główna droga + trunk: Droga główna primary: Droga pierwszorzędna secondary: Droga drugorzędna unclassified: Drogi niesklasyfikowane - unsurfaced: Droga polna lub leśna - track: Ścieżka - byway: Droga boczna - bridleway: Ścieżka dla koni - cycleway: Ścieżka rowerowa - footway: Chodnik + track: Droga polna lub leśna + bridleway: Droga dla koni + cycleway: Droga rowerowa + cycleway_national: droga rowerowa znaczenia państwowego + cycleway_regional: droga rowerowa znaczenia regionalnego + cycleway_local: droga rowerowa znaczenia lokalnego + footway: Droga dla pieszych rail: Tory kolejowe subway: Metro tram: @@ -1479,11 +1525,10 @@ pl: - terminal admin: 'Granica:' forest: Las - wood: Puszcza + wood: Drzewa golf: Pole golfowe park: Park resident: Teren mieszkalny - tourist: Atrakcja turystyczna common: - Pole - łąka @@ -1506,16 +1551,18 @@ pl: - Szkoła - uniwersytet building: Ważny budynek - station: Dworzec kolejowy + station: stacja kolejowa summit: - Góra - szczyt tunnel: Kreskowany obrys – tunel bridge: Czarny obrys – most private: Wstęp prywatny - permissive: Możliwy wstęp destination: Dostęp do punktu docelowego - construction: Drogi w budowie / planowane + construction: Drogi w budowie + bicycle_shop: Sklep rowerowy + bicycle_parking: postój dla rowerów + toilets: ustępy richtext_area: edit: Edytuj preview: Podgląd @@ -1528,7 +1575,7 @@ pl: ordered: Uporządkowana lista first: Pierwszy element second: Drugi element - link: Łącze + link: Odnośnik text: Tekst image: Obraz alt: Tekst alternatywny @@ -1536,24 +1583,23 @@ pl: trace: visibility: private: Prywatny (udostępniany jedynie jako anonimowy, nieuporządkowane punkty) - public: Publiczny (pokazywany na liście śladów i jako anonimowy, nieuporządkowane + public: Publiczny (wyświetlany na liście śladów i jako anonimowy, nieuporządkowane punkty) trackable: Niezidentyfikowany (udostępniany jedynie jako anonimowy, uporządkowane punkty ze znacznikami czasu) - identifiable: Zidentyfikowany (pokazywany w liście śladów i jako zidentyfikowany, + identifiable: Zidentyfikowany (wyświetlany na liście śladów i jako zidentyfikowany, uporządkowane punkty ze znacznikami czasu) create: - upload_trace: Wgraj ślad GPS - trace_uploaded: Twój plik GPX został wczytany i czeka na dodanie do bazy danych. - Powinno to nastąpić w ciągu 30 minut. Wtedy też dostaniesz wiadomość z informacją - o tym fakcie. + upload_trace: Wyślij ślad GPS + trace_uploaded: Plik GPX został wysłany i czeka na dodanie do bazy danych. Powinno + to nastąpić w ciągu 30 minut, a informacja o tym fakcie zostanie wysłana wiadomością. edit: title: Edycja śladu %{name} heading: Edycja śladu %{name} filename: 'Nazwa pliku:' download: pobierz uploaded_at: 'Wysłano:' - points: 'Punkty:' + points: 'Liczba punktów:' start_coord: 'Współrzędne początkowe:' map: mapa edit: edytuj @@ -1564,6 +1610,7 @@ pl: save_button: Zapisz zmiany visibility: 'Widoczność:' visibility_help: co to znaczy? + visibility_help_url: http://wiki.openstreetmap.org/wiki/Pl:Visibility_of_GPS_traces trace_form: upload_gpx: Prześlij plik GPX description: Opis @@ -1571,34 +1618,31 @@ pl: tags_help: rozdzielone przecinkami visibility: Widoczność visibility_help: co to znaczy? - upload_button: Wgrywaj + visibility_help_url: http://wiki.openstreetmap.org/wiki/Pl:Visibility_of_GPS_traces + upload_button: Wyślij help: Pomoc + help_url: http://wiki.openstreetmap.org/wiki/Pl:Upload trace_header: upload_trace: Wyślij ślad - see_all_traces: Zobacz wszystkie ślady - see_your_traces: Zobacz wszystkie Twoje ślady + see_all_traces: Wyświetl wszystkie ślady + see_your_traces: Wyświetl swoje ślady traces_waiting: - few: Masz %{count} ślady oczekujące na dodanie. Poczekaj aż wgrywanie ich - zostanie zakończone przed dodaniem kolejnych, aby nie blokować kolejki innym - użytkownikom. - many: Masz %{count} oczekujących na dodanie śladów. Poczekaj aż wgrywanie - ich zostanie zakończone przed dodaniem kolejnych, aby nie blokować kolejki - innym użytkownikom. - one: Masz %{count} ślad oczekujący na dodanie. Poczekaj aż wgrywanie go zostanie - zakończone przed dodaniem kolejnych, aby nie blokować kolejki innym użytkownikom. - other: Masz %{count} oczekujących na dodanie śladów. Poczekaj aż wgrywanie - ich zostanie zakończone przed dodaniem kolejnych, aby nie blokować kolejki - innym użytkownikom. + one: '%{count} ślad oczekuje na wysłanie. Proszę zaczekać na zakończenie jego + wysyłania przed dodaniem kolejnych, aby nie blokować kolejki innym użytkownikom.' + few: '%{count} ślady oczekują na wysłanie. Proszę zaczekać na zakończenie + ich wysyłania przed dodaniem kolejnych, aby nie blokować kolejki innym użytkownikom.' + other: '%{count} śladów oczekuje na wysłanie. Proszę zaczekać na zakończenie + ich wysyłania przed dodaniem kolejnych, aby nie blokować kolejki innym użytkownikom.' trace_optionals: tags: Tagi view: title: Przeglądanie śladu %{name} heading: Przeglądanie śladu %{name} pending: OCZEKUJE - filename: 'Plik:' + filename: 'Nazwa pliku:' download: pobierz - uploaded: 'Dodano:' - points: 'Punktów:' + uploaded: 'Czas dodania:' + points: 'Liczba punktów:' start_coordinates: 'Współrzędne początkowe:' map: mapa edit: edycja @@ -1607,8 +1651,8 @@ pl: tags: 'Tagi:' none: Brak edit_track: Edytuj ten ślad - delete_track: Wykasuj ten ślad - trace_not_found: Ślad nie znaleziony! + delete_track: Usuń ten ślad + trace_not_found: Nie odnaleziono śladu! visibility: 'Widoczność:' trace_paging_nav: showing_page: Strona %{page} @@ -1619,10 +1663,10 @@ pl: count_points: '%{count} punktów' ago: '%{time_in_words_ago} temu' more: więcej - trace_details: Pokaż szczegóły śladu - view_map: Pokaż mapę + trace_details: Wyświetl szczegóły śladu + view_map: Wyświetl mapę edit: edycja - edit_map: Edytuj Mapę + edit_map: Edytuj mapę public: PUBLICZNY identifiable: IDENTYFIKOWALNY private: PRYWATNY @@ -1632,15 +1676,15 @@ pl: map: mapa list: public_traces: Publiczne ślady GPS - your_traces: Twoje ślady GPS + your_traces: Własne ślady GPS public_traces_from: Publiczne ślady GPS użytkownika %{user} - description: Przeglądaj najnowsze dodane ścieżki GPS + description: Przeglądanie ostatnio dodanych śladów GPS tagged_with: ' otagowane %{tags}' empty_html: Nic tu jeszcze nie ma. <a href='%{upload_link}'>Prześlij nowy ślad</a> lub dowiedz się więcej o śledzeniu GPS na <a href='http://wiki.openstreetmap.org/wiki/Beginners_Guide_1.2'>stronie wiki</a>. delete: - scheduled_for_deletion: Ślad oczekuje na skasowanie + scheduled_for_deletion: Ślad oczekuje na usunięcie make_public: made_public: Ślad stał się publicznie dostępny offline_warning: @@ -1657,10 +1701,10 @@ pl: description_without_count: Plik GPX od %{user} application: require_cookies: - cookies_needed: Wydaje się, że masz wyłączoną obsługę cookies (ciasteczek) w - swojej przeglądarce internetowej – włącz ją, zanim przejdziesz dalej. + cookies_needed: Wygląda na to, że wyłączono obsługę ciasteczek w przeglądarce. + Proszę ją włączyć przed kontynuowaniem. require_moderator: - not_a_moderator: Musisz być moderatorem, aby wykonać tą akcję. + not_a_moderator: Musisz być moderatorem, aby wykonać tą czynność. setup_user_auth: blocked: Twój dostęp do API jest zablokowany. Zaloguj się do interfejsu sieciowego, aby dowiedzieć się więcej. @@ -1669,32 +1713,33 @@ pl: ich akceptować, ale musisz się z nimi zapoznać. oauth: oauthorize: - title: Autoryzuj dostęp do Twojego konta - request_access: Aplikacja %{app_name} żąda dostępu do Twojego konta użytkownika - - %{user}. Sprawdź, czy chcesz pozwolić aplikacji na poniższe działania. Możesz - wybrać dowolną liczbę opcji. + title: Uwierzytelnij dostęp do konta + request_access: Aplikacja %{app_name} żąda dostępu do konta użytkownika %{user}. + Proszę potwierdzić przyznanie aplikacji poniższych uprawnień. Można wybrać + dowolną liczbę opcji. allow_to: 'Zezwól aplikacji klienckiej na:' allow_read_prefs: odczytywanie preferencji konta - allow_write_prefs: modyfikowanie preferencji Twojego konta + allow_write_prefs: modyfikowanie preferencji konta allow_write_diary: tworzenie wpisów w dzienniku, dopisywanie komentarzy i nawiązywanie kontaktów. - allow_write_api: modyfikuj mapę - allow_read_gpx: odczytywanie Twoich osobistych śladów GPS - allow_write_gpx: prześlij ślady GPS + allow_write_api: modyfikowanie mapy + allow_read_gpx: odczytywanie prywatnych śladów GPS + allow_write_gpx: przesyłanie śladów GPS allow_write_notes: modyfikowanie uwag. + grant_access: Przyznaj dostęp oauthorize_success: - title: Żądanie autoryzacji dozwolone - allowed: Dałeś aplikacji %{app_name} dostęp do twojego konta. + title: Dozwolone żądanie uwierzytelnienia + allowed: Przyznano dostęp do konta aplikacji %{app_name}. verification: Kod weryfikacyjny to %{code}. oauthorize_failure: - title: Żądanie autoryzacji nie powiodło się - denied: Zakazano aplikacji %{app_name} dostępu do twojego konta. - invalid: Nieprawidłowy token do autoryzacji. + title: Nieudane żądanie uwierzytelnienia + denied: Odmówiono dostępu do konta aplikacji %{app_name}. + invalid: Token uwierzytelnienia jest nieprawidłowy. revoke: - flash: Cofnąłeś prawa dostępu dla aplikacji %{application} + flash: Odwołano uprawnienia aplikacji %{application} oauth_clients: new: - title: Rejestracja nowej aplikacji + title: Rejestrowanie nowej aplikacji submit: Zarejestruj edit: title: Edycja aplikacji @@ -1711,26 +1756,25 @@ pl: delete: Usuń klienta confirm: Jesteś pewien? requests: 'Zapytanie następujących uprawnień ze strony użytkownika:' - allow_read_prefs: odczytywanie ich ustawień. - allow_write_prefs: modyfikacja ich ustawień. - allow_write_diary: tworzenie wpisów w dzienniku, dopisywanie komentarzy i nawiązywanie - kontaktów. - allow_write_api: modyfikacja mapy. - allow_read_gpx: odczytywanie ich śladów GPS. - allow_write_gpx: przesyłanie śladów GPS. - allow_write_notes: modyfikowanie uwag. + allow_read_prefs: Odczytywanie ustawień użytkownika + allow_write_prefs: Modyfikowanie ustawień użytkownika + allow_write_diary: Tworzenie wpisów w dzienniku, komentowanie i dodawanie znajomych + allow_write_api: Modyfikowanie mapy + allow_read_gpx: Odczytywanie prywatnych śladów GPS + allow_write_gpx: Przesyłanie śladów GPS. + allow_write_notes: Modyfikowanie uwag index: - title: Szczegóły autoryzacji OAuth + title: Szczegóły uwierzytelnienia OAuth my_tokens: Zarejestrowane programy - list_tokens: 'Następujące tokeny zostały wydane do aplikacji w twoim imieniu:' + list_tokens: 'Wydano następujące tokeny aplikacjom w imieniu użytkownika:' application: Nazwa aplikacji - issued_at: Wydane + issued_at: Czas wydania revoke: Odwołaj! my_apps: Programy klienckie - no_apps: Czy chcesz zarejestrować programy korzystające ze standardu %{oauth}? + no_apps: Poniżej zarejestrować można programy korzystające ze standardu %{oauth}. Programy muszą być wcześniej zarejestrowane, nim będzie można skorzystać z - zapytań OAuth do tego serwisu. - registered_apps: 'Masz zarejestrowane następujące aplikacje klienckie:' + zapytań OAuth do tej usługi. + registered_apps: 'Zarejestrowano następujące aplikacje klienckie:' register_new: Zarejestruj swoją aplikację form: name: Nazwa @@ -1738,19 +1782,19 @@ pl: url: Główny adres URL aplikacji callback_url: Adres URL odwołania zwrotnego support_url: Adres URL pomocy technicznej - requests: 'Żądaj następujących uprawnień od użytkowników:' - allow_read_prefs: odczytywanie ich ustawień. - allow_write_prefs: modyfikacja ich ustawień. - allow_write_diary: tworzenie wpisów w dzienniku, dopisywanie komentarzy i nawiązywanie - kontaktów. - allow_write_api: modyfikacja mapy. - allow_read_gpx: odczytywanie ich prywatnych śladów GPS. - allow_write_gpx: przesyłanie śladów GPS. - allow_write_notes: modyfikowanie uwag. + requests: 'Żądanie następujących uprawnień od użytkowników:' + allow_read_prefs: Odczytywanie ich ustawień użytkownika + allow_write_prefs: Modyfikowanie ich ustawień użytkownika + allow_write_diary: Tworzenie wpisów w dzienniku, dodawanie komentarzy i nawiązywanie + kontaktów + allow_write_api: Modyfikowanie mapy + allow_read_gpx: Odczytywanie ich prywatnych śladów GPS + allow_write_gpx: Przesyłanie śladów GPS + allow_write_notes: Modyfikowanie uwag not_found: sorry: Niestety, nie odnaleziono %{type}. create: - flash: Pomyślnie zarejestrowano informacje + flash: Zarejestrowano informacje update: flash: Informacje o kliencie zostały pomyślnie zaktualizowane destroy: @@ -1760,9 +1804,9 @@ pl: title: Logowanie heading: Logowanie email or username: 'Adres email lub nazwa użytkownika:' - password: Hasło + password: 'Hasło:' openid: '%{logo} OpenID:' - remember: 'Pamiętaj mnie:' + remember: Zapamiętanie danych uwierzytelniających lost password link: Zapomniałeś hasła? login_button: Zaloguj się register now: Zarejestruj się @@ -1780,29 +1824,35 @@ pl: aktywność.<br />Skontaktuj się z <a href="%{webmaster}">webmasterem</a>, jeśli chcesz przedyskutować blokadę. auth failure: Niestety, podane dane nie pozwoliły na zalogowanie. - openid_logo_alt: Zaloguj przez OpenID + openid_logo_alt: Loguje za pomocą OpenID auth_providers: openid: - title: Zaloguj przez OpenID - alt: Zaloguj przez URL OpenID + title: Zaloguj za pomocą OpenID + alt: Zaloguj za pomocą adresu URL OpenID google: - title: Zaloguj przez Google - alt: Zaloguj przez Google OpenID + title: Loguje za pomocą Google + alt: Zaloguj za pomocą Google OpenID facebook: - title: Zaloguj przez Facebooka - alt: Zaloguj przez konto Facebook + title: Loguje za pomocą Facebook + alt: Zaloguj za pomocą konta Facebook windowslive: - title: Zaloguj przez Windows Live - alt: Zaloguj przez konto Windows Live + title: Loguje za pomocą Windows Live + alt: Zaloguj za pomocą konta Windows Live + github: + title: Loguje za pomocą GitHub + alt: Zaloguj przy użyciu konta GitHub + wikipedia: + title: Loguje za pomocą Wikipedia + alt: Zaloguj za pomocą konta Wikipedia yahoo: - title: Zaloguj używając Yahoo - alt: Zaloguj używając Yahoo OpenID + title: Loguje za pomocą Yahoo + alt: Zaloguj za pomocą OpenID Yahoo wordpress: - title: Zaloguj przez Wordpress - alt: Zaloguj używając Wordpress OpenID + title: Loguje za pomocą Wordpress + alt: Zaloguj za pomocą OpenID Wordpress aol: - title: Zaloguj przez AOL - alt: Zaloguj używając AOL OpenID + title: Loguje za pomocą AOL + alt: Zaloguj za pomocą OpenID AOL logout: title: Wyloguj heading: Wyloguj z OpenStreetMap @@ -1812,23 +1862,23 @@ pl: heading: Zapomniałeś hasła? email address: 'Adres e-mail:' new password button: Wyczyść hasło - help_text: Wpisz adres e-mail, którego użyłeś do logowania się. Wyślemy na niego - link, który możesz użyć do zresetowania hasła. - notice email on way: Przykro nam że je zgubiłeś/aś ale zaraz dostaniesz maila - z pomocą którego niedługo zresetujesz hasło. - notice email cannot find: Niestety nie znaleziono tego adresu e-mail. + help_text: Proszę wprowadzić adres e-mail używany do logowania. Zostanie wysłany + na niego odnośnik służący do wyczyszczenia hasła. + notice email on way: Przykro nam z powodu utraty hasła. Wiadomość, która umożliwi + jego wyczyszczenie, jest już w drodze. + notice email cannot find: Niestety, nie odnaleziono tego adresu e-mail. reset_password: - title: zresetuj hasło - heading: Resetowanie hasła %{user} + title: Wyczyść hasło + heading: Czyszczenie hasła użytkownika %{user} password: Hasło confirm password: Potwierdź hasło - reset: Resetuj hasło + reset: Wyczyść hasło flash changed: Hasło zostało zmienione. flash token bad: Nie znaleziono tokenu, sprawdź URL new: title: Zarejestruj się no_auto_account_create: Niestety nie możemy aktualnie stworzyć Ci konta automatycznie. - contact_webmaster: Skontaktuj się proszę się z <a href="mailto:webmaster@openstreetmap.org">webmasterem</a>, + contact_webmaster: Skontaktuj się proszę się z <a href="%{webmaster}">webmasterem</a>, aby utworzyć konto. Postaramy się zająć się Twoją prośbą tak szybko, jak to będzie możliwe. about: @@ -1840,9 +1890,10 @@ pl: uczestnictwa</a>. email address: 'Adres e-mail:' confirm email address: 'Potwierdzenie adresu e-mail:' - not displayed publicly: Informacje nie wyświetlane publicznie (zobacz <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" - title="polityka prywatności zawierająca sekcję o adresach e-mail">politykę - prywatności</a>) + not displayed publicly: Twój adres nie będzie wyświetlany publicznie, zobacz + naszą <a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy" title="polityka + prywatności OSMF zawierająca sekcję o adresach el-pocztowych">politykę prywatności</a> + aby uzyskać więcej informacji. display name: 'Przyjazna nazwa:' display name description: Twoja publiczna nazwa użytkownika. Można ją później zmienić w ustawieniach. @@ -1852,18 +1903,12 @@ pl: use external auth: 'Zaloguj przez:' auth no password: Jeśli korzystasz z logowania pośredniego, hasło nie jest wymagane, jednak niektóre dodatkowe narzędzia lub serwer mogą go potrzebować. - auth association: |- - <p>Twoje ID nie jest jeszcze skojarzone z kontem OpenStreetMap.</p> - <ul> - <li>Jeśli jesteś nowym użytkownikiem OpenStreetMap, utwórz nowe konto, korzystając z poniższego formularza.</li> - <li>Jeśli masz już konto, możesz zalogować się na nie przy użyciu nazwy użytkownika i hasła, a następnie skojarzyć je z Twoim ID w ustawieniach użytkownika. - </li> - </ul> continue: Zarejestruj się terms accepted: Dziękujemy za przyjęcie nowych Warunków uczestnictwa! terms declined: Jest nam przykro, że zdecydowałeś się nie przyjmować nowych Warunków uczestnictwa. Więcej informacji możesz znaleźć <a href="%{url}">na tej stronie</a>. + terms declined url: http://wiki.openstreetmap.org/wiki/Contributor_Terms_Declined terms: title: Warunki uczestnictwa heading: Warunki uczestnictwa @@ -1872,10 +1917,12 @@ pl: consider_pd: Oprócz powyższych warunków, stwierdzam również, że mój wkład jest w domenie publicznej consider_pd_why: co to oznacza? + consider_pd_why_url: http://wiki.osmfoundation.org/w/index.php?title=Licence_and_Legal_FAQ/Why_would_I_want_my_contributions_to_be_public_domain&redirect=no guidance: 'Informacje, które pomogą zrozumieć te warunki: <a href="%{summary}">w formie czytelnego podsumowania</a> oraz <a href="%{translations}">nieoficjalne tłumaczenia</a>' agree: Akceptuję + declined: http://wiki.openstreetmap.org/wiki/Contributor_Terms_Declined decline: Nie akceptuję you need to accept or decline: Prosimy przeczytać i następnie przyjąć lub odrzucić nowe Warunki uczestnictwa, aby kontynuować. @@ -1889,17 +1936,18 @@ pl: heading: Użytkownik %{user} nie istnieje body: Niestety nie znaleziono użytkownika o nazwie %{user}, sprawdź pisownię. Być może skorzystano z nieprawidłowego odnośnika. + deleted: usunięty view: - my diary: mój dziennik + my diary: Dziennik new diary entry: nowy wpis w dzienniku - my edits: moje zmiany - my traces: moje ślady - my notes: moje uwagi - my messages: moje wiadomości - my profile: mój profil - my settings: moje ustawienia - my comments: moje komentarze - oauth settings: ustawienia oauth + my edits: Zmiany + my traces: Ślady + my notes: Uwagi + my messages: Wiadomości + my profile: Profil + my settings: Ustawienia + my comments: Komentarze + oauth settings: Ustawienia oauth blocks on me: Otrzymane blokady blocks by me: Nałożone blokady send message: wyślij wiadomość @@ -1907,7 +1955,7 @@ pl: edits: edycje traces: ślady notes: uwagi - remove as friend: Usuń ze znajomych + remove as friend: usuń ze znajomych add as friend: dodaj do znajomych mapper since: 'Mapuje od:' ago: (%{time_in_words_ago} temu) @@ -1915,18 +1963,18 @@ pl: ct undecided: niezdecydowane ct declined: odrzucone ct accepted: przyjęte %{ago} temu - latest edit: 'Ostatnia edycja %{ago}:' + latest edit: 'Ostatnia zmiana %{ago}:' email address: Adres e‐mail created from: 'Stworzony z:' status: 'Stan:' spam score: 'Punktacja spamu:' description: Opis - user location: Lokalizacja użytkownika + user location: Położenie użytkownika if set location: Podaj swoją lokalizację na stronie %{settings_link}, aby zobaczyć użytkowników blisko ciebie. settings_link_text: stronie ustawień your friends: Twoi znajomi - no friends: Nie masz jeszcze dodanych żadnych znajomych. + no friends: Nie dodano jeszcze żadnych znajomych. km away: '%{count}km stąd' m away: '%{count}m stąd' nearby users: Najbliżsi użytkownicy @@ -1941,16 +1989,16 @@ pl: revoke: administrator: Cofnij dostęp administratora moderator: Cofnij dostęp moderatora - block_history: otrzymane blokady - moderator_history: nałożone blokady + block_history: Aktywne Blokady + moderator_history: Nałożone Blokady comments: komentarze - create_block: zablokuj tego użytkownika - activate_user: aktywuj tego użytkownika - deactivate_user: dezaktywuj tego użytkownika - confirm_user: zatwierdź tego użytkownika - hide_user: ukryj tego użytkownika - unhide_user: odkryj tego użytkownika - delete_user: usuń to konto + create_block: Zablokuj tego użytkownika + activate_user: Aktywuj tego użytkownika + deactivate_user: Dezaktywuj tego użytkownika + confirm_user: Zatwierdź tego użytkownika + hide_user: Ukryj tego użytkownika + unhide_user: Odkryj tego użytkownika + delete_user: Usuń tego użytkownika confirm: Potwierdź friends_changesets: zestawy zmian znajomych friends_diaries: wpisy w dziennikach znajomych @@ -1962,7 +2010,7 @@ pl: friend: Znajomy account: title: Zmiana ustawień konta - my settings: moje ustawienia + my settings: Ustawienia current email address: 'Aktualny adres e-mail:' new email address: 'Nowy adres e-mail:' email never displayed publicly: (nie jest wyświetlany publicznie) @@ -1972,7 +2020,7 @@ pl: link text: co to jest? public editing: heading: 'Edycje publiczne:' - enabled: Włączone. Nie anonimowy i uprawniony do edycji danych. + enabled: Włączone. Nie anonimowy i uprawniony do edycji danych. enabled link: http://wiki.openstreetmap.org/wiki/Disabling_anonymous_edits enabled link text: co to jest? disabled: Wyłączone i nieuprawniony do edycji danych, wszystkie wcześniejsze @@ -1990,33 +2038,37 @@ pl: są już domyślnie publiczni.</ul></li> contributor terms: heading: 'Warunki uczestnictwa:' - agreed: Zgodziłeś się na nowe Warunki uczestnictwa. - not yet agreed: Nie zgodziłeś się na nowe warunki uczestnictwa. + agreed: Wyrażono zgodę na nowe warunki uczestnictwa. + not yet agreed: Nie wyrażono zgody na nowe Warunki uczestnictwa. review link text: Na tej stronie możesz zapoznać się z nowymi Warunkami uczestnictwa i je zaakceptować. agreed_with_pd: Zadeklarowałeś, że twoje edycje publikujesz w domenie publicznej. + link: http://wiki.osmfoundation.org/w/index.php?title=Licence/Contributor_Terms&redirect=no link text: co to jest? profile description: 'Opis profilu:' preferred languages: 'Preferowane języki:' preferred editor: 'Preferowany edytor:' - image: 'Grafika:' + image: 'Obraz:' gravatar: - gravatar: Użyj Gravatara + gravatar: Użycie Gravatara + link: http://wiki.openstreetmap.org/wiki/Gravatar link text: co to jest? - new image: Dodaj grafikę + disabled: Wyłączono „Gravatara”. + enabled: Włączono wyświetlanie „Gravatara”. + new image: Dodanie obrazu keep image: Pozostaw dotychczasową ilustrację - delete image: Usuń obecną grafikę + delete image: Usunięcie aktualnego obrazu replace image: Zmień obecną grafikę image size hint: (najlepiej sprawdzają się kwadratowe obrazy o rozmiarach przynajmniej 100x100) - home location: 'Lokalizacja domowa:' + home location: 'Położenie domu:' no home location: Nie wpisałeś swojej lokalizacji domowej. latitude: 'Szerokość:' longitude: 'Długość geograficzna:' - update home location on click: Aktualizować lokalizację, kiedy klikam na mapie? + update home location on click: Uaktualnianie położenia kliknięciem na mapie save changes button: Zapisz zmiany make edits public button: Niech wszystkie edycje będą publiczne. - return to profile: Powrót do profilu + return to profile: Wróć do profilu flash update success confirm needed: Zaktualizowano profil użytkownika. Sprawdź czy przyszedł już mail potwierdzający nowy adres mailowy. flash update success: Zaktualizowano profil użytkownika. @@ -2025,7 +2077,7 @@ pl: introduction_1: Wysłaliśmy ci e-mail z potwierdzeniem. introduction_2: Potwierdź swoje konto klikając na link w wiadomości i zacznij mapować. - press confirm button: Użyj poniższego przycisku aby aktywować Twoje konto. + press confirm button: Proszę kliknąć poniższy przycisk, aby aktywować konto. button: Potwierdzam success: Twoje konto zostało zatwierdzone, cieszymy się że do nas dołączyłeś! already active: To konto zostało potwierdzone. @@ -2036,33 +2088,32 @@ pl: success: Wysłaliśmy nową wiadomość z potwierdzeniem na %{email} i jak tylko aktywujesz swoje konto, będziesz mógł zacząć edytować mapę.<br /><br />Jeśli używasz systemu antyspamowego, upewnij się, że do swojej białej listy dodałeś - adres webmaster@openstreetmap.org. Dzięki temu będziemy mogli skontaktować - się z tobą bez problemów. - failure: Brak użytkownika %{name}. + adres %{sender}. Dzięki temu będziemy mogli skontaktować się z tobą bez problemów. + failure: Nie odnaleziono użytkownika %{name}. confirm_email: heading: Porwierdzenie zmiany adresu mailowego - press confirm button: Użyj poniższego przycisku aby potwierdzić Twój nowy adres - e-mail. + press confirm button: Proszę kliknąć poniższy przycisk, aby potwierdzić nowy + adres e-mail. button: Potwierdzam success: Potwierdzenie zmiany adresu mailowego failure: Adres email o tym kodzie był już potwierdzony. unknown_token: Ten kod potwierdzający wygasł lub nie istnieje. set_home: - flash success: Nowa lokalizacja domowa zapisana + flash success: Zapisano nowe położenie domu go_public: flash success: Wszystkie Twoje modyfikacje są od teraz publiczne i jesteś uprawniony/a do edycji. make_friend: - heading: Dodać %{user} do listy przyjaciół? + heading: Dodać %{user} do grona znajomych? button: Dodaj do listy przyjaciół - success: '%{name} jest teraz twoim znajomym!' - failed: Niestety dodanie %{name} jako znajomego nie powiodło się. - already_a_friend: '%{name} już jest Twoim gronie znajomych.' + success: '%{name} należy teraz do grona znajomych!' + failed: Nie udało się dodać %{name} do grona znajomych. + already_a_friend: '%{name} już jest znajomym.' remove_friend: - heading: Usunąć %{user} z przyjaciół? + heading: Usunąć %{user} z grona znajomych? button: Usuń z przyjaciół - success: '%{name} został wyłączony z grona Twoich znajomych.' - not_a_friend: '%{name} nie był Twoim znajomym.' + success: Usunięto %{name} z grona znajomych. + not_a_friend: '%{name} nie należy do grona znajomych.' filter: not_an_administrator: Musisz mieć uprawnienia administratora do wykonania tego działania. @@ -2094,6 +2145,13 @@ pl: invalid_credentials: Nieprawidłowe dane logownia no_authorization_code: Brak kodu autoryzacyjnego unknown_signature_algorithm: Nieznany algorytm podpisu + invalid_scope: Nieprawidłowy zakres + auth_association: + heading: Twój identyfikator nie jest jeszcze powiązany z kontem OpenStreetMap. + option_1: Jeśli jesteś po raz pierwszy na OpenStreetMap, utwórz nowe konto za + pomocą formularza poniżej. + option_2: Jeśli masz już konto, możesz zalogować się, podając swoją nazwę użytkownika + i hasło, a następnie powiązać konto z twoim ID w ustawieniach użytkownika. user_role: filter: not_an_administrator: Tylko administratorzy mogą zarządzać rolami użytkowników, @@ -2122,7 +2180,7 @@ pl: not_found: sorry: Niestety, nie udało się odnaleźć blokady użytkownika o identyfikatorze %{id}. - back: Powrót do spisu + back: Wróć do spisu new: title: Tworzenie blokady użytkownika %{name} heading: Tworzenie blokady użytkownika %{name} @@ -2138,7 +2196,7 @@ pl: tried_waiting: Dałem(-am) użytkownikowi rozsądny czas, aby odpowiedzieć na te komunikaty. needs_view: Użytkownik musi się zalogować, zanim blokada zostanie wyczyszczona - back: Zobacz wszystkie blokady + back: Wyświetl wszystkie blokady edit: title: Edycja blokady dla użytkownika %{name} heading: Edycja blokady dla użytkownika %{name} @@ -2151,7 +2209,7 @@ pl: do API. submit: Uaktualnij blokadę show: Zobacz tę blokadę - back: Zobacz wszystkie blokady + back: Wyświetl wszystkie blokady needs_view: Czy użytkownik musi zalogować się zanim blokada ulegnie wyczyszczeniu? filter: block_expired: Blokada zakończyła się i nie można jej edytować. @@ -2214,8 +2272,8 @@ pl: time_past: Zakończona %{time} temu created: Utworzony ago: '%{time} temu' - status: Status - show: Pokaż + status: Stan + show: Wyświetl edit: Edytuj revoke: Odwołaj confirm: Na pewno? @@ -2258,56 +2316,61 @@ pl: javascripts: close: Zamknij share: - title: Udostępnij + title: Udostępnianie cancel: Anuluj image: Obraz - link: Link lub HTML - long_link: Link - short_link: Krótki link + link: Odnośnik lub HTML + long_link: Odnośnik + short_link: Skrócony + geo_uri: Schemat geo URI embed: HTML - custom_dimensions: Ustaw własne wymiary + custom_dimensions: Własne wymiary format: 'Format:' scale: 'Skala:' - image_size: Obraz będzie pokazywał standardową warstwę w rozdzielczości + image_size: Obraz będzie przedstawiał podstawową warstwę w rozdzielczości download: Pobierz short_url: Krótki URL include_marker: Dołącz pinezkę center_marker: Wyśrodkuj mapę na znaczniku paste_html: Wklej podany kod HTML do swojej strony view_larger_map: Wyświetl większą mapę + only_standard_layer: Tylko warstwa standardowa może być eksportowana jako obraz + embed: + report_problem: Zgłoś błąd key: title: Legenda tooltip: Legenda - tooltip_disabled: Legenda jest dostępna tylko dla warstwy podstawowej + tooltip_disabled: Legenda nie jest dostępna dla tej warstwy map: zoom: - in: Powiększ - out: Pomniejsz + in: Przybliż + out: Oddal locate: - title: Pokaż moje położenie + title: Wyświetl aktualne położenie popup: Jesteś w promieniu {distance} {unit} od tego punktu base: standard: Podstawowa - cycle_map: Mapa rowerowa - transport_map: Transport publiczny - hot: Pomoc humanitarna + cycle_map: Rowerowa + transport_map: Transportu publicznego + hot: Humanitarna layers: header: Warstwy mapy notes: Uwagi data: Dane mapy - overlays: Włącz nakładki do rozwiązywania problemów na mapie + gps: Publiczne ślady GPS + overlays: Nakładki do rozwiązywania problemów na mapie title: Warstwy copyright: © <a href='%{copyright_url}'>autorzy OpenStreetMap</a> donate_link_text: <a class='donate-attr' href='%{donate_url}'>Przekaż darowiznę</a> site: edit_tooltip: Edytuje mapę - edit_disabled_tooltip: Powiększ, aby edytować mapę + edit_disabled_tooltip: Przybliż mapę, aby ją edytować createnote_tooltip: Zgłoś błąd lub dodaj uwagę na mapie createnote_disabled_tooltip: Przybliż mapę, by dodać uwagę map_notes_zoom_in_tooltip: Powiększ, aby zobaczyć uwagi - map_data_zoom_in_tooltip: Powiększ, aby zobaczyć dane mapy - queryfeature_tooltip: Obejrzyj dane obiektu - queryfeature_disabled_tooltip: Użyj powiększenia, aby obejrzeć dane obiektu + map_data_zoom_in_tooltip: Przybliż mapę, aby zobaczyć jej dane + queryfeature_tooltip: Wyświetl dane obiektu + queryfeature_disabled_tooltip: Przybliż mapę, aby obejrzeć dane obiektu changesets: show: comment: Komentarz @@ -2330,8 +2393,8 @@ pl: reactivate: Ponownie aktywuj comment_and_resolve: Skomentuj i rozwiąż comment: Dodaj komentarz - edit_help: Przesuń mapę i powiększ miejsce, które chcesz edytować, a następnie - kliknij tutaj. + edit_help: Proszę przesunąć mapę i przybliżyć modyfikowane położenie, a następnie + kliknąć tutaj. directions: engines: graphhopper_bicycle: Rower (GraphHopper) @@ -2340,6 +2403,9 @@ pl: mapquest_car: Samochód (MapQuest) mapquest_foot: Pieszo (MapQuest) osrm_car: Samochód (OSRM) + mapzen_bicycle: Rower (Mapzen) + mapzen_car: Samochód (Mapzen) + mapzen_foot: Pieszo (Mapzen) directions: Opis trasy distance: Odległość errors: @@ -2348,18 +2414,38 @@ pl: instructions: continue_without_exit: Kontynuuj na %{name} slight_right_without_exit: Lekko w prawo w %{name} + offramp_right_without_exit: Jedź zjazdem w prawo do %{name}. + onramp_right_without_exit: Skręć w prawo do podjazdu do %{name}. + endofroad_right_without_exit: Na końcu tej drogi skręć w prawo w kierunku + %{name}. + merge_right_without_exit: Skręć w prawo w kierunku %{name}. + fork_right_without_exit: Na rozwidleniu dróg skręć w prawo w kierunku %{name}. turn_right_without_exit: Skręć w prawo w %{name} sharp_right_without_exit: Ostro w prawo w %{name} uturn_without_exit: Zawróć wzdłuż %{name} sharp_left_without_exit: Ostro w lewo w %{name} turn_left_without_exit: Skręć w lewo w %{name} + offramp_left_without_exit: Jedź zjazdem w lewo do %{name}. + onramp_left_without_exit: Skręć w lewo do podjazdu do %{name}. + endofroad_left_without_exit: Na końcu tej drogi skręć w lewo w kierunku %{name}. + merge_left_without_exit: Skręć w lewo w kierunku %{name}. + fork_left_without_exit: Na rozwidleniu dróg skręć w prawo w kierunku %{name}. slight_left_without_exit: Lekko w lewo w %{name} via_point_without_exit: (przez punkt) follow_without_exit: Jedź wzdłuż %{name} + roundabout_without_exit: Na rondzie, wybierz %{name} leave_roundabout_without_exit: Opuść rondo - %{name} stay_roundabout_without_exit: Zostań na rondzie - %{name} - destination_without_exit: Dojechałeś do celu + start_without_exit: Zacznij na końcu %{name} + destination_without_exit: Osiągnięto cel trasy + against_oneway_without_exit: Ruszaj na przeciwko jednostronnego ruchu na %{name} + end_oneway_without_exit: Koniec jednostronnego ruchu na %{name} roundabout_with_exit: Na rondzie zjedź %{exit} zjazdem w %{name} + turn_left_with_exit: Na rondzie skręć w lewo w %{name} + slight_left_with_exit: Na rondzie skręć lekko w lewo w %{name} + turn_right_with_exit: Na rondzie skręć w prawo w %{name} + slight_right_with_exit: Na rondzie skręć lekko w prawo w %{name} + continue_with_exit: Na rondzie jedź na wprost w %{name} unnamed: bez nazwy courtesy: Wyznaczanie trasy dzięki uprzejmości %{link} time: Czas @@ -2387,7 +2473,7 @@ pl: title: Tworzenie nowej poprawki show: description: 'Opis:' - heading: Poprawka "%{title}" + heading: Poprawka „%{title}” title: Wyświetlenie poprawki user: 'Autor:' edit: Edytuj tę poprawkę diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index b584a46df..0cf181d6b 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -4,8 +4,11 @@ # Author: Amgauna # Author: BraulioBezerra # Author: Brunomelnic +# Author: Cainamarques +# Author: Cristofer Alves # Author: Dianakc # Author: Diego Queiroz +# Author: Eduardo Addad de Oliveira # Author: Fmca # Author: Ftrebien # Author: Fúlvio @@ -13,10 +16,15 @@ # Author: Gmare # Author: Gusta # Author: Jgpacker +# Author: L # Author: Leosls # Author: Luckas # Author: Luckas Blade +# Author: Luk3 +# Author: Macofe # Author: Matheus Sousa L.T +# Author: NMaia +# Author: Naoliv # Author: Nemo bis # Author: Nighto # Author: Rodrigo Avila @@ -24,6 +32,8 @@ # Author: Ruila # Author: Tuliouel # Author: Vgeorge +# Author: Vitalb +# Author: Walesson # Author: Wille # Author: 555 --- @@ -35,19 +45,19 @@ pt-BR: friendly: '%e de %B de %Y às %H:%M' activerecord: models: - acl: Lista de Controle de acesso + acl: Lista de controle de acesso changeset: Conjunto de alterações changeset_tag: Etiqueta do conjunto de alterações country: País diary_comment: Comentário do diário - diary_entry: Entrada do Diário + diary_entry: Entrada do diário friend: Amigo language: Idioma message: Mensagem node: Ponto node_tag: Etiqueta do ponto notifier: Notificador - old_node: Ponto Antigo + old_node: Ponto antigo old_node_tag: Etiqueta do ponto antigo old_relation: Relação Antiga old_relation_member: Membro da Relação Antiga @@ -186,6 +196,7 @@ pt-BR: way: linha relation: relação changeset: conjunto de alterações + note: Nota timeout: sorry: Os dados para %{type} com id %{id} estão demorando demais para chegar. type: @@ -193,6 +204,7 @@ pt-BR: way: linha relation: relação changeset: conjunto de alterações + note: Nota redacted: redaction: Anulação %{id} message_html: A versão %{version} deste(a) %{type} não pode ser exibida porque @@ -279,6 +291,7 @@ pt-BR: diary_entry: new: title: Nova Entrada de Diário + publish_button: Publicar list: title: Diários dos Usuários title_friends: Diários dos amigos @@ -760,7 +773,7 @@ pt-BR: city: Cidade country: País county: Condado - farm: Lavoura + farm: Fazenda hamlet: Lugarejo house: Casa houses: Casas @@ -1025,17 +1038,17 @@ pt-BR: sujeitos à licença <a href="http://creativecommons.org/licenses/by-sa/2.0/">Creative Commons Atribuição – Compartilhamento pela mesma Licença 2.0</a> (CC-BY-SA). credit_title_html: Como fazer atribuição ao OpenStreetMap - credit_1_html: Requeremos que você faça atribuição citando “contribuidores do - © OpenStreetMap”. + credit_1_html: Requeremos que você faça atribuição citando “© contribuidores + do OpenStreetMap”. credit_2_html: "Você deve deixar claro que os dados são disponibilizados mediante - a licença \"Open\nDatabase Licence, e se usar nosso acervo cartográfico, que - o mesmo é\nlicenciado como CC-BY-SA. Você pode proceder ligando a\n<a href=\"http://www.openstreetmap.org/copyright\">esta - página</a>.\nAlternativamente, e obrigatoriamente, caso esteja distribuindo - o OSM em \nforma de dados, você pode denominar e ligar diretamente à(s) licença(s). - Em veículos\nonde \"links\" não são possíveis (p. ex.: impressos), sugerimos - que você\nremeta seus leitores ao endereço openstreetmap.org (talvez escrevendo - \nOpenStreetMap ao endereço completo), ao opendatacommons.org, e,\nse for - relevante, ao creativecommons.org." + a licença \"Open\nDatabase Licence\", e se usar nosso acervo cartográfico, + que o mesmo é\nlicenciado como CC-BY-SA. Você pode proceder ligando a\n<a + href=\"http://www.openstreetmap.org/copyright\">esta página</a>.\nAlternativamente, + e obrigatoriamente, caso esteja distribuindo o OSM em \nforma de dados, você + pode denominar e ligar diretamente à(s) licença(s). Em veículos\nonde \"links\" + não são possíveis (p. ex.: impressos), sugerimos que você\nremeta seus leitores + ao endereço openstreetmap.org (talvez expandindo \n'OpenStreetMap' ao seu + endereço completo), ao opendatacommons.org, e,\nse for relevante, ao creativecommons.org." credit_3_html: |- Para um mapa eletrônico navegável, a atribuição deve aparecer no canto do mapa. Por exemplo: @@ -1047,13 +1060,11 @@ pt-BR: Leia mais sobre o uso de nossos dados, e sobre como nos dar crédito, em <a href="http://wiki.openstreetmap.org/wiki/Legal_FAQ?setlang=pt">Legal FAQ</a>. - more_2_html: |2- - Embora o OpenStreetMap tenha dados abertos, não podemos prover uma - API de mapas livre de encargos para desenvolvedores de terceiros. - - Veja nossa <a href="http://wiki.openstreetmap.org/wiki/API_usage_policy">Política de uso da API</a>, - <a href="http://wiki.openstreetmap.org/wiki/Pt-br:Tile_usage_policy">Política de Uso de Imagens</a> - e <a href="http://wiki.openstreetmap.org/wiki/Pt-br:Nominatim#Pol.C3.ADtica_de_uso">Política de Uso do Nominatim</a>. + more_2_html: |- + Embora o OpenStreetMap seja aberto, não podemos fornecer + API de mapa gratuito para terceiros. + Veja nossa<a href="https://operations.osmfoundation.org/policies/api/"></a> Política de uso da API<a href="https://operations.osmfoundation.org/policies/tiles/"></a>Política de Uso de Imagens</a> + e<a href="https://operations.osmfoundation.org/policies/nominatim/"></a> contributors_title_html: Nossos contribuidores contributors_intro_html: |- Nossos contribuidores são milhares de indivíduos. Também incluímos @@ -1139,7 +1150,7 @@ pt-BR: como o nome de um restaurante ou o limite de velocidade de uma rodovia. rules: title: Regras! - paragraph_1_html: O OpenStreetMap tem poucas regras formas mas espera que todos + paragraph_1_html: O OpenStreetMap tem poucas regras formais mas espera que todos os participantes contribuam e se comuniquem com a comunidade. Se estiver pensando em atividades que não sejam editar manualmente, lei a e siga as orientações em <a href='http://wiki.openstreetmap.org/wiki/Pt:Import/Guidelines'>Importações</a> @@ -1216,7 +1227,7 @@ pt-BR: description: Navegue no wiki para ver a documentação do OSM com mais detalhes. about_page: next: Próximo - copyright_html: <span>©</span>Contribuidores<br>do OpenStreetMap + copyright_html: <span>©</span>contribuidores<br>do OpenStreetMap used_by: O %{name} fornece dados a centenas de sites na internet, aplicações de celular e outros dispositivos lede_text: O OpenStreetMap é desenvolvido por uma comunidade voluntária de mapeadores @@ -1243,18 +1254,21 @@ pt-BR: Se você alterar os dados ou criar algo com os dados, pode distribuir o produto resultante apenas sob a mesma licença. Consulte <a href='%{copyright_path}'>a página sobre direitos de autor e licenciamento</a> para mais informações. legal_title: Jurídico - legal_html: Esta página e vários outros serviços relacionados são formalmente + legal_html: "Esta página e vários outros serviços relacionados são formalmente operados pela <a href='http://osmfoundation.org/'>OpenStreetMap Foundation</a> - (OSMF) em nome da comunidade. <br> Por favor <a href='http://osmfoundation.org/Contact'>contate + (OSMF) em nome da comunidade. O uso de todos os serviços operados pela OSMF + está sujeito às nossas <a href=\"http://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy\">\nPolíticas + de Uso Aceitável</a> e à nossa <a href=\"http://wiki.osmfoundation.org/wiki/Privacy_Policy\">Política + de Privacidade</a>\n<br> \nPor favor <a href='http://osmfoundation.org/Contact'>contate a OSMF</a> se tiver perguntas sobre licenciamento, direitos autorais ou outras - questões e problemas legais. + questões e problemas legais." partners_title: Parceiros notifier: diary_comment_notification: - subject: '[OpenStreetMap] %{user} comentou uma entrada do seu diário' + subject: '[OpenStreetMap] %{user} comentou em uma entrada do diário' hi: Olá %{to_user}, - header: '%{from_user} comentou a sua entrada de diário do OpenStreetMap com - o assunto %{subject}:' + header: '%{from_user} comentou na entrada do diário do OpenStreetMap com o assunto + %{subject}:' footer: Você pode ler o comentário em %{readurl}, pode comentá-lo em %{commenturl} ou respondê-lo em %{replyurl} message_notification: @@ -1351,6 +1365,7 @@ pt-BR: A nota está perto de %{place}.' details: Mais detalhes sobre a nota podem ser encontrados em %{url}. changeset_comment_notification: + hi: Olá %{to_user}, greeting: Olá, commented: subject_own: '[OpenStreetMap] %{commenter} comentou um conjunto de alterações @@ -1365,6 +1380,8 @@ pt-BR: partial_changeset_without_comment: sem comentários details: Mais detalhes sobre o conjunto de alterações podem ser encontrados em %{url} + unsubscribe: Para cancelar a subscrição das atualizações deste conjunto de alterações, + visite %{url} e clique em "Anular subscrição". message: inbox: title: Caixa de Entrada @@ -1488,15 +1505,17 @@ pt-BR: table: entry: motorway: Autoestrada + main_road: Estrada principal trunk: Via expressa primary: Via primária secondary: Via secundária unclassified: Via não classificada - unsurfaced: Via não pavimentada track: Estrada rústica - byway: Trilha larga bridleway: Hipovia cycleway: Ciclovia + cycleway_national: Ciclovia nacional + cycleway_regional: Ciclovia regional + cycleway_local: Ciclovia local footway: Caminho de pedestre rail: Ferrovia subway: Metrô @@ -1518,7 +1537,6 @@ pt-BR: golf: Campo de golfe park: Parque resident: Área residencial - tourist: Atração turística common: - Baldio comunitário - prado @@ -1548,9 +1566,11 @@ pt-BR: tunnel: Túnel (contorno tracejado) bridge: Ponte/viaduto (contorno contínuo) private: Acesso restrito - permissive: Acesso sob autorização destination: Acesso local apenas construction: Vias em construção + bicycle_shop: Loja de bicicletas + bicycle_parking: Bicicletário + toilets: Banheiros richtext_area: edit: Editar preview: Pré-visualizar @@ -1614,6 +1634,11 @@ pt-BR: upload_trace: Enviar uma trilha see_all_traces: Ver todas as trilhas see_your_traces: Ver todas as suas trilhas + traces_waiting: '{{PLURAL|one=Você tem %{count} trilha esperando para enviar. + Por favor considere esperar que ela termine antes de enviar, para não bloquear + a fila para outros usuários.|Você tem %{count} trilhas esperando para enviar. + Por favor considere esperar que elas terminem antes de enviar, para não bloquear + a fila para outros usuários.' trace_optionals: tags: Etiquetas view: @@ -1706,6 +1731,7 @@ pt-BR: allow_read_gpx: ler suas trilhas de GPS privadas allow_write_gpx: atualizar trilhas de GPS. allow_write_notes: alterar notas. + grant_access: Dar acesso oauthorize_success: title: Pedido de autorização permitido allowed: Dar acesso à sua conta ao programa %{app_name}. @@ -1818,6 +1844,12 @@ pt-BR: windowslive: title: Entrar com o Windows Live alt: Entrar com uma Conta do Windows Live + github: + title: Entrar com o GitHub + alt: Entrar com conta do GitHub + wikipedia: + title: Entrar com Wikipédia + alt: Login com uma conta da Wikipedia yahoo: title: Entrar com o Yahoo alt: Entrar com um OpenID da Yahoo @@ -1853,9 +1885,9 @@ pt-BR: title: Registrar-se no_auto_account_create: Infelizmente no momento não podemos criar uma conta para você automaticamente. - contact_webmaster: Contate o <a href="mailto:webmaster@openstreetmap.org">webmaster</a> - (em inglês) para que uma conta seja criada - nós a criaremos o mais rápido - possível. + contact_webmaster: Por favor contate o <a href="%{webmaster}">webmaster</a> + para que uma conta seja criada - nós iremos tentar e lidar com o pedido o + mais rápido possível. about: header: Livre e editável html: |- @@ -1867,9 +1899,9 @@ pt-BR: do Contribuidor</a>. email address: 'Endereço de E-mail:' confirm email address: 'Confirme o Endereço de E-mail:' - not displayed publicly: Não será exibido publicamente (veja a <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" + not displayed publicly: Seu endereço não é exibido publicamente, veja a <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" title="política de privacidade no wiki incluindo a seção sobre endereços de - e-mail">política de privacidade</a>) + e-mail">política de privacidade</a> para mais informações display name: 'Nome de Exibição:' display name description: Seu nome de usuário disponível publicamente. Você pode mudá-lo depois nas preferências. @@ -1879,11 +1911,6 @@ pt-BR: use external auth: Ou identifique-se através de terceiros auth no password: Com autenticação por terceiros não é necessária uma senha, mas certas ferramentas ou o servidor talvez ainda precisem. - auth association: <p>Seu ID ainda não está associado a uma conta do OpenStreetMap.</p> - <ul> <li>Se você é novo no OpenStreetMap, crie uma conta usando o formulário - a seguir.</li> <li> Se você já tem uma conta, vocẽ pode entrar com ela usando - seu nome de usuário e senha, e então associar a conta ao seu ID nas suas configurações - de usuário. </li> </ul> continue: Registrar-se terms accepted: Obrigado por aceitar os novos termos de contribuição! terms declined: Lamentamos que você tenha decidido não aceitar os novos Termos @@ -1916,6 +1943,7 @@ pt-BR: heading: O usuário %{user} não existe body: Não há um usuário com o nome %{user}. Confira a digitação, ou talvez o link em que você clicou esteja errado. + deleted: excluído view: my diary: Meu Diário new diary entry: nova entrada de diário @@ -1967,16 +1995,16 @@ pt-BR: revoke: administrator: Revogar acesso de administrador moderator: Revogar acesso de moderador - block_history: bloqueios recebidos - moderator_history: bloqueios aplicados + block_history: Bloqueios Ativos + moderator_history: Bloqueios Aplicados comments: Comentários - create_block: bloquear este usuário - activate_user: ativar este usuário - deactivate_user: desativar este usuário - confirm_user: confirmar este usuário - hide_user: esconder esse usuário - unhide_user: exibir esse usuário - delete_user: excluir este usuário + create_block: Bloquear este Usuário + activate_user: Ativar este Usuário + deactivate_user: Desativar este Usuário + confirm_user: Confirmar este usuário + hide_user: Esconder esse Usuário + unhide_user: Exibir esse Usuário + delete_user: Excluir este Usuário confirm: Confirmar friends_changesets: conjuntos de alterações dos amigos friends_diaries: entradas de diário dos amigos @@ -2030,6 +2058,8 @@ pt-BR: gravatar: gravatar: Use o Gravatar link text: O que é isto? + disabled: O Gravatar foi desativado. + enabled: A exibição do seu Gravatar foi ativada. new image: Adicionar uma imagem keep image: Manter a imagem atual delete image: Remover a imagem atual @@ -2061,10 +2091,10 @@ pt-BR: href="%{reconfirm}">clique aqui</a>. confirm_resend: success: Enviamos uma nova mensagem de confirmação para %{email} e, assim que - você confirmar o seu cadastro, poderá começar a editar os mapas.<br /><br - />Se você usa um sistema antispam que exige uma mensagem de confirmação certifique-se - que o endereço webmaster@openstreetmap.org esteja na sua lista de e-mails - confiáveis, já que não conseguimos responder a nenhum pedido de confirmação. + você confirmar o seu cadastro, poderá começar a mapear.<br /><br />Se você + usa um sistema antispam que exige uma mensagem de confirmação então certifique-se + de que o endereço %{sender} esteja na sua lista de e-mails confiáveis, já + que não conseguimos responder a nenhum pedido de confirmação. failure: Usuário %{name} não encontrado. confirm_email: heading: Confirmar uma mudança do endereço de e-mail @@ -2120,6 +2150,15 @@ pt-BR: no_authorization_code: Nenhum código de autorização unknown_signature_algorithm: Algoritmo de assunatura desconhecido invalid_scope: Escopo inválido + auth_association: + heading: Seu ID não está associado a uma conta de OpenStreetMap ainda. + option_1: |- + Se você é novo no OpenStreetMap, por favor, crie uma nova conta + utilizando o formulário abaixo. + option_2: |- + Se você já tem uma conta, você pode fazer login na sua conta + usando seu nome de usuário e senha e, em seguida, associar a conta + com o seu ID em suas configurações de usuário. user_role: filter: not_an_administrator: Somente administradores podem gerenciar papéis de usuários, @@ -2233,6 +2272,8 @@ pt-BR: heading: '%{block_on} bloqueado por %{block_by}' time_future: Termina em %{time} time_past: Terminou há %{time} + created: Criado + ago: '%{time} atrás' status: Estado show: Exibir edit: Editar @@ -2283,6 +2324,7 @@ pt-BR: link: Link ou HTML long_link: Link short_link: Link Curto + geo_uri: Geo URI embed: HTML custom_dimensions: Definir dimensões personalizadas format: 'Formato:' @@ -2294,10 +2336,13 @@ pt-BR: center_marker: Centralizar o mapa no marcador paste_html: Cole o HTML para publicar no site view_larger_map: Ver Mapa Ampliado + only_standard_layer: Somente a camada padrão pode ser exportada como uma imagem + embed: + report_problem: Reportar um problema key: title: Legenda tooltip: Legenda - tooltip_disabled: Legenda disponível só para a camada padrão + tooltip_disabled: Legenda não disponível para esta camada map: zoom: in: Aproximar @@ -2309,15 +2354,15 @@ pt-BR: standard: Padrão cycle_map: Ciclístico transport_map: Transporte Público - mapquest: MapQuest Open hot: Humanitário layers: header: Camadas do Mapa notes: Notas de Mapa data: Dados do Mapa + gps: Rastreios públicos de GPS overlays: Ativar sobreposições para solucionar problemas do mapa title: Camadas - copyright: © <a href='%{copyright_url}'>Contribuidores OpenStreetMap</a> + copyright: © <a href='%{copyright_url}'>contribuidores do OpenStreetMap</a> donate_link_text: <a class='donate-attr' href='%{donate_url}'>Fazer uma doação</a> site: edit_tooltip: Edite o mapa @@ -2360,12 +2405,48 @@ pt-BR: mapquest_car: Carro (MapQuest) mapquest_foot: Pedestre (MapQuest) osrm_car: Carro (OSRM) + mapzen_bicycle: Bicicleta (MapQuest) + mapzen_car: Carro (MapQuest) + mapzen_foot: Pé (MapQuest) directions: Itinerário distance: Distância errors: no_route: Rota entre esses dois lugares não encontrada. no_place: Não foi possível encontrar esse lugar. instructions: + continue_without_exit: Continuar em %{name} + slight_right_without_exit: Curva suave à direita para %{name} + offramp_right_without_exit: Pegue a via de acesso à direita na %{name} + onramp_right_without_exit: Vire à direita, na via de acesso, na %{name} + endofroad_right_without_exit: No fim da estrada, vire à direita na %{name} + merge_right_without_exit: Entre à direita na %{name} + fork_right_without_exit: Na bifurcação, vire à direita na %{name} + turn_right_without_exit: Vire à direita para %{name} + sharp_right_without_exit: Curva acentuada à direita para %{name} + uturn_without_exit: Retorno em %{name} + sharp_left_without_exit: Curva acentuada à esquerda para %{name} + turn_left_without_exit: Vire à esquerda para %{name} + offramp_left_without_exit: Pegue a via de acesso à esquerda na %{name} + onramp_left_without_exit: Vire à esquerda, na via de acesso, na %{name} + endofroad_left_without_exit: No fim da estrada, vire à esquerda na %{name} + merge_left_without_exit: Entre à esquerda na %{name} + fork_left_without_exit: Na bifurcação, vire à esquerda na %{name} + slight_left_without_exit: Esquerda suave para %{name} + via_point_without_exit: (ponto de passagem) + follow_without_exit: Siga %{name} + roundabout_without_exit: Na rotatória pegue %{name} + leave_roundabout_without_exit: Saia da rotatória - %{name} + stay_roundabout_without_exit: Mantenha-se na rotatória - %{name} + start_without_exit: Comece no final de %{name} + destination_without_exit: Chegue ao destino + against_oneway_without_exit: Vá contra o sentido da mão única em %{name} + end_oneway_without_exit: Final de mão única em %{name} + roundabout_with_exit: Na rotatória, pegue a saída %{exit} para %{name} + turn_left_with_exit: Na rotatória, vire à esquerda para %{name} + slight_left_with_exit: Na rotatória à esquerda ligeiramente para %{name} + turn_right_with_exit: Na rotatória, vire à direita para %{name} + slight_right_with_exit: Na rotatória à direita para %{name} + continue_with_exit: Na rotatória, continue em frente para %{name} unnamed: sem nome courtesy: Itinerário cortesia de %{link} time: Duração diff --git a/config/locales/pt-PT.yml b/config/locales/pt-PT.yml index def72bc56..8aaf8bc13 100644 --- a/config/locales/pt-PT.yml +++ b/config/locales/pt-PT.yml @@ -180,6 +180,7 @@ pt-PT: way: linha relation: relação changeset: conjunto de alterações + note: nota timeout: sorry: 'Lamentamos, demorou demasiado tempo a obter os dados do pedido: %{type} com o id %{id}.' @@ -188,6 +189,7 @@ pt-PT: way: linha relation: relação changeset: alterações + note: nota redacted: redaction: Revisão %{id} message_html: A versão %{version} do elemento %{type} não pode ser mostrada @@ -275,6 +277,7 @@ pt-PT: diary_entry: new: title: Nova entrada no diário + publish_button: Publicar list: title: Diários dos utilizadores title_friends: Diários dos amigos @@ -754,7 +757,7 @@ pt-PT: allotments: Horta Urbana / Comunitária block: Bloco airport: Aeroporto - city: Cidade + city: Capital de distrito country: País county: Condado farm: Quinta @@ -774,9 +777,9 @@ pt-PT: state: Estado subdivision: Subdivisão suburb: Subúrbio - town: Cidade + town: Cidade / Vila unincorporated_area: Área não incorporada - village: Vila + village: Capital de freguesia "yes": Local railway: abandoned: Ferrovia Abandonada @@ -924,7 +927,7 @@ pt-PT: admin_levels: level2: Fronteira de País level4: Região - level5: Ilha + level5: Sub-região / Ilha level6: Distrito level8: Freguesia level9: Localidade @@ -935,8 +938,8 @@ pt-PT: Nominatim</a> geonames: Resultado de <a href="http://www.geonames.org/">GeoNames</a> types: - cities: Cidades - towns: Cidades + cities: Capitais de distrito + towns: Cidades / Vilas places: Lugares results: no_results: Não foram encontrados resultados @@ -1042,12 +1045,12 @@ pt-PT: Leia mais informações sobre a utilização dos nossos dados e como atribuir a autoria na <a href="http://osmfoundation.org/License">página da licença da OSMF</a> e a página da comunidade <a href="http://wiki.openstreetmap.org/wiki/Legal_FAQ">Perguntas frequentes - Legais</a> (em inglês). - more_2_html: Apesar do OpenStreetMap consistir em dados abertos, não podemos - fornecer um serviço mapa API, livre de encargos, a programadores terceiros. - Veja a <a href="http://wiki.openstreetmap.org/wiki/API_usage_policy">Política - de Utilização da API</a> (em inglês), <a href="http://wiki.openstreetmap.org/wiki/Tile_usage_policy">Política - de Utilização de Telas</a> (em inglês) e <a href="http://wiki.openstreetmap.org/wiki/Nominatim#Usage_Policy">Política - de Utilização do Nominatim</a> (em inglês). + more_2_html: Apesar do OpenStreetMap ser uma plataforma de dados abertos, não + podemos fornecer a terceiros uma API de mapas, livre de encargos. Veja a <a + href="http://wiki.openstreetmap.org/wiki/API_usage_policy">Política de Utilização + da API</a>, <a href="http://wiki.openstreetmap.org/wiki/Tile_usage_policy">Política + de Utilização de Telas</a> e <a href="http://wiki.openstreetmap.org/wiki/Nominatim#Usage_Policy">Política + de Utilização do Nominatim</a>. contributors_title_html: Os nossos contribuidores contributors_intro_html: 'Os contribuidores do OpenStreetMap são milhares. Também são utilizados dados de agências cartográficas nacionais e outras fontes, @@ -1097,9 +1100,9 @@ pt-PT: para retirar dados protegidos</a> (em inglês) ou preencha os dados diretamente no <a href="http://dmca.openstreetmap.org/">formulário</a> (em inglês). trademarks_title_html: <span id="trademarks"></span>Marcas registadas - trademarks_1_html: OpenStreetMap e o logotipo com a lupa são marcas registadas - da OpenStreetMap Foundation. Se tiver alguma questão sobre a utilização das - marcas, por favor envie as suas questões para o <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">Grupo + trademarks_1_html: OpenStreetMap, o respetivo logótipo e State of the Map são + marcas registadas da OpenStreetMap Foundation. Se tiver alguma questão sobre + a utilização das marcas, por favor envie as suas questões para o <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">Grupo de Trabalho de Licenças</a>. welcome_page: title: Bem-vindo ! @@ -1127,6 +1130,14 @@ pt-PT: um rio, um lago ou um prédio. tag_html: Uma <strong>etiqueta</strong> é um peça de informação sob um nó ou uma linha, como o nome do restaurante ou o limite de velocidade duma estrada. + rules: + title: Regras! + paragraph_1_html: "O OpenStreetMap tem poucas regras formais mas espera-se que + todos os participantes colaborem e comuniquem com a comunidade. Se pretender + realizar ações em massa como importação de dados através de programas por + favor siga as instruções presentes em \n<a href='http://wiki.openstreetmap.org/wiki/Pt:Import/Guidelines'>Importações</a> + and \n<a href='http://wiki.openstreetmap.org/wiki/Pt:Automated_Edits_code_of_conduct'>Edições + Automatizadas</a>." questions: title: Tens perguntas ? paragraph_1_html: |- @@ -1200,7 +1211,7 @@ pt-PT: about_page: next: Seguinte copyright_html: <span>©</span>Colaboradores<br>do OpenStreetMap - used_by: O %{name} fornece dados a centenas de sítios na internet, aplicações + used_by: O %{name} fornece dados a milhares de sítios na internet, aplicações de telemóveis e outros dispositivos lede_text: O OpenStreetMap é desenvolvido por uma comunidade voluntária de mapeadores que contribuem e mantêm atualizados os dados sobre estradas, trilhos, cafés, @@ -1228,16 +1239,19 @@ pt-PT: legal_title: Termos legais legal_html: "Este site e outros serviços relacionados são formalmente geridos pela \n<a href='http://osmfoundation.org/'>OpenStreetMap Foundation</a> (OSMF) - \nem nome da comunidade.\n<br> \nPor favor <a href='http://osmfoundation.org/Contact'>contacte - a OSMF</a> \nse tiver questões sobre a licença, direitos de autor, questões - legais ou problemas." + \nem nome da comunidade. A utilização de todos os serviços operados pela OSMF + está sujeita às nossas normas de <a href=\"http://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy\">Utilização + Aceitável</a> e de <a href=\"http://wiki.osmfoundation.org/wiki/Privacy_Policy\">Privacidade</a>\n<br> + \nPor favor <a href='http://osmfoundation.org/Contact'>contacte a OSMF</a> \nse + tiver questões relacionadas com licenças, direitos de autor, questões legais + ou problemas." partners_title: Parceiros notifier: diary_comment_notification: - subject: '[OpenStreetMap] %{user} comentou numa entrada do seu diário' + subject: '[OpenStreetMap] %{user} comentou uma entrada de diário' hi: Olá %{to_user}, - header: '%{from_user} comentou na sua entrada recente do diário no OpenStreetMap - com o assunto %{subject}:' + header: '%{from_user} comentou a entrada do diário OpenStreetMap com o assunto + %{subject}:' footer: Também pode ler o comentário em %{readurl} e comentar em %{commenturl} ou responder em %{replyurl} message_notification: @@ -1468,13 +1482,12 @@ pt-PT: table: entry: motorway: Auto-Estrada + main_road: Rua principal trunk: Via Rápida primary: Estrada Nacional (Primária) secondary: Estrada Regional (Secundária) unclassified: Estrada sem classificação oficial - unsurfaced: Estrada não pavimentada track: Carreiro florestal ou agrícola - byway: Byway (atalho proibido a veículos motorizados) bridleway: Via para cavaleiros cycleway: Ciclovia footway: Via pedonal @@ -1498,7 +1511,6 @@ pt-PT: golf: Campo de golfe park: Parque resident: Área residencial - tourist: Atração turística common: - Baldio - prado @@ -1528,7 +1540,6 @@ pt-PT: tunnel: Linha tracejada = túnel bridge: Linha cheia = ponte private: Acesso restrito (propriedade privada) - permissive: Acesso permitido destination: Acesso a clientes / fornecedores construction: Estradas em construção richtext_area: @@ -1692,6 +1703,7 @@ pt-PT: allow_read_gpx: ler os meus trilhos GPS privados. allow_write_gpx: enviar trilhos GPS. allow_write_notes: alterar erros reportados. + grant_access: Permitir Acesso oauthorize_success: title: Pedido de autorização permitido allowed: Forneceu ao programa %{app_name} o acesso à sua conta. @@ -1803,6 +1815,9 @@ pt-PT: windowslive: title: Iniciar sessão com Windows Live alt: Iniciar sessão com uma conta do Windows Live + github: + title: Iniciar sessão com GitHub + alt: Iniciar sessão com uma conta GitHub yahoo: title: Iniciar sessão com Yahoo alt: Iniciar sessão com OpenID Yahoo @@ -1838,7 +1853,7 @@ pt-PT: title: Criar conta no_auto_account_create: Infelizmente neste momento não poderemos criar uma conta automaticamente. - contact_webmaster: Entre em contacto com o <a href="mailto:webmaster@openstreetmap.org">webmaster</a> + contact_webmaster: Entre em contacto com o <a href="%{webmaster}">webmaster</a> para uma conta ser criada - vamos tentar lidar com o pedido o mais rapidamente possível. about: @@ -1851,9 +1866,10 @@ pt-PT: de Colaboração</a>. email address: 'E-mail:' confirm email address: 'Confirmar E-mail:' - not displayed publicly: Não será visível publicamente (ver <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" - title="política de privacidade incluindo secção sobre endereços de e-mail">política - de privacidade</a>) + not displayed publicly: O seu endereço de IP não será visível publicamente. + Consulte a <a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy" title="política + de privacidade OSMF, incluindo secção sobre endereços de correio eletrónico">política + de privacidade</a> para mais informação. display name: 'Nome de utilizador:' display name description: O nome de utilizador será visível publicamente. Poderá alterar o nome posteriormente nas preferências. @@ -1865,15 +1881,6 @@ pt-PT: auth no password: Não é necessário introduzir a palavra-passe com o iniciar da sessão por serviço externo, mas o servidor ou as ferramenas externas podem necessitar de uma. - auth association: |- - <p>O seu identificador ainda não está associado a uma conta no OpenStreetMap.</p> - <ul> - <li>Se nunca criou uma conta no OpenStreetMap, por favor crie uma no formulário seguinte.</li> - <li> - Se já tiver uma conta, pode iniciar sessão utilizando o nome de utilizador e a palavra-passe e então associar a sua conta - com o seu identificador nas configurações da conta. - </li> - </ul> continue: Criar conta terms accepted: Obrigado por aceitar os novos termos de colaborador! terms declined: Lamentamos não ter aceitado os novos Termos de Colaborador. @@ -1955,16 +1962,16 @@ pt-PT: revoke: administrator: Retirar acesso de administrador moderator: Retirar acesso de moderador - block_history: bloqueios recebidos - moderator_history: bloqueios feitos + block_history: Bloqueios ativos + moderator_history: Bloqueios feitos comments: Comentários - create_block: bloquear este utilizador - activate_user: ativar este utilizador - deactivate_user: desativar este utilizador - confirm_user: confirmar esse utilizador - hide_user: ocultar este utilizador - unhide_user: descobrir este utilizador - delete_user: eliminar este utilizador + create_block: Bloquear este utilizador + activate_user: Ativar este utilizador + deactivate_user: Desativar este utilizador + confirm_user: Confirmar esse utilizador + hide_user: Ocultar este utilizador + unhide_user: Desocultar este utilizador + delete_user: Eliminar este utilizador confirm: Confirmar friends_changesets: alterações dos amigos friends_diaries: ver as entradas em diários dos amigos @@ -2052,8 +2059,8 @@ pt-PT: success: Já enviámos um email de confirmação para %{email} e mal confirme a sua conta, poderá mapear.<br /><br />Caso utilize um sistema anti-spam que envie pedidos de confirmação, por favor coloque na lista branca de remetentes - seguros o endereço webmaster@openstreetmap.org uma vez que não temos possibilidade - de responder a pedidos de confirmação. + seguros o endereço %{sender} uma vez que não temos possibilidade de responder + a pedidos de confirmação. failure: Utilizador %{name} não foi encontrado. confirm_email: heading: Confirmar a alteração de e-mail @@ -2111,6 +2118,13 @@ pt-PT: no_authorization_code: Sem código de autorização unknown_signature_algorithm: Algoritmo de assinatura desconhecido invalid_scope: Âmbito inválido + auth_association: + heading: O seu ID ainda não está associado a uma conta do OpenStreetMap. + option_1: Se ainda não tem conta no OpenStreetMap por favor preencha o seguinte + formulário. + option_2: Se já tiver uma conta, pode entrar na sua conta utilizando os dados + de acesso a esta e então associar a sua conta ao seu ID nas preferências da + conta. user_role: filter: not_an_administrator: Apenas os administradores podem gerir cargos, e você não @@ -2229,6 +2243,8 @@ pt-PT: heading: '%{block_on} bloqueado por %{block_by}' time_future: Termina em %{time} time_past: Terminou há %{time} atrás + created: Criado + ago: há %{time} status: Estado show: Mostrar edit: Editar @@ -2279,6 +2295,7 @@ pt-PT: link: Ligação ou HTML long_link: Link short_link: Lig.Curta + geo_uri: Geo URI embed: HTML custom_dimensions: Definir dimensões personalizadas format: 'Formato:' @@ -2290,10 +2307,12 @@ pt-PT: center_marker: Centrar o mapa no marcador paste_html: Colar HTML para incorporar na página web view_larger_map: Ver mapa maior + embed: + report_problem: Reportar problema key: title: Legenda do mapa tooltip: Legenda do mapa - tooltip_disabled: Legenda do Mapa disponível apenas no Mapa Padrão + tooltip_disabled: Legenda do Mapa indisponível para esta camada map: zoom: in: Aproximar @@ -2358,12 +2377,22 @@ pt-PT: mapquest_car: Carro (MapQuest) mapquest_foot: A pé (MapQuest) osrm_car: Carro (OSRM) + mapzen_bicycle: Bicicleta (Mapzen) + mapzen_car: Carro (Mapzen) + mapzen_foot: A pé (Mapzen) directions: Direções distance: Distância errors: no_route: Não foi encontrada uma rota entre os dois pontos. no_place: Desculpe - não foi possível encontrar esse local. instructions: + continue_without_exit: Continuar em %{name} + follow_without_exit: Seguir %{name} + roundabout_without_exit: Na rotunda seguir %{name} + leave_roundabout_without_exit: Saia da rotunda - %{name} + stay_roundabout_without_exit: Mantenha-se na rotunda - %{name} + destination_without_exit: Chegada ao destino + roundabout_with_exit: Na rotunda seguir a saída %{exit} para %{name} unnamed: sem nome courtesy: Direções fornecidas por %{link} time: Tempo diff --git a/config/locales/ro.yml b/config/locales/ro.yml index e6ac5f1d2..0b68f9c99 100644 --- a/config/locales/ro.yml +++ b/config/locales/ro.yml @@ -1,15 +1,21 @@ # Messages for Romanian (română) # Exported from translatewiki.net # Export driver: phpyaml +# Author: C1pr1an # Author: EddyPetrisor # Author: McDutchie # Author: Minisarm +# Author: Ruila # Author: Strainu +# Author: Wintereu --- ro: + html: + dir: ltr time: formats: friendly: '%e %B %Y la %H:%M' + blog: '%e %B %Y' activerecord: models: acl: Lista de control al accesului @@ -41,6 +47,7 @@ ro: tracetag: Etichetă înregistrare GPS user: Utilizator user_preference: Preferințe utilizator + user_token: Jeton utilizator way: Cale way_node: Nod cale way_tag: Etichetă cale @@ -77,34 +84,79 @@ ro: description: Descriere languages: Limbi pass_crypt: Parolă + printable_name: + with_version: '%{id}, v%{version}' + with_name_html: '%{name} (%{id})' editor: default: Implicit (în prezent %{name}) potlatch: name: Potlatch 1 description: Potlatch 1 (editor înglobat în navigator) + id: + name: iD + description: iD (editor-în-navigator) potlatch2: name: Potlatch 2 description: Potlatch 2 (editor înglobat în navigator) remote: + name: Control la distanță description: Control de la distanță (JOSM sau Merkaartor) browse: + created: Creat + closed: Închis + created_html: Creat <abbr title='%{title}'>cu %{time} în urmă</abbr> + closed_html: Închis <abbr title='%{title}'>cu %{time} în urmă</abbr> + created_by_html: Creat <abbr title='%{title}'>cu %{time} în urmă</abbr> de %{user} + deleted_by_html: Șters <abbr title='%{title}'>cu %{time} în urmă</abbr> de %{user} + edited_by_html: Modificat <abbr title='%{title}'>cu %{time} în urmă</abbr> de + %{user} + closed_by_html: Închis <abbr title='%{title}'>cu %{time} în urmă</abbr> de %{user} version: Versiune in_changeset: Set de modificări anonymous: anonim no_comment: (niciun comentariu) + part_of: Parte din + download_xml: Descarcă XML + view_history: Vezi istoric + view_details: Vezi detalii + location: 'Amplasament:' changeset: title: 'Set de modificări: %{id}' belongs_to: Autor node: Noduri (%{count}) node_paginated: Noduri (%{x}-%{y} din %{count}) + way: Căi (%{count}) + way_paginated: Căi (%{x}-%{y} din %{count}) + relation: Comunicații (%{count}) + relation_paginated: Comunicații (%{x}-%{y} din %{count}) + comment: Comentarii (%{count}) + hidden_commented_by: Ascuns comentariu scris de %{user} <abbr title='%{exact_time}'>cu + %{when} în urmă</abbr> + commented_by: Comentariu scris de %{user} <abbr title='%{exact_time}'>cu %{when} + în urmă</abbr> changesetxml: Set de modificări XML osmchangexml: XML osmChange feed: title: 'Set de modificări: %{id}' title_comment: Set de modificări %{id} — %{comment} + join_discussion: Conectați-vă pentru a vă alătura discuției + discussion: Discuție + node: + title: 'Nod: %{name}' + history_title: 'Istoricul nodului: %{name}' way: + title: 'Cale: %{name}' + history_title: 'Istoricul căii: %{name}' nodes: Noduri + also_part_of: + one: parte a liniei de %{related_ways} + other: parte din liniile de %{related_ways} + relation: + title: 'Relație: %{name}' + history_title: 'Istoricul relației: %{name}' + members: Membri relation_member: + entry: '%{type} %{name}' entry_role: '%{type} %{name} ca %{role}' type: node: Nod @@ -120,6 +172,7 @@ ro: way: drum relation: relație changeset: set de modificări + note: notă timeout: sorry: Ne pare rău, dar durata recepționării datelor pentru %{type} cu identificatorul %{id} a fost prea mare. @@ -128,6 +181,7 @@ ro: way: calea relation: relația changeset: setul de schimbări + note: notă redacted: redaction: Redactarea %{id} message_html: Nu se poate afișa versiunea %{version} a acestui/acestei %{type} @@ -138,6 +192,9 @@ ro: way: drum relation: relații start_rjs: + feature_warning: Se încarcă %{num_features} caracteristici, ceea care ar putea + încetini sau bloca navigatorul dumneavoastră. Sigur doriți afișarea acestor + date? load_data: Încărcare date loading: Se încarcă... tag_details: @@ -145,9 +202,26 @@ ro: wiki_link: key: Pagina de pe wiki pentru tagul %{key} tag: Pagina de pe wiki pentru tagul %{key}=%{value} + wikidata_link: Elementul %{page} pe Wikidata wikipedia_link: Articolul %{page} pe Wikipedia + telephone_link: Sună %{phone_number} note: title: 'Notă: %{id}' + new_note: Notă nouă + description: Descriere + open_title: 'Notă nerezolvată #%{note_name}' + closed_title: 'Notă rezolvată #%{note_name}' + hidden_title: 'Notă ascunsă #%{note_name}' + open_by: Creat de %{user} <abbr title=cu '%{exact_time}'>%{when} în urmă</abbr> + open_by_anonymous: Creat de un utilizator anonim <abbr title=cu '%{exact_time}'>%{when} + în urmă</abbr> + commented_by: Comentariu scris de %{user} <abbr title='%{exact_time}'>cu %{when} + în urmă</abbr> + commented_by_anonymous: Comentariu scris de un utilizator anonim <abbr title=cu + '%{exact_time}'>%{when} în urmă</abbr> + query: + introduction: Dați clic pe hartă pentru a găsi obiectivele din apropiere. + nearby: Obiectivele din apropiere changeset: changeset_paging_nav: showing_page: Pagina %{page} @@ -178,6 +252,10 @@ ro: timeout: sorry: Ne pare rău, preluarea listei de modificări pe care ați solicitat-o a durat prea mult. + rss: + commented_at_html: Actualizat acum %{when} + commented_at_by_html: Actualizat acum %{when} de %{user} + full: Discuție completă diary_entry: new: title: O nouă înregistrare în jurnal @@ -264,6 +342,15 @@ ro: format_to_export: Format de exportat osm_xml_data: Date XML OpenStreetMap licence: Licență + too_large: + planet: + title: Planeta OSM + overpass: + title: Overpass API + geofabrik: + title: Descărcări Geofabrik + other: + title: Alte surse options: Opțiuni format: Format scale: Scară @@ -287,7 +374,11 @@ ro: Nominatim</a> geonames: Rezultate de la <a href="http://www.geonames.org/">GeoNames</a> search_osm_nominatim: + prefix_format: '%{name}' prefix: + aerialway: + cable_car: Telecabină + chair_lift: Telescaun aeroway: aerodrome: Aerodrom apron: Peron de aeroport @@ -316,6 +407,7 @@ ro: charging_station: Stație de taxare cinema: Cinematograf clinic: Clinică + clock: Ceas college: Colegiu community_centre: Centru comunitar courthouse: Tribunal @@ -343,16 +435,20 @@ ro: library: Bibliotecă market: Piață marketplace: Piață de mărfuri + monastery: Mănăstire + motorcycle_parking: Parcare pentru motociclete nightclub: Club de noapte nursery: Creșă nursing_home: Azil de bătrâni office: Birou parking: Parcare + parking_entrance: Intrare în parcare pharmacy: Farmacie place_of_worship: Lăcaș de cult police: Poliție post_box: Cutie poștală post_office: Oficiu poștal + preschool: Preșcolar prison: Închisoare pub: Pub public_building: Clădire publică @@ -392,12 +488,25 @@ ro: "yes": Pod building: "yes": Clădire + craft: + electrician: Electrician + gardener: Grădinar + painter: Pictor + photographer: Fotograf + plumber: Instalator + shoemaker: Cizmar + tailor: Croitor + emergency: + ambulance_station: Stație de ambulanță + defibrillator: Defibrilator + phone: Telefon de urgență highway: bridleway: Drum pentru călărie bus_guideway: Linie de autobuz ghidată bus_stop: Stație de autobuz construction: Drum în construcție cycleway: Pistă de biciclete + elevator: Lift emergency_access_point: Punct de acces de urgență footway: Cale pietonală ford: Vad @@ -412,7 +521,7 @@ ro: primary: Drum principal primary_link: Drum principal raceway: Pistă - residential: Rezidențial + residential: Stradă rezidențială rest_area: Zonă pentru odihnă road: Drum secondary: Drum secundar @@ -421,30 +530,42 @@ ro: services: Servicii pe autostradă speed_camera: Radar cu cameră foto steps: Scară + street_lamp: Lampă stradală tertiary: Drum terțiar tertiary_link: Drum terțiar track: Drum forestier sau agricol + traffic_signals: Semafor trail: Potecă unclassified: Drum neclasificat unsurfaced: Drum neasfaltat + "yes": Drum historic: archaeological_site: Sit arheologic battlefield: Câmp de luptă boundary_stone: Bornă de graniță - building: Clădire + building: Clădire istorică + bunker: Buncăr castle: Castel church: Biserică + city_gate: Poarta orașului + citywalls: Zidurile orașului fort: Fort house: Casă + icon: Pictogramă manor: Conac memorial: Memorial mine: Mină monument: Monument + roman_road: Drumul roman ruins: Ruine + stone: Piatră + tomb: Mormânt tower: Turn wayside_cross: Troiță wayside_shrine: Altar wreck: Epavă + junction: + "yes": Intersecție landuse: basin: Bazin cemetery: Cimitir @@ -453,6 +574,7 @@ ro: farm: Fermă farmland: Teren agricol forest: Pădure + garages: Garaje grass: Iarbă industrial: Zonă industrială landfill: Groapă de gunoi @@ -467,6 +589,7 @@ ro: vineyard: Podgorie leisure: beach_resort: Stațiune balneară + club: Club fishing: Zonă de pescuit garden: Grădină golf_course: Teren de golf @@ -477,10 +600,22 @@ ro: pitch: Teren de sport playground: Loc de joacă recreation_ground: Zonă de recreere + sauna: Saună + sports_centre: Centru de sport stadium: Stadion swimming_pool: Bazin de înot track: Pistă de atletism water_park: Parc acvatic + man_made: + lighthouse: Far + pipeline: Conductă + tower: Turn + works: Fabrică + military: + barracks: Cazarme + bunker: Buncăr + mountain_pass: + "yes": Trecătoare prin munți natural: bay: Golf beach: Plajă @@ -488,9 +623,12 @@ ro: cave_entrance: Intrare în peșteră cliff: Stâncă crater: Crater + dune: Dune fjord: Fiord + forest: Pădure geyser: Gheizer glacier: Ghețar + heath: Căldură hill: Deal island: Insulă land: Teren @@ -498,18 +636,24 @@ ro: moor: Baltă mud: Noroi peak: Vârf + point: Punct reef: Recif ridge: Creastă rock: Rocă scree: Grohotiș scrub: Tufăriș spring: Izvor + stone: Piatră strait: Strâmtoare tree: Copac valley: Vale volcano: Vulcan water: Apă wood: Pădure + office: + company: Societate + travel_agent: Agenție de turism + "yes": Birou place: airport: Aeroport city: Oraș @@ -533,12 +677,14 @@ ro: town: Orășel unincorporated_area: Zonă neîncorporată village: Sat + "yes": Loc railway: abandoned: Cale ferată abandonată construction: Cale ferată în construcție disused: Cale ferată dezafectată disused_station: Gară dezafectată funicular: Funicular + halt: Gară historic_station: Gară istorică junction: Nod feroviar level_crossing: Trecere la nivel @@ -584,12 +730,15 @@ ro: newsagent: Chioșc de ziare optician: Optician organic: Magazin de alimente organice + pet: Magazin de animale + pharmacy: Farmacie salon: Salon de frumusețe shopping_centre: Centru comercial stationery: Magazin de papetărie supermarket: Supermarket toys: Magazin de jucării travel_agency: Agenție de turism + "yes": Magazin tourism: alpine_hut: Refugiu montan artwork: Operă de artă @@ -625,23 +774,10 @@ ro: results: no_results: Niciun rezultat găsit more_results: Mai multe rezultate - distance: - one: circa 1 km - zero: mai puțin de 1 km - other: circa %{count} km - direction: - south_west: sud-vest - south: sud - south_east: sud-est - east: est - north_east: nord-est - north: nord - north_west: nord-vest - west: vest layouts: logo: alt_text: Logoul OpenStreetMap - home: acasă + home: Mergi la locul de reședință logout: Închide sesiunea log_in: Autentificare log_in_tooltip: Autentificare cu un cont existent @@ -650,7 +786,9 @@ ro: sign_up_tooltip: Creați un cont pentru editare edit: Modificare history: Istoric + export: Exportă edit_with: Modificare cu %{editor} + intro_header: Bine ați venit la OpenStreetMap! partners_partners: parteneri help: Ajutor about: Despre @@ -675,15 +813,42 @@ ro: infringement_title_html: Încălcarea drepturilor de autor welcome_page: title: Bun venit! + rules: + title: Reguli questions: title: Întrebări? fixthemap: how_to_help: join_the_community: title: Alăturați-vă comunității + help_page: + welcome: + title: Bine ați venit la OSM + beginners_guide: + url: http://wiki.openstreetmap.org/wiki/Ro:Beginners%27_guide + notifier: + message_notification: + hi: Salut, %{to_user}, + gpx_notification: + greeting: Salut, + email_confirm_html: + greeting: Salut, + lost_password_plain: + greeting: Salut, + lost_password_html: + greeting: Salut, + note_comment_notification: + greeting: Salut, + changeset_comment_notification: + greeting: Salut, message: + inbox: + from: De la message_summary: delete_button: Şterge + new: + subject: Subiect + message_sent: Mesaj trimis outbox: title: Mesaje trimise my_inbox: Mesajele mele primite @@ -713,6 +878,13 @@ ro: shortlink: Legătură scurtată edit: user_page_link: pagină de utilizator + sidebar: + close: Închide + search: + from: De la + to: Către + where_am_i: Unde sunt eu? + where_am_i_title: Descrie locaÅ£ia curentă folosind motorul de căutare trace: edit: visibility: 'Vizibilitate:' @@ -758,4 +930,15 @@ ro: new: password: 'Parolă:' confirm password: 'Confirmați parola:' + javascripts: + share: + title: Distribuie + map: + zoom: + in: Mărește + out: Micşorează + locate: + title: Arată locația mea + site: + edit_disabled_tooltip: Măriți pentru a edita harta ... diff --git a/config/locales/ru.yml b/config/locales/ru.yml index 2c317a1a3..b84733ed2 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -8,6 +8,7 @@ # Author: Aleksandr Dezhin # Author: Amire80 # Author: Andrewsh +# Author: BushmanK # Author: CM3X # Author: Calibrator # Author: Chilin @@ -15,25 +16,33 @@ # Author: DCamer # Author: Dmitry-s93 # Author: Dr&mx +# Author: Eduard Popov +# Author: Edward17 # Author: Eleferen # Author: Ergo # Author: EugeneZelenko # Author: Express2000 # Author: Ezhick +# Author: FreeExec # Author: G0rn # Author: Ignatus # Author: Iluvatar +# Author: Irus # Author: Kaganer # Author: Komzpa # Author: Lockal +# Author: Macofe # Author: MaxSem # Author: Mechano # Author: Mixaill # Author: Nemo bis +# Author: Nzeemin # Author: Okras +# Author: Perevod16 # Author: Putnik # Author: Riliam # Author: Ruila +# Author: Sanail # Author: Santacloud # Author: Spider # Author: TarzanASG @@ -205,6 +214,7 @@ ru: way: линия relation: отношение changeset: пакет правок + note: примечание timeout: sorry: Извините, данные для %{type} с %{id} слишком длинные для извлечения. type: @@ -212,6 +222,7 @@ ru: way: линии relation: отношения changeset: пакета правок + note: примечание redacted: redaction: Редакция %{id} message_html: Версия %{version} этого объекта вырезана и не может быть отображена. @@ -238,7 +249,7 @@ ru: new_note: Новая заметка description: Описание open_title: 'Необработанная заметка #%{note_name}' - closed_title: 'Разрешённая заметка #%{note_name}' + closed_title: 'Обработанная заметка #%{note_name}' hidden_title: 'Скрытая заметка #%{note_name}' open_by: Создано пользователем %{user} <abbr title='%{exact_time}'>%{when} назад</abbr> open_by_anonymous: Создано анонимом <abbr title='%{exact_time}'>%{when} назад</abbr> @@ -246,7 +257,7 @@ ru: назад</abbr> commented_by_anonymous: Комментарий анонима <abbr title='%{exact_time}'>%{when} назад</abbr> - closed_by: Решена пользователем %{user} <abbr title='%{exact_time}'>%{when} + closed_by: Обработана пользователем %{user} <abbr title='%{exact_time}'>%{when} назад</abbr> closed_by_anonymous: Разрешена анонимом <abbr title='%{exact_time}'>%{when} назад</abbr> @@ -300,6 +311,7 @@ ru: diary_entry: new: title: Сделать новую запись в дневнике + publish_button: Опубликовать list: title: Дневники title_friends: Дневники друзей @@ -579,10 +591,10 @@ ru: phone: Телефон экстренной связи highway: abandoned: Заброшенная дорога - bridleway: Конный путь + bridleway: Дорожка для верховой езды bus_guideway: Автобусная полоса-рельс bus_stop: Автобусная остановка - construction: Ремонт дороги + construction: Ремонт/строительство дороги cycleway: Велодорожка elevator: Лифт emergency_access_point: Пункт первой помощи @@ -612,7 +624,7 @@ ru: street_lamp: Уличный фонарь tertiary: Дорога третьего класса tertiary_link: Дорога третьего класса - track: Неофициальная грунтовка + track: Дорога хозяйственного назначения traffic_signals: Светофор trail: Тропа trunk: Трасса @@ -651,7 +663,7 @@ ru: landuse: allotments: Сады-огороды basin: Бассейн - brownfield: Заброшенная зона, пустырь + brownfield: Расчистка под застройку cemetery: Кладбище commercial: Офисная территория conservation: Законсервированная зона @@ -666,7 +678,7 @@ ru: industrial: Промзона landfill: Свалка meadow: Луг - military: Военная зона + military: Военная территория mine: Шахта orchard: Фруктовый сад quarry: Карьер @@ -697,7 +709,7 @@ ru: miniature_golf: Минигольф nature_reserve: Заповедник park: Парк - pitch: Спортивный газон + pitch: Спортивная площадка playground: Детская игровая площадка recreation_ground: Зона отдыха resort: Курорт @@ -726,21 +738,21 @@ ru: beach: Пляж cape: Мыс cave_entrance: Вход в пещеру - cliff: Обрыв + cliff: Скальный обрыв crater: Кратер dune: Дюна - fell: Холм + fell: Горная пустошь fjord: Фьорд forest: Лес geyser: Гейзер glacier: Ледник grassland: Луг - heath: Пустошь + heath: Вересковая пустошь hill: Холм island: Остров land: Земля - marsh: Болото - moor: Торфяник + marsh: Травянистое болото + moor: Горное болото mud: Грязь peak: Вершина горы point: Мыс @@ -789,7 +801,7 @@ ru: islet: Маленький остров isolated_dwelling: Отдельный дом-ферма locality: Заброшенная деревня, урочище, необитаемая местность - moor: Торфяник + moor: Горное болото municipality: Муниципалитет neighbourhood: Соседство postcode: Почтовый индекс @@ -822,7 +834,7 @@ ru: spur: Ответвление ж/д пути station: Железнодорожная станция stop: Железнодорожная остановка - subway: Станция метро + subway: Метро subway_entrance: Вход в метро switch: Железнодорожная стрелка tram: Трамвай @@ -869,7 +881,7 @@ ru: general: Магазин gift: Магазин подарков greengrocer: Овощной магазин - grocery: Бакалея + grocery: Продуктовый магазин hairdresser: Парикмахерская hardware: Хозяйственные магазины hifi: Магазин аудио/видео аппаратуры @@ -884,8 +896,8 @@ ru: music: Музыкальный магазин newsagent: Газетный киоск optician: Оптика - organic: Продуктовый магазин - outdoor: Открытый рынок + organic: Магазин органических продуктов + outdoor: Магазин для активного отдыха pet: Зоомагазин pharmacy: Аптека photo: Фотомагазин @@ -908,7 +920,7 @@ ru: artwork: Произведения искусства attraction: Аттракцион bed_and_breakfast: Полупансион - cabin: Каюта + cabin: Хижина camp_site: Лагерь caravan_site: Стоянка для домов на колёсах chalet: Шале @@ -920,7 +932,7 @@ ru: motel: Мотель museum: Музей picnic_site: Место для пикника - theme_park: Аттракционы + theme_park: Тематический парк viewpoint: Смотровая площадка zoo: Зоопарк tunnel: @@ -1030,9 +1042,10 @@ ru: legal_babble: title_html: Авторские права и лицензирование intro_1_html: |- - OpenStreetMap содержит <i>свободные данные</i>, распространяемые по лицензии <a + OpenStreetMap<sup><a href="#trademarks">®</a></sup> содержит <i>свободные данные</i>, распространяемые по лицензии <a href="http://opendatacommons.org/licenses/odbl/">Open Data - Commons Open Database License</a> (ODbL). + Commons Open Database License</a> (ODbL) организацией <a + href="http://osmfoundation.org/">OpenStreetMap Foundation</a> (OSMF). intro_2_html: Вы можете свободно копировать, распространять, передавать и дорабатывать наши данные до тех пор, пока вы ссылаетесь на OpenStreetMap и его сообщество. Если вы изменяете или берёте наши данные за основу, то вы должны распространять @@ -1065,9 +1078,9 @@ ru: на юридические вопросы</a>. more_2_html: Хотя данные OpenStreetMap открыты для использования, мы не в состоянии предоставить бесплатный API к нашим картам для сторонних разработчиков. См. - <a href="http://wiki.openstreetmap.org/wiki/API_usage_policy">Правила использования - API</a>, <a href="http://wiki.openstreetmap.org/wiki/Tile_usage_policy">Правила - использования частей карты</a> и <a href="http://wiki.openstreetmap.org/wiki/Nominatim#Usage_Policy">Правила + <a href="https://operations.osmfoundation.org/policies/api/">Правила использования + API</a>, <a href="https://operations.osmfoundation.org/policies/tiles/">Правила + использования частей карты</a> и <a href="https://operations.osmfoundation.org/policies/nominatim/">Правила использования службы Nominatim</a> . contributors_title_html: Кто вносит вклад в наш проект contributors_intro_html: 'Участниками проекта являются тысячи отдельных людей. @@ -1089,6 +1102,9 @@ ru: 2007 (<a href="http://www.and.com">www.and.com</a>)' contributors_nz_html: <strong>Новая Зеландия.</strong> Данные из сведений о земельных ресурсах Новой Зеландии. Crown Copyright reserved. + contributors_si_html: '<strong>Словения</strong>: содержит данные от <a href="http://www.gu.gov.si/en/">Геодезического + и картографического управления</a> и <a href="http://www.mkgp.gov.si/en/">Министерства + сельского, лесного хозяйства и продовольствия</a> (открытая информация Словении).' contributors_za_html: |- <strong>ЮАР</strong>: Имеются данные из <a href="http://www.ngi.gov.za/">Главное управление: @@ -1112,6 +1128,12 @@ ru: к нашей <a href="http://www.osmfoundation.org/wiki/License/Takedown_procedure">процедуре изымания</a> или непосредственно на нашу <a href="http://dmca.openstreetmap.org/">вебстраницу регистрации</a>. + trademarks_title_html: <span id="trademarks"></span>Товарные знаки + trademarks_1_html: OpenStreetMap, логотип с увеличительным стеклом и State of + the Map являются зарегистрированными товарными знаками Фонда OpenStreetMap. + Если у вас есть вопросы об использовании знаков, пожалуйста, отправьте ваши + вопросы <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">рабочей + группе по лицензированию</a>. welcome_page: title: Добро пожаловать! introduction_html: Добро пожаловать на OpenStreetMap, открытую и свободную карту @@ -1138,6 +1160,14 @@ ru: обозначающая, к примеру, дорогу, ручей, контур озера или здания. tag_html: <strong>Тег</strong> – это единица описания точки или линии, например название ресторана или скоростное ограничение конкретной дороги. + rules: + title: Правила! + paragraph_1_html: В OpenStreetMap есть лишь несколько формальных правил, но + мы бы хотели, чтоб все участники сотрудничали и взаимодействовали с сообществом. + Если речь идёт о любых действиях, кроме редактирования вручную, пожалуйста, + прочитайте рекомендацияи по <a href="http://wiki.openstreetmap.org/wiki/Import/Guidelines">импорту</a> + и <a href="http://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct">автоматизированным + правкам</a> и следуйте им в дальнейшем. questions: title: Появились вопросы? paragraph_1_html: |- @@ -1190,10 +1220,14 @@ ru: description: Задать вопрос или найти ответы на сайте вопросов и ответов OSM. mailing_lists: title: Списки рассылок + description: Задайте вопрос или обсудите насущные вопросы в списке рассылок + (количество активных пользователей зависит от языка). forums: title: Форумы + description: Вопросы и обсуждения для тех кто предпочитает форумы для общения irc: title: IRC + description: Интерактивный чат на разных языках и на разные темы. switch2osm: title: switch2osm description: Помощь компаниям и организациям в переходе на OpenStreetMap карты @@ -1205,7 +1239,7 @@ ru: about_page: next: Далее copyright_html: <span>©</span>Участники<br />OpenStreetMap - used_by: '%{name} предоставляет данные для сотен сайтов, мобильных приложений + used_by: '%{name} предоставляет данные для тысяч сайтов, мобильных приложений и устройств' lede_text: OpenStreetMap создан сообществом картографов, которые добавляют и поддерживают данные о дорогах, тропах, кафе, вокзалах и многих других объектах по всему миру. @@ -1227,13 +1261,20 @@ ru: Смотрите <a href=''%{copyright_path}''>Авторские права и Страница лицензии</a> для более подробной информации.' legal_title: Юридический + legal_html: Этот веб-сайт и многие связанные с ними услуги находятся в ведении + <a href='http://osmfoundation.org/'>OpenStreetMap Foundation</a> (OSMF), для + сообщества OSM. Использование услуг OSMF-powered является предметом нашей <a + href="http://wiki.osmfoundation.org/wiki/Privacy_Policy">политики конфиденциальности</a>и + «<a href="http://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy">Приемлемой + политики использования</a>».<br>Пожалуйста, <a href='http://osmfoundation.org/Contact'>свяжитесь + с OSMF</a>, если вы лицензируете, авторское право или другие правовые вопросы + и проблемы. partners_title: Партнёры notifier: diary_comment_notification: - subject: Пользователь [OpenStreetMap] %{user} оставил комментарий в вашем дневнике + subject: Пользователь [OpenStreetMap] %{user} оставил комментарий в дневнике hi: Привет, %{to_user}, - header: '%{from_user} прокомментировал вашу дневниковую запись на OpenStreetMap - с темой %{subject}:' + header: '%{from_user} прокомментировал на OpenStreetMap с темой %{subject}:' footer: Вы можете также прочитать комментарий — %{readurl}, оставить свой — %{commenturl} или ответить — %{replyurl} message_notification: @@ -1249,7 +1290,7 @@ ru: befriend_them: Вы также можете добавить их в качестве друзей в %{befriendurl}. gpx_notification: greeting: Привет, - your_gpx_file: Это выглядит как ваш файл GPX + your_gpx_file: Похоже, ваш файл GPX with_description: с описанием and_the_tags: 'и следующими тегами:' and_no_tags: и без меток. @@ -1313,9 +1354,9 @@ ru: commented_note: '%{commenter} оставил комментарий к одной из картографических заметок, которую вы тоже комментировали. Заметка находится около %{place}.' closed: - subject_own: '[OpenStreetMap] %{commenter} разрешил вашу заметку' + subject_own: '[OpenStreetMap] %{commenter} обработал вашу заметку' subject_other: '[OpenStreetMap] %{commenter} обработал интересную вам заметку' - your_note: '%{commenter} разрешил одну из ваших отметок на карте недалеко + your_note: '%{commenter} обработал одну из ваших отметок на карте недалеко от %{place}.' commented_note: '%{commenter} разрешил одну из отметок, которые вы комментировали. Отметка недалеко от %{place}.' @@ -1436,7 +1477,7 @@ ru: copyright: Авторские права принадлежат OpenStreetMap и его участникам на условиях открытой лицензии remote_failed: Редактирование не удалось. Убедитесь, что JOSM или Merkaartor - загружены и включена настройка дистанционного управления + запущен и опция дистанционного управления активна edit: not_public: Вы не сделали свои правки общедоступными. not_public_description: 'Вы не можете больше анонимно редактировать карту. Вы @@ -1473,15 +1514,17 @@ ru: table: entry: motorway: Автомагистраль + main_road: Главная дорога trunk: Шоссе primary: Магистральная дорога secondary: Второстепенная дорога unclassified: Дорога местного значения - unsurfaced: Грунтовая дорога track: Просёлочная дорога - byway: Тропинка bridleway: Дорога для верховой езды cycleway: Велосипедная дорога + cycleway_national: Национальная велодорожка + cycleway_regional: Региональная велодорожка + cycleway_local: Локальная велодорожка footway: Пешеходная дорожка rail: Железная дорога subway: Линия метро @@ -1503,25 +1546,24 @@ ru: golf: Площадка для гольфа park: Парк resident: Жилой район - tourist: Достопримечательность common: - Общественная земля - луг retail: Торговый район industrial: Промышленный район commercial: Коммерческий район - heathland: Пустошь + heathland: Вересковая пустошь lake: - Озеро - водохранилище farm: Ферма - brownfield: Заброшенная зона + brownfield: Расчистка под застройку cemetery: Кладбище allotments: Сады-огороды, дачные участки pitch: Спортивная площадка centre: Спортивный центр reserve: Заповедник - military: Военная зона + military: Военная территория school: - Школа - университет @@ -1533,9 +1575,11 @@ ru: tunnel: Туннель (пунктир) bridge: Мост (жирная линия) private: Частный доступ - permissive: Разрешительный доступ destination: Целевой доступ construction: Строительство дороги + bicycle_shop: Магазин велосипедов + bicycle_parking: Парковка для велосипедов + toilets: Туалеты richtext_area: edit: Изменить preview: Предпросмотр @@ -1688,17 +1732,18 @@ ru: oauthorize: title: Разрешить доступ к вашей учётной записи request_access: Приложение %{app_name} запрашивает доступ к вашей учётной записи, - %{user}. Пожалуйста, проверьте желаете ли вы, чтобы приложение имело следующие - возможности. Вы можете выбрать любое количество. - allow_to: 'Разрешить клиентскому приложению:' + %{user}. Пожалуйста, проверьте хотите ли вы, чтобы приложение имело следующие + возможности. Вы можете выбрать любые из них или все. + allow_to: 'Разрешить этому приложению:' allow_read_prefs: читать ваши пользовательские настройки - allow_write_prefs: изменять ваши пользовательские настройки - allow_write_diary: создавать дневниковые записи, комментарии, устанавливать - друзей - allow_write_api: изменять карту - allow_read_gpx: читать ваши частные GPS-треки - allow_write_gpx: передавать GPS-треки на сервер. - allow_write_notes: изменять заметки. + allow_write_prefs: изменять ваши настройки на сайте + allow_write_diary: создавать дневниковые записи, комментарии, заводить друзей + allow_write_api: изменять данные + allow_read_gpx: читать ваши <a herf="https://wiki.openstreetmap.org/wiki/RU:%D0%92%D0%B8%D0%B4%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D1%8C_GPS-%D1%82%D1%80%D0%B5%D0%BA%D0%BE%D0%B2">частные + GPS-треки</a> + allow_write_gpx: передавать GPS-треки на сервер + allow_write_notes: изменять заметки + grant_access: Предоставить доступ oauthorize_success: title: Запрос на авторизацию разрешён allowed: Вы предоставили приложению %{app_name} доступ к вашей учётной записи. @@ -1785,6 +1830,7 @@ ru: register now: Зарегистрируйтесь with username: 'У вас уже есть учётная запись OpenStreetMap? Пожалуйста, войдите с вашим именем пользователя и паролем:' + with external: 'Кроме того, можете воспользоваться аккаунтом на другом сайте:' new to osm: Впервые на OpenStreetMap? to make changes: Чтобы вносить изменения в данные OpenStreetMap, вы должны иметь учётную запись. @@ -1805,6 +1851,18 @@ ru: google: title: Войти с помощью Google alt: Войти с помощью Google OpenID + facebook: + title: Войти с помощью Facebook + alt: Войти с помощью учётной записи в Facebook + windowslive: + title: Войти с помощью Windows Live + alt: Войти с помощью учётной записи Windows Live + github: + title: Войти с GitHub + alt: Войти с учётной записи на GitHub + wikipedia: + title: Войти с помощью Википедии + alt: Вход с использованием учётной записи в Википедии yahoo: title: Войти с помощью Yahoo alt: Войти с помощью Yahoo OpenID @@ -1840,7 +1898,7 @@ ru: title: Регистрация no_auto_account_create: К сожалению, сейчас мы не можем автоматически создать для вас учётную запись. - contact_webmaster: Пожалуйста, свяжитесь с <a href="mailto:webmaster@openstreetmap.org">вебмастером</a> + contact_webmaster: Пожалуйста, свяжитесь с <a href="%{webmaster}">вебмастером</a> с просьбой создать подобную учётную запись. Мы попробуем и ответим настолько быстро, насколько сможем. about: @@ -1854,14 +1912,19 @@ ru: сотрудничества</a>. email address: 'Адрес эл. почты:' confirm email address: 'Подтвердите адрес эл. почты:' - not displayed publicly: Не отображается публично (см. <a href="http://wiki.openstreetmap.org/index.php?title=Privacy_Policy&uselang=ru" - title="вики политика конфиденциальности включая часть про адрес эл. почты">политику - конфиденциальности</a>) + not displayed publicly: Ваш адрес не будет отображаться публично, смотрите нашу + <a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy" title="OSMF privacy + policy including section on email addresses">политику конфиденциальности</a> + для получения дополнительной информации display name: 'Отображаемое имя:' display name description: Ваше имя, как оно будет видно другим пользователям. Вы сможете изменить его позже в настройках. + external auth: 'Внешний сайт с учётной записью:' password: 'Пароль:' confirm password: 'Повторите пароль:' + use external auth: Либо воспользуйтесь аккаунтом с другого сайта + auth no password: С внешним логином пароль не обязателен, но в некоторых случаях + он необходим continue: Зарегистрироваться terms accepted: Спасибо за принятие новых условий участия! terms declined: Нам жаль, что вы решили не принимать новые условия участия. @@ -1872,8 +1935,8 @@ ru: read and accept: Пожалуйста, прочтите приведённое ниже соглашение и нажмите кнопку «Согласен», чтобы подтвердить, что вы согласны с условиями этого соглашения относительно вашего существующего и будущего вклада. - consider_pd: В дополнение к вышеизложенному соглашению, я считаю, что мой вклад - находиться в общественном достоянии + consider_pd: В дополнение к вышеизложенному соглашению, я принимаю во внимание, + что мой вклад находится в общественном достоянии consider_pd_why: что это значит? guidance: 'Информация, которая поможет понять эти условия: <a href="%{summary}">краткое описание</a> и несколько <a href="%{translations}">неофициальных переводов</a>' @@ -1891,6 +1954,7 @@ ru: heading: Пользователя %{user} не существует body: Извините, нет пользователя с именем %{user}. Пожалуйста, проверьте правильность ввода. Возможно, вы перешли по ошибочной ссылке. + deleted: удалено view: my diary: Мой дневник new diary entry: новая запись @@ -1945,16 +2009,16 @@ ru: revoke: administrator: Отозвать права администратора moderator: Отозвать права модератора - block_history: полученные блокировки + block_history: Активные Блоки moderator_history: созданные блокировки comments: Комментарии - create_block: блокировать пользователя - activate_user: активировать этого пользователя - deactivate_user: деактивировать этого пользователя - confirm_user: подтвердить этого пользователя - hide_user: скрыть этого пользователя - unhide_user: отобразить этого пользователя - delete_user: удалить этого пользователя + create_block: Блокировать участника + activate_user: активировать пользователя + deactivate_user: деактивировать пользователя + confirm_user: подтвердить пользователя + hide_user: скрыть пользователя + unhide_user: отобразить пользователя + delete_user: удалить пользователя confirm: Подтвердить friends_changesets: наборы правок друзей friends_diaries: дневники друзей @@ -2009,6 +2073,8 @@ ru: gravatar: gravatar: Использовать Gravatar link text: что это? + disabled: Gravatar отключён. + enabled: Отображение вашего Gravatar включено. new image: Добавить изображение keep image: Оставить текущее изображение delete image: Удалить текущее изображение @@ -2043,8 +2109,8 @@ ru: success: Мы выслали новое письмо с подтверждением на адрес %{email}, и как только вы подтвердите вашу учётную запись, вы можете начать работать с картами.<br /><br />Если вы используете антиспам-систему, посылающую запросы на подтверждение, - пожалуйста, внесите адрес webmaster@openstreetmap.org в ваш белый список, - так как мы не можем отвечать на такие запросы. + пожалуйста, внесите адрес %{sender} в ваш белый список, так как мы не можем + отвечать на такие запросы. failure: Участник %{name} не найден. confirm_email: heading: Подтвердите изменение адреса электронной почты @@ -2096,7 +2162,18 @@ ru: вы можете связаться с %{webmaster}, если вы хотите это обсудить. </p> auth_failure: + connection_failed: Не удалось соединиться с сервером авторизации invalid_credentials: Недопустимые учётные данные для аутентификации + no_authorization_code: Нет кода авторизации + unknown_signature_algorithm: Неизвестный алгоритм подписи + invalid_scope: Недопустимый масштаб + auth_association: + heading: Ваш ID пока ещё не связан с учётной записью OpenStreetMap. + option_1: Если вы впервые на OpenStreetMap, пожалуйста, создайте новую учётную + запись, используя форму ниже. + option_2: Если у вас уже есть учётная запись, вы можете войти в неё, используя + свой логин и пароль, а затем связать учётную запись с вашем ID в пользовательских + настройках. user_role: filter: not_an_administrator: Только администраторы могут управлять ролями пользователей, @@ -2217,6 +2294,7 @@ ru: heading: '%{block_on}, наложил блокировку: %{block_by}' time_future: Заканчивается %{time} time_past: Закончилась %{time} назад + created: Создано ago: '%{time} назад' status: Состояние show: Показывать @@ -2234,7 +2312,7 @@ ru: opened_at_by_html: Создана %{when} назад %{user} commented_at_html: Обновлена %{when} назад commented_at_by_html: Обновлена %{when} назад %{user} - closed_at_html: Решена %{when} назад + closed_at_html: Обработана %{when} назад closed_at_by_html: Решена %{when} назад %{user} reopened_at_html: Возобновлена %{when} назад reopened_at_by_html: Возобновлена %{when} назад %{user} @@ -2263,12 +2341,13 @@ ru: javascripts: close: Закрыть share: - title: Поделиться + title: Вставить на сайт cancel: Отмена image: Изображение link: Ссылка или код для вставки long_link: Полная ссылка short_link: Короткая ссылка + geo_uri: Geo URI embed: Код custom_dimensions: Выбрать размер вручную format: 'Формат:' @@ -2280,10 +2359,14 @@ ru: center_marker: Центрировать карту на маркер paste_html: HTML-код для встраивания на сайт view_larger_map: Посмотреть более крупную карту + only_standard_layer: Только стандартный слой может быть экспортирован в виде + изображения + embed: + report_problem: Сообщить о проблеме key: title: Легенда карты tooltip: Условные знаки - tooltip_disabled: Легенда карты доступна только для Стандартного слоя + tooltip_disabled: Условные знаки не доступны для этого слоя map: zoom: in: Приблизить @@ -2295,8 +2378,7 @@ ru: standard: Стандартный cycle_map: Карта для велосипедистов transport_map: Карта транспорта - mapquest: MapQuest Open - hot: Humanitarian‎ + hot: Гуманитарная layers: header: Слои карты notes: Заметки @@ -2333,10 +2415,10 @@ ru: anonymous_warning: Эта заметка содержит комментарии анонимных участников. Требуется независимая проверка сведений. hide: Скрыть - resolve: Разрешить + resolve: Обработать reactivate: Переоткрыть - comment_and_resolve: Прокомментировать и обработать - comment: Прокомментировать + comment_and_resolve: Ответить и обработать + comment: Ответить edit_help: Передвиньте карту и увеличьте место, которые вы хотите править, затем кликните здесь. directions: @@ -2347,12 +2429,46 @@ ru: mapquest_car: На машине (MapQuest) mapquest_foot: Пешком (MapQuest) osrm_car: На машине (OSRM) + mapzen_bicycle: Велосипед (Mapzen) + mapzen_car: Автомобиль (Mapzen) + mapzen_foot: Пешком (Mapzen) directions: Маршрут distance: Длина пути errors: no_route: Не удалось найти маршрут между этими двумя точками. no_place: К сожалению, данное место не найдено. instructions: + continue_without_exit: Продолжите по %{name} + slight_right_without_exit: Слегка направо на %{name} + offramp_right_without_exit: Используйте съезд вправо на %{name} + onramp_right_without_exit: Поверните направо на съезде на %{name} + endofroad_right_without_exit: В конце дороги поверните направо на %{name} + merge_right_without_exit: Перестройтесь направо на %{name} + fork_right_without_exit: На развилке поверните направо на %{name} + turn_right_without_exit: Поверните направо на %{name} + sharp_right_without_exit: Резко направо на %{name} + uturn_without_exit: Разворот по %{name} + sharp_left_without_exit: Резко налево на %{name} + turn_left_without_exit: Поверните налево на %{name} + offramp_left_without_exit: Используйте съезд влево на %{name} + onramp_left_without_exit: Поверните налево на съезде на %{name} + endofroad_left_without_exit: В конце дороги поверните налево на %{name} + merge_left_without_exit: Перестройтесь налево на %{name} + fork_left_without_exit: На развилке поверните налево на %{name} + slight_left_without_exit: Слегка влево на %{name} + via_point_without_exit: (через точку) + follow_without_exit: Следуйте %{name} + roundabout_without_exit: На развязке сверните к %{name} + leave_roundabout_without_exit: Покиньте развязку - %{name} + stay_roundabout_without_exit: Оставайтесь на развязке - %{name} + start_without_exit: Начните в конце %{name} + destination_without_exit: Выбрать место назначения + against_oneway_without_exit: Идите против одностороннего движения на %{name} + end_oneway_without_exit: Конец одностороннего движения на %{name} + roundabout_with_exit: На развязке выберите выход %{exit} на %{name} + turn_left_with_exit: На круговой развязке поверните налево на %{name} + turn_right_with_exit: На круговой развязке поверните направо на %{name} + continue_with_exit: На круговой развязке продолжайте движение прямо на %{name} unnamed: без имени courtesy: Маршрут предоставлен %{link} time: Время diff --git a/config/locales/scn.yml b/config/locales/scn.yml index e22eb3b5b..695d3d29f 100644 --- a/config/locales/scn.yml +++ b/config/locales/scn.yml @@ -2,7 +2,9 @@ # Exported from translatewiki.net # Export driver: phpyaml # Author: Gmelfi +# Author: Macofe # Author: Pippinu +# Author: Sarvaturi # Author: SurdusVII --- scn: @@ -11,10 +13,10 @@ scn: friendly: '%e %B %Y ê %H:%M' activerecord: models: - acl: Lista di cuntrollu d’accessu + acl: Lista di cuntrollu d'accessu changeset: Gruppu di canciamenti changeset_tag: Etichetta dû gruppu di canciamenti - country: Paìsi + country: Paisi diary_comment: Cummentu ntô diariu diary_entry: Vuci dû diariu friend: Amicu @@ -39,8 +41,8 @@ scn: tracepoint: Puntu dû tracciatu tracetag: Etichetta dû tracciatu user: Utenti - user_preference: Prifirenza di l’utenti - user_token: Lassa-passari ill’utenti + user_preference: Prifirenza di l'utenti + user_token: Lassa-passari di l'utenti way: Caminu way_node: Gruppu dû caminu way_tag: Etichetta dû caminu @@ -51,7 +53,7 @@ scn: user: Utenti title: Oggettu latitude: Latitùdini - longitude: Longitùdini + longitude: Luncitùdini language: Lingua friend: user: Utenti @@ -62,7 +64,7 @@ scn: name: Nomu size: Grannizza latitude: Latitùdini - longitude: Longitùdini + longitude: Luncitùdini public: Pùbblicu description: Discrizzioni message: @@ -73,12 +75,12 @@ scn: user: email: Posta elittrònica active: Attivu - display_name: Nomu mmustratu + display_name: Nomu ammustratu description: Discrizzioni languages: Lingui - pass_crypt: Palora d’òrdini + pass_crypt: Palora d'òrdini editor: - default: Pridifinutu (com’ad ora %{name}) + default: Pridifinutu (com'a ora %{name}) potlatch: name: Potlatch 1 description: Potlatch 1 (editor ntô browser) @@ -89,8 +91,8 @@ scn: name: Potlatch 2 description: Potlatch 2 (editor ntô browser) remote: - name: Telicumannu - description: Telicumannu (JOSM or Merkaartor) + name: Telecumannu + description: Telecumannu (JOSM o Merkaartor) browse: created: Criatu closed: Chiudutu @@ -103,11 +105,11 @@ scn: version: Virsioni in_changeset: Gruppu di canciamenti anonymous: anònimu - no_comment: (nuḍḍu cummentu) - part_of: Fa’ parti di + no_comment: (nuddu cummentu) + part_of: Fa parti di download_xml: Scàrrica ntô furmatu XML - view_history: Talìa a cronuluggìa - view_details: Talìa i dittagghî + view_history: Talìa la crunuluggìa + view_details: Talìa li dittagghî location: 'Locu:' changeset: title: 'Gruppu di canciamenti: %{id}' @@ -119,29 +121,29 @@ scn: relation: Rilazzioni (%{count}) relation_paginated: Rilazzioni (%{x}-%{y} di %{count}) comment: Cummenti (%{count}) - hidden_commented_by: Cummentu mmucciatu di %{user} <abbr title='%{exact_time}'>%{when} + hidden_commented_by: Cummentu ammucciatu di %{user} <abbr title='%{exact_time}'>%{when} fa</abbr> commented_by: Cummentu di %{user} <abbr title='%{exact_time}'>%{when} fa</abbr> changesetxml: XML dû gruppu di canciamenti - osmchangexml: osmChange XML + osmchangexml: XML osmChange feed: title: Gruppu di canciamenti %{id} title_comment: Gruppu di canciamenti %{id} - %{comment} - join_discussion: Pi’ participari ntâ discussioni trasi + join_discussion: Pi participari ntâ discussioni trasi discussion: Discussioni node: title: 'Gruppu: %{name}' - history_title: 'Cronuluggìa dû gruppu: %{name}' + history_title: 'Crunuluggìa dû gruppu: %{name}' way: title: 'Caminu: %{name}' - history_title: 'Cronuluggìa dû caminu: %{name}' + history_title: 'Crunuluggìa dû caminu: %{name}' nodes: Gruppa also_part_of: one: parti dû caminu %{related_ways} other: parti dî camini %{related_ways} relation: title: 'Rilazzioni: %{name}' - history_title: 'Cronuluggìa dâ rilazzioni: %{name}' + history_title: 'Crunuluggìa dâ rilazzioni: %{name}' members: Membri relation_member: entry_role: '%{type} %{name} comu %{role}' @@ -153,66 +155,67 @@ scn: entry: Rilazzioni %{relation_name} entry_role: Rilazzioni %{relation_name} (comu %{relation_role}) not_found: - sorry: 'Purtroppu, %{type} #%{id} nun si potti truvari.' + sorry: 'Purtroppu, %{type} #%{id} nun si potti attruvari.' type: - node: u gruppu - way: u caminu - relation: a rilazzioni - changeset: u gruppu di canciamenti + node: lu gruppu + way: lu caminu + relation: la rilazzioni + changeset: lu gruppu di canciamenti + note: nota timeout: - sorry: Purtroppu, cci vosi troppu tempu pi’ pigghiari i dati %{type} cu’ id - %{id}. + sorry: Purtroppu, ci vosi troppu tempu pi pigghiari li dati %{type} cu id %{id}. type: node: dû gruppu way: dû caminu relation: dâ rilazzioni changeset: dû gruppu di canciamenti + note: nota redacted: redaction: Occultamentu %{id} - message_html: A virsioni %{version} di %{type} nun si po’ mmustrari picchì fu’ - occultata. Pi’ favuri talìa %{redaction_link} pî dittagghî. + message_html: La virsioni %{version} di %{type} nun si pò ammustrari pirchì + fu occultata. Pi favuri talìa %{redaction_link} pî dittagghî. type: node: stu gruppu way: stu caminu relation: sta rilazzioni start_rjs: - feature_warning: Si vannu a’ carricari %{num_features} elimenti, e sta cosa - ti purrìa rallintari u browser o puru bluccàrilu. Si’ sicuru chi’ voi mmustrari + feature_warning: Si vannu a carricari %{num_features} elimenti, e sta cosa ti + purrìa allintari lu browser o puru bluccàrilu. Sî sicuru chi voi ammustrari sti dati? - load_data: Càrrica i dati + load_data: Càrrica li dati loading: Carricamentu... tag_details: tags: Etichetti wiki_link: - key: A pàggina dâ wiki chi’ discrivi l’etichetta %{key} - tag: A pàggina dâ wiki chi’ discrivi l’etichetta %{key}=%{value} - wikidata_link: U suggettu %{page} supra a’ Wikidata - wikipedia_link: L’artìculu %{page} supra a’ Wikipedia - telephone_link: Chiama u %{phone_number} + key: La pàggina dâ wiki chi discrivi l'etichetta %{key} + tag: La pàggina dâ wiki chi discrivi l'etichetta %{key}=%{value} + wikidata_link: Lu suggettu %{page} supra a Wikidata + wikipedia_link: L'artìculu %{page} supra a Wikipedia + telephone_link: Chiama lu %{phone_number} note: title: 'Nota: %{id}' new_note: Nota nova description: Discrizzioni - open_title: 'Nota nun risulvuta #%{note_name}' - closed_title: 'Nota risulvuta #%{note_name}' - hidden_title: 'Nota mmucciata #%{note_name}' + open_title: 'Nota nun arrisurvuta #%{note_name}' + closed_title: 'Nota arrisurvuta #%{note_name}' + hidden_title: 'Nota ammucciata #%{note_name}' open_by: Criata di %{user} <abbr title='%{exact_time}'>%{when} fa</abbr> - open_by_anonymous: Criata di n’anònimu <abbr title='%{exact_time}'>%{when} fa</abbr> + open_by_anonymous: Criata di n'anònimu <abbr title='%{exact_time}'>%{when} fa</abbr> commented_by: Cummentu di %{user} <abbr title='%{exact_time}'>%{when} fa</abbr> - commented_by_anonymous: Cummentu di n’anònimu <abbr title='%{exact_time}'>%{when} + commented_by_anonymous: Cummentu di n'anònimu <abbr title='%{exact_time}'>%{when} fa</abbr> - closed_by: Risulvuta di %{user} <abbr title='%{exact_time}'>%{when} fa</abbr> - closed_by_anonymous: Risulvuta di n’anònimu <abbr title='%{exact_time}'>%{when} + closed_by: Arrisurvuta di %{user} <abbr title='%{exact_time}'>%{when} fa</abbr> + closed_by_anonymous: Arrisurvuta di n'anònimu <abbr title='%{exact_time}'>%{when} fa</abbr> - reopened_by: Riapruta di %{user} <abbr title='%{exact_time}'>%{when} fa</abbr> - reopened_by_anonymous: Riapruta di n’anònimu <abbr title='%{exact_time}'>%{when} + reopened_by: Arrigraputa di %{user} <abbr title='%{exact_time}'>%{when} fa</abbr> + reopened_by_anonymous: Arrigraputa di n'anònimu <abbr title='%{exact_time}'>%{when} fa</abbr> - hidden_by: Mmucciata di %{user} <abbr title='%{exact_time}'>%{when} fa</abbr> + hidden_by: Ammucciata di %{user} <abbr title='%{exact_time}'>%{when} fa</abbr> query: - title: Risciduta di l’elimenti - introduction: Clicca supra â cartina pi’ circari l’elimenti vicini. + title: Arricerca di l'elimenti + introduction: Clicca supra â cartina pi circari l'elimenti vicini. nearby: Elimenti vicini - enclosing: Elimenti chi’ cuntènunu + enclosing: Elimenti chi cuntèninu changeset: changeset_paging_nav: showing_page: Pàggina %{page} @@ -220,52 +223,53 @@ scn: previous: « Prima changeset: anonymous: Anònimu - no_edits: (nuḍḍu canciamentu) - view_changeset_details: Ammustra i dittagghî dû gruppu di canciamenti + no_edits: (nuddu canciamentu) + view_changeset_details: Ammustra li dittagghî dû gruppu di canciamenti changesets: id: ID - saved_at: Sarvatu u + saved_at: Sarvatu lu user: Utenti comment: Cummentu - area: Aria + area: Ària list: title: Gruppi di canciamenti title_user: Gruppi di canciamenti di %{user} - title_friend: Gruppi di canciamenti dî to amici - title_nearby: Gruppi di canciamenti di l’utenti vicini - empty: Nuḍḍu gruppu di canciamenti truvatu. - empty_area: Nuḍḍu gruppu di canciamenti nta st’aria. - empty_user: Nuḍḍu gruppu di canciamenti fattu di st’utenti. - no_more: Nuḍḍu autru gruppu di canciamenti truvatu. - no_more_area: Nuḍḍu autru gruppu di canciamenti nta st’aria. - no_more_user: Nuḍḍu autru gruppu di canciamenti fattu di st’utenti. - load_more: Carricànni autri + title_friend: Gruppi di canciamenti dî tò amici + title_nearby: Gruppi di canciamenti di l'utenti vicini + empty: Nuddu gruppu di canciamenti attruvatu. + empty_area: Nuddu gruppu di canciamenti nta st'ària. + empty_user: Nuddu gruppu di canciamenti fattu di st'utenti. + no_more: Nuddu àutru gruppu di canciamenti attruvatu. + no_more_area: Nuddu àutru gruppu di canciamenti nta st'ària. + no_more_user: Nuddu àutru gruppu di canciamenti fattu di st'utenti. + load_more: Carrìcanni àutri timeout: - sorry: Purtroppu, cci vosi troppu tempu pi’ pigghiari a lista dî gruppi di canciamenti - ch’addumannasti. + sorry: Purtroppu, ci vosi troppu tempu pi pigghiari la lista dî gruppi di canciamenti + c'addumannasti. rss: - title_all: Discussioni supra ô gruppu di canciamenti di OpenStreetMap - title_particular: 'Discussioni supra ô gruppu di canciamenti di OpenStreetMap + title_all: Discussioni supra ô gruppu di canciamenti d'OpenStreetMap + title_particular: 'Discussioni supra ô gruppu di canciamenti d''OpenStreetMap #%{changeset_id}' comment: 'Cummentu novu supra ô gruppu di canciamenti #%{changeset_id} di %{author}' commented_at_html: Aggiurnatu %{when} fa commented_at_by_html: Aggiurnatu %{when} fa di %{user} - full: Discussioni intera + full: Discussioni ntera diary_entry: new: title: Vuci nova dû diariu + publish_button: Pùbblica list: - title: Diarî di l’utenti - title_friends: Diarî di l’amici - title_nearby: Diarî di l’utenti vicini + title: Diarî di l'utenti + title_friends: Diarî di l'amici + title_nearby: Diarî di l'utenti vicini user_title: Diariu di %{user} - in_language_title: Vuci di diariu in %{language} + in_language_title: Vuci dô diariu n %{language} new: Vuci nova dû diariu - new_title: Scrivi na vuci nova ntô to diariu di l’utenti - no_entries: Nuḍḍa vuci ntô diariu + new_title: Scrivi na vuci nova ntô tò diariu di l'utenti + no_entries: Nudda vuci ntô diariu recent_entries: Vuci di diariu ricenti - older_entries: Vuci cchiu’ vecchî - newer_entries: Vuci cchiu’ novi + older_entries: Vuci cchiù vecchî + newer_entries: Vuci cchiù novi edit: title: Cancia sta vuci dû diariu subject: 'Oggettu:' @@ -273,94 +277,95 @@ scn: language: 'Lingua:' location: 'Locu:' latitude: 'Latitùdini:' - longitude: 'Longitùdini:' - use_map_link: adòpira a cartina + longitude: 'Luncitùdini:' + use_map_link: adòpira la cartina save_button: Sarva marker_text: Locu dâ vuci dû diariu view: title: Diariu di %{user} | %{title} user_title: Diariu di %{user} leave_a_comment: Lassa nu cummentu - login_to_leave_a_comment: Pi’ lassari cummenti %{login_link} + login_to_leave_a_comment: Pi lassari cummenti %{login_link} login: trasi save_button: Sarva no_such_entry: - title: Nuḍḍa vuci dû diariu currispunni - heading: 'Nuḍḍa vuci havi l’id: %{id}' - body: Purtroppu nun cc’è nuḍḍa vuci dû diariu o puru cummentu chi’ havi l’id - %{id}. Pi’ favuri cuntrolla chi’ scrivisti bonu; o puru po’ jèssiri chi’ u - culligamentu chi’ cliccasti è sbagghiatu. + title: Nudda vuci dû diariu currispunni + heading: 'Nudda vuci havi l''id: %{id}' + body: Purtroppu nun c'è nudda vuci dû diariu o puru cummentu chi havi l'id %{id}. + Pi favuri cuntrolla chi scrivisti bonu; o puru pò èssiri chi lu culligamentu + chi cliccasti è sbagghiatu. diary_entry: - posted_by: Pubblicatu di %{link_user} u %{created} in %{language_link} + posted_by: Pubblicatu di %{link_user} lu %{created} n %{language_link} comment_link: Cummenta sta vuci - reply_link: Rispunni a’ sta vuci + reply_link: Arrispunni a sta vuci comment_count: - zero: Nuḍḍu cummentu + zero: Nuddu cummentu one: '%{count} cummentu' other: '%{count} cummenti' edit_link: Cancia sta vuci - hide_link: Mmuccia sta vuci - confirm: Cunfirma + hide_link: Ammuccia sta vuci + confirm: Cunferma diary_comment: - comment_from: Cummentu di %{link_user} u %{comment_created_at} - hide_link: Mmuccia stu cummentu - confirm: Cunfirma + comment_from: Cummentu di %{link_user} lu %{comment_created_at} + hide_link: Ammuccia stu cummentu + confirm: Cunferma location: location: 'Locu:' view: Talìa edit: Cancia feed: user: - title: Vuci dû diariu di OpenStreetMap di %{user} - description: Vuci ricenti dû diariu di OpenStreetMap di %{user} + title: Vuci dû diariu d'OpenStreetMap di %{user} + description: Vuci ricenti dû diariu d'OpenStreetMap di %{user} language: - title: Vuci dû diariu di OpenStreetMap in %{language_name} - description: Vuci ricenti dû diariu di OpenStreetMap in %{language_name} + title: Vuci dû diariu d'OpenStreetMap n %{language_name} + description: Vuci ricenti dû diariu di OpenStreetMap n %{language_name} all: - title: Vuci dû diariu di OpenStreetMap - description: Vuci ricenti dû diariu di l’utenti di OpenStreetMap + title: Vuci dû diariu d'OpenStreetMap + description: Vuci ricenti dû diariu di l'utenti d'OpenStreetMap comments: - has_commented_on: '%{display_name} cummintàu i siguenti vuci dû diariu' + has_commented_on: '%{display_name} cummintau li vuci dû diariu siguenti' post: Pùbblica - when: Quannnu + when: Quannu comment: Cummentu ago: '%{ago} fa' - newer_comments: Cummenti cchiu’ novi - older_comments: Cummenti cchiu’ vecchî + newer_comments: Cummenti cchiù novi + older_comments: Cummenti cchiù vecchî export: title: Espurtazzioni start: - area_to_export: Aria di espurtari - manually_select: Scegghî manualmenti n’aria diffirenti - format_to_export: Furmatu di espurtari - osm_xml_data: Dati XML di OpenStreetMap - map_image: Mmàgini dâ cartina (ammustra u stratu standard) + area_to_export: Ària d'espurtari + manually_select: Scegghî manualmenti n'ària diffirenti + format_to_export: Furmatu d'espurtari + osm_xml_data: Dati XML d'OpenStreetMap + map_image: Mmàggini dâ cartina (ammustra lu stratu standard) embeddable_html: HTML ncurpuràbbili licence: Licenza - export_details: I dati di OpenStreetMap sunnu sutta a licenza <a href="http://opendatacommons.org/licenses/odbl/1.0/">Open + export_details: Li dati d'OpenStreetMap sunnu sutta la licenza <a href="http://opendatacommons.org/licenses/odbl/1.0/">Open Data Commons Open Database License</a> (ODbL). too_large: - advice: 'Si’ l’espurtazzioni ccassupra nun rinesci, poi pruvari cu’ una dî + advice: 'Si la spurtazzioni ccassupra nun arrinesci, poi pruvari cu una dî fonti ccassutta:' - body: St’aria è troppu granni p’espurtàrila comu Dati XML di OpenStreetMap. - Pi’ favuri zumma, o scegghî n’aria cchiu’ picciriḍḍa, o puru pû scarricamentu + body: St'ària è troppu granni pi spurtàrila comu Dati XML di OpenStreetMap. + Pi favuri zumma, o scegghî n'ària cchiù piccidda, o puru pû scarricamentu massizzu di dati adòpira una dî fonti ccassutta. planet: title: Pianeta OSM - description: Copî aggiurnati rigularmenti dâ basi di dati cumpleta di OpenStreetMap + description: Copî dâ basi di dati cumpreta di OpenStreetMap ca vèninu aggiurnati + rigularmenti overpass: title: API Overpass - description: Scàrrica stu riquatru dûn mirror dâ basi di dati di OpenStreetMap + description: Scàrrica stu riquatru dûn mirror dâ basi di dati d'OpenStreetMap geofabrik: title: Scarricamenti dâ Geofabrik - description: Estratti di cuntinenti, paìsi, e na silizzioni di città aggiurnati - rigularmenti + description: Astratti di cuntinenti, di paisi, e di na silizzioni di cità + ca vèninu aggiurnati rigularmenti metro: title: Metro Extracts - description: Estratti dî principali città dû munnu e ill’àrii circustanti + description: Estratti dî principali cità dû munnu e di l'àrii circustanti other: - title: Autri fonti - description: Autri fonti elincati ntâ wiki di OpenStreetMap + title: Àutri fonti + description: Àutri fonti elincati ntâ wiki d'OpenStreetMap options: Opzioni format: Furmatu scale: Scala @@ -369,24 +374,24 @@ scn: zoom: Ngrannimentu add_marker: Agghiunci un signu ntâ cartina latitude: 'Lat:' - longitude: 'Lon:' + longitude: 'Lun:' output: Pruduttu - paste_html: Ncoḍḍa l’HTML pi’ncurpurari ntôn situ web + paste_html: Ncodda l'HTML pi ncurpurari ntôn situ web export_button: Esporta geocoder: search: title: - latlon: Risultati di <a href="http://openstreetmap.org/">Nternu</a> - us_postcode: Risultati di <a href="http://geocoder.us/">Geocoder.us</a> - uk_postcode: Risultati di <a href="http://www.npemap.org.uk/">NPEMap / FreeThe + latlon: Risurtati di <a href="http://openstreetmap.org/">Nternu</a> + us_postcode: Risurtati di <a href="http://geocoder.us/">Geocoder.us</a> + uk_postcode: Risurtati di <a href="http://www.npemap.org.uk/">NPEMap / FreeThe Postcode</a> - ca_postcode: Risultati di <a href="http://geocoder.ca/">Geocoder.CA</a> - osm_nominatim: Risultati di <a href="http://nominatim.openstreetmap.org/">OpenStreetMap + ca_postcode: Risurtati di <a href="http://geocoder.ca/">Geocoder.CA</a> + osm_nominatim: Risurtati di <a href="http://nominatim.openstreetmap.org/">OpenStreetMap Nominatim</a> - geonames: Risultati di <a href="http://www.geonames.org/">GeoNames</a> - osm_nominatim_reverse: Risultati di <a href="http://nominatim.openstreetmap.org/">OpenStreetMap + geonames: Risurtati di <a href="http://www.geonames.org/">GeoNames</a> + osm_nominatim_reverse: Risurtati di <a href="http://nominatim.openstreetmap.org/">OpenStreetMap Nominatim</a> - geonames_reverse: Risultati di <a href="http://www.geonames.org/">GeoNames</a> + geonames_reverse: Risurtati di <a href="http://www.geonames.org/">GeoNames</a> search_osm_nominatim: prefix: aerialway: @@ -397,36 +402,36 @@ scn: station: Stazzioni dâ funivìa aeroway: aerodrome: Ariuportu - apron: Piazzali + apron: Chiazzali gate: Porta di mbarcu helipad: Eliportu runway: Pista d’attirraggiu taxiway: Pista di rullaggiu terminal: Terminal amenity: - animal_shelter: Rifuggiu di l’armali - arts_centre: Centru d’arti + animal_shelter: Rifuggiu di l'armali + arts_centre: Centru d'arti atm: Bancomat bank: Banca bar: Bar bbq: Fucuni - bench: Bancu + bench: Vancu bicycle_parking: Pusteggiu dî bicicletti - bicycle_rental: Affitta-bicicletti + bicycle_rental: Alluga-bicicletti biergarten: Biergarten - boat_rental: Affitta-barchi + boat_rental: Alluga-varchi brothel: Burdellu bureau_de_change: Scanciaturi di muniti - bus_station: Stazzioni ill’autobus + bus_station: Stazzioni di l'autobussu cafe: Cafè - car_rental: Affitta-màchini + car_rental: Alluga-màchini car_sharing: Car Sharing car_wash: Lavaggiu dî màchini casino: Casa di jocu charging_station: Stazzioni di ricàrrica childcare: Asilu nidu - cinema: Cinema - clinic: Clinica + cinema: Cìnima + clinic: Clìnica clock: Ruloggiu college: Accademia community_centre: Centru cìvicu @@ -435,10 +440,10 @@ scn: dentist: Dintista doctors: Dutturi dormitory: Durmitoriu - drinking_water: Acqua pi’ mbìviri + drinking_water: Acqua pi vìviri driving_school: Scola guida - embassy: Mmasciata - emergency_phone: Telèfunu d’emirgenza + embassy: Ammasciata + emergency_phone: Telèfunu d'emirgenza fast_food: Fast Food ferry_terminal: Attraccu dû traghettu fire_hydrant: Idranti @@ -462,14 +467,14 @@ scn: nightclub: Night Club nursery: Asilu nursing_home: Casa di riposu - office: Ufficiu + office: Uffizziu parking: Pusteggiu parking_entrance: Trasuta dû pusteggiu pharmacy: Farmacìa place_of_worship: Locu di cultu police: Guardia post_box: Buca dâ posta - post_office: Ufficiu pustali + post_office: Uffizziu pustali preschool: Asilu prison: Càrciri pub: Pub @@ -478,12 +483,12 @@ scn: recycling: Ìsula eculòggica restaurant: Risturanti retirement_home: Casa di riposu - sauna: Sauna + sauna: Sàuna school: Scola shelter: Pinnata shop: Nigozziu shower: Doccia - social_centre: Centru sociali + social_centre: Centru suciali social_club: Cìrculu social_facility: Sirvizzî suciali studio: Studiu di riggistrazzioni @@ -493,18 +498,18 @@ scn: theatre: Tiatru toilets: Cessi townhall: Municipiu - university: Università - vending_machine: Machinetta chi’ vinni - veterinary: Veterinariu + university: Univirsità + vending_machine: Machinetta chi vinni + veterinary: Vitirinariu village_hall: Municipiu waste_basket: Biduni dâ munnizza waste_disposal: Cassuni dâ munnizza - youth_centre: Centru giuvanili + youth_centre: Centru giuvinili boundary: administrative: Cunfini amministrativu - census: Cunfini censuariu + census: Cunfini cinzuariu national_park: Parcu nazziunali - protected_area: Aria prutetta + protected_area: Ària prutetta bridge: aqueduct: Catusatu suspension: Ponti suspisu @@ -515,7 +520,7 @@ scn: "yes": Edificiu craft: brewery: Birrificiu - carpenter: Mastru d’ascia + carpenter: Mastru d'ascia electrician: Elittricista gardener: Jardinaru painter: Pitturi @@ -525,40 +530,40 @@ scn: tailor: Custureri "yes": Putìa dû mastru emergency: - ambulance_station: Stazzioni ill’ambulanzi - defibrillator: Defibbrillaturi - landing_site: Pista d’attirraggiu d’emirgenza - phone: Telèfunu d’emirgenza + ambulance_station: Stazzioni di l'ambulanzi + defibrillator: Difibbrillaturi + landing_site: Pista d'attirraggiu d'emirgenza + phone: Telèfunu d'emirgenza highway: abandoned: Strata abbannunata - bridleway: Caminu pî cavaḍḍi - bus_guideway: Cursia ill’autobus a’ guida vinculata - bus_stop: Firmata ill’autobus - construction: Strata in custruzzioni + bridleway: Caminu pî cavaddi + bus_guideway: Cursìa di l'autobussu a guida vinculata + bus_stop: Firmata di l'autobussu + construction: Strata n custruzzioni cycleway: Pista ciclàbbili - elevator: Ascinsuri - emergency_access_point: Puntu di cugghiuta d’emirgenza + elevator: Ascinzuri + emergency_access_point: Puntu di cugghiuta d'emirgenza footway: Caminu pidunali ford: Sguazzu living_street: Living Street milestone: Petra miliari motorway: Autustrata - motorway_junction: Svìnculu ill’autustrata + motorway_junction: Svìnculu di l'autustrata motorway_link: Autustrata path: Caminu - pedestrian: Stata pidunali + pedestrian: Strata pidunali platform: Firmata primary: Strata primaria primary_link: Strata primaria proposed: Strata pruggittata raceway: Pista residential: Strata risidinziali - rest_area: Aria di pusteggiu + rest_area: Ària di pusteggiu road: Strata - secondary: Strata secunnaria - secondary_link: Strata secunnaria + secondary: Strata sicunnaria + secondary_link: Strata sicunnaria service: Strata di sirvizziu - services: Aria di sirvizziu + services: Ària di sirvizziu speed_camera: Autovelox steps: Scala street_lamp: Lampiuni @@ -578,10 +583,10 @@ scn: boundary_stone: Petra finàita building: Edificiu stòricu bunker: Bunker - castle: Casteḍḍu - church: Chiesa - city_gate: Porta dâ città - citywalls: Mura dâ città + castle: Casteddu + church: Cresia + city_gate: Porta dâ cità + citywalls: Mura dâ cità fort: Forti heritage: Situ di ntiressi stòricu-culturali house: Casa stòrica @@ -591,9 +596,9 @@ scn: mine: Minera monument: Munumentu roman_road: Strata rumana - ruins: Ruìni + ruins: Ruini stone: Petra stòrica - tomb: Sepultura + tomb: Sipultura tower: Turri wayside_cross: Crucifissu wayside_shrine: Cona @@ -607,15 +612,15 @@ scn: cemetery: Cimiteru commercial: Zona cummirciali conservation: Zona prutetta - construction: Zona in custruzzioni + construction: Zona n custruzzioni farm: Massarìa - farmland: Terra cultivata + farmland: Terra curtivata farmyard: Aria forest: Furesta garages: Garage - grass: Erba + grass: Erva greenfield: Zona luttizzata - industrial: Zona innustriali + industrial: Zona nnustriali landfill: Munnizzaru meadow: Pratu military: Zona militari @@ -624,41 +629,41 @@ scn: quarry: Pirrera railway: Ferruvìa recreation_ground: Chianu di ricrìu - reservoir: Lagu artificiali + reservoir: Lacu artificiali reservoir_watershed: Gebbia residential: Zona risidinziali retail: Putìa - road: Aria dâ strata + road: Ària dâ strata village_green: Parcu urbanu vineyard: Vigna "yes": Usu dâ terra leisure: beach_resort: Lidu - bird_hide: Ossirvatoriu pi’ l’aceḍḍi + bird_hide: Ossirvatoriu pi l'auceddi club: Cìrculu common: Cumuni dog_park: Parcu dî cani fishing: Riserva di pisca fitness_centre: Palestra - fitness_station: Attrezzi pâ ginnastica + fitness_station: Attrezzi pâ ginnàstica garden: Jardinu golf_course: Campu di golf - horse_riding: Maniggiu - ice_rink: Pista ghiacciata + horse_riding: Equitazzioni + ice_rink: Pista ghiazzata marina: Portu turìsticu miniature_golf: Minigolf nature_reserve: Riserva naturali park: Villa pitch: Campu di jocu - playground: Jochi pî picciriḍḍi + playground: Jochi pî picciriddi recreation_ground: Chianu di ricrìu resort: Villaggiu turìsticu - sauna: Sauna - slipway: Rampa d’alaggiu + sauna: Sàuna + slipway: Rampa d'alaggiu sports_centre: Centru spurtivu stadium: Stadiu swimming_pool: Piscina - track: Pista dâ cursa + track: Pista di cursa water_park: Acquapark "yes": Ricrìu man_made: @@ -675,20 +680,20 @@ scn: "yes": Passu di muntagna natural: bay: Gulfu - beach: Praja + beach: Praia cape: Capu cave_entrance: Trasuta dâ grutta cliff: Sdirrupu crater: Crateri dune: Duna - fell: Viggitazzioni d’auta muntagna + fell: Viggitazzioni d'àuta muntagna fjord: Fiordu forest: Furesta geyser: Geyser - glacier: Ghiacciaju + glacier: Ghiacciaiu grassland: Pratu heath: Brughiera - hill: Cuḍḍina + hill: Cullina island: Ìsula land: Terra marsh: Margiu @@ -699,7 +704,7 @@ scn: reef: Scogghiu summersu ridge: Serra rock: Massu - saddle: Seḍḍa + saddle: Sedda sand: Rina scree: Agghiara scrub: Troffi @@ -707,32 +712,32 @@ scn: stone: Petra strait: Strittu tree: Àrvulu - valley: Vaḍḍi - volcano: Vulcanu + valley: Vaddi + volcano: Vurcanu water: Acqua wetland: Pantanu - wood: Boscu + wood: Voscu office: accountant: Raggiuneri administrative: Ufficiu pùbblicu lucali architect: Architettu - company: Società + company: Sucità employment_agency: Agginzìa pû travagghiu - estate_agent: Agginzìa Immobbiliari + estate_agent: Agginzìa Mmubbiliari government: Ufficiu pùbblicu insurance: Assicurazzioni lawyer: Avvucatu - ngo: Organizzazzioni Nun Guvernativa - telecommunication: Società di telicumunicazzioni + ngo: Organizzazzioni Nun Guvirnativa + telecommunication: Sucità di telecumunicazzioni travel_agent: Agginzìa dî viaggi - "yes": Ufficiu + "yes": Uffizziu place: - allotments: Territoriu agrìculu o ricriativu + allotments: Tirritoriu agrìculu o ricriativu block: Isulatu airport: Ariuportu - city: Città - country: Paìsi - county: Cuntèa + city: Cità + country: Paisi + county: Cuntea farm: Massarìa hamlet: Casali house: Casa @@ -745,46 +750,46 @@ scn: municipality: Cumuni neighbourhood: Quarteri postcode: CAP - region: Riggioni + region: Pruvincia sea: Mari state: Statu subdivision: Suttadivisioni suburb: Quarteri - town: Cittateḍḍa - unincorporated_area: Aria nun ncurpurata - village: Paìsi + town: Citatedda + unincorporated_area: Ària nun ncurpurata + village: Paisi "yes": Locu railway: abandoned: Ferruvìa abbannunata - construction: Ferruvìa in custruzzioni - disused: Ferruvìa in disusu + construction: Ferruvìa n custruzzioni + disused: Ferruvìa n disusu disused_station: Stazzioni dû trenu abbannunata funicular: Funiculari halt: Firmata dû trenu - historic_station: Stazzioni dû trenu storica + historic_station: Stazzioni dû trenu stòrica junction: Biviu ferruviariu - level_crossing: Passaggiu a’ liveḍḍu - light_rail: Metrupulitana liggira - miniature: Binariu in miniatura - monorail: Monurutaja - narrow_gauge: Ferruvia a’ scartamentu ridduciutu + level_crossing: Passaggiu a liveddu + light_rail: Mitrupulitana leggia + miniature: Binariu n miniatura + monorail: Monurutaia + narrow_gauge: Ferruvìa a scartamentu arridduciutu platform: Binariu dâ stazzioni - preserved: Ferruvìa storica - proposed: Ferruvìa in pruggettu + preserved: Ferruvìa stòrica + proposed: Ferruvìa n pruggettu spur: Binariu di sirvizziu station: Stazzioni dâ ferruvìa stop: Firmata dû trenu - subway: Metrupulitana - subway_entrance: Trasuta dâ metrupulitana + subway: Mitrupulitana + subway_entrance: Trasuta dâ mitrupulitana switch: Scanciu ferruviariu tram: Tram tram_stop: Firmata dû tram shop: - alcohol: Putìa di bivanni alcolici + alcohol: Putìa di vivanni alcòlichi antiques: Antiquariu - art: Nigòzziu d’arti + art: Nigozziu d'arti bakery: Furnu - beauty: Nigòzziu di biḍḍizza + beauty: Nigozziu di biddizza beverages: Putìa dî buttigghî bicycle: Nigozziu dî bicicletti books: Nigozziu dî libbra @@ -797,36 +802,36 @@ scn: charity: Nigozziu di binificienza chemist: Sanitaria clothes: Nigozziu dî vistiti - computer: Nigozziu dî computer + computer: Nigozziu dî computeri confectionery: Pastizzarìa convenience: Minimarket - copyshop: Copistirìa - cosmetics: Nigòzziu di cusmètici + copyshop: Cupistarìa + cosmetics: Nigozziu di cusmètici deli: Salumarìa - department_store: Granni maggazzinu + department_store: Magasenu granni discount: Discount doityourself: Fai-da-te dry_cleaning: Lavasiccu - electronics: Nigozziu d’elittrònica + electronics: Nigozziu d'elittrònica estate_agent: Agginzìa mmubbiliari - farm: Putìa dû viḍḍanu + farm: Putìa dû viddanu fashion: Boutique fish: Piscarìa florist: Ciuraru food: Putìa dû manciari funeral_directors: Casciamurtaru furniture: Putìa dî mòbbili - gallery: Gallaria d’arti + gallery: Jallarìa d'arti garden_centre: Putìa dû jardinaggiu general: Putìa - gift: Àrticuli di riggalu + gift: Artìculi di rijalu greengrocer: Putìa dâ frutta grocery: Putìa hairdresser: Piluccheri hardware: Firramenta hifi: Hi-Fi insurance: Assicurazzioni - jewelry: Giujellirìa + jewelry: Giujillirìa kiosk: Cioscu laundry: Lavannarìa mall: Centru cummirciali @@ -837,14 +842,14 @@ scn: newsagent: Giurnalaru optician: Òtticu organic: Manciari biulòggicu - outdoor: Àrticuli di campìu - pet: Nigozziu ill’armali + outdoor: Nigozziu d'artìculi pi sport â campìa + pet: Nigozziu di l'armali pharmacy: Farmacìa - photo: Àrticuli di futugrafìa - salon: Saluni di biḍḍizza - second_hand: Artìculi i secunna manu + photo: Artìculi di futugrafìa + salon: Saluni di biddizza + second_hand: Artìculi di secunna manu shoes: Scarparu - shopping_centre: Centru Cummirciali + shopping_centre: Centru cummirciali sports: Artìculi spurtivi stationery: Cartaru supermarket: Supirmircatu @@ -857,53 +862,53 @@ scn: tourism: alpine_hut: Rifuggiu apartment: Appartamentu - artwork: Òpira d’arti + artwork: Òpira d'arti attraction: Attrazzioni turìstica bed_and_breakfast: Bed and Breakfast cabin: Barracca camp_site: Campìu caravan_site: Campìu pî roulotte chalet: Bungalow - gallery: Gallaria d’arti + gallery: Jallarìa d'arti guest_house: Guest House hostel: Ostellu - hotel: Albergu + hotel: Arbergu information: Nfurmazzioni turìstichi motel: Motel - museum: Musèu - picnic_site: Aria di pic-nic + museum: Museu + picnic_site: Ària di picchi-nicchi theme_park: Parcu dî divirtimenti viewpoint: Postu panuràmicu zoo: Zoo tunnel: culvert: Tumbinatura - "yes": Gallarìa + "yes": Jallarìa waterway: - artificial: Cursu d’acqua artificiali + artificial: Cursu d'acqua artificiali boatyard: Canteri navali canal: Canali dam: Diga - derelict_canal: Saja abbannunata + derelict_canal: Saia abbannunata ditch: Fossu dock: Bacinu - drain: Saja + drain: Saia lock: Conca di navigazzioni lock_gate: Chiusa mooring: Molu rapids: Catarratti river: Ciumi - stream: Vaḍḍuni - wadi: Uadi + stream: Vadduni + wadi: Uadì waterfall: Cascata weir: Brigghia fluviali - "yes": Cursu d’acqua + "yes": Cursu d'acqua admin_levels: level2: Cunfini di nazzioni - level4: Cunfini di riggioni - level5: Cunfini di riggioni èstira + level4: Cunfini di riggiuni + level5: Cunfini di riggiuni èstira level6: Cunfini di pruvincia level8: Cunfini di cumuni - level9: Cunfini di villàggiu + level9: Cunfini di villaggiu level10: Cunfini di quarteri description: title: @@ -911,139 +916,139 @@ scn: Nominatim</a> geonames: Lucalizzazzioni di <a href="http://www.geonames.org/">GeoNames</a> types: - cities: Città - towns: Paìsi + cities: Cità + towns: Paisi places: Posti results: - no_results: Nuḍḍu risultatu truvatu - more_results: Autri risultati + no_results: Nuddu risurtatu attruvatu + more_results: Àutri risurtati layouts: logo: - alt_text: Logu di OpenStreetMap + alt_text: Logu d'OpenStreetMap home: Vai â casa logout: Nesci log_in: Trasi log_in_tooltip: Trasi cûn cuntu esistenti sign_up: Scrìviti - start_mapping: Accumencia a’ mappari - sign_up_tooltip: Crea un cuntu pi’ fari canciamenti + start_mapping: Accumenza a mappari + sign_up_tooltip: Crea un cuntu pi fari canciamenti edit: Cancia - history: Cronuluggìa + history: Crunuluggìa export: Esporta data: Dati - export_data: Esporta i dati + export_data: Esporta li dati gps_traces: Tracciati GPS - gps_traces_tooltip: Gistisci i tracciati GPS - user_diaries: Diarî ill’utenti - user_diaries_tooltip: Talìa i diarî ill’utenti - edit_with: Cancia cu’ %{editor} - tag_line: A Cartina-wiki dû Munnu Lìbbira - intro_header: Binvinuti nta OpenStreetMap! - intro_text: OpenStreetMap è na cartina dû munnu, criata di genti comu a’ tia e - lìbbira a’ adupirari secunnu na licenza aperta. - intro_2_create_account: Crìa un cuntu di utenti - partners_html: L’hosting veni sustinutu di %{ucl}, %{ic} e %{bytemark}, e autri + gps_traces_tooltip: Gistisci li tracciati GPS + user_diaries: Diarî di l'utenti + user_diaries_tooltip: Talìa li diarî di l'utenti + edit_with: Cancia cu %{editor} + tag_line: La cartina-wiki dû munnu lìbbira + intro_header: Bimminuti nta OpenStreetMap! + intro_text: OpenStreetMap è na cartina dû munnu, criata di genti comu a tìa e + lìbbira a adupirari secunnu na licenza graputa. + intro_2_create_account: Crea un cuntu d'utenti + partners_html: L'hosting veni sustinutu di %{ucl}, %{ic} e %{bytemark}, e àutri %{partners}. partners_ucl: the UCL VR Centre partners_ic: Imperial College London partners_bytemark: Bytemark Hosting partners_partners: cullabburatura - osm_offline: A basi di dati di OpenStreetMap comu ad ora nun è in lìnia picchì - si stannu facennu travagghî di manutinizioni funnamintali. - osm_read_only: A basi di dati di OpenStreetMap comu ad ora è ntâ mudalità di sula - littura picchì si stannu facennu travagghî di manutinizioni funnamintali. - donate: Susteni a’ OpenStreetMap %{link} ô funnu pi’ l’aggiurnamentu ill’hardware. + osm_offline: La basi di dati d'OpenStreetMap comu a ora nun è n lìnia pirchì si + stannu facennu travagghî di manutinzioni funnamintali. + osm_read_only: La basi di dati d'OpenStreetMap comu a ora è ntâ mudalità di sula + littura pirchì si stannu facennu travagghî di manutinzioni funnamintali. + donate: Susteni a OpenStreetMap %{link} ô funnu pi l'aggiurnamentu di l'hardware. help: Guida about: Nfurmazzioni - copyright: Dritti d’auturi + copyright: Dritti d'auturi community: Cumunità community_blogs: Blog dâ cumunità - community_blogs_title: Blog di membri dâ cumunità di OpenStreetMap + community_blogs_title: Blog di membri dâ cumunità d'OpenStreetMap foundation: Funnazzioni - foundation_title: A Funnazzioni OpenStreetMap + foundation_title: La Funnazzioni OpenStreetMap make_a_donation: - title: Susteni a’ OpenStreetMap cu na dunazzioni di dinaru + title: Susteni a OpenStreetMap cu na dunazzioni di dinaru text: Fai na dunazzioni - learn_more: Sapìrinni cchiu’ ssai - more: Autri cosi + learn_more: Sapìrinni cchiossai + more: Àutri cosi license_page: foreign: - title: A’ prupòsitu di sta traduzzioni - text: In casu di cunflittu tra di sta pàggina traduciuta e %{english_original_link}, - fa’ fidi a pàggina in ngrisi - english_link: l’origginali in lingua ngrisi + title: A prupòsitu di sta traduzzioni + text: N casu di cunflittu tra di sta pàggina traduciuta e %{english_original_link}, + fa fidi la pàggina n ngrisi + english_link: l'origginali n lingua ngrisa native: - title: A’ prupòsitu di sta pàggina - text: Stai taliannu a virsioni in lingua ngrisi dâ pàggina dû drittu d’auturi. + title: A prupòsitu di sta pàggina + text: Stai taliannu la virsioni n lingua ngrisa dâ pàggina dû drittu d'auturi. Poi turnari â %{native_link} di sta pàggina o puru poi finiri di nfurmàriti - supra ô drittu d’auturi e %{mapping_link}. - native_link: virsioni in sicilianu - mapping_link: accuminciari a’ mappari + supra ô drittu d'auturi e %{mapping_link}. + native_link: virsioni n sicilianu + mapping_link: accuminzari a mappari legal_babble: - title_html: Dritti d’auturi e Licenza + title_html: Dritti d'auturi e Licenza intro_1_html: |- - OpenStreetMap<sup><a href="#trademarks">®</a></sup> è fattu di <i>dati aperti</i>, cunciduti sutta â licenza <a + OpenStreetMap<sup><a href="#trademarks">®</a></sup> è fattu di <i>dati graputi</i>, cunciduti sutta â licenza <a href="http://opendatacommons.org/licenses/odbl/">Open Data Commons Open Database License</a> (ODbL) dâ <a href="http://osmfoundation.org/">Funnazzioni OpenStreetMap</a> (OSMF). intro_2_html: |- - Si’ lìbbiru di cupiari, diffùnniri, trasmèttiri e adattari i nostri dati, fintantu chi’ l’attribuisci a’ OpenStreetMap e ê so cuntribbutura. Si’ canci i dati o l’adòpiri comu puntu di partenza, poi distribbuiri u travagghiu risultanti sulamenti sutta â stissa licenza. U <a href="http://opendatacommons.org/licenses/odbl/1.0/">còdici ligali - code</a> cumpletu spiega quali sunnu i to dritti e i to rispunsabbilità. + Sî lìbbiru di cupiari, diffùnniri, trasmèttiri e adattari li nostri dati, fintantu chi l'attribbuisci a OpenStreetMap e ê sò cuntribbutura. Si canci li dati o l'adòpiri comu puntu di partenza, poi distribbuiri lu travagghiu risurtanti sulamenti sutta â stissa licenza. Lu <a href="http://opendatacommons.org/licenses/odbl/1.0/">còdici ligali + code</a> cumpletu spiega quali sunnu li tò dritti e li tò rispunzabbilità. intro_3_html: |- - A cartugrafìa ntê mattunelli dâ nostra cartina, e a nostra ducumintazzioni, sunnu sutta â licenza <a href="http://creativecommons.org/licenses/by-sa/2.0/">Creative + La cartugrafìa ntê mattunelli dâ nostra cartina, e la nostra ducumintazzioni, sunnu sutta â licenza <a href="http://creativecommons.org/licenses/by-sa/2.0/">Creative Commons Attribution-ShareAlike 2.0</a> (CC BY-SA). - credit_title_html: Comu s’attribbuìsci a’ OpenStreetMap - credit_1_html: Richiedemu chi’ si usa l’attribbuzzioni «© i cuntribbutura - di OpenStreetMap». - credit_2_html: "S’havi a’ rènniri chiaru ch’i dati sunnu misi a’ dispusizzioni - sutta dâ Open\nDatabase License, e si’ s’adòpirunu i mattunelli dâ nostra - cartina, ch’a cartugrafìa è sutta dâ licenza CC BY-SA. Sta cosa si po’ fari - mittennu nu culligamentu a’ \n<a href=\"http://www.openstreetmap.org/copyright\">sta - pàggina dû drittu d’auturi</a>.\nComu altirnativa, e obbligaturiamenti quannu - si diffunni OSM sutta forma di dati, si ponnu mintuari i licenzi pi’ nomu - e cûn culligamentu direttu chi’ porta unn’iḍḍi. Nta ḍḍi menzi unni i culligamenti - nun sunnu pussìbbili (ad esempiu ntâ carta stampata), suggiremu di mannari - i littura direttamenti unni openstreetmap.org (macari espannennu \n‘OpenStreetMap’ - a’ stu nnirizzu cumpletu), unni opendatacommons.org, e, quann’è oppurtunu, + credit_title_html: Comu s'attribbuisci a OpenStreetMap + credit_1_html: Addumannamu chi s'usa l'attribbuzzioni «© li cuntribbutura + d'OpenStreetMap». + credit_2_html: "S'havi a rènniri chiaru ca li dati sunnu misi a dispusizzioni + sutta dâ Open\nDatabase License, e si s’adòpiranu li mattunelli dâ nostra + cartina, chi la cartugrafìa è sutta dâ licenza CC BY-SA. Sta cosa si pò fari + mittennu nu culligamentu a \n<a href=\"http://www.openstreetmap.org/copyright\">sta + pàggina dû drittu d'auturi</a>.\nComu altirnativa, e obbligatoriamenti quannu + si diffunni OSM sutta forma di dati, si ponnu mintuari li licenzi pi nomu + e cûn culligamentu direttu chi porta unni iddi. Nta ddi menzi unni li culligamenti + nun sunnu pussìbbili (p'esempiu ntâ carta stampata), suggiremu di mannari + li littura direttamenti unni openstreetmap.org (macari espannennu \n‘OpenStreetMap’ + a stu nnirizzu cumpletu), unni opendatacommons.org, e, quann'è oppurtunu, unni\n creativecommons.org." credit_3_html: |- - Nta na cartina elittronica navigàbbili, l’attribbuzzioni avissi a’ spuntari nta l’àngulu dâ cartina. - Ad esempiu: + Nta na cartina elittrònica navigàbbili, l’attribbuzzioni avissi a spuntari nta l'àngulu dâ cartina. + P'esempiu: attribution_example: - alt: Esempiu di comu s’attribbuìsci a’ OpenStreetMap nta na pàggina web - title: Esempiu di attribbuzzioni - more_title_html: Pi’ sapìrinni cchiu’ ssai + alt: Esempiu di comu s'attribbuisci a OpenStreetMap nta na pàggina web + title: Esempiu d'attribbuzzioni + more_title_html: Pi sapìrinni cchiossai more_1_html: |- - Trova autri nfurmazzioni a’ prupòsitu di comu s’adòpirunu i nostri dati, e comu nni si duna attribbuzioni, ntâ <a - href="http://osmfoundation.org/Licence">pàggina dâ licenza di l’OSMF</a> e ntê <a - href="http://wiki.openstreetmap.org/wiki/Legal_FAQ">dumanni friquenti ligali</a> gistuti dâ cumunità. - more_2_html: "Macari si’ OpenStreetMap è fattu di dati aperti, nun putemu furniri - n’API cartugràfica gratùita ê sviluppatura di terza parti.\nTalìa a nostra - <a href=\"http://wiki.openstreetmap.org/wiki/API_usage_policy\">Pulìtica pi’ - l’utilizzu ill’API</a>, \na <a href=\"http://wiki.openstreetmap.org/wiki/Tile_usage_policy\">Pulìtica - pi’ l’utilizzu dî mattunelli</a>\n e a <a href=\"http://wiki.openstreetmap.org/wiki/Nominatim#Usage_Policy\">Pulìtica - pi’ l’utilizzu di Nominatim</a>." - contributors_title_html: I nostri cuntribbutura - contributors_intro_html: 'I nostri cuntribbutura sunnu migghiara di genti. Pigghiamu - macari dati cu’ licenza aperta furnuti di l’agginzìi cartugràfichi nazziunali - e di autri fonti, tra dî quali:' + Attrova àutri nfurmazzioni a prupòsitu di comu s'adòpiranu li nostri dati, e comu ni si duna attribbuzzioni, ntâ <a + href="http://osmfoundation.org/Licence">pàggina dâ licenza di l'OSMF</a> e ntê <a + href="http://wiki.openstreetmap.org/wiki/Legal_FAQ">addumannati friquenti ligali</a> gistuti dâ cumunità. + more_2_html: "Macari si OpenStreetMap è fattu di dati graputi, nun putemu furniri + n'API cartugràfica gratùita ê sviluppatura di terza parti.\nTalìa la nostra + <a href=\"http://wiki.openstreetmap.org/wiki/API_usage_policy\">Pulìtica pi + l'utilizzu di l'API</a>, \nla <a href=\"http://wiki.openstreetmap.org/wiki/Tile_usage_policy\">Pulìtica + pi l'utilizzu dî mattunelli</a>\n e la <a href=\"http://wiki.openstreetmap.org/wiki/Nominatim#Usage_Policy\">Pulìtica + pi l'utilizzu di Nominatim</a>." + contributors_title_html: Li nostri cuntribbutura + contributors_intro_html: 'Li nostri cuntribbutura sunnu migghiara di genti. + Pigghiamu macari dati cu licenza graputa furnuti di l''agginzìi cartugràfichi + nazziunali e d''àutri fonti, tra dî quali:' contributors_at_html: "<strong>Austria</strong>: Cunteni dati dâ\n<a href=\"http://data.wien.gv.at/\">Stadt - Wien</a> (sutta a’ \n<a href=\"http://creativecommons.org/licenses/by/3.0/at/deed.de\">CC + Wien</a> (sutta a \n<a href=\"http://creativecommons.org/licenses/by/3.0/at/deed.de\">CC BY</a>),\n<a href=\"http://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm\">Land - Vorarlberg</a> e\nLand Tirol (sutta a’ <a href=\"http://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/\">CC - BY AT cu’ canciamenti</a>)." + Vorarlberg</a> e\nLand Tirol (sutta a <a href=\"http://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/\">CC + BY AT cu canciamenti</a>)." contributors_ca_html: "<strong>Canadà</strong>: Cunteni dati di \nGeoBase®, GeoGratis (© Department of Natural\nResources Canada), CanVec (© Department of Natural\nResources Canada), e StatCan (Geography Division,\nStatistics Canada)." contributors_fi_html: "<strong>Finlannia</strong>: Cunteni dati dâ Basi di Dati - Topugràfica dû National Land Survey dâ Finlannia \ne di autri insiemi di dati, + Topugràfica dû National Land Survey dâ Finlannia e d'àutri nzemi di dati, sutta â \n<a href=\"http://www.maanmittauslaitos.fi/en/NLS_open_data_licence_version1_20120501\">Licenza NLSFI</a>." contributors_fr_html: "<strong>Francia</strong>: Cunteni dati furnuti dâ \nDirection Générale des Impôts." contributors_nl_html: |- - <strong>Paìsi Vasci</strong>: Cunteni dati © AND, 2007 + <strong>Paisi Vasci</strong>: Cunteni dati © AND, 2007 (<a href="http://www.and.com">www.and.com</a>) contributors_nz_html: "<strong>Nova Zilanna</strong>: Cunteni dati furnuti dâ \nLand Information New Zealand. Crown Copyright reserved." @@ -1059,108 +1064,108 @@ scn: Survey © Crown copyright and database right 2010-12. contributors_footer_1_html: |- - Pi’ canùsciri autri dittagghî supra a’ chisti e autri fonti chi’ furu adupirati pi’ migghiurari OpenStreetMap, poi taliari <a - href="http://wiki.openstreetmap.org/wiki/Contributors">a pàggina dî cuntribbutura</a> supra â wiki di OpenStreetMap. - contributors_footer_2_html: A nclusioni dî dati nta OpenStreetMap nun ìmplica - ch’u so furnituri origginali susteni OpenStreetMap, furnisci na quarchi’ garanzìa, - o accetta na quarchi’ rispunsabbilità. + Pi canùsciri àutri dittagghî supra a chisti e àutri fonti chi foru adupirati pi migghiurari OpenStreetMap, poi taliari <a + href="http://wiki.openstreetmap.org/wiki/Contributors">la pàggina dî cuntribbutura</a> supra â wiki di OpenStreetMap. + contributors_footer_2_html: La nclusioni dî dati nta OpenStreetMap nun ìmplica + ca lu sò furnituri origginali susteni OpenStreetMap, furnisci na quarchi garanzìa, + o accetta na quarchi rispunzabbilità. infringement_title_html: Viulazzioni dû drittu d’auturi - infringement_1_html: Ê cuntribbutura di OSM si ricorda di nun agghiùnciri mai - dati chi’ vènunu di fonti prutetti dû drittu d’auturi (ad esempiu Google Maps - o puru i carti stampati) senza aviri n’auturizzazzioni esplìcita dû titulari + infringement_1_html: Ê cuntribbutura d'OSM s'arricorda di nun agghiùnciri mai + dati chi vèninu di fonti prutetti dû drittu d'auturi (ad esempiu Google Maps + o puru li carti stampati) senza aviri n'auturizzazzioni splìcita dû titulari dû drittu d'auturi. - infringement_2_html: "Si’ pensi chi fu’ gghiunciutu a’ manera indèbita matiriali - prutettu dû drittu d’auturi ntâ basi di dati di OpenStreetMap o puru ntâ stu - situ, pi’ favuri fai rifirimentu â nostra\n <a href=\"http://www.osmfoundation.org/wiki/License/Takedown_procedure\">prucidura - di cancillazzioni</a> o puru signalinnillu direttamenti pi’ menzu dû nostru - \n<a href=\"http://dmca.openstreetmap.org/\">mòdulu di signalazzioni in linia</a>." + infringement_2_html: "Si penzi chi fu junciutu di manera nun dèbbita matiriali + prutettu dû drittu d'auturi o ntâ basi di dati di OpenStreetMap o puru nta + stu situ, pi favuri fai rifirimentu â nostra\n <a href=\"http://www.osmfoundation.org/wiki/License/Takedown_procedure\">prucidura + di cancillazzioni</a> o puru signalinilu direttamenti pi menzu dû nostru \n<a + href=\"http://dmca.openstreetmap.org/\">mòdulu di signalazzioni n lìnia</a>." trademarks_title_html: <span id="trademarks"></span>Marchi riggistrati - trademarks_1_html: OpenStreetMap e u logu dâ lenti di ngrannimentu sunnu marchi - riggistrati dâ Funnazzioni OpenStreetMap. Si’ hai quarchi’ dumanna supra a’ - l’utilizzu chi’ poi fari di sti marchi, a poi mannari ô <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">Gruppu + trademarks_1_html: OpenStreetMap e lu logu dâ lenti di ngrannimentu sunnu marchi + riggistrati dâ Funnazzioni OpenStreetMap. Si hai quarchi addumannata supra + a l'utilizzu chi poi fari di sti marchi, la poi mannari ô <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">Gruppu di travagghiu dî licenzi</a>. welcome_page: - title: Binvinuti! - introduction_html: Binvinuti nta OpenStreetMap, a cartina du munnu lìbbira e mudificàbbili. - Ora chi’ siti scritti, siti pronti p’accuminciari a’ mappari. Cca cc’è na guida - chi’ spiega i cosi cchiu’ mpurtanti ch’haviti a’ sapiri. + title: Bimminuti! + introduction_html: Bimminuti nta OpenStreetMap, la cartina dû munnu lìbbira e + canciàbbili. Ora chi siti scritti, siti pronti p'accuminzari a mappari. Ccà + c'è na guida chi spiega li cosi cchiù mpurtanti c'aviti a sapiri. whats_on_the_map: - title: Chiḍḍu chi’ cc'è supra â cartina + title: Zocchi c'è supra â cartina on_html: |- - OpenStreetMap è nu postu pi’ mappari cosi chi’ su’ <em>veri e attuali</em> - - cunteni miliuna d’edificî, strati e autri dittagghî dî posti. Poi mappari chiḍḍu chi’ è jè dû munnu riali chi’ ti ntiressa. - off_html: |- - Chiḍḍu chi’ nveci <em>nun cc’è</em> sunnu i dati d’opinioni comu ad esempiu i giudizzî, l’elimenti chi’ nun esìstunu cchiu’ o - chi’ sunnu iputètici, e i dati chi’ vènunu di fonti prutetti dû drittu d’auturi. A’ menu chi’ nun hai n’auturizzazzioni spiciali, - nun cupiari mai di mappi online o di carta. + OpenStreetMap è nu postu pi mappari cosi chi sù <em>veri e attuali</em> - + cunteni miliuna d'edificî, strati e àutri dittagghî dî posti. Poi mappari zocchegghiè dû munnu riali chi ti ntiressa. + off_html: Chiddu chi mmeci <em>nun c'è</em> sunnu li dati d'opinioni comu p'esempiu + li giudizzî, l'elimenti chi nun esìstinu cchiù o chi sunnu iputètici, e li + dati chi vèninu di fonti prutetti dû drittu d'auturi. A menu chi nun hai n'auturizzazzioni + spiciali, nun cupiari mai di mappi n lìnia o di carta. basic_terms: title: Tèrmini funnamintali dâ mappatura - paragraph_1_html: OpenStreetMap havi nu so linguaggiu particulari. Cca’ cci - su’ na para di palori chi’ ti ponnu giuvari. - editor_html: N’<strong>editor</strong> è nu prugramma o nu situ web chi’ poi - adupirari pi’ fari canciamenti ntâ cartina. + paragraph_1_html: OpenStreetMap havi nu sò linguaggiu particulari. Ccà ci sù + na para di palori chi ti ponnu aggiuvari. + editor_html: N'<strong>editor</strong> è nu prugramma o nu situ web chi poi + adupirari pi fari canciamenti ntâ cartina. node_html: Un <strong>gruppu</strong> è nu puntu sìngulu supra â cartina, comu - ad esempiu nu risturanti o n’àrvulu. - way_html: Nu <strong>caminu</strong> è na linia o puru n’aria, comu ponnu èssiri - na strata, un ciumi, un lagu o puru n’edificiu. + p'esempiu nu ristoranti o n'àrvulu. + way_html: Nu <strong>caminu</strong> è na lìnia o puru n'ària, comu ponnu èssiri + na strata, un ciumi, un lacu o puru n'edificiu. tag_html: |- - N’<strong>etichetta</strong> è na sìngula nfurmazzioni a’ prupòsitu dûn gruppu o dûn caminu, comu - ad esempiu u nomu dûn risturanti o u lìmiti di vilucità di na strata. + N’<strong>etichetta</strong> è na nfurmazzioni sìngula a prupòsitu dûn gruppu o dûn caminu, comu + p'esempiu lu nomu dûn ristoranti o lu lìmiti di vilucità di na strata. rules: title: Règuli! - paragraph_1_html: "OpenStreetMap havi picca règuli furmali, però nni spittamu - chi’ tutti i participanti cullabburannu\ne cumunicannu câ cumunità. Si’ stai - pigghiannu a’ cunsiddirazzioni di canciari a carta a’ quarchi’ n’autra manera - rispettu a’ fàrilu a’ manu, pi’ favuri leggi e rispetta i lìnî guida ca poi - truvari nta\n<a href='http://wiki.openstreetmap.org/wiki/Import/Guidelines'>Impurtazzioni</a> + paragraph_1_html: "OpenStreetMap havi picca règuli furmali, pirò n'aspittamu + chi tutti li participanti cullàbburanu e cumùnicanu câ cumunità. Si stai pigghiannu + a cunziddirazzioni di canciari la carta di quarchi manera àutra rispettu a + fàrilu a manu, pi favuri leggi e rispetta li lìnii guida ca poi attruvari + nta\n<a href='http://wiki.openstreetmap.org/wiki/Import/Guidelines'>Mpurtazzioni</a> e \n<a href='http://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct'>Canciamenti autumatizzati</a>." questions: title: Hai dumanni? paragraph_1_html: |- - OpenStreetMap havi tanti risorsi pi’ nzignàrisi comu funziona u pruggettu, pi’ fari dumanni e dari risposti, - e pi’ discùtiri d’argumenti chi’ riguàrdunu a mappatura e ducumintàrili in cullabburazzioni. - <a href='%{help_url}'>Poi truvari ajutu cca</a>. - start_mapping: Accumencia a’ mappari + OpenStreetMap havi tanti risorsi pi nzignàrisi comu funziona lu pruggettu, pi fari addumannati e dari arrispunnuti, + e pi discùtiri d'argumenti c'arriguàrdanu la mappatura e ducumintàrili n cullabburazzioni. + <a href='%{help_url}'>Poi attruvari aiutu ccà</a>. + start_mapping: Accumenza a mappari add_a_note: - title: Nun hai tempu pi’ fari canciamenti? Allura agghiunci na nota! + title: Nun hai tempu pi fari canciamenti? Allura agghiunci na nota! paragraph_1_html: |- - Si’ voi sulamenti cunsata quarchi’ cosa picciriḍḍa, e nun hai u tempu pi’ scrìviriti e nzignàriti a’ mappari, è - cchiu’ fàcili lassari na nota. + Si voi sulamenti cunzata quarchi cosa piccidda, e nun hai lu tempu pi scrivìriti e nzignàriti a mappari, è + cchiù fàcili lassari na nota. paragraph_2_html: |- - Basta chi’ vai <a href='%{map_url}'>supra â cartina</a> e clicchi a cona dâ nota: - <span class='icon note'></span>. A’ sta manera s’agghiunci un signali supra â cartina, e u poi spustari strascinànnulu. Agghiunci u to missàggiu, clicca sarva, e a stu puntu l’autri mappatura darannu n’occhiata. + Abbasta chi vai <a href='%{map_url}'>supra â cartina</a> e clicchi la cona dâ nota: + <span class='icon note'></span>. Di sta manera s'agghiunci un signali supra â cartina, e lu poi spustari strascinànnulu. Agghiunci lu tò missaggiu, clicca sarva, e a stu puntu l'àutri mappatura dùnanu n'occhiata. fixthemap: - title: Signalari prubblemi / Cunsari a cartina + title: Assignalari prubblemi / Cunzari la cartina how_to_help: - title: Comu ajutari + title: Comu aiutari join_the_community: title: Tràsiri ntâ cumunità - explanation_html: Si’ t’accurgisti chi’ cc’è quarchi’ prubblema ntê dati dâ - nostra cartina, ad esempiu manca na strata o puru u to nnirizzu è sbagghiatu, - a megghiu cosa di fari è di scrìviriti ntâ cumunità di OpenStreetMap e agghiùnciri - o cunsari i dati tu stissu. + explanation_html: Si t'addunasti chi c'è quarchi prubblema ntê dati dâ nostra + cartina, p'esempiu c'ammanca na strata o puru ca lu tò nnirizzu è sbagghiatu, + la megghiu cosa di fari è di scrivìriti ntâ cumunità d'OpenStreetMap e d'agghiùnciri + o cunzari li dati tu stissu. add_a_note: instructions_html: |- - Basta chi’ clicchi <a class='icon note'></a> o puru a stissa cona ntâ carta. - Facennu accussì si piazza un signali supra â carta, chi’ si po’ spustari strascinannulu. - S’agghiunci nu propiu missaggiu, ppoi si clicca «sarva», e l’autri mappatura taliirannu a situazzioni. + Abbasta chi clicchi <a class='icon note'></a> o puru la stissa cona ntâ carta. + Facennu accussì si piazza un signali supra â carta, chi si pò spustari strascinànnulu. + S'agghiunci nu propiu missaggiu, appoi si clicca «sarva», e l'àutri mappatura talìanu la situazzioni. other_concerns: - title: Autri dubbî - explanation_html: "Si’ hai dubbî a’ prupòsitu di comu vènunu adupirati i nostri - dati, o a’ prupòsitu dî cuntinuti, pi’ favuri cunsulta a nostra \n<a href='/copyright'>pàggina - dû drittu d’auturi</a> p’aviri autri nfurmazzioni ligali, o puru cuntatta - u \n<a href='http://wiki.osmfoundation.org/wiki/Working_Groups'>gruppu di - travagghiu OSMF</a> apprupriatu." + title: Àutri dubbî + explanation_html: "Si hai dubbî a prupòsitu di comu vèninu adupirati li nostri + dati, o a prupòsitu dî cuntinuti, pi favuri cunzurta la nostra \n<a href='/copyright'>pàggina + dû drittu d'auturi</a> p'aviri àutri nfurmazzioni ligali, o puru cuntatta + lu \n<a href='http://wiki.osmfoundation.org/wiki/Working_Groups'>gruppu di + travagghiu OSMF</a> apprupiatu." help_page: - title: Truvari ajutu + title: Attruvari aiutu introduction: |- - OpenStreetMap havi tanti risorsi pi’ nzignàrisi comu funziona u pruggettu, pi’ fari dumanni e dari risposti, - e pi’ discùtiri d’argumenti chi’ riguàrdunu a mappatura e ducumintàrili in cullabburazzioni. + OpenStreetMap havi tanti risorsi pi nzignàrisi comu funziona lu pruggettu, pi fari addumannati e dari arrispunnuti, + e pi discùtiri d'argumenti c'arriguàrdanu la mappatura e ducumintàrili n cullabburazzioni. welcome: url: /welcome - title: Binvinuti nta OSM - description: Accumencia cu’ sta guida ràpida chi’ nzigna i funnamenti di OpenStreetMap. + title: Bimminuti nta OSM + description: Accumenza cu sta guida ràpida chi nzigna li funnamenti d'OpenStreetMap. beginners_guide: url: http://wiki.openstreetmap.org/wiki/IT:Beginners%27_guide title: Guida dî principianti @@ -1168,180 +1173,179 @@ scn: help: url: https://help.openstreetmap.org/ title: help.openstreetmap.org - description: Fai na dumanna o cerca na risposta ntô situ di dumanni e risposti - di OSM. + description: Fai n'addumannata o cerca n'arrispunnuta ntô situ d'addumannati + e arrispunnuti d'OSM. mailing_lists: title: Mailing list - description: Fai dumanni o discuti di questioni ntirissanti ntâ na gamma ampia - di mailing list spicializzati pi’ tema o pi’ riggioni. + description: Fai addumannati o discuti di quistioni ntirissanti nta na gamma + ampia di mailing list spicializzati pi tema o pi riggiuni. forums: title: Forum - description: Dumanni e discussioni pi’ chiḍḍi chi’ prifirìsciunu na ntirfaccia - fatta a’ bacheca. + description: Addumannati e discussioni pi chiddi chi prifirìscinu na ntirfaccia + fatta a bacheca. irc: title: IRC - description: Chat ntirattiva nta tanti lingui e supra a’ tanti argumenti diffirenti. + description: Chat ntirattiva nta tanti lingui e supra a tanti argumenti diffirenti. switch2osm: title: switch2osm - description: Ajutu pi’ mprisi e assuciazzioni chi’ vannu a’ passari ê cartini - e a’ l’autri sirvizzi basati supra a’ OpenStreetMap. + description: Aiutu pi mprisi e assuciazzioni chi vannu a passari ê cartini e + a l'àutri sirvizzi basati supra a OpenStreetMap. wiki: url: http://wiki.openstreetmap.org/ title: wiki.openstreetmap.org - description: Sfogghia â wiki pi’ truvari a ducumintazzioni apprufunnuta di OSM. + description: Sfogghia lu wiki p'attruvari la ducumintazzioni apprufunnuta d'OSM. about_page: next: Appressu - copyright_html: <span>©</span>I cuntribbutura<br>di OpenStreetMap - used_by: '%{name} furnisci i dati giugràfici a’ cintinara di siti web, applicazzioni - mòbbili e apparicchî hardware' + copyright_html: <span>©</span>Li cuntribbutura<br>d'OpenStreetMap + used_by: '%{name} furnisci li dati giogràfici a migghiara di siti web, applicazzioni + mòbbili e apparecchi hardware' lede_text: |- - OpenStreetMap veni custruutu di na cumunità di mappatura chi’ cuntribbuìsciunu e mantènunu dati - chi’ riguàrdunu strati, trazzeri, bar, stazzioni dî treni, e tanti autri cosi, nta tuttu u munnu. + OpenStreetMap veni custruutu di na cumunità di mappatura chi cuntribbuìscinu e mantèninu dati + c'arriguàrdanu strati, trazzeri, bar, stazzioni dî treni, e tanti àutri cosi, nta tuttu lu munnu. local_knowledge_title: Canuscenza lucali - local_knowledge_html: |- - OpenStreetMap metti l’accentu supra â canuscenza lucali. I cuntribbutura adòpirunu mmagini aerii, dispusitivi GPS, accussì comu cartini a’ bascia tecnuluggìa, pi’ virificari chi’ OpenStreetMap - è accuratu e resta aggiurnatu. + local_knowledge_html: OpenStreetMap metti l'accentu supra â canuscenza lucali. + Li cuntribbutura adòpiranu mmàggini aèrii, dispusitivi GPS, accussì comu cartini + a vascia ticnoluggìa, pi virificari chi OpenStreetMap è accuratu e arresta aggiurnatu. community_driven_title: Guidatu dâ cumunità community_driven_html: |- - A cumunità di OpenStreetMap è varia, appassiunata, e crisci ognin jornu. - Tra dî nostri cuntribbutura cci sunnu mappatura entusiasti, prufissiunisti dî GIS, ngigneri chi’ mànnunu avanti i serventi di OSM, vuluntarî chi’ màppunu i zoni afflitti dî disastri, e autri genti ancora. - Pi’ sapiri cchiu’ ssai a’ prupòsitu dâ cumunità, talìa <a href='%{diary_path}'>i diari ill’utenti</a>, - <a href='http://blogs.openstreetmap.org/'>i blog dâ cumunità</a>, e u situ dâ <a href='http://www.osmfoundation.org/'>Funnazzioni OSM</a>. - open_data_title: Dati aperti - open_data_html: 'OpenStreetMap è fattu di <i>dati aperti</i>: si’ lìbbiru d’adupiràrili - pi’ quali mutivu voi voi, finattantu chi’ duni l’attribbuzioni a’ OpenStreetMap - e i so cuntribbutura. Si’ canci i dati o l’adòpiri comu puntu di partenza, u - travagghiu chi’ nni risulta u poi distribbuìri sulu sutta â stissa licenza. - Talìa a <a href=''%{copyright_path}''>pàggina dû drittu d’auturi e dâ licenza</a> + La cumunità d'OpenStreetMap è varia, appassiunata, e crisci ogni jornu. + Tra dî nostri cuntribbutura ci sunnu mappatura entusiasti, prufissiunisti dî GIS, ncigneri chi mànnanu avanti li sirventi di OSM, vuluntarî chi màppanu li zoni afflitti dî disastri, e àutri genti ancora. + Pi sapiri cchiossai a prupòsitu dâ cumunità, talìa <a href='%{diary_path}'>li diari di l'utenti</a>, + <a href='http://blogs.openstreetmap.org/'>li blog dâ cumunità</a>, e lu situ dâ <a href='http://www.osmfoundation.org/'>Funnazzioni OSM</a>. + open_data_title: Dati graputi + open_data_html: 'OpenStreetMap è fattu di <i>dati graputi</i>: sî lìbbiru d''adupiràrili + pi quali mutivu voi voi, finattantu chi duni l''attribbuzzioni a OpenStreetMap + e li sò cuntribbutura. Si canci li dati o l''adòpiri comu puntu di partenza, + lu travagghiu chi nni risurta lu poi distribbuiri sulu sutta â stissa licenza. + Talìa la <a href=''%{copyright_path}''>pàggina dû drittu d''auturi e dâ licenza</a> pî dittagghî.' legal_title: Noti ligali - legal_html: "Stu situ e tanti autri sirvizzî assuciati sunnu gistuti dâ \n<a - href='http://osmfoundation.org/'>Funnazzioni OpenStreetMap</a> (OSMF) \npi’ - cuntu dâ cumunità.\n<br> \nVi prigamu di <a href='http://osmfoundation.org/Contact'>cuntattari - l’OSMF</a> \ns’aviti dumanni o autri prubblemi a’ prupòsitu di licenza, drittu - d’auturi o autri quistioni ligali." + legal_html: "Stu situ e tanti àutri sirvizzî assuciati sunnu gistuti dâ \n<a + href='http://osmfoundation.org/'>Funnazzioni OpenStreetMap</a> (OSMF) \npi cuntu + dâ cumunità.\n<br> \nVi prigamu di <a href='http://osmfoundation.org/Contact'>cuntattari + l'OSMF</a> \nsi aviti addumannati o àutri prubblemi a prupòsitu di licenza, + drittu d'auturi o àutri quistioni ligali." partners_title: Cullabburatura notifier: diary_comment_notification: - subject: '[OpenStreetMap] %{user} cummintau na vuci dû to diariu' + subject: '[OpenStreetMap] %{user} cummintau na vuci dû tò diariu' hi: Salutamu %{to_user}, - header: '%{from_user} cummintau na vuci recenti dû to diariu di OpenStreetMap - chi’ havi oggettu %{subject}:' - footer: Poi puru lèggiri u cummentu nta %{readurl} e poi cummintari di %{commenturl} - o puru rispùnniri di %{replyurl} + header: '%{from_user} cummintau na vuci ricenti dû tò diariu di OpenStreetMap + chi havi oggettu %{subject}:' + footer: Poi puru lèggiri lu cummentu nta %{readurl} e poi cummintari di %{commenturl} + o puru arrispùnniri di %{replyurl} message_notification: hi: Salutamu %{to_user}, - header: '%{from_user} ti mannàu pi’ menzu di OpenStreetMap nu missaggiu cu’ - l’oggettu %{subject}:' - footer_html: Poi lèggiri u missaggiu macari nta %{readurl} e cci poi rispùnniri + header: '%{from_user} ti mannau pi menzu d''OpenStreetMap nu missaggiu cu l''oggettu + %{subject}:' + footer_html: Poi lèggiri lu missaggiu macari nta %{readurl} e ci poi arrispùnniri di %{replyurl} friend_notification: - subject: '[OpenStreetMap] %{user} t’agghiuncìu comu amicu' - had_added_you: '%{user} t’agghiuncìu comu amicu nta OpenStreetMap.' - see_their_profile: Poi taliari u so prufilu nta %{userurl}. - befriend_them: U poi macari agghiùnciri comu amicu nta %{befriendurl}. + subject: '[OpenStreetMap] %{user} t''agghiuncìu comu amicu' + had_added_you: '%{user} t''agghiuncìu comu amicu nta OpenStreetMap.' + see_their_profile: Poi taliari lu sò prufilu nta %{userurl}. + befriend_them: Lu poi macari agghiùnciri comu amicu nta %{befriendurl}. gpx_notification: greeting: Salutamu, - your_gpx_file: Parirìa ch’u to file GPX - with_description: cu’ discrizzioni - and_the_tags: 'e st’etichetti cca:' - and_no_tags: e senza nuḍḍa etichetta. + your_gpx_file: Assimigghia ô tò file GPX + with_description: cu discrizzioni + and_the_tags: 'e st''etichetti ccà:' + and_no_tags: e senza nudda etichetta. failure: - subject: '[OpenStreetMap] Mpurtazzioni GPX nun rinisciuta' - failed_to_import: 'nun riniscìu a’ èssiri mpurtatu. Cca cc’è l’erruri:' - more_info_1: Autri nfurmazzioni a’ prupòsitu ill’erruri di mpurtazzioni GPX - e di comu fari pi’ evitàrili - more_info_2: 'si ponnu truvari nta:' + subject: '[OpenStreetMap] Mpurtazzioni GPX nun arrinisciuta' + failed_to_import: 'nun arriniscìu a èssiri mpurtatu. Ccà c''è l''erruri:' + more_info_1: Àutri nfurmazzioni a prupòsitu di l'erruri di mpurtazzioni GPX + e di comu fari p'evitàrili + more_info_2: 'si ponnu attruvari nta:' success: - subject: '[OpenStreetMap] Mpurtazzioni GPX rinisciuta' - loaded_successfully: fu’ carricatu bonu cu’ %{trace_points} dî %{possible_points} + subject: '[OpenStreetMap] Mpurtazzioni GPX arrinisciuta' + loaded_successfully: fu carricatu bonu cu %{trace_points} dî %{possible_points} punti pussìbbili. signup_confirm: - subject: '[OpenStreetMap] Binvinutu nta OpenStreetMap' - greeting: A’ tia! - created: Quarchidunu (speramu chi’ fusti tu) criàu ora ora un cuntu nta %{site_url}. - confirm: 'Avanti chi’ facemu chiḍḍu chi’ è jè, nni giuva a cunfirma chi’ sta - richiesta vinni di tia; pi’ ciò, s’i cosi stannu accussì, pi’ favuri clicca - u culligamentu ccassutta pi’ cunfirmari u to cuntu:' - welcome: U forti chi’ hai cunfirmatu u to cuntu, ti furnemu autri nfurmazzioni - pi’ spiegàriti comu s’accumencia. + subject: '[OpenStreetMap] Bimminutu nta OpenStreetMap' + greeting: A tìa! + created: Quarchidunu (spiramu chi fusti tu) criau ora ora un cuntu nta %{site_url}. + confirm: 'Avanti chi facemu zocchegghiè, n''aggiuva la cunferma chi st''addumannata + vinni di tìa; pi chistu, si li cosi stannu accussì, pi favuri clicca lu culligamentu + ccassutta pi cunfirmari lu tò cuntu:' + welcome: Lu forti chi cunfirmasti lu tò cuntu, ti furnemu àutri nfurmazzioni + pi spigàriti comu s'accumenza. email_confirm: - subject: '[OpenStreetMap] Cunfirma u to nnirizzu di posta elittrònica' + subject: '[OpenStreetMap] Cunferma lu tò nnirizzu di posta elittrònica' email_confirm_plain: greeting: Salutamu, - hopefully_you: Quarchidunu (speramu chi’ fusti tu) vurrìa canciari u so nnirizzu + hopefully_you: Quarchidunu (spiramu chi fusti tu) vurrìa canciari lu sò nnirizzu di posta elittrònica nta %{server_url} mittennu comu nnirizzu novu %{new_address}. - click_the_link: Si’ fusti tu, pi’ favuri clicca u culligamentu ccassutta pi’ - cunfirmari stu canciamentu. + click_the_link: Si fusti tu, pi favuri clicca lu culligamentu ccassutta pi cunfirmari + stu canciamentu. email_confirm_html: greeting: Salutamu, - hopefully_you: Quarchidunu (speramu chi’ fusti tu) vurrìa canciari u so nnirizzu + hopefully_you: Quarchidunu (spiramu chi fusti tu) vurrìa canciari lu sò nnirizzu di posta elittrònica nta %{server_url} mittennu comu nnirizzu novu %{new_address}. - click_the_link: Si’ fusti tu, pi’ favuri clicca u culligamentu ccassutta pi’ - cunfirmari stu canciamentu. + click_the_link: Si fusti tu, pi favuri clicca lu culligamentu ccassutta pi cunfirmari + stu canciamentu. lost_password: - subject: '[OpenStreetMap] Richiesta d’azziramentu dâ palora d’òrdini' + subject: '[OpenStreetMap] Addumannata d''azziramentu dâ palora d''òrdini' lost_password_plain: greeting: Salutamu, - hopefully_you: Quarchidunu (speramu chi’ fusti tu) dumannàu d’azzirari a palora - d’òrdini dû cuntu di openstreetmap.org assuciatu a’ stu nnirizzu di posta - elittrònica. - click_the_link: Si’ fusti tu, pi’ favuri clicca u culligamentu cassutta p’azzirari - a to palora d’òrdini. + hopefully_you: Quarchidunu (spiramu chi fusti tu) addumannau d'azzirari la palora + d'òrdini dû cuntu d'openstreetmap.org assuciatu a stu nnirizzu di posta elittrònica. + click_the_link: Si fusti tu, pi favuri clicca lu culligamentu ccassutta p'azzirari + la tò palora d'òrdini. lost_password_html: greeting: Salutamu, - hopefully_you: Quarchidunu (speramu chi’ fusti tu) dumannàu d’azzirari a palora - d’òrdini dû cuntu di openstreetmap.org assuciatu a’ stu nnirizzu di posta - elittrònica. - click_the_link: Si’ fusti tu, pi’ favuri clicca u culligamentu cassutta p’azzirari - a to palora d’òrdini. + hopefully_you: Quarchidunu (spiramu chi fusti tu) addumannau d'azzirari la palora + d'òrdini dû cuntu d'openstreetmap.org assuciatu a stu nnirizzu di posta elittrònica. + click_the_link: Si fusti tu, pi favuri clicca lu culligamentu ccà sutta p'azzirari + la tò palora d'òrdini. note_comment_notification: anonymous: N’utenti anònimu greeting: Salutamu, commented: - subject_own: '[OpenStreetMap] %{commenter} lassau nu cummentu nta una dî to + subject_own: '[OpenStreetMap] %{commenter} lassau nu cummentu nta una dî tò noti' subject_other: '[OpenStreetMap] %{commenter} lassau nu cummentu nta una dî - noti chi’ ti ntirèssunu' - your_note: '%{commenter} lassàu nu cummentu supra a’ una dî to noti dâ cartina - chi’ si trova vicinu a’ %{place}.' - commented_note: '%{commenter} lassàu nu cummentu supra a na nota dâ cartina - unni tu hai cummintatu macari. A nota si trova vicinu a’ %{place}.' + noti chi ti ntirèssanu' + your_note: '%{commenter} lassau nu cummentu supra a una dî tò noti dâ cartina + chi s''attrova vicinu a %{place}.' + commented_note: '%{commenter} lassau nu cummentu supra a na nota dâ cartina + unni tu cummintasti macari. La nota s''attrova vicinu a %{place}.' closed: - subject_own: '[OpenStreetMap] %{commenter} risulvìu una dî to noti' - subject_other: '[OpenStreetMap] %{commenter} risulvìu una dî noti chi’ ti - ntirèssunu' - your_note: '%{commenter} risulvìu una dî to noti chi’ si trova vicinu a’ %{place}.' - commented_note: '%{commenter} risulvìu na nota dâ cartina unni tu hai cummintatu. - A nota si trova vicinu a’ %{place}.' + subject_own: '[OpenStreetMap] %{commenter} arrisurvìu una dî tò noti' + subject_other: '[OpenStreetMap] %{commenter} arrisurvìu una dî noti chi ti + ntirèssanu' + your_note: '%{commenter} arrisurvìu una dî tò noti chi s''attrova vicinu a + %{place}.' + commented_note: '%{commenter} arrisurvìu na nota dâ cartina unni tu cummintasti. + La nota s''attrova vicinu a %{place}.' reopened: - subject_own: '[OpenStreetMap] %{commenter} attivàu n’autra vota una dî to + subject_own: '[OpenStreetMap] %{commenter} attivau n''àutra vota una dî tò noti' - subject_other: '[OpenStreetMap] %{commenter} attivàu n’autra vota una dî noti - chi’ ti ntirèssunu' - your_note: '%{commenter} attivàu n’autra vota una dî to noti dâ cartina chi’ - si trova vicinu a’ %{place}.' - commented_note: '%{commenter} attivàu n’autra vota na nota dâ cartina unni - tu hai cummintatu. A nota si trova vicinu a’ %{place}.' - details: Poi truvari autri dittagghî di sta nota nta %{url}. + subject_other: '[OpenStreetMap] %{commenter} attivau n''àutra vota una dî + noti chi ti ntirèssanu' + your_note: '%{commenter} attivau n''àutra vota una dî tò noti dâ cartina chi + s''attrova vicinu a %{place}.' + commented_note: '%{commenter} attivau n''àutra vota na nota dâ cartina unni + tu cummintasti. La nota s''attrova vicinu a %{place}.' + details: Poi attruvari àutri dittagghî di sta nota nta %{url}. changeset_comment_notification: greeting: Salutamu, commented: - subject_own: '[OpenStreetMap] %{commenter} cummintàu unu dî to gruppa di canciamenti' - subject_other: '[OpenStreetMap] %{commenter} cummintàu unu dî gruppa di canciamenti - chi’ ti ntirèssunu' - your_changeset: '%{commenter} lassàu nu cummentu nta unu dî to gruppa di canciamenti - criatu u %{time}' - commented_changeset: '%{commenter} lassàu nu cummentu ntôn gruppu di canciamenti - dâ cartina chi’ tu stai taliannu, criatu di %{changeset_author} u %{time}' + subject_own: '[OpenStreetMap] %{commenter} cummintau unu dî tò gruppa di canciamenti' + subject_other: '[OpenStreetMap] %{commenter} cummintau unu dî gruppa di canciamenti + chi ti ntirèssanu' + your_changeset: '%{commenter} lassau nu cummentu nta unu dî tò gruppa di canciamenti + criatu lu %{time}' + commented_changeset: '%{commenter} lassau nu cummentu ntôn gruppu di canciamenti + dâ cartina chi tu stai taliannu, criatu di %{changeset_author} lu %{time}' partial_changeset_with_comment: cû cummentu «%{changeset_comment}» partial_changeset_without_comment: senza cummentu - details: Si ponnu truvari autri dittagghî a’ prupòsitu di stu gruppu di canciamenti + details: Si ponnu attruvari àutri dittagghî a prupòsitu di stu gruppu di canciamenti nta %{url}. message: inbox: - title: Posta rrivata - my_inbox: A me posta rrivata + title: Posta arrivata + my_inbox: La mè posta arrivata outbox: posta mannata messages: Hai %{new_messages} e %{old_messages} new_messages: @@ -1353,58 +1357,57 @@ scn: from: Di subject: Oggettu date: Data - no_messages_yet: Ancora nun hai nuḍḍu missaggiu. Picchì nun fai canuscenza cu’ + no_messages_yet: Ancora nun hai nuddu missaggiu. Pirchì nun fai canuscenza cu quarchidunu dî %{people_mapping_nearby_link}? - people_mapping_nearby: mappatura vicinu a’ tia + people_mapping_nearby: mappatura vicinu a tìa message_summary: unread_button: Signa comu di lèggiri - read_button: Signa comu gia’ liggiutu - reply_button: Rispunni + read_button: Signa comu già liggiutu + reply_button: Arrispunni delete_button: Cancella new: title: Manna un missaggiu - send_message_to: Manna un missaggiu novu a’ %{name} + send_message_to: Manna un missaggiu novu a %{name} subject: Oggettu body: Corpu send_button: Manna - back_to_inbox: Ritorna â posta rrivata + back_to_inbox: Arritorna â posta arrivata message_sent: Missaggiu mannatu - limit_exceeded: Hai mannatu un saccu di missaggi nta stu tempu. Pi’ favuri spetta - na picca avanti di pruvari a’ mannàrinni autri. + limit_exceeded: Mannasti un saccu di missaggi nta stu tempu. Pi favuri aspetta + na picca avanti di pruvari a mannàrinni àutri. no_such_message: - title: Nuḍḍu missaggiu accussì - heading: Nuḍḍu missaggiu accussì - body: Purtroppu nun cc’è nuḍḍu missaggiu cu’ ḍḍ’id. + title: Nuddu missaggiu accussì + heading: Nuddu missaggiu accussì + body: Purtroppu nun c'è nuddu missaggiu cu l'id nnicatu. outbox: title: Posta mannata - my_inbox: A me %{inbox_link} - inbox: posta rrivata + my_inbox: La mè %{inbox_link} + inbox: posta arrivata outbox: posta mannata messages: one: Hai %{count} missaggiu mannatu other: Hai %{count} missaggî mannati - to: A’ + to: A subject: Oggettu date: Data - no_sent_messages: Ancora nun hai mannatu nuḍḍu missaggiu. Picchì nun fai canuscenza - cu’ quarchidunu dî %{people_mapping_nearby_link}? - people_mapping_nearby: mappatura vicinu a’ tia + no_sent_messages: Ancora nun mannasti nuddu missaggiu. Pirchì nun fai canuscenza + cu quarchidunu dî %{people_mapping_nearby_link}? + people_mapping_nearby: mappatura vicinu a tìa reply: - wrong_user: Si’ trasutu comu «%{user}» però u missaggiu ô quali vulivi rispùnniri - nun fu’ mannatu a’ ḍḍ’utenti. Pi’ favuri trasi comu l’utenti giustu pi’ putiri - rispùnniri. + wrong_user: Trasisti comu «%{user}» pirò lu missaggiu ô quali vulivi arrispùnniri + nun fu mannatu a dd'utenti. Pi favuri trasi comu l'utenti giustu pi putiri + arrispùnniri. read: - title: Leggi u missaggiu + title: Leggi lu missaggiu from: Di subject: Oggettu date: Data - reply_button: Rispunni + reply_button: Arrispunni unread_button: Signa comu di lèggiri - back: Torna arreti + back: Torna n arreri to: A - wrong_user: Si’ trasutu comu «%{user}» però u missaggiu chi’ vulivi lèggiri - nun fu’ mannatu a’ ḍḍ’utenti. Pi’ favuri trasi comu l’utenti giustu pû putiri - lèggiri. + wrong_user: Trasisti comu «%{user}» pirò lu missaggiu chi vulivi lèggiri nun + fu mannatu a dd'utenti. Pi favuri trasi comu l'utenti giustu pi putiri liggìrilu. sent_message_summary: delete_button: Cancella mark: @@ -1414,49 +1417,48 @@ scn: deleted: Missaggiu cancillatu site: index: - js_1: O stai adupirannu nu browser chi’ nun supporta u JavaScript, o puru hai - u JavaScript disattivatu. - js_2: OpenStreetMap adòpira u JavaScript pâ so cartina scurritura. - permalink: Culligamentu permanenti - shortlink: Culligamentu scurzatu + js_1: O stai adupirannu nu browser chi nun supporta lu JavaScript, o puru hai + lu JavaScript disattivatu. + js_2: OpenStreetMap adòpira lu JavaScript pâ sò cartina scurritura. + permalink: Culligamentu pirmanenti + shortlink: Culligamentu accurzatu createnote: Agghiunci na nota license: - copyright: Copyright OpenStreetMap e i so cuntribbutura, sutta a na licenza - aperta - remote_failed: 'U canciamentu nun riniscìu: assicùriti chi’ JOSM o Merkaartor - sunnu aperti e hannu l’opzioni telicumannu attivata' + copyright: Copyright OpenStreetMap e li sò cuntribbutura, sutta a na licenza + graputa + remote_failed: 'Lu canciamentu nun arriniscìu: assicùrati chi JOSM o Merkaartor + sunnu graputi e hannu l''opzioni telecumannu attivata' edit: - not_public: Nun hai mpustatu i to canciamenti pi’ èssiri pùbblici. - not_public_description: Non poi canciari cchiu’ a cartina nfina a’ quannu nô - fai. Poi mpustari i to canciamenti comu pùbblici dâ to %{user_page}. - user_page_link: pàggina ill’utenti - anon_edits_link_text: Ti spiegamu picchì. - flash_player_required: Ti giuva u Flash player p’adupirari Potlatch, u prugramma - pi’ canciari OpenStreetMap fattu cû Flash. Poi <a href="http://www.adobe.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash">scarricari - u Flash Player di Adobe.com</a>. <a href="http://wiki.openstreetmap.org/wiki/Editing">Cci - sunnu macari autri alternativi</a> pi’ fari canciamenti nta OpenStreetMap. - potlatch_unsaved_changes: Hai canciamenti senza sarvati. (Pi’ sarvari nta Potlatch, - avissi a’ disilizziunari u caminu o u puntu currenti, si’ stai facennu canciamenti - ntâ mudalità diretta, o si’ ll’hai carcari u buttuni «sarva».) - potlatch2_not_configured: Potlatch 2 nun havi statu cunfiguratu - pi’ favuri - talìa http://wiki.openstreetmap.org/wiki/The_Rails_Port#Potlatch_2 p’aviri - nfurmazzioni - potlatch2_unsaved_changes: Hai canciamenti senza sarvati. (Pi’ sarvari nta Potlach - 2, hâ’ carcari «sarva».) - id_not_configured: iD nun havi statu cunfiguratu - no_iframe_support: U to browser nun supporta l’iframe ill’HTML, chi’ sunnu nicissarî - pi’ sta funziunalità. + not_public: Nun mpustasti li tò canciamenti p'èssiri pùbblici. + not_public_description: Nun poi canciari cchiù la cartina nfinu a quannu nun + lu fai. Poi mpustari li tò canciamenti comu pùbblici dâ tò %{user_page}. + user_page_link: pàggina di l'utenti + anon_edits_link_text: Ti spigamu pirchì. + flash_player_required: T'abbisogna lu Flash player p'adupirari Potlatch, lu + prugramma pi canciari OpenStreetMap fattu cû Flash. Poi <a href="http://www.adobe.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash">scarricari + lu Flash Player d'Adobe.com</a>. <a href="http://wiki.openstreetmap.org/wiki/Editing">Ci + sunnu macari àutri altirnativi</a> pi fari canciamenti nta OpenStreetMap. + potlatch_unsaved_changes: Hai canciamenti nun sarvati. (Pi sarvari nta Potlatch, + avissi a disilizziunari lu caminu o lu puntu currenti, si stai facennu canciamenti + ntâ mudalità diretta, o si l'hai, carcari lu buttuni «sarva».) + potlatch2_not_configured: Potlatch 2 fu cunfiguratu - pi favuri talìa http://wiki.openstreetmap.org/wiki/The_Rails_Port#Potlatch_2 + p'aviri nfurmazzioni + potlatch2_unsaved_changes: Hai canciamenti nun sarvati. (Pi sarvari nta Potlach + 2, hai a carcari «sarva».) + id_not_configured: iD nun fu cunfiguratu + no_iframe_support: Lu tò browser nun supporta l'iframe di l'HTML, chi sunnu + nicissarî pi sta funziunalità. sidebar: - search_results: Risultati dâ risciduta + search_results: Risurtati di l'arricerca close: Chiudi search: - search: Risciduta - get_directions: Fatti dari innicazzioni - get_directions_title: Trova innicazzioni pi’ jiri dûn puntu a n’autru + search: Arricerca + get_directions: Fatti dari nnicazzioni + get_directions_title: Attrova nnicazzioni pi jiri di nu puntu a n'àutru from: Di - to: A’ + to: A where_am_i: Unni sugnu? - where_am_i_title: Discrivi a pusizzioni attuali pi’ menzu dûn muturi di risciduta + where_am_i_title: Discrivi la pusizzioni attuali pi menzu di nu muturi d'arricerca submit_text: Vai key: table: @@ -1464,18 +1466,16 @@ scn: motorway: Autustrata trunk: Supirstrata primary: Strata primaria - secondary: Strata secunnaria + secondary: Strata sicunnaria unclassified: Strata senza classificazzioni - unsurfaced: Strata stirrata track: Trazzera - byway: Trazzera - bridleway: Caminu pî cavaḍḍi + bridleway: Caminu pî cavaddi cycleway: Pista ciclàbbili footway: Caminu pidunali rail: Ferruvìa - subway: Metrupulitana + subway: Mitrupulitana tram: - - Metrupulitana liggera + - Mitrupulitana leggia - tram cable: - Funivìa @@ -1488,48 +1488,46 @@ scn: - terminal admin: Cunfini amministrativu forest: Furesta - wood: Boscu + wood: Voscu golf: Campu di golf park: Villa resident: Zona risidinziali - tourist: Attrazzioni turìstica common: - Cumuni - Pratu retail: Zona di nigozzî - industrial: Zona innustriali + industrial: Zona nnustriali commercial: Zona cummirciali heathland: Brughiera lake: - - Lagu - - lagu artificiali + - Lacu + - lacu artificiali farm: Massarìa brownfield: Zona di bunìfica cemetery: Cimiteru - allotments: Territorî agrìculi o ricriativi + allotments: Tirritorî agrìculi o ricriativi pitch: Campu di jocu centre: Centru spurtivu reserve: Riserva naturali military: Zona militari school: - Scola - - Università + - Univirsità building: Edificiu mpurtanti station: Stazzioni dâ ferruvìa summit: - Muntagna - Muntagna - tunnel: Cuntornu trattizzatu = gallarìa - bridge: Cuntornu nirittu = ponti + tunnel: Cuntornu trattiatu = jallarìa + bridge: Cuntornu niurittu = ponti private: Accessu privatu - permissive: Accesso permissivu destination: Sirvitù di passaggiu - construction: Strati in custruzzioni + construction: Strati n custruzzioni richtext_area: edit: Cancia preview: Antiprima markdown_help: - title_html: Testu cu’ <a href="http://daringfireball.net/projects/markdown/">Markdown</a> + title_html: Testu cu <a href="http://daringfireball.net/projects/markdown/">Markdown</a> headings: Ntistazzioni heading: Ntistazzioni subheading: Suttantistazzioni @@ -1540,93 +1538,93 @@ scn: link: Culligamentu text: Testu image: Mmàggini - alt: Testu alternativu + alt: Testu altirnativu url: URL trace: visibility: private: Privata (cunnivisu sulu comu anònimu, òrdini dî punti nun mantinutu) - public: Pùbblica (mmustratu ntâ lista dî tracciati e comu anònimu, òrdini dî + public: Pùbblica (ammustratu ntâ lista dî tracciati e comu anònimu, òrdini dî punti nun mantinutu) - trackable: Tracciàbbili (cunnivisu sulu comu anònimu, punti ordinati e cu’ marchi - tempurali) - identifiable: Idintificàbbili (mmustratu ntâ lista dî tracciati e comu idintificàbbili, - punti ordinati e cu’ marchi tempurali) + trackable: Tracciàbbili (cunnivisu sulu comu anònimu, punti ordinati e cu marchi + timpurali) + identifiable: Idintificàbbili (ammustratu ntâ lista dî tracciati e comu idintificàbbili, + punti ordinati e cu marchi timpurali) create: upload_trace: Càrrica nu tracciatu GPS - trace_uploaded: U to file GPX fu’ carricatu e ora sta spittannu d’èssiri misu - ntâ basi di dati. Sta cosa di sòlitu veni fatta entru na menz’ura, e na vota - ch’u sirvizzu veni spicciatu ti veni mannatu nu missaggiu di posta elittrònica. + trace_uploaded: Lu tò file GPX fu carricatu e ora sta aspittannu d'èssiri misu + ntâ basi di dati. Sta cosa di sòlitu veni fatta intra na menz'ura, e na vota + chi lu sirvizzu veni spicciatu ti veni mannatu nu missaggiu di posta elittrònica. edit: title: Canciamentu dû tracciatu %{name} heading: Canciamentu dû tracciatu %{name} filename: 'Nomu dû file:' download: scàrrica - uploaded_at: 'Carricatu u:' + uploaded_at: 'Carricatu lu:' points: 'Punti:' start_coord: 'Coordinata di principiu:' map: mappa edit: cancia - owner: 'Prupietariu:' + owner: 'Prupitariu:' description: 'Discrizzioni:' tags: 'Etichetti:' tags_help: spartuti câ vìrgula - save_button: Sarva i canciamenti + save_button: Sarva li canciamenti visibility: 'Visibbilità:' - visibility_help: chi’ voli diri? + visibility_help: chi voli diri? trace_form: - upload_gpx: 'Càrrica u file GPX:' + upload_gpx: 'Carricari lu file GPX:' description: 'Discrizzioni:' tags: 'Etichetti:' tags_help: spartuti câ vìrgula visibility: 'Visibbilità:' - visibility_help: chi’ voli diri? + visibility_help: chi voli diri? upload_button: Càrrica - help: Ajutu + help: Guida trace_header: upload_trace: Càrrica nu tracciatu - see_all_traces: Talìa tutti i tracciati - see_your_traces: Talìa i to tracciati + see_all_traces: Talìa tutti li tracciati + see_your_traces: Talìa li tò tracciati traces_waiting: - one: Già hai %{count} tracciatu chi’ si sta’ carricannu. Pi’ favuri cunsìddira - si’ poi spittari chi’ finisci chiḍḍu avanti di carricàrinni autri, accussì - nun blocchi a fila pi’ l’autri utenti. - other: Già hai %{count} tracciati chi’ si stannu carricannu. Pi’ favuri cunsìddira - si’ poi spittari chi’ finisciunu chiḍḍi avanti di carricàrinni autri, accussì - nun blocchi a fila pi’ l’autri utenti. + one: Già hai %{count} tracciatu chi si sta carricannu. Pi favuri cunzìddira + si poi aspittari chi finisci chiddu avanti di carricàrinni àutri, accussì + nun blocchi la fila pi l'àutri utenti. + other: Già hai %{count} tracciati chi si stannu carricannu. Pi favuri cunzìddira + si poi aspittari chi finìscinu chiddi avanti di carricàrinni àutri, accussì + nun blocchi la fila pi l'àutri utenti. trace_optionals: tags: Etichetti view: title: Visioni dû tracciatu %{name} heading: Visioni dû tracciatu %{name} - pending: IN CUDA + pending: N CUDA filename: 'Nomu dû file:' download: scàrrica - uploaded: 'Carricatu u:' + uploaded: 'Carricatu lu:' points: 'Punti:' start_coordinates: 'Coordinata di principiu:' - map: mappa + map: cartina edit: cancia - owner: 'Prupietariu:' + owner: 'Prupitariu:' description: 'Discrizzioni:' tags: 'Etichetti:' - none: Nuḍḍa + none: Nudda edit_track: Cancia stu tracciatu delete_track: Cancella stu tracciatu - trace_not_found: Tracciatu nun truvatu! + trace_not_found: Tracciatu nun attruvatu! visibility: 'Visibbilità:' trace_paging_nav: showing_page: Pàggina %{page} - older: Tracciati cchiu’ vecchî - newer: Tracciati cchiu’ novi + older: Tracciati cchiù vecchî + newer: Tracciati cchiù novi trace: - pending: IN CUDA + pending: N CUDA count_points: '%{count} punti' ago: '%{time_in_words_ago} fa' more: dittagghî - trace_details: Talìa i dittagghî dû tracciatu - view_map: Talìa supra â carta + trace_details: Talìa li dittagghî dû tracciatu + view_map: Talìa lu tracciatu supra dâ cartina edit: cancia - edit_map: Cancia a carta unni stu tracciatu + edit_map: Cancia la cartina unni stu tracciatu public: PÙBBLICA identifiable: IDINTIFICÀBBILI private: PRIVATA @@ -1636,590 +1634,577 @@ scn: map: carta list: public_traces: Tracciati GPS pùbblici - your_traces: I to tracciati GPS + your_traces: Li tò tracciati GPS public_traces_from: Tracciati GPS pùbblici di %{user} - description: Talìa i tracciati GPS carricati di picca tempu - tagged_with: ' etichittati cu’ %{tags}' - empty_html: Ancora nun nn’havi nuḍḍu. <a href='%{upload_link}'>Càrrica nu tracciatu - novu</a>, o puru nfòrmiti cchiu’ ssai a’ prupòsitu dî tracciati GPS nta sta - <a href='http://wiki.openstreetmap.org/wiki/Beginners_Guide_1.2'>pàggina dâ - wiki</a>. + description: Talìa li tracciati GPS carricati di picca tempu + tagged_with: ' etichittati cu %{tags}' + empty_html: Ancora nun nn'havi nuddu. <a href='%{upload_link}'>Càrrica nu tracciatu + novu</a>, o puru nfòrmati cchiossai a prupòsitu dî tracciati GPS nta sta <a + href='http://wiki.openstreetmap.org/wiki/Beginners_Guide_1.2'>pàggina dâ wiki</a>. delete: scheduled_for_deletion: Tracciatu ntâ spittata dâ cancillazzioni make_public: made_public: Tracciatu fattu pùbblicu offline_warning: - message: U sistema di carricamentu dî file GPX pi’ com’ora è fora sirvizziu + message: Lu sistema di carricamentu dî file GPX pi com'ora è fora sirvizziu offline: - heading: Memurizzazzioni dî GPX fora sirvizziu - message: U sistema di mimurizzazzioni e carricamentu dî file GPX pi’ com’ora + heading: Mimurizzazzioni dî GPX fora sirvizziu + message: Lu sistema di mimurizzazzioni e carricamentu dî file GPX pi com'ora è fora sirvizziu. georss: - title: Tracciati GPS di OpenStreetMap + title: Tracciati GPS d'OpenStreetMap description: description_with_count: - one: File GPX cu’ %{count} punti di %{user} - other: File GPX cu’ %{count} punti di %{user} + one: File GPX cu %{count} punti di %{user} + other: File GPX cu %{count} punti di %{user} description_without_count: File GPX di %{user} application: require_cookies: - cookies_needed: Pari chi’ hai i cookie disattivati; pi’ favuri attìvili ntô - to browser prima chi’ cuntinui. + cookies_needed: Pari chi hai li cookie disattivati; pi favuri attìvali ntô tò + browser prima chi cuntìnui. require_moderator: - not_a_moderator: Hâ’ jèssiri nu mudiraturi pi’ fari st’opirazzioni. + not_a_moderator: Hai a èssiri nu mudiraturi pi fari st'opirazzioni. setup_user_auth: - blocked: Fu’ bluccatu u to accessu a’ l’API. Pi’ favuri trasi via web pi’ sapìrinni - cchiu’ ssai. - need_to_see_terms: Fu’ suspinnutu timpuraniamenti u to accessu a’ l’API. Pi’ - favuri trasi dû situ pi’ taliari i cunnizzioni di cuntribbuzioni. Nun ll’hâ’ - accittari pi’ forza, però ll’hâ’ taliari. + blocked: Fu bluccatu lu tò accessu a l’API. Pi favuri trasi via web pi sapìrinni + cchiossai. + need_to_see_terms: Fu suspinnutu timpuraniamenti lu tò accessu a l'API. Pi favuri + trasi dû situ pi taliari li cunnizzioni di cuntribbuzzioni. Nun l'hai a accittari + pi forza, pirò l'hai a taliari. oauth: oauthorize: - title: Auturizzari l’accessu ô to cuntu - request_access: L’applicazzioni %{app_name} dumanna accessu ô to cuntu, %{user}. - Pi’ favuri cuntrolla si’ ti piaci chi’ l’applicazzioni havi accessu a’ sti - funziunalità. Poi scègghîri chiḍḍi chi’ voi, a’ to piaciri. - allow_to: 'Duna a’ l’applicazzioni clienti u pirmissu di:' - allow_read_prefs: lèggiri i mpustazzioni dû to utenti. - allow_write_prefs: canciari i mpustazzioni dû to utenti. + title: Auturizzari l'accessu ô tò cuntu + request_access: L'applicazzioni %{app_name} addumanna l'accessu ô tò cuntu, + %{user}. Pi favuri cuntrolla si ti piaci chi l'applicazzioni havi accessu + a sti funziunalità. Poi scègghiri chiddi chi voi, a tò piaciri. + allow_to: 'Duna a l''applicazzioni clienti lu pirmissu di:' + allow_read_prefs: lèggiri li mpustazzioni d'utenti. + allow_write_prefs: canciari li mpustazzioni d'utenti. allow_write_diary: criari vuci dû diariu e cummenti, e fari amici. - allow_write_api: canciari a cartina. - allow_read_gpx: lèggiri i to tracciati GPS privati. - allow_write_gpx: carricari i tracciati GPS. - allow_write_notes: canciari i noti. + allow_write_api: canciari la cartina. + allow_read_gpx: lèggiri li tò tracciati GPS privati. + allow_write_gpx: carricari li tracciati GPS. + allow_write_notes: canciari li noti. + grant_access: Duna l’accessu oauthorize_success: - title: Richiesta di auturizzazzioni cunciduta - allowed: Cuncidisti l’accessu ô to cuntu a’ l’applicazzioni %{app_name}. - verification: U còdici di virifica è %{code}. + title: Addumannata d'auturizzazzioni cunciduta + allowed: Cuncidisti l'accessu ô tò cuntu a l'applicazzioni %{app_name}. + verification: Lu còdici di virìfica è %{code}. oauthorize_failure: - title: Richiesta di auturizzazzioni nigata - denied: Nigasti l’accessu ô to cuntu a’ l’applicazzioni %{app_name}. - invalid: U token di auturizzazzioni nun è bonu. + title: Addumannata d'auturizzazzioni nigata + denied: Nijasti l'accessu ô tò cuntu a l'applicazzioni %{app_name}. + invalid: Lu token d'auturizzazzioni nun è bonu. revoke: - flash: Rivucasti u lassa-passari pi’ %{application} + flash: Arrivucasti lu lassa-passari pi %{application} oauth_clients: new: - title: Riggistrazzioni di n’applicazzioni nova - submit: Riggìstra + title: Riggistrazzioni di n'applicazzioni nova + submit: Riggistra edit: - title: Cancia a to applicazzioni + title: Cancia la tò applicazzioni submit: Cancia show: - title: Dittagghî di OAuth pi’ %{app_name} + title: Dittagghî d'OAuth pi %{app_name} key: 'Consumer Key:' secret: 'Consumer Secret:' url: 'URL pû Request Token:' - access_url: 'URL pi’ l’Access Token:' - authorize_url: 'URL di auturizzazzioni:' - support_notice: Suppurtamu i firmi HMAC-SHA1 (cunsigghiati) e RSA-SHA1. - edit: Cancia i dittagghî + access_url: 'URL pi l''Access Token:' + authorize_url: 'URL d''auturizzazzioni:' + support_notice: Suppurtamu li firmi HMAC-SHA1 (cunzigghiati) e RSA-SHA1. + edit: Cancia li dittagghî delete: Cancella stu clienti - confirm: Si’ sicuru? - requests: 'Dumanna a’ l’utenti sti pirmissi:' - allow_read_prefs: lèggiri i so mpustazzioni ill’utenti. - allow_write_prefs: canciari i so mpustazzioni ill’utenti. + confirm: Sî sicuru? + requests: 'Addumanna a l''utenti sti pirmissi:' + allow_read_prefs: lèggiri li sò mpustazzioni di l'utenti. + allow_write_prefs: canciari li sò mpustazzioni di l'utenti. allow_write_diary: criari vuci dû diariu e cummenti, e fari amici. - allow_write_api: canciari a carta. - allow_read_gpx: lèggiri i so tracciati GPS privati. - allow_write_gpx: carricari i tracciati GPS. - allow_write_notes: canciari i noti. + allow_write_api: canciari la carta. + allow_read_gpx: lèggiri li sò tracciati GPS privati. + allow_write_gpx: carricari li tracciati GPS. + allow_write_notes: canciari li noti. index: - title: I me dittagghî OAuth - my_tokens: I me applicazzioni auturizzati - list_tokens: 'A’ l’applicazzioni furu assignati sti lassa-passari a’ nomu toi:' - application: Nomu ill’applicazzioni - issued_at: Cuncidutu in data + title: Li mè dittagghî OAuth + my_tokens: Li mè applicazzioni auturizzati + list_tokens: 'A l''applicazzioni foru assignati sti lassa-passari a nomu tò:' + application: Nomu di l'applicazzioni + issued_at: Cuncidutu n data revoke: Rèvuca! - my_apps: I me applicazzioni clienti - no_apps: Hai n’applicazzzioni chi’ vulissi riggistrari unni nui adupirannu u - standard %{oauth}? A to applicazzioni web s’havi a’ riggistrari prima chi’ - po’ fari richiesti OAuth unni stu sirvizziu. - registered_apps: 'Hai riggistrati st’applicazzioni clienti:' - register_new: Riggistra a to applicazzioni + my_apps: Li mè applicazzioni clienti + no_apps: Hai n'applicazzzioni chi vulissi riggistrari p'usàrila cu nuàutri adupirannu + lu standard %{oauth}? La tò applicazzioni web s'havi a riggistrari prima chi + poi fari addumannati OAuth unni stu sirvizziu. + registered_apps: 'Hai riggistrati st''applicazzioni clienti:' + register_new: Riggistra la tò applicazzioni form: name: Nomu required: Obbligatoriu - url: URL principali ill’applicazzioni + url: URL principali di l'applicazzioni callback_url: URL di callback - support_url: URL ill’assistenza - requests: 'Dumanna a’ l’utenti sti pirmissi:' - allow_read_prefs: lèggiri i so mpustazzioni ill’utenti. - allow_write_prefs: canciari i so mpustazzioni ill’utenti. + support_url: URL di l'assistenza + requests: 'Addumanna a l''utenti sti pirmissi:' + allow_read_prefs: lèggiri li sò mpustazzioni di l'utenti. + allow_write_prefs: canciari li sò mpustazzioni di l'utenti. allow_write_diary: criari vuci dû diariu e cummenti, e fari amici. - allow_write_api: canciari a carta. - allow_read_gpx: lèggiri i so tracciati GPS privati. - allow_write_gpx: carricari i tracciati GPS. - allow_write_notes: canciari i noti. + allow_write_api: canciari la carta. + allow_read_gpx: lèggiri li sò tracciati GPS privati. + allow_write_gpx: carricari li tracciati GPS. + allow_write_notes: canciari li noti. not_found: - sorry: Purtroppu ḍḍu %{type} nun si potti truvari. + sorry: Purtroppu ddu %{type} nun si potti attruvari. create: flash: Nfurmazzioni riggistrati boni update: - flash: I nfurmazzioni dû clienti furu aggiurnati boni + flash: Li nfurmazzioni dû clienti foru aggiurnati boni destroy: - flash: Fu’ distruggiuta a riggistrazzioni ill’applicazzioni clienti + flash: Fu distruiuta la riggistrazzioni di l'applicazzioni clienti user: login: title: Trasi heading: Trasi email or username: 'Nnirizzu di posta elittrònica o nomu utenti:' - password: 'Palora d’òrdini:' + password: 'Palora d''òrdini:' openid: '%{logo} OpenID:' - remember: Ricòrditi i mia - lost password link: Pirdisti a to palora d’òrdini? + remember: Arricòrdati di mìa + lost password link: Pirdisti la tò palora d'òrdini? login_button: Trasi register now: Scrìviti ora - with username: 'Già hai un cuntu di OpenStreetMap? Pi’ favuri trasi cû to nomu - utenti e palora d’òrdini:' - with external: 'O puru, trasi pi’ menzu di na terza parti:' - new to osm: Si’ novu nta OpenStreetMap? - to make changes: Pi’ fari canciamenti ntê dati di OpenStreetMap, prima hâ’ aviri + with username: 'Già hai un cuntu d''OpenStreetMap? Pi favuri trasi cû tò nomu + utenti e palora d''òrdini:' + with external: 'O puru, trasi pi menzu di na terza parti:' + new to osm: Sî novu nta OpenStreetMap? + to make changes: Pi fari canciamenti ntê dati d'OpenStreetMap, prima hai a aviri un cuntu. - create account minute: Crìa un cuntu. Cci voli sulu un minutu. + create account minute: Crea un cuntu. Ci voli sulu un minutu. no account: Nun hai un cuntu? - account not active: Purtroppu u to cuntu ancora nun è attivatu.<br />P’attivàrulu, - pi’ favuri adòpira u culligamentu chi’ ti rrivàu ntô missaggiu di posta elittrònica - di cunfirma, o puru <a href="%{reconfirm}">dumanna chi’ ti mànnunu n’autru - missaggiu di cunfirma</a>. - account is suspended: Purtroppu u to cuntu fu’ suspinnutu pi’ causa di attività - suspetti.<br/>Pi’ favuri cuntatta <a href="%{webmaster}">u webmaster</a> si’ + account not active: Purtroppu lu tò cuntu ancora nun è attivatu.<br />P'attivàrilu, + pi favuri adòpira lu culligamentu chi t'arrivau ntô missaggiu di posta elittrònica + di cunferma, o puru <a href="%{reconfirm}">addumanna chi ti mànnanu n'àutru + missaggiu di cunferma</a>. + account is suspended: Purtroppu lu tò cuntu fu suspinnutu pi càusa d'attività + suspetti.<br/>Pi favuri cuntatta <a href="%{webmaster}">lu webmaster</a> si nni voi discùtiri. - auth failure: Purtroppu nun fu’ pussìbili tràsiri cu’ sti dittagghî. - openid_logo_alt: Trasi cu n’OpenID + auth failure: Purtroppu nun fu pussìbbili tràsiri cu sti dittagghî. + openid_logo_alt: Trasi cu n'OpenID auth_providers: openid: - title: Trasi cu n’OpenID - alt: Trasi cu n’URL OpenID + title: Trasi cu n'OpenID + alt: Trasi cu n'URL OpenID google: - title: Trasi cu’ Google - alt: Trasi cu n’OpenID di Google + title: Trasi cu Google + alt: Trasi cu n'OpenID di Google facebook: - title: Trasi cu’ Facebook + title: Trasi cu Facebook alt: Trasi cûn cuntu di Facebook windowslive: - title: Trasi cu’ Windows Live + title: Trasi cu Windows Live alt: Trasi cûn cuntu di Windows Live yahoo: - title: Trasi cu’ Yahoo - alt: Trasi cu n’OpenID di Yahoo + title: Trasi cu Yahoo + alt: Trasi cu n'OpenID di Yahoo wordpress: - title: Trasi cu’ Wordpress - alt: Trasi cu n’OpenID di Wordpress + title: Trasi cu Wordpress + alt: Trasi cu n'OpenID di Wordpress aol: - title: Trasi cu’ AOL - alt: Trasi cu n’OpenID di AOL + title: Trasi cu AOL + alt: Trasi cu n'OpenID d'AOL logout: title: Nesci - heading: Nesci di OpenStreetMap + heading: Nesci d'OpenStreetMap logout_button: Nesci lost_password: - title: Palora d’òrdini pirduta - heading: Ti scurdasti a palora d’òrdini? + title: Palora d'òrdini pirduta + heading: Ti scurdasti la palora d'òrdini? email address: 'Nnirizzu di posta elittrònica:' - new password button: Azzera a palora d’òrdini - help_text: Scrivi u nnirizzu di posta elittrònica ch’adupirasti quannu ti scrivisti, - e cci manniremu nu culligamentu chi’ purrai adupirari p’azzirari a to palora - d’òrdini. - notice email on way: Nni dispiaci ch’a pirdisti :-( però ti sta rrivannu nu - missaggiu di posta elittrònica pi’ menzu dû quali prestu a purrai azzirari. - notice email cannot find: Putroppu nun si trova stu nnirizzu di posta elittrònica. + new password button: Azzera la palora d'òrdini + help_text: Scrivi lu nnirizzu di posta elittrònica c'adupirasti quannu ti scrivisti, + e ci mannamu nu culligamentu chi poi adupirari p'azzirari la tò palora d'òrdini. + notice email on way: Ni dispiaci chi la pirdisti :-( pirò ti sta arrivannu nu + missaggiu di posta elittrònica pi menzu dû quali prestu la poi azzirari. + notice email cannot find: Putroppu nun s'attrova stu nnirizzu di posta elittrònica. reset_password: - title: Azzera a palora d’òrdini - heading: Azziramentu dâ palora d’òrdini di %{user} - password: 'Palora d’òrdini:' - confirm password: 'Cunfirma a palora d’òrdini:' - reset: Azzera a palora d’òrdini - flash changed: A to palora d’òrdini fu’ canciata. - flash token bad: Stu còdici nun si trova, picchì nun cuntrolli l’URL? + title: Azzera la palora d'òrdini + heading: Azziramentu dâ palora d'òrdini di %{user} + password: 'Palora d''òrdini:' + confirm password: 'Cunferma la palora d''òrdini:' + reset: Azzera la palora d'òrdini + flash changed: La tò palora d'òrdini fu canciata. + flash token bad: Stu còdici nun s'attrova, pirchì nun cuntrolli l'URL? new: title: Scrìviti - no_auto_account_create: Purtroppu comu ad ora nun semu n gradu di criàriti un + no_auto_account_create: Purtroppu comu a ora nun semu n gradu di criàriti un cuntu di manera autumàtica. - contact_webmaster: Pi’ favuri cuntatta ô <a href="mailto:webmaster@openstreetmap.org">webmaster</a> - pi’ fàriti criari un cuntu; pruviremu a’ pigghiari a’ cunsiddirazzioni a to - richiesta nta cchiu’ picca tempu pussìbbili. + contact_webmaster: Pi favuri cuntatta ô <a href="%{webmaster}">webmaster</a> + pi fàriti criari un cuntu; pruvamu a pigghiari a cunziddirazzioni la tò addumannata + nta cchiù picca tempu pussìbbili. about: header: Lìbbira e canciàbbili html: |- - <p>A’ diffirenza di autri cartini, OpenStreetMap è criata cumplitamenti di genti comu a’ tia, - e tutti sunnu lìbbiri di cunsàrila, aggiurnàrila, scarricàrila e adupiràrila.</p> - <p>Scrìviti p’accuminciari a’ dari u to cuntribbutu. Ti manniremu nu missaggiu di posta elittrònica pi’ cunfirmari u to cuntu.</p> - license_agreement: Quannu cunfirmi u to cuntu hâ’ accittari i <a href="http://www.osmfoundation.org/wiki/License/Contributor_Terms">cunnizziuni + <p>A diffirenza d'àutri cartini, OpenStreetMap è criata cumpletamenti di genti comu a tìa, + e tutti sunnu lìbbiri di cunzàrila, aggiurnàrila, scarricàrila e adupiràrila.</p> + <p>Scrìviti p'accuminzari a dari lu tò cuntribbutu. Ti mannamu nu missaggiu di posta elittrònica pi cunfirmari lu tò cuntu.</p> + license_agreement: Quannu cunfermi lu tò cuntu hai a accittari li <a href="http://www.osmfoundation.org/wiki/License/Contributor_Terms">cunnizzioni di cuntribbuzzioni</a>. email address: 'Nnirizzu di posta elittrònica:' - confirm email address: 'Cunfirma u nnirizzu di posta elittrònica:' - not displayed publicly: Nun veni mmustratu pubblicamenti (talìa <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" - title="wiki privacy policy including section on email addresses">a pulitica + confirm email address: 'Cunferma lu nnirizzu di posta elittrònica:' + not displayed publicly: Nun veni ammustratu pubblicamenti (talìa <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" + title="wiki privacy policy including section on email addresses">la pulìtica dâ risirvatizza</a>) - display name: 'Nomu mmustratu:' - display name description: U nomu dû to utenti comu veni mmustratu pubblicamenti. - Ppoi u poi canciari ntê prifirenzi. - external auth: 'Autenticazzioni di terzi parti:' - password: 'Palora d’òrdini:' - confirm password: 'Cunfirma a palora d’òrdini:' - use external auth: O puru, trasi pi’ menzu di na terza parti - auth no password: Cu’ l’autenticazzioni di terzi parti nun cci voli na palora - d'òrdini, però certi strumenti o serventi nni ponnu richièdiri una u stissu. - auth association: |- - <p>A to ID ancora nun è assuciata a’ nuḍḍu cuntu di OpenStreetMap.</p> - <ul> - <li>Si’ si’ novu nta OpenStreetMap, pi’ favuri crìa un cuntu novu adupirannu u mòdulu ccassutta.</li> - <li> - Si’ già hai un cuntu, cci poi tràsiri - adupirannu u to nomu utenti e a to palora d’ordini, pi’ ppoi assuciàrilu - câ to OpenID ntê to mpustazzioni ill’utenti. - </li> - </ul> + display name: 'Nomu ammustratu:' + display name description: Lu tò nomu d'utenti comu veni ammustratu pubblicamenti. + Appoi lu poi canciari ntê prifirenzi. + external auth: 'Autinticazzioni di terzi parti:' + password: 'Palora d''òrdini:' + confirm password: 'Cunferma la palora d''òrdini:' + use external auth: O puru, trasi pi menzu di na terza parti + auth no password: Cu l'autinticazzioni di terzi parti nun ci voli na palora + d'òrdini, pirò certi strummenti o sirventi nni ponnu addumannari una lu stissu. continue: Scrìviti - terms accepted: Ti ringrazziamu d’aviri accittatu i cunnizzioni di cuntribbuzzioni + terms accepted: T'arringrazziamu d'aviri accittatu li cunnizzioni di cuntribbuzzioni novi! - terms declined: Nni dispiaci chi’ dicidisti di nun accitari i cunnizzioni di - cuntribbuzzioni novi. Pi’ maggiuri nfurmazzioni, pi’ favuri talìa <a href="%{url}">sta + terms declined: Ni dispiaci chi dicidisti di nun accittari li cunnizzioni di + cuntribbuzzioni novi. Pi maiuri nfurmazzioni, pi favuri talìa <a href="%{url}">sta pàggina dâ wiki</a>. terms: title: Cunnizzioni di cuntribbuzzioni heading: Cunnizzioni di cuntribbuzzioni - read and accept: Pi’ favuri lèggiti stu cuntrattu e carca u buttuni «accettu» - pi’ cunfirmari chi’ accetti i cunnizzioni di stu cuntrattu pî to cuntribbuti + read and accept: Pi favuri lèggiti stu cuntrattu e carca lu buttuni «accettu» + pi cunfirmari chi accetti li cunnizzioni di stu cuntrattu pî tò cuntribbuti esistenti e futuri. - consider_pd: Sparti dû cuntrattu ccassupra, cunsìddiru ch’i me cuntribbuti sunnu - ntô Pùbblicu Duminiu - consider_pd_why: chi’ voli diri? - guidance: 'Nfurmazzioni chi’ ti ponnu ajutari a’ capiri sti cunnizzioni: nu - <a href="%{summary}">riassuntu liggìbbili dî genti</a> e quarchi’ <a href="%{translations}">traduzzioni - infurmali</a>' + consider_pd: Sparti dû cuntrattu ccassupra, cunzìddiru chi li mè cuntribbuti + sunnu ntô Duminiu Pùbblicu + consider_pd_why: chi voli diri? + guidance: 'Nfurmazzioni chi ti ponnu aiutari a capiri sti cunnizzioni: nu <a + href="%{summary}">riassuntu liggìbbili dî genti</a> e quarchi <a href="%{translations}">traduzzioni + nun furmali</a>' agree: Accettu decline: Rifiutu - you need to accept or decline: Pi’ cuntinuari, pi’ favuri leggi i cunnizzioni - di cuntribbuzzioni novi e ppoi accèttili o rifiùtili. - legale_select: 'Paìsi di risidenza:' + you need to accept or decline: Pi cuntinuari, pi favuri leggi li cunnizzioni + di cuntribbuzzioni novi e appoi accèttali o rifiùtali. + legale_select: 'Paisi di risidenza:' legale_names: france: Francia italy: Italia rest_of_world: Restu dû munnu no_such_user: - title: St’utenti nun cc’è + title: St'utenti nun c'è heading: L’utenti %{user} nun esisti - body: Purtroppu nun cc’è nuḍḍu utenti chi’ si chiama %{user}. Pi’ favuri cuntrolla - chi’ scrivisti bonu, o puru po’ jèssiri ch’u culligamentu chi’ cliccasti è - sbagghiatu. + body: Purtroppu nun c'è nuddu utenti chi si chiama %{user}. Pi favuri cuntrolla + chi scrivisti bonu, o puru pò èssiri chi lu culligamentu chi cliccasti è sbagghiatu. view: - my diary: U me diariu + my diary: Lu mè diariu new diary entry: vuci nova dû diariu - my edits: I me canciamenti - my traces: I me tracciati - my notes: I me noti - my messages: I me missaggi - my profile: U me prufilu - my settings: I me mpustazzioni - my comments: I me cummenti - oauth settings: mpustazzioni di oauth - blocks on me: Cu blocca a’ mia - blocks by me: A’ cu bloccu io + my edits: Li mè canciamenti + my traces: Li mè tracciati + my notes: Li mè noti + my messages: Li mè missaggi + my profile: Lu mè prufilu + my settings: Li mè mpustazzioni + my comments: Li mè cummenti + oauth settings: Mpustazzioni di oauth + blocks on me: Cu blocca a mìa + blocks by me: A cu bloccu iu send message: Manna nu missaggiu diary: Diariu edits: Canciamenti traces: Tracciati notes: Noti dâ cartina - remove as friend: Leva ill’amici - add as friend: Agghiunci a’ l’amici + remove as friend: Leva di l'amici + add as friend: Agghiunci a l'amici mapper since: 'Mappaturi di:' ago: (%{time_in_words_ago} fa) ct status: 'Cunnizzioni di cuntribbuzzioni:' - ct undecided: Nun havi dicidutu + ct undecided: Nun dicisi ct declined: Rifiutati ct accepted: Accittati %{ago} fa - latest edit: 'Ùltimu canciamentu %{ago}:' + latest edit: 'Ùrtimu canciamentu %{ago}:' email address: 'Nnirizzu di posta elittrònica:' created from: 'Criatu di:' status: 'Statu:' spam score: 'Punteggiu di Spam:' description: Discrizzioni - user location: Pusizzioni ill’utenti - if set location: Mposta a to pusizzioni basi ntâ pàggina dî %{settings_link} - pi’ vìdiri quali utenti stannu vicinu a’ tia. + user location: Pusizzioni di l'utenti + if set location: Mposta la tò pusizzioni basi ntâ pàggina dî %{settings_link} + pi vìdiri quali utenti stannu vicinu a tìa. settings_link_text: mpustazzioni - your friends: I to amici - no friends: Ancora nun hai gghiunciutu nuḍḍu amicu. + your friends: Li tò amici + no friends: Ancora nun agghiuncisti nuddu amicu. km away: luntanu %{count} km m away: luntanu %{count} m - nearby users: Autri utenti vicinu - no nearby users: Ancora nun cci sunnu autri utenti chi’ si dichiàrunu mappatura - cca vicinu. + nearby users: Àutri utenti vicinu + no nearby users: Ancora nun ci sunnu àutri utenti chi si dichiàranu mappatura + ccà vicinu. role: - administrator: St’utenti è n’amministraturi - moderator: St’utenti è nu mudiraturi + administrator: St'utenti è n'amministraturi + moderator: St'utenti è nu mudiraturi grant: administrator: Cuncedi l’accessu comu amministraturi moderator: Cuncedi l’accessu comu mudiraturi revoke: - administrator: Rèvuca l’accessu comu amministraturi - moderator: Rèvuca l’accessu comu mudiraturi - block_history: blocchi ricivuti + administrator: Arrèvuca l'accessu comu amministraturi + moderator: Arrèvuca l'accessu comu mudiraturi + block_history: blocchi arricivuti moderator_history: blocchi dati comments: Cummenti - create_block: blocca a’ st’utenti - activate_user: attiva a’ st’utenti - deactivate_user: disattiva a’ st’utenti - confirm_user: cunfirma a’ st’utenti - hide_user: mmuccia a’ st’utenti - unhide_user: mmustra a st’utenti - delete_user: cancella a’ st’utenti - confirm: Cunfirma - friends_changesets: gruppa di canciamenti ill’amici - friends_diaries: vuci dî diarî ill’amici - nearby_changesets: gruppa di canciamenti ill’utenti vicini - nearby_diaries: vuci dî diarî ill’utenti vicini + create_block: blocca a st'utenti + activate_user: attiva a st'utenti + deactivate_user: disattiva a st'utenti + confirm_user: Cunferma a st'utenti + hide_user: Ammuccia a st'utenti + unhide_user: Ammustra a st'utenti + delete_user: Cancella a st'utenti + confirm: Cunferma + friends_changesets: gruppa di canciamenti di l'amici + friends_diaries: vuci dî diarî di l'amici + nearby_changesets: gruppa di canciamenti di l'utenti vicini + nearby_diaries: vuci dî diarî di l'utenti vicini popup: - your location: A to pusizzioni + your location: La tò pusizzioni nearby mapper: Mappaturi vicinu friend: Amicu account: - title: Cancia u cuntu - my settings: I me mpustazzioni + title: Cancia lu cuntu + my settings: Li mè mpustazzioni current email address: 'Nnirizzu di posta elittrònica attuali:' new email address: 'Nnirizzu di posta elittrònica novu:' - email never displayed publicly: (nun veni mmustratu mai pubblicamenti) - external auth: 'Autenticazzioni esterna:' + email never displayed publicly: (nun veni ammustratu mai pubblicamenti) + external auth: 'Autinticazzioni esterna:' openid: link: http://wiki.openstreetmap.org/wiki/IT:OpenID - link text: chi’ voli diri? + link text: chi voli diri? public editing: heading: 'Canciamenti pùbblici:' - enabled: Attivati. Nun si’ anònimu e poi canciari i dati. + enabled: Attivati. Nun sî anònimu e poi canciari li dati. enabled link: http://wiki.openstreetmap.org/wiki/Anonymous_edits - enabled link text: chi’ voli diri? - disabled: Disattivati, e nun po’ canciari i dati, tutti i canciamenti pricidenti + enabled link text: chi voli diri? + disabled: Disattivati, e nun poi canciari li dati, tutti li canciamenti pricidenti sunnu anònimi. - disabled link text: picchì nun pozzu fari canciamenti? + disabled link text: pirchì nun pozzu fari canciamenti? public editing note: heading: Canciamenti pùbblici - text: Com’ad ora i to canciamenti sunnu anònimi e i genti nun ti ponnu mannari - missaggi o vìdiri unni si’. Pi’ fari a’ vìdiri chiḍḍu chi’ canci e pirmèttiri - ê genti di cuntattàriti pi’ menzu dû situ web, carca u buttuni cassutta. - <b>A’ pàrtiri ill’introduzzioni ill’API 0.6, sulu l’utenti pùbblici ponnu - canciari i dati dâ carta</b>. (<a href="http://wiki.openstreetmap.org/wiki/Anonymous_edits">vidi - picchì</a>).<ul><li>Si’ diventi n’utenti pùbblicu u to nnirizzu i posta - nun sarravi pùbblicatu.</li><li>Sta dicisioni nun si po’ annullari, e a’ - ccuminciari di ora tutti l’utenti novi su’ pùbblici comu mpustazzioni pridifinuta.</li></ul> + text: Com'a ora li tò canciamenti sunnu anònimi e li genti nun ti ponnu mannari + missaggi o vìdiri unni sî. Pi fari vìdiri chiddu chi canci e pirmèttiri + ê genti di cuntattàriti pi menzu dû situ web, carca lu buttuni cassutta. + <b>A pàrtiri dâ ntroduzzioni di l'API 0.6, sulu l'utenti pùbblici ponnu + canciari li dati dâ carta</b>. (<a href="http://wiki.openstreetmap.org/wiki/Anonymous_edits">vidi + pirchì</a>).<ul><li>Si addiventi n'utenti pùbblicu lu tò nnirizzu di posta + è pùbblicatu.</li><li>Sta dicisioni nun si pò annullari, e a accuminzari + d'ora tutti l'utenti novi sù pùbblici comu mpustazzioni pridifinuta.</li></ul> contributor terms: heading: 'Cunnizzioni di cuntribbuzzioni:' - agreed: Accittasti i cunnizzioni di cuntribbuzzioni novi. - not yet agreed: Ancora nun hai accittatu i cunnizzioni di cuntribbuzioni novi. - review link text: Quannu voi tu vai nta stu link pi’ lèggiri e accittari i - cunnizzioni di cuntribbuzioni novi. - agreed_with_pd: Dichiarasti macari chi’ cunsìddiri i to canciamenti nto Pùbblicu - Duminiu. - link text: chi’ voli diri? + agreed: Accittasti li cunnizzioni di cuntribbuzzioni novi. + not yet agreed: Ancora nun accittasti li cunnizzioni di cuntribbuzzioni novi. + review link text: Quannu voi tu vai nta stu link pi lèggiri e accittari li + cunnizzioni di cuntribbuzzioni novi. + agreed_with_pd: Dichiarasti macari chi cunzìddiri li tò canciamenti ntô Duminiu + Pùbblicu. + link text: chi voli diri? profile description: 'Discrizzioni dû prufilu:' preferred languages: 'Lingui prifiruti:' preferred editor: 'Editor prifirutu:' image: 'Mmàggini:' gravatar: gravatar: Adòpira Gravatar - link text: chi’ voli diri? + link text: chi voli diri? new image: Agghiunci na mmàggini - keep image: Manteni a mmàggini attuali - delete image: Leva a mmàggini attuali - replace image: Rimpiazza a mmàggini attuali - image size hint: (su’ mègghiu i mmàggini quatrati 100x100 o cchiu’ grossi) + keep image: Manteni la mmàggini attuali + delete image: Leva la mmàggini attuali + replace image: Rimpiazza la mmàggini attuali + image size hint: (sù megghiu li mmàggini quatrati 100x100 o chiù grossi) home location: 'Pusizzioni basi:' - no home location: Ancora nun hai mpustatu a to pusizzioni basi. + no home location: Ancora nun mpustasti la tò pusizzioni basi. latitude: 'Latitùdini:' - longitude: 'Longitùdini:' - update home location on click: Aggiorna a pusizzioni basi quannu cliccu supra + longitude: 'Luncitùdini:' + update home location on click: Aggiorna la pusizzioni basi quannu cliccu supra â carta? - save changes button: Sarva i canciamenti - make edits public button: Renni tutti i me canciamenti pùbblici - return to profile: Ritorna ô prufilu - flash update success confirm needed: I nfurmazziuni ill’utenti furu aggiurnati - boni. Cuntrolla a to posta elittronica chi’ t’havi a’ rrivari un missaggiu - pi’ cunfirmari u nnirizzu di posta novu. - flash update success: I nfurmazziuni ill’utenti furu aggiurnati boni. + save changes button: Sarva li canciamenti + make edits public button: Arrenni tutti li mè canciamenti pùbblici + return to profile: Arritorna ô prufilu + flash update success confirm needed: Li nfurmazzioni di l'utenti foru aggiurnati + boni. Cuntrolla la tò posta elittrònica chi t'havi a arrivari nu missaggiu + pi cunfirmari lu nnirizzu di posta novu. + flash update success: Li nfurmazzioni di l'utenti foru aggiurnati boni. confirm: - heading: Talìa a to posta! - introduction_1: Ti mannammu nu missaggiu di posta elittrònica di cunfirma. - introduction_2: Cunfirma u to cuntu cliccannu u link ntô missaggiu e poi ccuminciari - a’ mappari. - press confirm button: Carca u buttuni «cunfirma» ccassutta p’attivari u to cuntu. - button: Cunfirma - success: Cunfirmasti u to cuntu, ti ringrazziamu p’avìriti scrivutu! - already active: Già stu cuntu havi statu cunfirmatu. - unknown token: Ḍḍu còdici di cunfirma o scadìu o nun esisti. - reconfirm_html: Si’ voi chi’ ti mannamu n’autra vota u missaggiu di cunfirma, - <a href="%{reconfirm}">clicca cca</a>. + heading: Talìa la tò posta! + introduction_1: Ti mannammu nu missaggiu di posta elittrònica di cunferma. + introduction_2: Cunferma lu tò cuntu cliccannu lu link ntô missaggiu e poi accuminzari + a mappari. + press confirm button: Carca lu buttuni «cunferma» ccassutta p'attivari lu tò + cuntu. + button: Cunferma + success: Cunfirmasti lu tò cuntu, t'arringrazziamu p'avìriti scrivutu! + already active: Già stu cuntu fu cunfirmatu. + unknown token: Ddu còdici di cunferma o scadìu o nun esisti. + reconfirm_html: Si voi chi ti mannamu n'àutra vota lu missaggiu di cunferma, + <a href="%{reconfirm}">clicca ccà</a>. confirm_resend: - success: Ti mannammu n’autru missaggiu di cunfirma unni %{email}, e u forti - chi’ cunfirmi u to cuntu poi ccuminciari a’ mappari.<br /><br />S’adòpiri - nu sistema anti-spam chi’ manna richiesti di cunfirma, pi’ favuri hâ’ mèttiri - u nnirizzu webmaster@openstreetmap.org ntâ so lista janca, picchì nuiautri - nun putemu rispùnniri a’ nuḍḍa richiesta di cunfirma. - failure: Utenti %{name} nun truvatu. + success: Ti mannammu n'àutru missaggiu di cunferma unni %{email}, e lu forti + chi cunfermi lu tò cuntu poi accuminzari a mappari.<br /><br />S'adòpiri nu + sistema anti-spam chi manna addumannati di cunferma, pi favuri hai a mèttiri + lu nnirizzu %{sender} ntâ lista janca, pirchì nuàutri nun putemu arrispùnniri + a nudda addumannata di cunferma. + failure: Utenti %{name} nun attruvatu. confirm_email: - heading: Cunfirma dû canciu dû nnirizzu di posta - press confirm button: Carca u buttuni «cunfirma» ccassutta pi’ cunfirmari u - to nnirizzu di posta elittrònica novu. - button: Cunfirma - success: Cunfirmasti u canciamentu dû to nnirizzu di posta! - failure: Già cu’ stu còdici fu’ cunfirmatu nu nnirizzu di posta. - unknown_token: Ḍḍu còdici di cunfirma o scadìu o nun esisti. + heading: Cunferma dû canciu dû nnirizzu di posta + press confirm button: Carca lu buttuni «cunferma» ccassutta pi cunfirmari lu + tò nnirizzu di posta elittrònica novu. + button: Cunferma + success: Cunfirmasti lu canciamentu dû tò nnirizzu di posta! + failure: Già cu stu còdici fu cunfirmatu nu nnirizzu di posta. + unknown_token: Ddu còdici di cunferma o scadìu o nun esisti. set_home: flash success: Pusizzioni basi sarvata bona. go_public: - flash success: Ora tutti i to canciamnti sunnu pùbblici, e hai u pirmissu di - fari canciamenti. + flash success: Ora tutti li tò canciamenti sunnu pùbblici, e hai lu pirmissu + di fari canciamenti. make_friend: - heading: Agghiunciri a’ %{user} comu amicu? + heading: Agghiùnciri a %{user} comu amicu? button: Agghiunci comu amicu - success: Ora %{name} è amicu toi! - failed: Purtroppu a junta di %{name} comu amicu nun riniscìu. - already_a_friend: Già siti amici cu’ %{name}. + success: Ora %{name} è amicu tò! + failed: Purtroppu la junta di %{name} comu amicu nun arriniscìu. + already_a_friend: Già siti amici cu %{name}. remove_friend: - heading: Livari %{user} ill’amici? - button: Leva ill’amici - success: '%{name} fu’ livatu dî to amici.' - not_a_friend: '%{name} nun è amicu toi.' + heading: Livari %{user} di l'amici? + button: Leva di l'amici + success: '%{name} fu livatu dî tò amici.' + not_a_friend: '%{name} nun è amicu tò.' filter: - not_an_administrator: Hâ’ jèssiri n’amministraturi pi’ fari st’opirazzioni. + not_an_administrator: Hai a èssiri n'amministraturi pi fari st'opirazzioni. list: title: Utenti heading: Utenti showing: one: Pàggina %{page} (%{first_item} di %{items}) other: Pàggina %{page} (%{first_item}-%{last_item} di %{items}) - summary: '%{name} criatu di %{ip_address} u %{date}' - summary_no_ip: '%{name} criatu u %{date}' - confirm: Cunfirma a’ l’utenti scigghiuti - hide: Mmuccia a’ l’utenti scigghiuti - empty: Nun fu’ truvatu nuḍḍu utenti chi’ currispunni + summary: '%{name} criatu di %{ip_address} lu %{date}' + summary_no_ip: '%{name} criatu lu %{date}' + confirm: Cunferma a l'utenti scigghiuti + hide: Ammuccia a l'utenti scigghiuti + empty: Nun fu attruvatu nuddu utenti chi currispunni suspended: title: Cuntu suspinnutu heading: Cuntu suspinnutu webmaster: webmaster body: |- <p> - Purtroppu, u to cuntu fu’ suspinnutu di manera autumatica pi’ attività suspetti. + Purtroppu, lu tò cuntu fu suspinnutu di manera autumàtica pi attività suspetti. </p> <p> - Tra picca tempu sta dicisioni sarravi esaminata di n’amministraturi, - o puru poi cuntattari u %{webmaster} si’ nni voi discùtiri. + Tra picca tempu sta dicisioni è esaminata di n'amministraturi, + o puru poi cuntattari lu %{webmaster} si nni voi discùtiri. </p> auth_failure: - connection_failed: U culligamentu cû furnituri ill’autenticazzioni nun riniscìu - invalid_credentials: Cridinziali d’autenticazzioni nun vàlidi - no_authorization_code: Nuḍḍu còdici d’auturizzazzioni + connection_failed: Lu culligamentu cû furnituri di l'autinticazzioni nun arriniscìu + invalid_credentials: Cridinziali d'autinticazzioni nun vàlidi + no_authorization_code: Nuddu còdici d'auturizzazzioni unknown_signature_algorithm: Alguritmu di firma scanusciutu invalid_scope: Àmmitu nun vàlidu user_role: filter: - not_an_administrator: Sulu l’amministratura ponnu gistiri i roli, e tu nun si’ - amministraturi. - not_a_role: A stringa «%{role}» nun è un rolu vàlidu. - already_has_role: L’utenti già havi u rolu %{role}. - doesnt_have_role: L’utenti nun havi u rolu %{role}. + not_an_administrator: Sulu l'amministratura ponnu gistiri li roli, e tu nun + sì amministraturi. + not_a_role: La stringa «%{role}» nun è un rolu vàlidu. + already_has_role: L'utenti già havi lu rolu %{role}. + doesnt_have_role: L'utenti nun havi lu rolu %{role}. grant: - title: Cunfirma a cuncissioni dûn rolu - heading: Cunfirma a cuncissioni dûn rolu - are_you_sure: Si’ sicuru chi’ voi cuncèdiri u rolu «%{role}» a’ l’utenti «%{name}»? - confirm: Cunfirma - fail: Nun fu’ pussìbbili cuncèdiri u rolu «%{role}» a’ l’utenti «%{name}». Pi’ - favuri cuntrolla chi’ tantu l’utenti quantu u rolu sunnu vàlidi. + title: Cunferma la cuncissioni dûn rolu + heading: Cunferma la cuncissioni dûn rolu + are_you_sure: Sî sicuru chi voi cuncèdiri lu rolu «%{role}» a l'utenti «%{name}»? + confirm: Cunferma + fail: Nun fu pussìbbili cuncèdiri lu rolu «%{role}» a l'utenti «%{name}». Pi + favuri cuntrolla chi tantu l'utenti quantu lu rolu sunnu vàlidi. revoke: - title: Cunfirma a rèvuca dûn rolu - heading: Cunfirma a rèvuca dûn rolu - are_you_sure: Si’ sicuru chi’ voi rivucari u rolu «%{role}» a’ l’utenti «%{name}»? - confirm: Cunfirma - fail: Nun fu’ pussìbbili rivucari u rolu «%{role}» a’ l’utenti «%{name}». Pi’ - favuri cuntrolla chi’ tantu l’utenti quantu u rolu sunnu vàlidi. + title: Cunferma la rèvuca dûn rolu + heading: Cunferma la rèvuca dûn rolu + are_you_sure: Sî sicuru chi voi arrivucari lu rolu «%{role}» a l'utenti «%{name}»? + confirm: Cunferma + fail: Nun fu pussìbbili arrivucari lu rolu «%{role}» a l'utenti «%{name}». Pi + favuri cuntrolla chi tantu l'utenti quantu lu rolu sunnu vàlidi. user_block: model: - non_moderator_update: Hâ’ jèssiri nu mudiraturi pi’ criari o canciari un bloccu. - non_moderator_revoke: Hâ’ jèssiri nu mudiraturi pi’ rivucari un bloccu. + non_moderator_update: Hai a èssiri nu mudiraturi pi criari o canciari un bloccu. + non_moderator_revoke: Hai a èssiri nu mudiraturi p'arrivucari un bloccu. not_found: - sorry: Purtroppu u bloccu cu’ ID %{id} nun si potti truvari. - back: Ritorna a’ l’ìnnici + sorry: Purtroppu lu bloccu cu ID %{id} nun si potti attruvari. + back: Arritorna a l'ìnnici new: title: Criazzioni dûn bloccu di %{name} heading: Criazzioni dûn bloccu di %{name} - reason: U mutivu picchì si sta’ bluccannu a’ %{name}. Pi’ favuri hâ’ jèssiri - u cchiu’ calmu e raggiunìvuli pussìbbili, spiegannu tutti i dittagghî dâ situazzioni, - e ricurdànnusi chi’ stu missaggiu sarravi visìbbili pubblicamenti. Teni prisenti - chi’ nun tutti l’utenti capìsciunu u gergu dâ cumunità, pi’ chistu cerca d’adupirari - tèrmini chi’ tutti ponnu cumprènniri. - period: Pi’ quantu tempu, a’ partiri di ora, l’utenti sarravi bluccatu ill’usu - ill’API. - submit: Crìa u bloccu - tried_contacting: Haju cuntattatu l’utenti e cc’haju dumannatu di finìrila. - tried_waiting: Cci desi tempu a’ sufficienza pi’ rispùnniri â me cumunicazzioni. - needs_view: L’utenti havi a’ tràsiri prima chi’ stu bloccu veni cancillatu - back: Talìa tutti i blocchi + reason: Lu mutivu pirchì si sta bluccannu a %{name}. Pi favuri hai a èssiri + lu cchiù calmu e raggiunèvuli pussìbbili, spigannu tutti li dittagghî dâ situazzioni, + e arricurdànnusi chi stu missaggiu è visìbbili pubblicamenti. Teni prisenti + chi nun tutti l'utenti capìscinu lu gergu dâ cumunità, pi chistu cerca d'adupirari + tèrmini chi tutti ponnu cumprènniri. + period: Pi quantu tempu, a pàrtiri d'ora, l'utenti è bluccatu di l'usu di l'API. + submit: Crea lu bloccu + tried_contacting: Cuntattai l'utenti e ci addumannai di finìrila. + tried_waiting: Ci desi abbastanti tempu p'arrispùnniri â mè cumunicazzioni. + needs_view: L'utenti havi a tràsiri prima chi stu bloccu veni livatu + back: Talìa tutti li blocchi edit: title: Canciamentu dû bloccu di %{name} heading: Canciamentu dû bloccu di %{name} - reason: U mutivu picchì si sta’ bluccannu a’ %{name}. Pi’ favuri hâ’ jèssiri - u cchiu’ calmu e raggiunìvuli pussìbbili, spiegannu tutti i dittagghî dâ situazzioni. - Teni prisenti chi’ nun tutti l’utenti capìsciunu u gergu dâ cumunità, pi’ - chistu cerca d’adupirari tèrmini chi’ tutti ponnu cumprènniri. - period: Pi’ quantu tempu, a’ partiri di ora, l’utenti sarravi bluccatu ill’usu - ill’API. - submit: Aggiorna u bloccu + reason: Lu mutivu pirchì si sta bluccannu a %{name}. Pi favuri hai a èssiri + lu cchiù calmu e raggiunèvuli pussìbbili, spigannu tutti li dittagghî dâ situazzioni. + Teni prisenti chi nun tutti l'utenti capìscinu lu gergu dâ cumunità, pi chistu + cerca d'adupirari tèrmini chi tutti ponnu cumprènniri. + period: Pi quantu tempu, a pàrtiri d'ora, l'utenti è bluccatu di l'usu di l'API. + submit: Aggiorna lu bloccu show: Talìa stu bloccu - back: Talìa tutti i blocchi - needs_view: Havi a’ tràsiri l’utenti avanti chi’ stu bloccu veni cancillatu? + back: Talìa tutti li blocchi + needs_view: Havi a tràsiri l'utenti avanti chi stu bloccu veni livatu? filter: - block_expired: U bloccu già scadìu e nun si po’ canciari. - block_period: U pirìudu di bloccu havi a’ jèssiri unu di valuri chi’ si ponnu - scègghîri ill’elencu a’ scinnuta. + block_expired: Lu bloccu già scadìu e nun si pò canciari. + block_period: Lu pirìudu di bloccu havi a èssiri unu dî valuri chi si ponnu + scègghiri di l'elencu a scinnuta. create: - try_contacting: Pi’ favuri prova a’ cuntattari l’utenti prima i bluccàrilu e - dacci tempu a’ sufficienza pi’ rispùnniri. - try_waiting: Pi’ favuri duna a’ l’utenti tempu a’ sufficienza pi’ rispùnniri - prima ch’u blocchi. - flash: Fu’ criatu nu bloccu contra a’ l’utenti %{name}. + try_contacting: Pi favuri prova a cuntattari l'utenti prima di bluccàrilu e + dacci abbastanti tempu p'arrispùnniri. + try_waiting: Pi favuri duna a l'utenti abbastanti tempu p'arrispùnniri prima + chi lu blocchi. + flash: Fu criatu nu bloccu contra a l'utenti %{name}. update: - only_creator_can_edit: Sulu u mudiraturi chi’ criàu stu bloccu u po’ canciari. + only_creator_can_edit: Sulu lu mudiraturi chi criau stu bloccu lu pò canciari. success: Bloccu aggiurnatu. index: - title: Blocchi ill’utenti - heading: Elencu dî blocchi ill’utenti - empty: Ancura nun fu’ fattu nuḍḍu bloccu. + title: Blocchi di l'utenti + heading: Elencu dî blocchi di l'utenti + empty: Ancora nun fu fattu nuddu bloccu. revoke: title: Rèvuca dû bloccu di %{block_on} heading: Rèvuca dû bloccu di %{block_on} fattu di %{block_by} - time_future: Stu bloccu finiravi tra %{time}. - past: Stu bloccu finìu %{time} fa e ora nun si po’ rivucari cchiu’. - confirm: Si’ sicuru chi’ voi rivucari stu bloccu? + time_future: Stu bloccu finisci tra %{time}. + past: Stu bloccu finìu %{time} fa e ora nun si pò arrivucari cchiù. + confirm: Sî sicuru chi voi arrivucari stu bloccu? revoke: Rèvuca! - flash: Stu bloccu fu’ rivucatu. + flash: Stu bloccu fu arrivucatu. period: one: 1 ura other: '%{count} uri' partial: - show: Mmustra + show: Ammustra edit: Cancia revoke: Rèvuca! - confirm: Si’ sicuru? + confirm: Sî sicuru? display_name: Utenti bluccatu creator_name: Criaturi reason: Mutivu dû bloccu status: Statu - revoker_name: Rivucatu di - not_revoked: (nun rivucatu) + revoker_name: Arrivucatu di + not_revoked: (nun arrivucatu) showing_page: Pàggina %{page} next: Appressu » - previous: « Arreti + previous: « Arreri helper: time_future: Finisci tra %{time} - until_login: Attivatu nfina a’ quannu l’utenti trasi. + until_login: Attivatu nfina a quannu l'utenti trasi. time_past: Finìu %{time} fa. blocks_on: title: Blocchi di %{name} - heading: Elencu dî blocchi contra a’ %{name} - empty: '%{name} nun hâ statu bluccatu ancora.' + heading: Elencu dî blocchi contra a %{name} + empty: '%{name} nun fu bluccatu ancora.' blocks_by: title: Blocchi fatti di %{name} heading: Elencu dî blocchi fatti di %{name} - empty: '%{name} nun havi fattu nuḍḍu bloccu ancora.' + empty: '%{name} nun fici nuddu bloccu ancora.' show: title: '%{block_on} bluccatu di %{block_by}' heading: '%{block_on} bluccatu di %{block_by}' @@ -2231,42 +2216,42 @@ scn: show: Ammustra edit: Cancia revoke: Rèvuca! - confirm: Si’ sicuru? + confirm: Sî sicuru? reason: 'Mutivu dû bloccu:' - back: Talìa tutti i blocchi + back: Talìa tutti li blocchi revoker: 'Rivucaturi:' - needs_view: L’utenti havi a’ tràsiri prima chi’ stu bloccu veni cancillatu. + needs_view: L'utenti havi a tràsiri prima chi stu bloccu veni livatu. note: description: opened_at_html: Criatu %{when} fa opened_at_by_html: Criatu %{when} fa di %{user} commented_at_html: Aggiurnatu %{when} fa commented_at_by_html: Aggiurnatu %{when} fa di %{user} - closed_at_html: Risulvuta %{when} fa - closed_at_by_html: Risulvuta %{when} fa di %{user} - reopened_at_html: Riapruta %{when} fa - reopened_at_by_html: Riapruta %{when} fa di %{user} + closed_at_html: Arrisurvuta %{when} fa + closed_at_by_html: Arrisurvuta %{when} fa di %{user} + reopened_at_html: Rigraputa %{when} fa + reopened_at_by_html: Rigraputa %{when} fa di %{user} rss: - title: Noti di OpenStreetMap - description_area: N’elencu dî noti signalati, cummintati o risulvuti ntâ to + title: Noti d'OpenStreetMap + description_area: N’elencu dî noti signalati, cummintati o arrisurvuti ntâ tò zona [(%{min_lat}|%{min_lon}) -- (%{max_lat}|%{max_lon})] description_item: Un flussu RSS pâ nota %{id} - opened: nota nova (vicinu a’ %{place}) - commented: cummentu novu (vicinu a’ %{place}) - closed: nota risulvuta (vicinu a’ %{place}) - reopened: nota riattivata (vicinu a’ %{place}) + opened: nota nova (vicinu a %{place}) + commented: cummentu novu (vicinu a %{place}) + closed: nota arrisurvuta (vicinu a %{place}) + reopened: nota riattivata (vicinu a %{place}) entry: comment: Cummentu full: Nota cumpleta mine: - title: Noti scritti o cummintati ill’utenti %{user} + title: Noti scritti o cummintati di l'utenti %{user} heading: Noti di %{user} - subheading: Noti scritti o cummintati ill’utenti %{user} + subheading: Noti scritti o cummintati di l'utenti %{user} id: Id creator: Criaturi description: Discrizzioni - created_at: Criata u - last_changed: Canciata l’ùltima vota u + created_at: Criata lu + last_changed: Canciata l'ùrtima vota lu ago_html: '%{when} fa' javascripts: close: Chiudi @@ -2276,30 +2261,30 @@ scn: image: Mmàggini link: Culligamentu o HTML long_link: Culligamentu - short_link: Culligamentu scurzatu + short_link: Culligamentu accurzatu geo_uri: Geo-URI embed: HTML - custom_dimensions: Mposta diminsioni pirsunalizzati + custom_dimensions: Mposta diminzioni pirsunalizzati format: 'Furmatu:' scale: 'Scala:' - image_size: A mmàggini farravi a’ vìdiri u stratu standard a’ + image_size: La mmàggini fa vìdiri lu stratu standard a download: Scàrrica short_url: URL curta - include_marker: Ncludi u signali - center_marker: Centra a cartina ntô signali - paste_html: Ncoḍḍa l’HTML pi’ ncurpurari ntôn situ web - view_larger_map: Talìa na cartina cchiu’ granni + include_marker: Ncludi lu signali + center_marker: Centra la cartina ntô signali + paste_html: Ncodda l'HTML pi ncurpurari ntôn situ web + view_larger_map: Talìa na cartina cchiù granni key: - title: Legenda - tooltip: Legenda - tooltip_disabled: A legenda cc’è sulu pû stratu Standard + title: Liggenna + tooltip: Liggenna + tooltip_disabled: La liggenna c'è sulu pû stratu Standard map: zoom: - in: Zumma pi’ d’intra - out: Zumma pi’ fora + in: Zumma pi dintra + out: Zumma pi fora locate: title: Ammustra unni sugnu - popup: Ti trovi nta {distance} {unit} di stu puntu + popup: T'attrovi nta {distance} {unit} di stu puntu base: standard: Standard cycle_map: Cartina pî bicicletti @@ -2309,84 +2294,84 @@ scn: header: Strati dâ cartina notes: Noti dâ cartina data: Dati dâ cartina - overlays: Attiva i strati chi’ giùvunu pi’ risòlviri i prubblemi dâ cartina + overlays: Attiva li suprapusizzioni p'arrisòrviri li prubblemi dâ cartina title: Strati - copyright: © <a href='%{copyright_url}'>i cuntribbutura di OpenStreetMap</a> + copyright: © <a href='%{copyright_url}'>li cuntribbutura d'OpenStreetMap</a> donate_link_text: <a class='donate-attr' href='%{donate_url}'>Fai na dunazzioni</a> site: - edit_tooltip: Cancia a cartina - edit_disabled_tooltip: Zumma pi’ putiri canciari a cartina + edit_tooltip: Cancia la cartina + edit_disabled_tooltip: Zumma pi putiri canciari la cartina createnote_tooltip: Agghiunci na nota ntâ cartina - createnote_disabled_tooltip: Zumma pi’ putiri agghiùnciri noti ntâ cartina - map_notes_zoom_in_tooltip: Zumma pi’ putiri a’ vìdiri i noti ntâ cartina - map_data_zoom_in_tooltip: Zumma pi‘ putiri a’ vìdiri i dati dâ cartina - queryfeature_tooltip: Ricerca elimenti - queryfeature_disabled_tooltip: Zumma pi’ putiri circari l’elimenti + createnote_disabled_tooltip: Zumma pi putiri agghiùnciri noti ntâ cartina + map_notes_zoom_in_tooltip: Zumma pi putiri a vìdiri li noti ntâ cartina + map_data_zoom_in_tooltip: Zumma pi putiri a vìdiri li dati dâ cartina + queryfeature_tooltip: Arricerca elimenti + queryfeature_disabled_tooltip: Zumma pi putiri circari l'elimenti changesets: show: - comment: Cummentu - subscribe: Abbòniti + comment: Cummenta + subscribe: Abbònati unsubscribe: Annulla l’abbunamentu - hide_comment: mmuccia - unhide_comment: mmustra + hide_comment: Ammuccia + unhide_comment: Ammustra notes: new: - intro: Truvasti nu sbagghiu o quarchi’ cosa chi’ manca? Faccillu sapiri a’ - l’autri mappatura, accussì u putemu cunsari. Sposta u signali ntâ pusizzioni - curretta e scrivi na nota pi’ spiegari quali è u prubblema. (Pi’ favuri - nun mèttiri nfurmazzioni pirsunali, o puru chi’ vènunu di cartini o elenchi - chi’ sunnu prutetti di drittu d’auturi.) - add: Agghiunci a nota + intro: Attruvasti nu sbagghiu o quarchi cosa chi ammanca? Faccillu sapiri + a l'àutri mappatura, accussì lu putemu cunzari. Sposta lu signali ntâ pusizzioni + curretta e scrivi na nota pi spigari quali è lu prubblema. (Pi favuri nun + mèttiri nfurmazzioni pirsunali, o puru chi vèninu di cartini o elenchi chi + sunnu prutetti di drittu d'auturi.) + add: Agghiunci la nota show: - anonymous_warning: Sta nota cunteni cummenti di utenti anònimi, chi’ s’avìssuru - a’ virificari di fonti innipinnenti. - hide: Mmuccia - resolve: Risolvi + anonymous_warning: Sta nota cunteni cummenti di utenti anònimi, chi s'avìssiru + a virificari di fonti nnipinnenti. + hide: Ammuccia + resolve: Arrisorvi reactivate: Attiva di novu - comment_and_resolve: Cummenta & risolvi + comment_and_resolve: Cummenta & arrisorvi comment: Cummenta - edit_help: Sposta a cartina e zumma ntôn postu chi’ voi canciari, e ppoi clicca - cca. + edit_help: Sposta la cartina e zumma ntôn postu chi voi canciari, e appoi clicca + ccà. directions: engines: - graphhopper_bicycle: Bicicletta (GraphHopper) - graphhopper_foot: A’ pedi (GraphHopper) - mapquest_bicycle: Bicicletta (MapQuest) - mapquest_car: Màchina (MapQuest) - mapquest_foot: A’ pedi (MapQuest) - osrm_car: Màchina (OSRM) - directions: Innicazzioni + graphhopper_bicycle: Câ bicicretta (GraphHopper) + graphhopper_foot: A pedi (GraphHopper) + mapquest_bicycle: Câ bicicretta (MapQuest) + mapquest_car: Câ màchina (MapQuest) + mapquest_foot: A pedi (MapQuest) + osrm_car: Câ màchina (OSRM) + directions: Nnicazzioni distance: Distanza errors: - no_route: Nun si potti truvari nu caminu tra di sti du posti. - no_place: Purtroppu nun si potti truvari ḍḍu postu. + no_route: Nun si potti attruvari nu caminu tra di sti dui posti. + no_place: Purtroppu nun si potti attruvari ddu postu. instructions: - continue_without_exit: Cuntinuari pi’ %{name} - slight_right_without_exit: Vutari na picca a’ manu dritta nta %{name} - turn_right_without_exit: Vutari a’ manu dritta nta %{name} - sharp_right_without_exit: Vutari tuttu a’ manu dritta nta %{name} - uturn_without_exit: Fari nvirsioni a’ U nta %{name} - sharp_left_without_exit: Vutari tuttu a’ manu manca nta %{name} - turn_left_without_exit: Vutari a’ manu manca nta %{name} - slight_left_without_exit: Vutari picca a’ manu manca nta %{name} + continue_without_exit: Cuntinuari pi %{name} + slight_right_without_exit: Vutari na picca a manu dritta nta %{name} + turn_right_without_exit: Vutari a manu dritta nta %{name} + sharp_right_without_exit: Vutari tuttu a manu dritta nta %{name} + uturn_without_exit: Fari nvirsioni a U nta %{name} + sharp_left_without_exit: Vutari tuttu a manu manca nta %{name} + turn_left_without_exit: Vutari a manu manca nta %{name} + slight_left_without_exit: Vutari na picca a manu manca nta %{name} via_point_without_exit: (puntu dû traggittu) follow_without_exit: Sicutari %{name} roundabout_without_exit:  rutunna pigghiari %{name} leave_roundabout_without_exit: Nèsciri dâ rutunna - %{name} - stay_roundabout_without_exit: Ristari ntâ rutunna - %{name} - start_without_exit: Ccuminciari â fini di %{name} - destination_without_exit: Arrivu â distinazzioni - against_oneway_without_exit: Caminari contra dû sensu ùnicu nta %{name} - end_oneway_without_exit: Fini dû sensu ùnicu nta %{name} - roundabout_with_exit:  rutunna pigghiari a nisciuta %{exit} nta %{name} - unnamed: senza nomu - courtesy: Innicazzioni pi’ gintili cuncissioni di %{link} + stay_roundabout_without_exit: Arristari ntâ rutunna - %{name} + start_without_exit: Accuminzari â fini di %{name} + destination_without_exit: Arriva â distinazzioni + against_oneway_without_exit: Caminari contra dû senzu ùnicu nta %{name} + end_oneway_without_exit: Fini dû senzu ùnicu nta %{name} + roundabout_with_exit:  rutunna pigghiari la nisciuta %{exit} pi %{name} + unnamed: strata senza nomu + courtesy: Nnicazzioni pi cuncissioni gintili di %{link} time: Tempu query: node: Gruppu way: Caminu relation: Rilazzioni - nothing_found: Nuḍḍu elimentu truvatu + nothing_found: Nuddu elimentu attruvatu error: 'Erruri ntô cuntattari %{server}: %{error}' timeout: Tempu scadutu ntô cuntattari %{server} redaction: @@ -2396,29 +2381,29 @@ scn: submit: Sarva occultamentu title: Cancia occultamentu index: - empty: Nuḍḍu occultamentu di mmustrari. - heading: Lista ill’occultamenti - title: Lista ill’occultamenti + empty: Nuddu occultamentu d'ammustrari. + heading: Lista di l'occultamenti + title: Lista di l'occultamenti new: description: Discrizzioni - heading: Immèttiri i nfurmazzioni dû novu occultamentu - submit: Crìa l’occultamentu - title: Criazzioni dûn novu occultamentu + heading: Nziriri li nfurmazzioni di l'occultamentu novu + submit: Crea l'occultamentu + title: Criazzioni dûn occultamentu novu show: description: 'Discrizzioni:' heading: Occultamentu «%{title}» title: Occultamentu user: 'Criaturi:' - edit: Cancia st’occultamentu - destroy: Leva st’occultamentu - confirm: Si’ sicuru? + edit: Cancia st'occultamentu + destroy: Leva st'occultamentu + confirm: Sî sicuru? create: flash: Occultamentu criatu. update: flash: Canciamenti sarvati. destroy: - not_empty: St’occultamentu nun è vacanti. Pi’ favuri leva ill’occultamentu tutti - i virsioni chi’ nni fannu parti avanti ch’u distruggi. - flash: Occultamentu distruggiutu. - error: Mmattìu n’erruri ntô distrùggiri st’occultamentu. + not_empty: St'occultamentu nun è vacanti. Pi favuri leva di l'occultamentu tutti + li virsioni chi nni fannu parti avanti chi lu distrudi. + flash: Occultamentu distruiutu. + error: Ammattìu n'erruri ntô distrùiri st'occultamentu. ... diff --git a/config/locales/sk.yml b/config/locales/sk.yml index 2a2174cf0..735effe7d 100644 --- a/config/locales/sk.yml +++ b/config/locales/sk.yml @@ -6,6 +6,7 @@ # Author: KuboF # Author: Kusavica # Author: Lesny skriatok +# Author: Macofe # Author: MartinSNV # Author: MichalP # Author: Mikulas1 @@ -14,6 +15,7 @@ # Author: Rudko # Author: Ruila # Author: Teslaton +# Author: TomášPolonec # Author: Vladolc --- sk: @@ -170,6 +172,7 @@ sk: way: cesta relation: relácia changeset: počet zmien + note: poznámka timeout: sorry: Ľutujeme, ale načítanie dát %{type} číslo %{id} trvalo príliÅ¡ dlho type: @@ -177,9 +180,10 @@ sk: way: cesta relation: relácia changeset: sada zmien + note: poznámka redacted: redaction: Revízia %{id} - message_html: Verzia %{version} tohto objektu %{type} nemôže byÅ¥ zobrazené, + message_html: Verzia %{version} tohto objektu %{type} nemôže byÅ¥ zobrazená, pretože bola skrytá. Viac informácií nájdete na %{redaction_link}. type: node: bod @@ -380,6 +384,7 @@ sk: search_osm_nominatim: prefix: aerialway: + cable_car: Lanovka chair_lift: Sedačková lanovka drag_lift: Vlek station: Lanovková stanica @@ -392,6 +397,7 @@ sk: taxiway: Pojazdová dráha terminal: Terminál amenity: + animal_shelter: Útulok pre zvieratá arts_centre: Kultúrne stredisko atm: Bankomat bank: Banka @@ -608,12 +614,15 @@ sk: leisure: beach_resort: Plážové letovisko bird_hide: Vtáčia pozorovateľňa + club: Klub common: Verejné priestranstvo + dog_park: Psí park fishing: Rybolov (Å¡portový) fitness_centre: Fitnescentrum fitness_station: Fitnes zastávka garden: Záhrada golf_course: Golfové ihrisko + horse_riding: Jazda na koni ice_rink: Umelé klzisko marina: Prístav pre jachty miniature_golf: Mini golf @@ -634,6 +643,7 @@ sk: pipeline: Vodovod tower: Veža works: Továreň + "yes": Vytvorené človekom military: airfield: Vojenské letisko barracks: Kasárne @@ -826,6 +836,7 @@ sk: camp_site: Kemping caravan_site: Autokemping chalet: Veľká chata + gallery: Galéria guest_house: Penzión hostel: Ubytovňa, internát hotel: Hotel @@ -1051,6 +1062,8 @@ sk: title: NahlásiÅ¥ problém / OpraviÅ¥ mapu how_to_help: title: Ako pomôcÅ¥ + join_the_community: + title: Pripojte sa ku komunite help_page: welcome: title: Vitajte na OSM @@ -1063,6 +1076,9 @@ sk: title: Fóra irc: title: IRC + wiki: + url: http://wiki.openstreetmap.org/ + title: wiki.openstreetmap.org about_page: next: Ďalej partners_title: Partneri @@ -1138,6 +1154,8 @@ sk: anonymous: Anonymný používateľ greeting: Ahoj, details: Viac podrobností o poznámke môžete nájsÅ¥ nájsÅ¥ na %{url}. + changeset_comment_notification: + greeting: Ahoj, message: inbox: title: Doručená poÅ¡ta @@ -1262,15 +1280,17 @@ sk: table: entry: motorway: Diaľnica + main_road: Hlavná cesta trunk: Cesta pre motorové vozidlá primary: Cesta prvej triedy secondary: Cesta druhej triedy unclassified: Neklasifikovaná cesta - unsurfaced: Nespevnená cesta track: Lesná, poľná cesta - byway: Súkromná cesta bridleway: Chodník pre kone cycleway: Cyklotrasa + cycleway_national: Národná cyklotrasa + cycleway_regional: Regionálna cyklotrasa + cycleway_local: Miestna cyklotrasa footway: Chodník pre peších rail: Železnica subway: Metro @@ -1292,7 +1312,6 @@ sk: golf: Golfové ihrisko park: Park resident: Obytná oblasÅ¥ - tourist: Turistická atrakcia common: - Pastvina - lúka @@ -1322,9 +1341,11 @@ sk: tunnel: Čiarkovaný obrys = tunel bridge: Čireny obrys = most private: Súkromný prístup - permissive: Voľný prístup destination: Prejazd zakázaný construction: Cesta vo výstavbe + bicycle_shop: Obchod s bicyklami + bicycle_parking: Parkovanie pre bicykle + toilets: WC richtext_area: edit: UpraviÅ¥ preview: Náhľad @@ -1558,6 +1579,28 @@ sk: podozrivú aktivitu.<br>Ak to chcete rieÅ¡iÅ¥, môžete kontaktovaÅ¥ <a href="%{webmaster}">webmastera</a>. auth failure: Ľutujeme, s uvedenými údajmi sa nie je možné prihlásiÅ¥. openid_logo_alt: Prihlásenie pomocou OpenID + auth_providers: + openid: + title: Prihlásenie sa pomocou OpenID + alt: Prihlásenie sa pomocou OpenID URL + google: + title: Prihlásenie sa pomocou Google + alt: Prihlásenie sa pomocou Google OpenID + facebook: + title: Prihlásenie sa pomocou Facebooku + alt: Prihlásenie sa pomocou účtu na Facebooku + windowslive: + title: Prihlásenie sa pomocou Windows Live + alt: Prihlásenie sa pomocou účtu Windows Live + yahoo: + title: Prihlásenie sa pomocou Yahoo + alt: Prihlásenie sa pomocou Yahoo OpenID + wordpress: + title: Prihlásenie sa pomocou Wordpress + alt: Prihlásenie sa pomocou Wordpress OpenID + aol: + title: Prihlásenie sa pomocou AOL + alt: Prihlásenie sa pomocou AOL OpenID logout: title: Odhlásenie heading: Odhlásenie z OpenStreetMap @@ -1584,7 +1627,7 @@ sk: title: ZaregistrovaÅ¥ sa no_auto_account_create: Bohužiaľ teraz nie sme schopný vytvoriÅ¥ pre vás účet automaticky. - contact_webmaster: Kontaktujte prosím <a href="mailto:webmaster@openstreetmap.org">webmastera</a> + contact_webmaster: Kontaktujte prosím <a href="%{webmaster}">webmastera</a> so žiadosÅ¥ou o založenie konta – budeme sa snažiÅ¥ vaÅ¡u požiadavku vybaviÅ¥ čo najrýchlejÅ¡ie. license_agreement: Pri potvrdení konta budete musieÅ¥ vyjadriÅ¥ súhlas s <a href="http://www.osmfoundation.org/wiki/License/Contributor_Terms">Podmienkami @@ -1683,13 +1726,13 @@ sk: block_history: prijaté bloky moderator_history: odovzdané bloky comments: Komentáre - create_block: blokovaÅ¥ tohoto používateľa - activate_user: aktivovaÅ¥ tohoto používateľa - deactivate_user: deaktivovaÅ¥ tohoto používateľa - confirm_user: potvrdiÅ¥ tohoto používateľa - hide_user: skryÅ¥ tohto používateľa - unhide_user: zobraziÅ¥ tohoto používateľa - delete_user: vymazaÅ¥ tohoto používateľa + create_block: BlokovaÅ¥ tohoto používateľa + activate_user: AktivovaÅ¥ tohoto používateľa + deactivate_user: DeaktivovaÅ¥ tohoto používateľa + confirm_user: PotvrdiÅ¥ tohoto používateľa + hide_user: SkryÅ¥ tohto používateľa + unhide_user: ZobraziÅ¥ tohoto používateľa + delete_user: OdstrániÅ¥ tohoto používateľa confirm: PotvrdiÅ¥ friends_changesets: PrechádzaÅ¥ vÅ¡etky sady zmien priateľov friends_diaries: PrechádzaÅ¥ vÅ¡etky denníkové záznamy priateľov @@ -1776,8 +1819,8 @@ sk: success: Na adresu %{email} sme Vám poslali potvrdzovací e-mail. Akonáhle svoje konto potvrdíte, budete môcÅ¥ začaÅ¥ tvoriÅ¥ mapy.<br /><br />Ak náhodou používate systém pre ochranu proti nevyžiadanej poÅ¡te (anti-spam), ktorý vyžaduje potvrdenia, - nezabudnite definovaÅ¥ výnimku pre odosielateľa webmaster@openstreetmap.org, - nakoľko na žiadosti o potvrdenie nie sme schopní reagovaÅ¥. + nezabudnite definovaÅ¥ výnimku pre odosielateľa %{sender}, nakoľko na žiadosti + o potvrdenie nie sme schopní reagovaÅ¥. failure: Používateľ %{name} neexistuje. confirm_email: heading: PotvrdiÅ¥ zmenu e-mailovej adresy @@ -1942,6 +1985,8 @@ sk: heading: '%{block_on} zablokovaný používateľom %{block_by}' time_future: Končí o %{time} time_past: Ukončené pred %{time} + created: Vytvorené + ago: pred %{time} status: Stav show: ZobraziÅ¥ edit: UpraviÅ¥ @@ -1958,6 +2003,8 @@ sk: creator: Autor description: Popis created_at: Vytvorené + last_changed: Posledná zmena + ago_html: pred %{when} javascripts: close: ZavrieÅ¥ share: @@ -1978,10 +2025,12 @@ sk: center_marker: CentrovaÅ¥ mapu na značku paste_html: HTML pre vloženie na webovú stránku view_larger_map: ZobraziÅ¥ väčšiu mapu + embed: + report_problem: NahlásiÅ¥ problém key: title: Legenda tooltip: Legenda - tooltip_disabled: Legenda je dostupná len pre Å tandardnú vrstvu + tooltip_disabled: Legenda je dostupná nie je dostupná pre túto vrstvu map: zoom: in: PriblížiÅ¥ @@ -2007,6 +2056,10 @@ sk: edit_disabled_tooltip: Pre editáciu priblížte mapu createnote_tooltip: PridaÅ¥ do mapy poznámku createnote_disabled_tooltip: Pre vloženie poznámky priblížte mapu + changesets: + show: + hide_comment: skryÅ¥ + unhide_comment: zobraziÅ¥ notes: new: intro: Aby sme mohli mapu spresniÅ¥, zobrazí sa vami zadaná informácia ostatným diff --git a/config/locales/sl.yml b/config/locales/sl.yml index 046be9255..352e3b940 100644 --- a/config/locales/sl.yml +++ b/config/locales/sl.yml @@ -5,7 +5,10 @@ # Author: Dbc334 # Author: Eleassar # Author: Lesko987 +# Author: Macofe # Author: Mateju +# Author: Peter Klofutar +# Author: Pickle12 # Author: Ruila # Author: Skalcaa # Author: Stefanb @@ -161,12 +164,13 @@ sl: entry: Zveza %{relation_name} entry_role: Zveza %{relation_name} (kot %{relation_role}) not_found: - sorry: 'Oprostite, %{type} #%{id} ni mogoče najti.' + sorry: 'Žal %{type} #%{id} ni mogoče najti.' type: node: vozlišče way: pot relation: zveza changeset: Paket sprememb + note: opomba timeout: sorry: Oprostite, podatki za %{type} z ID-jem %{id} se predolgo prenaÅ¡ajo. type: @@ -174,6 +178,7 @@ sl: way: pot relation: zveza changeset: Paket sprememb + note: opomba redacted: redaction: Redakcija %{id} message_html: Verzija %{version} te %{type} ne more biti prikazana, ker je bila @@ -212,7 +217,10 @@ sl: nazaj</abbr> hidden_by: Skril %{user} <abbr title='%{exact_time}'>%{when} nazaj</abbr> query: + title: Poišči značilnosti + introduction: Kliknite na zemljevid za iskanje bližnjih značilnosti. nearby: Značilnosti v neposredni bližini + enclosing: Vsebujoče značilnosti changeset: changeset_paging_nav: showing_page: Stran %{page} @@ -233,18 +241,26 @@ sl: title_user: Paketi sprememb uporabnika %{user} title_friend: Paket sprememb vaÅ¡ih prijateljev title_nearby: Paketi sprememb bližnjih uporabnikov - empty: Ni najdenih množic sprememb. - empty_area: Na tem področju ni množic sprememb. + empty: Ni najdenih paketov sprememb. + empty_area: Na tem področju ni paketov sprememb. + empty_user: Ni paketov sprememb tega uporabnika. + no_more: Ni najdenih več paketov sprememb. + no_more_area: Ni več paketov sprememb na tem področju. + no_more_user: Ni več paketov sprememb tega uporabnika. load_more: Naloži več timeout: sorry: Žal je seznam zahtevanih sprememb predolg za prenos. rss: + title_all: Razprava o paketu sprememb OpenStreetMap + title_particular: 'Razprava o paketu sprememb OpenStreetMap #%{changeset_id}' + comment: 'Nov komentar o paketu sprememb #%{changeset_id} uporabnika %{author}' commented_at_html: Posodobljeno %{when} nazaj commented_at_by_html: Posodobil %{user} %{when} nazaj full: Celoten pogovor diary_entry: new: title: Nov zapis v dnevnik uporabnikov + publish_button: Objavi list: title: Dnevniki uporabnikov title_friends: Dnevniki vaÅ¡ih prijateljev @@ -332,12 +348,17 @@ sl: export_details: OpenStreetMap podatki imajo dovoljenje <a href="http://opendatacommons.org/licenses/odbl/1.0/">Open Data Commons Open Database License</a> (ODbL). too_large: + advice: 'Če zgornji izvoz spodleti, uporabite enega od spodnjih virov:' body: 'To področje je preveliko za izvoz v OpenStreetMap XML. Prosimo, da se približate ali izberete manjÅ¡e območje ali pa da uporabite enega od naslednjih virov za obsežen prenos podatkov:' planet: title: Planet OSM description: Redno posodabljane kopije celotne podatkovne zbirke OpenStreetMap + overpass: + title: Overpass API + description: Prenesi to območje iz zrcalnega strežnika podatkovne zbirke + OpenStreetMap geofabrik: title: Prenosi Geofabrik description: Redno posodabljani izvlečki celin, držav in izbranih mest @@ -414,7 +435,7 @@ sl: cinema: Kinematograf clinic: Klinika clock: Ura - college: Srednja Å¡ola + college: Fakulteta community_centre: Center skupnosti courthouse: Sodišče crematorium: Krematorij @@ -446,12 +467,12 @@ sl: motorcycle_parking: Parkirišče motornih koles nightclub: Nočni klub nursery: Vrtec - nursing_home: Dom za ostarele + nursing_home: Dom za starejÅ¡e office: Pisarne parking: Parkirišče parking_entrance: Vhod v parkirišče pharmacy: Lekarna - place_of_worship: Cerkev + place_of_worship: Mesto za čaščenje police: Policija post_box: PoÅ¡tni nabiralnik post_office: PoÅ¡ta @@ -485,7 +506,7 @@ sl: waste_basket: KoÅ¡ za odpadke youth_centre: Mladinski center boundary: - administrative: Upravne meje + administrative: Upravna meja census: Popisna meja national_park: Nacionalni Park protected_area: Zavarovano območje @@ -517,7 +538,7 @@ sl: bridleway: Jahalna pot bus_guideway: Turistični avtobus bus_stop: Avtobusna postaja - construction: Autocesta v izgradnji + construction: Cesta v izgradnji cycleway: Kolesarska steza elevator: Dvigalo emergency_access_point: Dostop za interventna vozila @@ -529,7 +550,7 @@ sl: motorway_junction: Avtocestno križišče motorway_link: Avtocestni priključek path: Pot - pedestrian: Pločnik + pedestrian: Ulica namenjena peÅ¡cem platform: Platforma primary: Glavna cesta primary_link: Priključek na glavno cesto @@ -596,7 +617,7 @@ sl: garages: Garaže grass: Travnik greenfield: Pripravljeno za gradbišče - industrial: Industrijska cona + industrial: Industrijsko podočje landfill: Smetišče meadow: Travnik military: VojaÅ¡ko območje @@ -658,7 +679,7 @@ sl: cliff: Klif crater: Krater dune: Peščina - fell: ViÅ¡inski travnik + fell: Planina fjord: Fjord forest: Gozd geyser: Gejzir @@ -668,7 +689,7 @@ sl: island: Otok land: Otok marsh: Močvirje - moor: Močvirje + moor: Pušča mud: Blato peak: Vrh point: Točka @@ -689,7 +710,7 @@ sl: wetland: Mokrišče wood: Pragozd office: - accountant: Računovodja + accountant: Računovodstvo administrative: Administracija architect: Arhitekt company: Podjetje @@ -716,7 +737,7 @@ sl: islet: Otoček isolated_dwelling: Osamljena hiÅ¡a locality: Krajevno ime - moor: Muring + moor: Pušča municipality: Občina neighbourhood: Mestna četrt postcode: PoÅ¡tna Å¡tevilka @@ -728,6 +749,7 @@ sl: town: Mesto unincorporated_area: NikogarÅ¡nje območje village: Vas + "yes": Kraj railway: abandoned: Opuščena železnica construction: Železnica v izgradnji @@ -738,7 +760,7 @@ sl: historic_station: Zgodovinska železniÅ¡ka postaja junction: Križišče železnic level_crossing: Prehod - light_rail: Tramvaj + light_rail: Mestna železnica miniature: Miniaturna železnica monorail: Monorail narrow_gauge: Ozkotirna železnica @@ -760,7 +782,7 @@ sl: bakery: Pekarna beauty: Salon lepote beverages: Trgovina pijač - bicycle: Trgovina koles + bicycle: Kolesarska trgovina books: Knjigarna boutique: Butik butcher: Mesar @@ -768,20 +790,20 @@ sl: car_parts: Avtomobilski deli car_repair: Avtoservis carpet: Prodajalna preprog - charity: Dobrodelni trgovina + charity: Trgovina za dobrodelne namene chemist: Kemična trgovina clothes: Trgovina z oblekami computer: RačunalniÅ¡ka trgovina - confectionery: Trgovina sladkarij + confectionery: Slaščičarna convenience: Minimarket copyshop: Kopirnica - cosmetics: Drogerija + cosmetics: Trgovina s kozmetiko deli: Delikatesna trgovina department_store: Trgovska hiÅ¡a discount: Outlet doityourself: Orodjarna dry_cleaning: Čistilnica - electronics: Elektronska trgovina + electronics: Trgovina z elektroniko estate_agent: Nepremičninska agencija farm: Kmečka trgovina fashion: Modna trgovina @@ -811,7 +833,7 @@ sl: newsagent: Trafika optician: Optik organic: Trgovina z ekoloÅ¡ko hrano - outdoor: Trgovina na prostem + outdoor: Trgovina za dejavnosti na prostem pet: Trgovina za male živali pharmacy: Lekarna photo: Fotograf @@ -837,7 +859,7 @@ sl: cabin: Nočitev camp_site: Kamp caravan_site: Kamp - chalet: Apartma + chalet: PočitniÅ¡ka hiÅ¡ica gallery: Galerija guest_house: Penzion hostel: Hostel @@ -861,8 +883,8 @@ sl: ditch: Jarek dock: Dok drain: Jarek - lock: Zapornica - lock_gate: Velika zapornica + lock: Velika zapornica + lock_gate: Zapornica mooring: Sidrišče rapids: Brzice river: Reka @@ -903,7 +925,7 @@ sl: sign_up_tooltip: Ustvarite si nov uporabniÅ¡ki račun za urejanje edit: Uredi history: Zgodovina - export: Izvoz + export: Izvozi data: Podatki export_data: Izvoz podatkov gps_traces: Sledi GPS @@ -933,7 +955,7 @@ sl: community_blogs: Blogi skupnosti community_blogs_title: Blogi članov skupnosti OpenStreetMap foundation: Fundacija - foundation_title: OpenStreetMap Fubdacija + foundation_title: Fundacija OpenStreetMap make_a_donation: title: Podprite OpenStreetMap z denarnim prispevkom text: Prispevajte finančna sredstva @@ -1030,7 +1052,7 @@ sl: about_page: next: Naslednji copyright_html: <span>©</span>OpenStreetMap<br> sodelavci - local_knowledge_title: Lokalno znanje + local_knowledge_title: Krajevno znanje partners_title: Partnerji notifier: diary_comment_notification: @@ -1106,7 +1128,7 @@ sl: click_the_link: Če ste to vi, vas prosimo, da kliknete na spodnjo povezavo za ponastavitev gesla. note_comment_notification: - anonymous: Anonimni uporabnik + anonymous: Brezimni uporabnik greeting: Živjo, commented: subject_own: '[OpenStreetMap] %{commenter} je komentiral eno izmed vaÅ¡ih opomb' @@ -1187,7 +1209,7 @@ sl: no_such_message: title: Ni tega sporočila heading: Ni tega sporočila - body: Žal ni sporočila, s tem id-jem. + body: Žal ni sporočila s tem id-jem. outbox: title: Poslana poÅ¡ta my_inbox: Moja %{inbox_link} @@ -1272,20 +1294,22 @@ sl: table: entry: motorway: Avtocesta + main_road: Glavna cesta trunk: Hitra cesta primary: Glavna cesta secondary: Regionalna cesta unclassified: Ostale ceste izven naselij - unsurfaced: Neasfaltirana cesta track: Kolovoz - byway: Obvoz bridleway: Jahalna pot cycleway: Kolesarska steza + cycleway_national: Nacionalna kolesarska steza + cycleway_regional: Regionalna kolesarska steza + cycleway_local: Krajevna kolesarska steza footway: PeÅ¡pot rail: Železnica subway: Podzemna železnica tram: - - Tramvaj + - Mestna železnica - tramvaj cable: - Kabinska žičnica @@ -1302,12 +1326,11 @@ sl: golf: Igrišče za Golf park: Park resident: Naselje - tourist: Turistična znamenitost common: - Travniki - travnik retail: Trgovsko območje - industrial: Industrijsko območje + industrial: Industrijsko področje commercial: Poslovno območje heathland: Grmičevje lake: @@ -1332,9 +1355,11 @@ sl: tunnel: Črtkana obroba = predor bridge: Krepka obroba = most private: Zasebni dostop - permissive: Dostopno z dovolilnico destination: Dovoljeno za dostavo construction: Ceste v gradnji + bicycle_shop: Kolesarska trgovina + bicycle_parking: Parkirišče za kolesa + toilets: Stranišče richtext_area: edit: Uredi preview: Predogled @@ -1633,9 +1658,9 @@ sl: title: Prijavite se no_auto_account_create: Na žalost vam trenutno ne moremo samodejno ustvariti uporabniÅ¡kega računa. - contact_webmaster: Prosimo, piÅ¡ite <a href="mailto:webmaster@openstreetmap.org">webmastru</a> - (v angleščini) in se dogovorite za ustvarjenje uporabniÅ¡kega računa - potrudili - se bomo za čimprejÅ¡njo obravnavo vaÅ¡ega zahtevka. + contact_webmaster: Prosimo, piÅ¡ite <a href="%{webmaster}">webmastru</a> (v angleščini) + in se dogovorite za ustvarjenje uporabniÅ¡kega računa - potrudili se bomo za + čimprejÅ¡njo obravnavo vaÅ¡ega zahtevka. about: header: Brezplačen, ki ga je mogoče urejati html: |- @@ -1646,15 +1671,15 @@ sl: sodelovanja</a>. email address: 'E-poÅ¡tni naslov:' confirm email address: 'Potrdite naslov e-poÅ¡te:' - not displayed publicly: Ne bo javno objavljeno (glej <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" - title="politika zasebnosti z razdelkom o naslovu elektronske poÅ¡te v wiki-ju">politiko - zasebnosti</a>) + not displayed publicly: VaÅ¡ naslov ne bo javno objavljen (za več informacij + glej <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" title="politika + zasebnosti z razdelkom o naslovu elektronske poÅ¡te v wiki-ju">politiko zasebnosti</a>) display name: 'Prikazno ime:' display name description: Javno prikazano uporabniÅ¡ko ime. To lahko spremenite kasneje v nastavitvah. password: 'Geslo:' confirm password: 'Potrdite geslo:' - continue: Prijavite se + continue: Registracija terms accepted: Hvala za sprejem novih pogojev prispevanja! terms declined: Žal nam je, da ste se odločili, da ne sprejmete novih "contributor terms". Za več informacij, si oglejte <a href="%{url}">to wiki stran</a>. @@ -1664,7 +1689,7 @@ sl: read and accept: Prosimo, preberite sporazum spodaj, in pritisnite tipko Sprejmi, da potrdite, da se strinjate s pogoji tega sporazuma za svoje obstoječe in bodoče prispevke. - consider_pd: Poleg zgoraj navedenega sporazuma menim, da so moji prispevke v + consider_pd: Poleg zgoraj navedenega sporazuma menim, da so moji prispevki v javni domeni consider_pd_why: kaj je to? guidance: 'Informacije, ki pomagajo razumeti te pogoje: <a href="%{summary}">berljivi @@ -1718,7 +1743,7 @@ sl: user location: Lokacija uporabnika if set location: Nastavite vaÅ¡o domačo lokacijo na strani %{settings_link}, da vidite bližnje uporabnike. - settings_link_text: vaÅ¡ih nastavitvah + settings_link_text: vaÅ¡ih nastavitev your friends: VaÅ¡i prijatelji no friends: Niste Å¡e dodali nobenih prijateljev. km away: oddaljen %{count} km @@ -1735,16 +1760,16 @@ sl: revoke: administrator: Odvzemi administratorski dostop moderator: Odvzemi moderatorski dostop - block_history: prejete blokade - moderator_history: dane blokade + block_history: Dejavne blokade + moderator_history: Dane blokade comments: Pripombe - create_block: blokiraj uporabnika - activate_user: aktiviraj uporabnika - deactivate_user: dezaktiviraj uporabnika - confirm_user: potrdi uporabnika - hide_user: skriti tega uporabnika - unhide_user: prikaži uporabnika - delete_user: izbriÅ¡i uporabnika + create_block: Blokiraj uporabnika + activate_user: Aktiviraj uporabnika + deactivate_user: Dezaktiviraj uporabnika + confirm_user: Potrdi uporabnika + hide_user: Skrij uporabnika + unhide_user: Prikaži uporabnika + delete_user: IzbriÅ¡i uporabnika confirm: Potrdi friends_changesets: paketi sprememb prijateljev friends_diaries: dnevniki prijateljev @@ -1830,10 +1855,9 @@ sl: success: Poslali smo potrditveno sporočilo na %{email} in takoj, ko boste potrdili vaÅ¡ račun, boste lahko začeli kartirati.<br /><br />V kolikor vaÅ¡ filter neželene poÅ¡te pred sprejemom sporočil neznanih poÅ¡iljateljev zahteva potrditev, vas - prosimo, da poÅ¡iljatelja webmaster@openstreetmap.org uvrstite na seznam dovoljenih - poÅ¡iljateljev. Sistem pač ne zmore dovolj inteligentno odgovarjati na vse - take zahtevke. - failure: Ne najdem uporabnika %{name}. + prosimo, da poÅ¡iljatelja %{sender} uvrstite na seznam dovoljenih poÅ¡iljateljev. + Sistem pač ne zmore dovolj inteligentno odgovarjati na vse take zahtevke. + failure: Uporabnika %{name} ni bilo mogoče najti. confirm_email: heading: Potrdite spremembo naslova e-poÅ¡te press confirm button: Za potrditev spremembe vaÅ¡ega naslova elektronske poÅ¡te @@ -1869,7 +1893,7 @@ sl: summary_no_ip: '%{name} ustvarjen dne %{date}' confirm: Potrdi izbrane uporabnike hide: Skrij izbrane uporabnike - empty: Ne najdem nobenega uporabnika + empty: Nobenega uporabnika ni bilo mogoče najti suspended: title: Račun zaklenjen heading: Račun zaklenjen @@ -1908,7 +1932,7 @@ sl: non_moderator_update: Morate biti moderator da ustvarite ali popravite blokado. non_moderator_revoke: Morate biti moderator da prekličete blokado. not_found: - sorry: Žal blokade uporabnika z ID %{id} ni bilo mogoče najti. + sorry: Žal blokade uporabnika z ID-jem %{id} ni bilo mogoče najti. back: Nazaj na kazalo new: title: Ustvarjanje blokade za %{name} @@ -2040,10 +2064,11 @@ sl: share: title: Deli cancel: Prekliči - image: Slika - link: Povezavo ali HTML + image: sliko + link: povezavo ali HTML long_link: Povezavo short_link: Kratko povezavo + geo_uri: URI lokacije embed: HTML custom_dimensions: Nastavitev velikosti po meri format: 'Oblika:' @@ -2058,7 +2083,7 @@ sl: key: title: Ključ zemljevida tooltip: Ključ zemljevida - tooltip_disabled: Ključ zemljevida na voljo le za standardno plast + tooltip_disabled: Ključ zemljevida ni na voljo za to plast map: zoom: in: Povečaj @@ -2075,6 +2100,7 @@ sl: header: Plasti zemljevida notes: Opombe na zemljevidu data: Podatki zemljevida + gps: Javne sledi GPS overlays: Omogočite prekrivke za odpravljanje težav na zemljevidu title: Plasti copyright: © <a href='%{copyright_url}'>OpenStreetMap sodelavci</a> @@ -2083,9 +2109,11 @@ sl: edit_tooltip: Urejanje zemljevida edit_disabled_tooltip: Povečajte za urejanje zemljevida createnote_tooltip: Dodaj opombo na zemljevid - createnote_disabled_tooltip: Povečaj za dodati opombo na zemljevid - map_notes_zoom_in_tooltip: Povečaj za prikaz opomb zemljevida - map_data_zoom_in_tooltip: Povečaj za prikaz podatkov zemljevida + createnote_disabled_tooltip: Povečajte za dodajanje opomb na zemljevid + map_notes_zoom_in_tooltip: Povečajte za prikaz opomb zemljevida + map_data_zoom_in_tooltip: Povečajte za prikaz podatkov zemljevida + queryfeature_tooltip: Poišči značilnosti + queryfeature_disabled_tooltip: Povečajte za iskanje značilnosti changesets: show: comment: Komentiraj @@ -2114,15 +2142,19 @@ sl: directions: engines: graphhopper_bicycle: Kolo (GraphHopper) - graphhopper_foot: PeÅ¡ (GraphHopper) + graphhopper_foot: Hoja (GraphHopper) mapquest_bicycle: Kolo (MapQuest) mapquest_car: Avto (MapQuest) - mapquest_foot: PeÅ¡ (MapQuest) + mapquest_foot: Hoja (MapQuest) osrm_car: Avto (OSRM) + mapzen_bicycle: Kolo (Mapzen) + mapzen_car: Avto (Mapzen) + mapzen_foot: Hoja (Mapzen) directions: Navodila distance: Razdalja errors: no_route: Ni mogoče najti poti med tema dvema položajema. + no_place: Žal tega kraja ni bilo mogoče najti. instructions: unnamed: neimenovano courtesy: Navodila je ponudil %{link} @@ -2131,6 +2163,7 @@ sl: node: Vozlišče way: Pot relation: Zveza + nothing_found: Značilnosti ni bilo mogoče najti redaction: edit: description: Opis diff --git a/config/locales/sq.yml b/config/locales/sq.yml index 24d884de5..bacc1702c 100644 --- a/config/locales/sq.yml +++ b/config/locales/sq.yml @@ -3,10 +3,15 @@ # Export driver: phpyaml # Author: Euriditi # Author: GretaDoci +# Author: Kosovastar +# Author: Liridon +# Author: Macofe # Author: Mdupont # Author: MicroBoy # Author: Mikullovci11 # Author: Nemo bis +# Author: Ruila +# Author: Sidorela.uku # Author: Techlik # Author: Vinie007 # Author: 아라 @@ -17,17 +22,17 @@ sq: friendly: '%e %B %Y te %H:%M' activerecord: models: - acl: Qasu në Listën e Kontrollit - changeset: Ndryshim - changeset_tag: Ndryshim tag - country: Shteti - diary_comment: Koment Ditari - diary_entry: Shënim në ditar + acl: Qasja në listën e kontrollit + changeset: Vargu i ndryshimeve + changeset_tag: Etiketa e vargut të ndryshimeve + country: Vendi + diary_comment: Koment ditari + diary_entry: Shënim ditari friend: Mik language: Gjuha - message: Porosi + message: Mesazh node: Nyjë - node_tag: Etiketë nyjë + node_tag: Etiketë nyje notifier: Lajmëruesi old_node: Nyjë e vjetër old_node_tag: Etiketë e vjetër e nyjës @@ -37,19 +42,19 @@ sq: old_way: Rrugë e vjetër old_way_node: Nyje rrugore e vjetër old_way_tag: Etiketë rrugore e vjetër - relation: Lidhja + relation: Lidhje relation_member: Anëtar me lidhje të vjetër relation_tag: Etiketë lidhjeje - session: Seksioni - trace: Gjurma + session: Seancë + trace: Gjurmë tracepoint: Pika e gjurmës tracetag: Etiketa e gjurmës user: Përdoruesi user_preference: Parapëlqimet e përdoruesit user_token: Shenja e përdoruesit way: Rruga - way_node: Nyja e rrugës - way_tag: Etiketa e rrugës + way_node: Nyjë rruge + way_tag: Etiketë rruge attributes: diary_comment: body: Trupi i mesazhit @@ -77,401 +82,889 @@ sq: body: Trupi i mesazhit recipient: Marrësi user: - email: Email + email: Emaili active: Aktiv display_name: Emër i dukshëm description: Përshkrimi - languages: Gjuha + languages: Gjuhët pass_crypt: Fjalëkalimi printable_name: with_version: '%{id}, v%{version}' editor: - default: Default (momentalisht %{name}) + default: E parazgjedhur (aktualisht %{name}) potlatch: name: Potlatch 1 - description: Potlatch 1 (editor në shfletues) + description: Potlatch 1 (redaktorin e shfletuesit) id: name: iD - description: iD (në shfletuesin editor) + description: iD (në redaktorin e shfletuesit) potlatch2: name: Potlatch 2 - description: Potlatch 2 (editor në shfletues) + description: Potlatch 2 (në redaktorin e shfletuesit) remote: - name: Kontrollë prej së largu - description: Kontrollë prej së largu (JOSM apo Merkaartor) + name: Kontrollë nga larg + description: Kontrollë nga larg (JOSM apo Merkaartor) browse: created: Krijuar - closed: I Mbyllur + closed: Mbyllur created_html: Krijuar <abbr title='%{title}'>%{time} më parë</abbr> - closed_html: Të mbyllura <abbr title='%{title}'>%{time} më parë</abbr> - created_by_html: Të Krijuar <abbr title='%{title}'>%{time} më parë</abbr> nga - %{user} - deleted_by_html: Të Fshira <abbr title='%{title}'>%{time} më parë</abbr> nga %{user} - edited_by_html: të Redaktuara <abbr title='%{title}'>%{time} më parë</abbr> nga - %{user} - closed_by_html: Të mbyllura <abbr title='%{title}'>%{time} më parë</abbr> nga - %{user} + closed_html: Mbyllur <abbr title='%{title}'>%{time} më parë</abbr> + created_by_html: Krijuar <abbr title='%{title}'>%{time} më parë</abbr> nga %{user} + deleted_by_html: Fshirë <abbr title='%{title}'>%{time} më parë</abbr> nga %{user} + edited_by_html: Redaktuar <abbr title='%{title}'>%{time} më parë</abbr> nga %{user} + closed_by_html: Mbyllur <abbr title='%{title}'>%{time} më parë</abbr> nga %{user} version: Versioni in_changeset: Grupi i ndryshimeve anonymous: Anonim - no_comment: pa koment - part_of: 'Pjesë e:' + no_comment: (nuk ka koment) + part_of: Pjesë e download_xml: Shkarko në XML view_history: Shiko historikun view_details: Shiko detajet location: Vendndodhja changeset: - title: Ndryshim%{id} - belongs_to: Autori + title: 'Grupi i ndryshimeve: %{id}' + belongs_to: Autor node: Nyjet (%{count}) node_paginated: Nyjet (%{x}-%{y} nga %{count}) - way: Mënyra (%{count}) - way_paginated: Mënyra (%{x}-%{y} nga %{count}) + way: Mënyrat (%{count}) + way_paginated: Mënyrat (%{x}-%{y} nga %{count}) relation: Marrëdhëniet (%{count}) relation_paginated: Marrëdhëniet (%{x}-%{y} nga %{count}) - changesetxml: Ndryshim en XML - osmchangexml: Ndrsyhim i OSM-s en XML + comment: Komentet (%{count}) + hidden_commented_by: Koment i fshehur nga %{user} në <abbr title="%{exact_time}">%{when} + më parë</abbr> + commented_by: Koment nga %{user} në <abbr title="%{exact_time}">%{when} më parë</abbr> + changesetxml: Grupi i ndryshimeve në XML + osmchangexml: osmNdrsyhimi XML feed: - title: Ndryshim %{id} - title_comment: Ndryshimi %{id} - %{comment} + title: 'Grupi i ndryshimeve: %{id}' + title_comment: Grupi i ndryshimeve %{id} - %{comment} + join_discussion: Identifikohuni për t'iu bashkuar diskutimit + discussion: Diskutim node: - title: 'Nyje: %{name}' - history_title: 'Nyja e Historisë: %{name}' + title: 'Nyja: %{name}' + history_title: 'Historiati i nyjës: %{name}' way: - title: 'Rruga: %{name}' - history_title: 'Rrugën e Historisë: %{name}' + title: 'Drejtimi: %{name}' + history_title: 'Historiati i rrugës: %{name}' + nodes: Nyjet + also_part_of: + one: pjesë e rrugës %{related_ways} + other: pjesë e rrugëve %{related_ways} + relation: + title: 'Lidhja: %{name}' + history_title: 'Historiati i lidhjes: %{name}' + members: Anëtarët relation_member: entry: '%{type} %{name}' - entry_role: '%{type} %{name} asht si %{role}' + entry_role: '%{type} %{name} është si %{role}' type: - node: Pikë - way: Udhë - relation: Lidhje + node: Nyje + way: Rruga + relation: Lidhja containing_relation: entry: Lidhja %{relation_name} entry_role: Lidhja %{relation_name} (sikur %{relation_role}) not_found: - sorry: Na fal, %{type} me %{id}, nuk mujtem mi gjet + sorry: 'Na vjen keq, %{type} #%{id} nuk mund të gjendet.' type: - node: pikë - way: udhë + node: nyjë + way: rrugë relation: lidhje - changeset: shka asht ndrrue + changeset: grupi i ndryshimeve + note: shënim timeout: - sorry: Na fal, senet per %{type} me %{id}, u vanun shum per mu gjet. + sorry: Na vjen keq, të dhënat për %{type} me id %{id}, morën shumë kohë për + tu tërhequr. type: - node: pikë + node: nyjë way: rrugë relation: lidhje - changeset: shka asht ndrryshu + changeset: grupi i ndryshimeve + note: shënim redacted: - redaction: Redaktim %{id} - message_html: Versioni %{version} i këtij/kësaj %{type} nuk mund të shfaqet - pasi është redaktuar. Ju lutem shiko %{redaction_link} për detaje. + redaction: Redaktimi %{id} + message_html: Versioni %{version} i %{type} nuk mund të shfaqet pasiqë është + redaktuar. Ju lutem shiko %{redaction_link} për detaje. type: node: nyjë way: rrugë relation: lidhje start_rjs: - load_data: Zgedhi senet - loading: Tu u mush... + feature_warning: Duke ngarkuar %{num_features} karakteristika, të cilat mund + ta bëjnë shfletuesin tuaj të ngadalshëm ose të pavëmendshëm. Jeni të sigurt + që dëshironi ti shfaqni këto të dhëna? + load_data: Ngarko të dhënat + loading: Duke ngarkuar... tag_details: - tags: 'Etiketat:' + tags: Etiketat wiki_link: - key: Pērshkrimi i wiki faqes pēr %{key} tag - tag: Pērshkrimi i wiki faqes pēr %{key}=%{value} tag - wikipedia_link: '%{page} artikulli nē Wikipedia' + key: Pērshkrimi i faqes në wiki pēr etiketën %{key} + tag: Pērshkrimi i faqes në wiki pēr etiketën %{key}=%{value} + wikidata_link: Artikulli %{page} në Wikidata + wikipedia_link: Artikulli %{page} nē Wikipedia + telephone_link: Thirr %{phone_number} + note: + title: 'Shënim: %{id}' + new_note: Shënim i ri + description: Përshkrimi + open_title: 'Shënim i pazgjidhur #%{note_name}' + closed_title: 'Shënim i zgjidhur #%{note_name}' + hidden_title: 'Shënim i fshehur #%{note_name}' + open_by: Krijuar nga %{user} në <abbr title="%{exact_time}">%{when} më parë</abbr> + open_by_anonymous: Krijuar nga person anonim <abbr title="%{exact_time}">%{when} + më parë</abbr> + commented_by: Krijuar nga %{user} në <abbr title="%{exact_time}">%{when} më + parë</abbr> + commented_by_anonymous: Krijuar nga person anonim <abbr title="%{exact_time}">%{when} + më parë</abbr> + closed_by: Zgjidhur nga %{user} në <abbr title="%{exact_time}">%{when} më parë</abbr> + closed_by_anonymous: Zgjidhur nga person anonim <abbr title='%{exact_time}'>%{when} + më parë</abbr> + reopened_by: Riaktivizuar nga %{user} në <abbr title="%{exact_time}">%{when} + më parë</abbr> + reopened_by_anonymous: Riaktivizuar nga person anonim <abbr title="%{exact_time}">%{when} + më parë</abbr> + hidden_by: Fshehur nga %{user} në <abbr title="%{exact_time}">%{when} më parë</abbr> + query: + title: Tiparet e pyetsorit + introduction: Kliko në hartë për të gjetur tipare në afërsi. + nearby: Tiparet në afërsi + enclosing: Tipare të bashkangjitura changeset: changeset_paging_nav: - showing_page: Duke shfaqun faqen %{{page}} + showing_page: Faqe %{page} next: Vazhdo » previous: « Mëparshëm changeset: anonymous: Anonim - no_edits: (asnjë redaktim) + no_edits: (nuk ka redaktime) view_changeset_details: Shiko detajet e grupit të ndryshimeve changesets: id: ID - saved_at: Ruaje në + saved_at: Të ruajtura në user: Përdoruesi - comment: Komentoni + comment: Koment area: Zona list: title: Grupi i ndryshimeve - title_user: Grupi i ndryshimeve të %{user} + title_user: Ndryshime fjalish nga %{user} title_friend: Ndryshime nga miqtë e tu title_nearby: Ndryshime nga përdorues të zonës + empty: Nuk u gjet grupi i ndryshimeve. + empty_area: Nuk ka grupndryshime në këtë fushë. + empty_user: Nuk grupndryshime nga ky përdorues. + no_more: Nuk u gjetë më shum grupndryshime. + no_more_area: Nuk ka më grupndryshime në këtë fushë. + no_more_user: Nuk më grupndryshime nga ky përdorues. + load_more: Ngarko më shumë timeout: - sorry: Na vjen keq, lista e grupit të ndryshimeve që u kërkua morri shumë kohë + sorry: Na vjen keq, lista e grupit të ndryshimeve që u kërkua mori shumë kohë për tu shkarkuar. + rss: + title_all: Diskutim mbi vargun e ndryshimit në OpenStreetMap + title_particular: 'Diskutimi mbi grupin e ndryshimeve #%{changeset_id} të OpenStreetMap' + comment: 'Koment në grupin e ndryshimeve #%{changeset_id} nga %{author}' + commented_at_html: Përditësuar %{when} më parë + commented_at_by_html: Përditësuar %{when} më parë nga %{user} + full: Diskutimi i plotë diary_entry: new: - title: Hyrje e re në ditar + title: Shënim i ri në ditar + publish_button: Publiko list: - title: Ditatët e përdoruesve - title_friends: Ditarët e miqve - title_nearby: Ditarët e përdoruesve pranë + title: Ditarët e përdoruesve + title_friends: Ditarë të miqve + title_nearby: Ditarët e përdoruesve këtu pranë user_title: Ditari i %{user} - in_language_title: Hyrje në ditar në %{language} - new: Hyrje e re në ditar - new_title: Krijo një hyrje të re në ditarin tënd - no_entries: Nuk u gjet asnjë hyrje në ditar - recent_entries: 'Shënime në ditar së fundmi:' - older_entries: Shënimet e Vjetra + in_language_title: Shënimet në ditar në %{language} + new: Shënim i ri në ditar + new_title: Shkruani një shënim të ri në ditarin tuaj + no_entries: Nuk ka shënime në ditar + recent_entries: 'Shënimet më të fundit në ditar:' + older_entries: Shënimet e vjetra newer_entries: Shënimet e fundit edit: title: Redakto shënimin në ditar - subject: 'Subjekti:' - body: Trupi i mesazhit + subject: 'Titulli:' + body: 'Trupi i mesazhit:' language: 'Gjuha:' location: 'Lokacioni:' - latitude: Gjerësia gjeografike - longitude: Gjatësia gjeografike + latitude: 'Gjerësia gjeografike:' + longitude: 'Gjatësia gjeografike:' use_map_link: përdor hartën - save_button: Ruje + save_button: Ruaj + marker_text: Lokacioni i shënimit në ditar view: + title: Ditari i %{user} | %{title} user_title: Ditari i %{user} - leave_a_comment: Lene naj koment - login: Kyçuni + leave_a_comment: Lëre ndonjë koment + login_to_leave_a_comment: '%{login_link} për të lënë një koment' + login: Identifikohu save_button: Ruaj no_such_entry: + title: Nuk ka shënim të tillë në ditar heading: 'Nuk ka shënim me id: %{id}' + body: Na vjen keq, nuk ka përdorues me këtë id %{id}. Të lutem kontrollo drejtshkrimin + ose ndoshta linku ku ke klikuar është gabim. diary_entry: + posted_by: Postuar nga %{link_user} më %{created} në %{language_link} comment_link: Komento në këtë shënim + reply_link: Përgjigju në këtë shënim comment_count: - one: 1 koment + zero: Nuk ka komente + one: '%{count} koment' other: '%{count} komente' - edit_link: Ndryshoje qët shënim - hide_link: Mshefe qët shënim - confirm: Konfirmoje + edit_link: Redakto këtë shënim + hide_link: Fshih këtë shënim + confirm: Konfirmo diary_comment: + comment_from: Koment nga %{link_user} më %{comment_created_at} + hide_link: Fshih këtë koment confirm: Konfirmo location: location: 'Lokacioni:' - view: Kshyre + view: Shfaq edit: Redakto + feed: + user: + title: OpenStreetMap shënime ditari për %{user} + description: Shënimet e fundit në ditarin e OpenStreetMap nga %{user} + language: + title: Shënimet e ditarit të OpenStreetMap në %{language_name} + description: Shënimet e fundit në ditar nga përdoruesit e OpenStreetMap në + %{language_name} + all: + title: Shënimet e ditarit të OpenStreetMap + description: Shënimet e fundit në ditar nga përdoruesit e OpenStreetMap + comments: + has_commented_on: '%{display_name} ka komentuar në këto të shënime ditari' + post: Posto + when: Kur + comment: Komenti + ago: '%{ago} më parë' + newer_comments: Komentet më të fundit + older_comments: Komentet e vjetra export: + title: Eksporto start: - area_to_export: Zona per Eksport - manually_select: Manualisht zgedhe ni zon te ndryshme - format_to_export: Formati per Eksport - osm_xml_data: OpenStreetMap XML të dhana + area_to_export: Zona për tu eksportuar + manually_select: Zgjidh me dorë një zonë tjetër + format_to_export: Formati per eksportim + osm_xml_data: Të dhëna XML të OpenStreetMap + map_image: Imzhi i hartës (shfaq shtresën e parazgjedhur) + embeddable_html: HTML i inkorporueshëm licence: Licensa - export_details: Të dhënat e OpenStreetMap janë të licencuara nëpërmjet <a href="http://creativecommons.org/licenses/by-sa/2.0/">Creative - Commons Attribution-ShareAlike 2.0 license</a>. + export_details: Të dhënat e OpenStreetMap janë të licencuara nën <a href="http://opendatacommons.org/licenses/odbl/1.0/">Open + Data Commons Open Database License</a> (ODbL). too_large: - body: Kjo zonë është shum e madhe që të eksportohet si XML në OpenStreetMap. - Të lutna afroje ma ngat ose mere një zonë ma të vogel. - options: Opcionet + advice: 'Në qoftë se dështon eksporti i mësipërm, të lutem konsidero përdorimin + e një nga burimet e renditura më poshtë:' + body: Kjo zonë është shumë e madhe për të eksportuar të dhënat XML të OpenStreetMap. + Të lutem zmadho (zoom) ose zgjidh një zonë më të vogël, ose përdor një nga + burimet e listuara më poshtë për të shkarkuar pjesë të mëdha të të dhënave. + planet: + title: Planet OSM + description: Kopje të plota të përditësuara rregullisht të bazës së të dhënave + të OpenStreetMap + overpass: + title: API mbikalues + description: Shkarkoni këtë kuti kufizimi nga një pasqyrim i të dhënave + të OpenStreetMap + geofabrik: + title: Shkarkimet nga Geofabrik + description: Përditësime rregullisht të ekstrakteve të kontinenteve, vendeve, + dhe qyteteve të përzgjedhura + metro: + title: Metro Ekstrakte + description: Ekstrakte të qyteteve më të mëdha botërore dhe zonave përreth + tyre + other: + title: Burime të tjera + description: Burime shtesë të listuara në faqen e OpenStreetMap wiki + options: Opsionet format: Formati scale: Shkallë - max: maks - image_size: Madhësia e Imazhit - zoom: Zmadhim - add_marker: Shto shënjues në hartë + max: max + image_size: Madhësia e imazhit + zoom: Zmadho + add_marker: Shto një shënues në hartë latitude: 'Lat:' longitude: 'Lon:' - output: Outputi - paste_html: Fute HTML per me ngjit ne web sajt + output: Dalja + paste_html: Ngjite HTML për ta inkorporuar në uebfaqe export_button: Eksporto geocoder: search: title: + latlon: Rezultatet e brendshme nga <a href="http://openstreetmap.org/"></a> us_postcode: Rezultatet nga <a href="http://geocoder.us/">Geocoder.us</a> - ca_postcode: Rezultatet nga <a href="http://geocoder.ca/">Geocoder.CA</a> + uk_postcode: Rezultatet nga <a href="http://www.npemap.org.uk/">NPEMap / FreeThe + Postcode</a> + ca_postcode: Rezultatet nga <a href="http://geocoder.ca/">Geocoder.ca</a> + osm_nominatim: Rezultatet nga <a href="http://nominatim.openstreetmap.org/">OpenStreetMap + Nominatim</a> geonames: Rezultate nga <a href="http://www.geonames.org/">GeoNames</a> + osm_nominatim_reverse: Rezultatet nga <a href="http://nominatim.openstreetmap.org/">OpenStreetMap + Nominatim</a> + geonames_reverse: Rezultate nga <a href="http://www.geonames.org/">GeoNames</a> search_osm_nominatim: prefix_format: '%{name}' prefix: + aerialway: + cable_car: Teleferiku + chair_lift: Teleferik + drag_lift: Teleferik + gondola: Teleferik gondolë + station: Stacion teleferiku + aeroway: + aerodrome: Aeroport + apron: Platformë + gate: Portë + helipad: Helipad + runway: Pistë + taxiway: Rrugë taksie + terminal: Terminal amenity: - airport: Aeroport + animal_shelter: Strehim i kafshëve arts_centre: Qendër arti atm: Bankomat - auditorium: Auditor bank: Bankë - bar: Lokal + bar: Bar + bbq: Zgarë bench: Stol bicycle_parking: Parkim biçikletash bicycle_rental: Biçikleta me qera + biergarten: Birrari + boat_rental: Varka me qera brothel: Shtëpi publike bureau_de_change: Këmbim valute - bus_station: Stacion autobuzi + bus_station: Stacion autobusi cafe: Kafe car_rental: Makina me qera - car_sharing: Car Sharing - car_wash: Lavazh për makina + car_sharing: Përdorim i përbashkët i makinës + car_wash: Autolarje casino: Kazino + charging_station: Stacion mbushës + childcare: Kujdesi për fëmijët cinema: Kinema clinic: Klinikë - club: Klub + clock: Orë college: Kolegj community_centre: Qendër komunitare courthouse: Gjykatë crematorium: Krematorium dentist: Dentist + doctors: Mjekët dormitory: Konvikt drinking_water: Ujë i pijshëm - embassy: Ambasada + driving_school: Autoshkollë + embassy: Ambasadë emergency_phone: Kabinë telefoni për emergjencë fast_food: Ushqim i shpejtë ferry_terminal: Terminal i trageteve - fire_hydrant: Pompë zjarrfikse + fire_hydrant: Hidrant zjarrfikës fire_station: Zjarrëfiksat + food_court: Kënd ushqimi fountain: Shatërvan fuel: Stacion karburanti + gambling: Kumar grave_yard: Varrezë - gym: Qendër fitness / Palestër - hall: Sallë + gym: Qendër fitnesi / Palestër health_centre: Qendër shëndetsore hospital: Spital - hotel: Hotel hunting_stand: Vend gjuetie ice_cream: Akullore - kindergarten: Kopësht për fëmijë - library: Biblioteka + kindergarten: Kopësht fëmijësh + library: Bibliotekë market: Market marketplace: Treg - mountain_rescue: Forca e shpëtimit në mal + monastery: Manastir + motorcycle_parking: Vendparkim motoçikletash nightclub: Klub nate nursery: Çerdhe nursing_home: Çerdhe - office: Zyra - park: Park - parking: Vend parkim + office: Zyrë + parking: Vendparkim + parking_entrance: Hyrje parkimi pharmacy: Barnatore place_of_worship: Vend kulti police: Policia - post_box: Kutia postare - post_office: Kutia postare - preschool: Cikli para-shkollor + post_box: Kuti postare + post_office: Zyrë postare + preschool: Cikël para-shkollor prison: Burg pub: Pub public_building: Ndërtesë publike - public_market: Treg publik - reception_area: Zona e pritjes - recycling: Pikë e riciklimit + reception_area: Zonë e pritjes + recycling: Pikë riciklimi restaurant: Restorant - sauna: Sauna + retirement_home: Shtëpi pleqësh + sauna: Saunë school: Shkollë shelter: Strehë shop: Dyqan - shopping: Tregtar + shower: Dush + social_centre: Qendrën sociale social_club: Klub shoqëror + social_facility: Institucion social studio: Studio - supermarket: Supermarket + swimming_pool: Pishinë taxi: Taksi telephone: Telefon publik theatre: Teatër toilets: Banjë publike - townhall: Bashkia + townhall: Bashki university: Universitet - vending_machine: Shitës automatik - veterinary: Veterinari - village_hall: Komuna + vending_machine: Automat me monedha + veterinary: Kirurgji veterinare + village_hall: Bashkësi lokale waste_basket: Kosh plehrash - wifi: Shërbim WiFi - youth_centre: Qendër Rinore + waste_disposal: Deponi mbeturinash + youth_centre: Qendër rinore boundary: administrative: Kufi administrativ + census: Regjistrim kufitar + national_park: Park kombëtar + protected_area: Zonë e mbrojtur + bridge: + aqueduct: Ujësjellës + suspension: Urë lëvizëse + swing: Urë rrotulluese + viaduct: Viadukt + "yes": Urë + building: + "yes": Ndërtesë + craft: + brewery: Birrari + carpenter: Marangoz + electrician: Elektricist + gardener: Kopshtar + painter: Piktor + photographer: Fotograf + plumber: Hidraulik + shoemaker: Këpuctar + tailor: Rrobaqepës + "yes": Dyqan zeje + emergency: + ambulance_station: Stacion ambulance + defibrillator: Defibrilator + landing_site: Vend për ulje emergjente + phone: Kabinë telefoni për emergjencë highway: + abandoned: Autostradë e braktisur bridleway: Rrugë për kalërim + bus_guideway: Shirit i rezervuar për autobusë + bus_stop: Stacion autobusi + construction: Autostradë në ndërtim + cycleway: Rrugë biçikletash + elevator: Ashensor + emergency_access_point: Pikë qasjeje emeregjente + footway: Rrugë këmbësorësh ford: Va living_street: Rrugë për këmbësorë + milestone: Piketë + motorway: Autostradë + motorway_junction: Kryqëzim autostrade + motorway_link: Autostradë + path: Shteg + pedestrian: Rrugë këmbësorësh + platform: Platformë + primary: Rrugë primare + primary_link: Rrugë primare + proposed: Rrugë e propozuar + raceway: Pistë garash me veturë + residential: Rrugë banimi + rest_area: Zonë pushimi + road: Rrugë + secondary: Rrugë dytësore + secondary_link: Rrugë dytësore + service: Rrugë shërbimi + services: Shërbime autostrade + speed_camera: Kamerë shpejtësie (radar) + steps: Hapat + street_lamp: Llambë rruge + tertiary: Rrugë terciare + tertiary_link: Rrugë terciare + track: Gjurmë + traffic_signals: Shenja trafiku + trail: Shteg + trunk: Rrugë magjistrale + trunk_link: Rrugë magjistrale + unclassified: Rrugë e paklasifikuar + unsurfaced: Rrugë me kalldrëm + "yes": Rrugë historic: - church: Kisha - museum: Muze + archaeological_site: Vend arkeologjik + battlefield: Fushëbetejë + boundary_stone: Gur kufiri + building: Ndërtesë historike + bunker: Bunker + castle: Kala + church: Kishë + city_gate: Portë qyteti + citywalls: Mure qyteti + fort: Fortesë + heritage: Vend trashigimie + house: Shtëpi + icon: Ikonë + manor: Pronë e madhe + memorial: Memorial + mine: Minierë + monument: Monument + roman_road: Rrugë romake + ruins: Rrënoja + stone: Gur + tomb: Varr + tower: Kullë + wayside_cross: Kryq përgjatë rrugës + wayside_shrine: Kuti reliktesh përgjatë rrugës + wreck: Anije e mbytur + junction: + "yes": Kryqëzim + landuse: + allotments: Kopsht i vogël + basin: Pellg + brownfield: Deponi industriale + cemetery: Varreza + commercial: Zonë tregtare + conservation: Mbrojtje natyre + construction: Ndërtimtari + farm: Fermë + farmland: Tokë bujqësore + farmyard: Oborr ferme + forest: Pyll + garages: Garazha + grass: Bar + greenfield: Fushë jeshile (kullosë) + industrial: Zonë industriale + landfill: Deponi + meadow: Luadh + military: Zonë ushtarake + mine: Minierë + orchard: Pemishte + quarry: Gurore + railway: Hekurudhë + recreation_ground: Hapsirë rekreacioni + reservoir: Rezervuar + reservoir_watershed: Rezervuar ujëmbledhës + residential: Zonë e banuar + retail: Me pakicë + road: Zonë rruge + village_green: Fshat me gjelbrim + vineyard: Vreshtë + "yes": Përdorim toke + leisure: + beach_resort: Plazh + bird_hide: Kamuflim zogjësh + club: Klub + common: Tokë e përbashkët + dog_park: Park qenësh + fishing: Zonë peshkimi + fitness_centre: Qendër fitnesi + fitness_station: Saticion palestre + garden: Kopsht + golf_course: Fushë golfi + horse_riding: Kalërim + ice_rink: Vend patinazhi + marina: Sport porti (limani) + miniature_golf: Minigolf + nature_reserve: Rezervat natyror + park: Park + pitch: Terren sportiv + playground: Kënd lojërash + recreation_ground: Hapsirë rekreacioni + resort: Resort + sauna: Saunë + slipway: Rrëshqitëse + sports_centre: Qendër sportive + stadium: Stadium + swimming_pool: Pishinë + track: Pistë vrapimi + water_park: Park ujor + "yes": Kohë e lirë + man_made: + lighthouse: Fanar + pipeline: Tubacion + tower: Kullë + works: Fabrikë + "yes": I/e bërë nga njeriu + military: + airfield: Aeroport ushtarak + barracks: Kazerma + bunker: Bunker + mountain_pass: + "yes": Kalim malor natural: - cave_entrance: Shpella Hyrja + bay: Gji + beach: Plazh + cape: Kep + cave_entrance: Hyrje shpelle + cliff: Shkëmb + crater: Krater + dune: Dunë + fell: Kodrinë + fjord: Fjord (gji deti) + forest: Pyll + geyser: Gejzer + glacier: Akullnajë + grassland: Barishte + heath: Rrafshinë + hill: Kodër island: Ishull + land: Vend + marsh: Kënetë + moor: Moçal + mud: Baltë + peak: Majë + point: Pikë + reef: Gumë + ridge: Vargmal + rock: Gur + saddle: Shalë + sand: Rërë + scree: Rrëpirë me gurë (të rrëzuar) + scrub: Zonë me shkurre + spring: Pranverë + stone: Gur + strait: Rrugicë (ngushticë) + tree: Pemë + valley: Luginë volcano: Vullkan water: Ujë + wetland: Ligatinë + wood: Mal + office: + accountant: Kontabilist + administrative: Administratë + architect: Arkitekt + company: Kompani + employment_agency: Agjensi punësimi + estate_agent: Agjent i patundshmërive + government: Ent qeveritar + insurance: Zyrë sigurimi + lawyer: Avokat + ngo: Zyra e OJQ + telecommunication: Zyrë telekomunikacioni + travel_agent: Agjensi udhëtimesh + "yes": Zyrë place: + allotments: Kopsht i vogël + block: Bllok airport: Aeroport - city: Qyteti - country: Veni - farm: Ferma - house: Shtepi - houses: Shtepi + city: Qytet + country: Vend + county: Vend + farm: Fermë + hamlet: Fshat i vogël + house: Shtëpi + houses: Shtëpi island: Ishull - municipality: Komuna - postcode: Post kodi - region: Regjioni - sea: Deti - state: Shteti - town: Veni - village: Fshati + islet: Ishull + isolated_dwelling: Vendbanim i izoluar + locality: Lokalitet + moor: Moçal + municipality: Komunë + neighbourhood: Lagje + postcode: Kodi postar + region: Regjion + sea: Det + state: Shtet + subdivision: Nënndarje + suburb: Periferi + town: Qytezë + unincorporated_area: Zone e lirë + village: Fshat + "yes": Vend + railway: + abandoned: Hekurudhë e braktisur + construction: Hekurudhë në ndërtim e sipër + disused: Hekurudhë e braktisur + disused_station: Stacion hekurudhor jashtë përdorimi + funicular: Linjë teleferiku + halt: Stacion hekerudhor + historic_station: Stacion hekurudhor historik + junction: Nyje hekurudhore + level_crossing: Kryqzim hekurudhor + light_rail: Hekurudhë e lehtë + miniature: Hekurudhë në miniaturë + monorail: Hekurudhë me një shinë + narrow_gauge: Ngushticë hekurudhe + platform: Platformë hekurudhore + preserved: Hekurudhë muze + proposed: Hekurudhë e planifikuar + spur: Hekurudhë + station: Stacion hekurudhor + stop: Stacion hekurudhor + subway: Metro + subway_entrance: Hyrje metroje + switch: Pika hekurudhore shop: - bakery: Dyqan buke - computer: Shitore e kompjuterave + antiques: Antike + bakery: Furrë buke + beauty: Sallon bukurie + beverages: Dyqan pijesh + butcher: Mishtore + car: Sallon automobilash + car_parts: Autopjesë + car_repair: Autoservis + carpet: Dyqan qilimash + chemist: Drogeri + clothes: Dyqani rrobash + computer: Dyqan kompjuterësh + cosmetics: Dyqan kozmetike + department_store: Shtëpi mallrash + discount: Dyqan artikujsh me zbritje + doityourself: Dyqan 'bëje vet' + dry_cleaning: Pastrim kimik + electronics: Dyqan elektronike + estate_agent: Agjent i patundshmërive + fashion: Dyqan i veshjeve të modës + fish: Dyqan peshku + florist: Luleshitës + food: Ushqimore + funeral_directors: Ndërmarrje varrimi + furniture: Mobilieri + gallery: Galeri + garden_centre: Qendër kopshti + general: Dyqab me fushëveprim të përgjithshëm + gift: Dyqan dhuratash + greengrocer: Shitës frutash + grocery: Dyqan ushqimor + hairdresser: Floktar + hardware: Hekrari + hifi: Hi-Fi + insurance: Zyre sigurimi + jewelry: Dyqan bizhuterie + kiosk: Kiosk + laundry: Lavanderi + mall: Qendër tregtare + market: Treg + mobile_phone: Dyqan telefonash celular + motorcycle: Dyqan motoçikletash + music: Dyqan i veglave muzikore + optician: Optikë + pharmacy: Barnatore + photo: Fotograf + salon: Sallon + supermarket: Supermarket + tailor: Rrobaqepës + toys: Dyqan lodrash + "yes": Dyqan tourism: - artwork: Puna artistike - bed_and_breakfast: Bujtin dhe Mengjes - cabin: Kabine - camp_site: Ven per kamping - hostel: Bujtine + apartment: Apartament + artwork: Vepër artistike + bed_and_breakfast: Bujtinë me mëngjes + cabin: Kabinë + camp_site: Vend për kampim + gallery: Galeri + hostel: Bujtinë hotel: Hotel - information: Informacione + information: Informacion motel: Motel museum: Muze - picnic_site: Vend per Piknik - valley: Lugine + picnic_site: Vend për piknik zoo: Kopsht zoologjik + tunnel: + "yes": Tunel + waterway: + canal: Kanal + dam: Digë + derelict_canal: Kanal i braktisur + ditch: Hendek i thellë + drain: Drenazhim + mooring: Ankorim + river: Lum + stream: Rrjedhë + wadi: Përrua + waterfall: Ujëvarë + weir: Pendë + "yes": Ujore (rrugë) + admin_levels: + level2: Kufi vendi + level4: Kufi i njësisë federale + level5: Kufi regjional description: title: geonames: Lokacioni nga <a href="http://www.geonames.org/">GeoNames</a> + types: + cities: Qytetet + towns: Qyteza + places: Vende results: no_results: Nuk është gjetur asnjë rezultat more_results: Më shumë rezultate - direction: - south_west: jug-perëndim - south: jug - south_east: jug-lindje - east: lindja - north_east: veri-lindje - north: veriu - north_west: veri-perendim - west: perëndim layouts: project_name: title: OpenStreetMap h1: OpenStreetMap - logout: Ç'kyçu - log_in: Kyçuni - log_in_tooltip: Hyni ne me një llogari ekzistuese + logo: + alt_text: Logoja e OpenStreetMap + logout: Çidentifikohu + log_in: Identifikohu + log_in_tooltip: Identifikohu me një llogari ekzistuese + sign_up: Krijo llogari + start_mapping: Fillo hartografimin + sign_up_tooltip: Krijo një llogari për redaktim edit: Redakto + history: Historia + export: Eksporti + data: Të dhënat + export_data: Eksporto të dhënat + user_diaries: Ditarët e përdoruesit + user_diaries_tooltip: Shfaq ditarët e përdoruesit + edit_with: Redakto me %{editor} + tag_line: Harta e lirë e botës Wiki + intro_header: Mirësevjen në OpenStreetMap! + intro_text: OpenStreetMap është hartë e botës, e krijuar nga njerëz si ti dhe + për përdorim të lirshëm në kuadrin e një licence të hapur. + intro_2_create_account: Krijo një llogari përdoruesi + partners_html: Hostingu mbështetet nga %{ucl}, %{ic} dhe %{bytemark}, dhe të tjerë + %{partners}. + partners_partners: partnerët + help: Ndihmë + about: Rreth + copyright: Të drejtat e autorit + community: Komuniteti + community_blogs: Blogjet e komunitetit + foundation: Fondacioni + foundation_title: Fondacioni i OpenStreetMap make_a_donation: - text: Bëni një donacion + text: Dhuro + learn_more: Mëso më shumë + more: Më shumë license_page: foreign: title: Rreth këtij përkthimi - text: Në ni ngjarje të ni konflitkti me faqe e përktyme dhe %{english_original_link}, - Faqja anglisht ka perparsi - english_link: orgjianl anglisht + text: Në rast të një konflikti ndërmjet kësaj faqeje të përkthyer dhe %{english_original_link}, + faqja në anglisht do të ketë përparësi + english_link: origjinalit në anglisht native: - title: Rreth ksaj faqeje - text: Ju po shikoni versionin në gjuhën angelze të faqes së të drejtave autoriale. - Ju mund të shkoni prapa tek %{native_link} të kësaj faqe apo mund të ndaleni + title: Rreth kësaj faqeje + text: Je duke parë versionin në anglisht të faqes së të drejtave autoriale. + Mund të shkosh mbrapa tek %{native_link} i kësaj faqeje ose mund të ndalesh së lexuari rreth të drejtave autoriale dhe %{mapping_link}. - native_link: shqip verzion - mapping_link: Fillo hatrografimin + native_link: Versioni në THIS_LANGUAGE_NAME_HERE + mapping_link: fillo hatrografimin legal_babble: - title_html: Të drejtat autoriale dhe licenca + title_html: Të drejtat autoriale dhe licensa intro_1_html: |- - OpenStreetMap is <i>open data</i>, licensed under the <a + OpenStreetMap<sup><a href="#trademarks">®</a></sup> përmban <i>të dhëna të hapura</i>, të licencuara nën <a href="http://opendatacommons.org/licenses/odbl/">Open Data - Commons Open Database License</a> (ODbL). - intro_2_html: " Ju jeni të lirë të kopjoni, shpërndani, transmetoni dhe adoptoni - hartat\n dhe të dhënat tona, duke pasur parasysh citimin e OpenStreetMap - dhe \n kontribuuesve të saj. Nëse ndryshoni apo ndërtoni mbi hartat apo të - dhënat tona, ju\n mund të shpërndani rezultatet nën licencën e njëjtë. Licenca - e\n e plotë <a\n href=\"http://creativecommons.org/licenses/by-sa/2.0/legalcode\">legal\n + Commons Open Database License</a> (ODbL) by the <a + href="http://osmfoundation.org/">OpenStreetMap Foundation</a> (OSMF). + intro_2_html: "Ju jeni të lirë të kopjoni, shpërndani, transmetoni dhe adoptoni + dhe të dhënat tona, \nduke pasur parasysh citimin e OpenStreetMap dhe kontribuuesve + të saj. Nëse ndryshoni apo ndërtoni mbi hartat apo të dhënat tona, ju\nmund + të shpërndani rezultatet nën licencën e njëjtë. Licenca e plotë <a\n href=\"http://creativecommons.org/licenses/by-sa/2.0/legalcode\">legal\n \ code</a> shpjegon të drejtat dhe përgjegjësitë tuaja." + intro_3_html: |- + Hartografimi i pjesëve tona, dhe dokumantacioni ynë, janë të licencuara nën licensë të <a href="http://creativecommons.org/licenses/by-sa/2.0/">Creative + Commons Attribution-ShareAlike 2.0</a>(CC BY-SA). credit_title_html: Si të citoni OpenStreetMap - credit_1_html: " Nëse ju përdorni imazhe të hartave të OpenStreetMap, ne kërkojmë - që \n së paku citimet tuaja të përfshijnë “© OpenStreetMap\n kontribuuesit, - CC BY-SA”. Nëse ju përdorni vetëm të dhëna të hartave\n ne kërkojmë - citimin e kontribuuesve “të të dhënave të hartave © të OpenStreetMap,\n - \ CC BY-SA”." + credit_1_html: Ne kërkojmë që ju të përdorni kreditet e “© OpenStreetMap + contributors”. credit_2_html: " Ku është e mundur, OpenStreetMap duhet të hyperlinked to <a\n \ href=\"http://www.openstreetmap.org/\">http://www.openstreetmap.org/</a>\n \ dhe CC BY-SA to <a\n href=\"http://creativecommons.org/licenses/by-sa/2.0/\">http://creativecommons.org/licenses/by-sa/2.0/</a>. @@ -479,7 +972,7 @@ sq: e shtypur), ne sugjerojmë që ju të drejtoni lexuesit tek\n www.openstreetmap.org (ndoshta duke shpjeguar \n ‘OpenStreetMap’ këtë adresë të plotë) dhe tek \n www.creativecommons.org." - more_title_html: Të kuptoni më shumë + more_title_html: Zbulo më shumë more_1_html: |2- Lexoni më shumë rreth përdorimit të të dhënave <a href="http://wiki.openstreetmap.org/wiki/Legal_FAQ">Legal @@ -498,230 +991,389 @@ sq: paraqitur emrin apo duke lidhur faqen e tyre me link." contributors_ca_html: |- <strong>Canada</strong>: Përmban të dhëna nga - GeoBase®, GeoGratis (© Departamenti i Resurseve Natyrale - në Kanada), CanVec (© Departamenti i Resurseve Natyrale - në Kanada), and StatCan (Divizioni Gjeografik, - Statistik në Kanada ). - contributors_nz_html: |- - <strong>New Zealand</strong>: Përmban të dhëna nga burimet e Informatave të tokave - në Zelandë të re. Të drejtat e rezervuara i mbanë Crown. + GeoBase®, GeoGratis (© Department of Natural + Resources Canada), CanVec (© Department of Natural + Resources Canada), and StatCan (Geography Division, + Statistics Canada). + contributors_nz_html: '<strong>New Zealand</strong>: Përmban të dhëna të sigururar + nga Land Information New Zealand. Crown Copyright reserved.' contributors_gb_html: |- <strong>Britani e Madhe</strong>: Përmban të dhëna nga Ordnance Survey©. Crown i ka të drejtat autoriale dhe të databazës. contributors_footer_2_html: " Përfshirja e të dhënave në OpenStreetMap nuk thekson se të ofruesi origjinal i të \n dhënave përdor OpenStreetMap, ofron garancion, apo\n pranon çfarëdo anekse." + welcome_page: + title: Mirësevjen + whats_on_the_map: + title: Çfarë ka në hartë? + basic_terms: + title: Termat bazë për hartografim + paragraph_1_html: OpenStreetMap ka disa shprehje në zhargonin e vet. Këtu janë + disa fjalë kyçe mund të jenë të dobishme. + editor_html: Një <strong>redaktor</strong> është një program apo faqe të cilën + mund ta përdorni për ta redaktuar hartën. + node_html: Një <strong>nyje</strong> është një pikë në hartë, si një restorant + i vetëm ose një pemë. + way_html: Një <strong>rrugë</strong> është një linjë apo fushë, si një rrugë, + lumë, liqen apo ndërtesë. + rules: + title: Rregullat! + start_mapping: Fillo hartografimin + add_a_note: + title: Nuk ke kohë për të redaktuar? Shto një shënim! + fixthemap: + how_to_help: + title: Si të ndihmosh + join_the_community: + title: Bashkohu me komunitetin + explanation_html: Nëse keni vënë re një problem me të dhënat e hartës, për + shembull një rrugë mungon apo adresa juaj, mënyra më e mirë për të procesuar + është t'i bashkohesh komunitetit OpeenStreetMap dhe të shtosh apo të riparosh + të dhënat vetë. + add_a_note: + instructions_html: Klikoni <a class='icon note'></a> ose të njëjtën ikonë + në ekranin e hartës. Kjo do të shtojë një shënues në hartë, të cilën ju + mund ta lëvizni duke e tërhequr. Shtoni mesazhin tuaj, pastaj klikoni save + dhe editues të tjerë do ta kontrollojnë. + other_concerns: + title: Shqetësime të tjera + help_page: + title: Merr ndihmë + introduction: OpenStreetMap ka disa burime për të mësuar në lidhje me projektin, + duke bërë pyetje dhe duke ju përgjigjur dhe duke diskutuar bashkërisht dhe duke + dokumentuar temat e hartës. + welcome: + url: /mirësevjen + title: Mirësevjen në OSM + description: Filloni me këtë udhëzues të thjeshtë që mbulon bazat e OpenStreetMap. + beginners_guide: + url: http://wiki.openstreetmap.org/wiki/Sq:Beginners%27_guide + title: Udhëzues për fillestarë. + description: Një udhëzues për fillestarë që mirëmbahet nga komuniteti. + help: + url: https://help.openstreetmap.org/ + title: help.openstreetmap.org + description: Bëni një pyetje ose shikoni përgjigjet në faqen pyetje dhe përgjigje + të OSM-së. + mailing_lists: + title: Listat E Postimeve + description: Bëni një pyetje ose diskutoni çështje interesante në një gamë të + gjerë të listës së postimeve të ditës apo rajonale. + forums: + title: Forumet + about_page: + next: Tjetra + copyright_html: <span>©</span>OpenStreetMap<br>kontribuesit notifier: + diary_comment_notification: + hi: Përshëndetje %{to_user}, message_notification: subject_header: '[OpenStreetMap] %{subject}' - hi: Tung %{to_user}, + hi: Përshëndetje %{to_user}, gpx_notification: - greeting: Tung, + greeting: Përshëndetje, failure: import_failures_url: http://wiki.openstreetmap.org/wiki/GPX_Import_Failures + signup_confirm: + subject: '[OpenStreetMap] Mirësevjen në OpenStreetMap' + greeting: Tungjatjeta! email_confirm: - subject: '[OpenStreetMap] Konfirmo email adresën tënde' + subject: '[OpenStreetMap] Konfirmo adresën e emailit tënd' email_confirm_plain: - greeting: Tung, + greeting: Përshëndetje, email_confirm_html: - greeting: Tung, - click_the_link: Nëse ky je ti, ju lutem trusni lidhjen e mëposhtme për me konfirmu - ndryshimin. + greeting: Përshëndetje, + click_the_link: Nëse ky je ti, të lutem kliko në lidhjen e mëposhtme për të + konfirmuar ndryshimin. + lost_password_plain: + greeting: Përshëndetje, + lost_password_html: + greeting: Përshëndetje, + note_comment_notification: + greeting: Përshëndetje, + changeset_comment_notification: + greeting: Përshëndetje, + commented: + partial_changeset_without_comment: pa koment message: inbox: + title: Kutia mbërritëse + my_inbox: Kutia ime mbërritëse + messages: Ti ke %{new_messages} dhe %{old_messages} from: Prej + subject: Titulli date: Data + no_messages_yet: Ti nuk ke mesazhe ende. Pse nuk kontakton ndonjërin nga %{people_mapping_nearby_link}? + people_mapping_nearby: hartografët aty pranë + message_summary: + unread_button: Shëno si të palexuar + read_button: Shëno si të lexuar + reply_button: Përgjigje + delete_button: Fshi new: - title: Qo mesazh - limit_exceeded: Ju keni dërguar shumë mesazhe kohët e fundit. Ju lutem prisni - një kohë para se të dërgoni ndonjë tjetër. + title: Dërgo mesazh + send_message_to: Dërgo një mesazh të ri për %{name} + subject: Titulli + body: Trupi i mesazhit + send_button: Dërgo + back_to_inbox: Mbrapa te kutia mbërritëse + message_sent: Mesazhi u dërgua + limit_exceeded: Ke dërguar shumë mesazhe kohët e fundit. Të lutem prit pakëz + para se të dërgosh ndonjë tjetër. + no_such_message: + title: Nu ka mesazh të tillë + heading: Nuk ka mesazh të tillë + body: Na vjen keq, nuk ka mesazh me këtë id. + outbox: + title: Dalje + my_inbox: '%{inbox_link}' + inbox: kuti mbërritëse + outbox: dalje + to: Për + subject: Titulli + date: Data + read: + from: Prej + subject: Titulli + date: Data + reply_button: Përgjigje + unread_button: Shëno si të palexuar + back: Prapa + to: Për + wrong_user: 'TI je identifikuar si: "%{user}'', por mesazhi që ke kërkuar për + të lexuar nuk ishte dërguar nga ose për atë përdorues. Të lutem identifikohu + si përdorues i saktë për të lexuar atë.' sent_message_summary: - delete_button: Fshij + delete_button: Fshi + mark: + as_read: Mesazhi është shënuar si të lexuar + as_unread: Mesazhi është shënuar si i palexuar site: edit: + user_page_link: '{{GENDER:{{ROOTPAGENAME}}|faqja e përdoruesit|faqja e përdorueses}}' anon_edits: (%{link}) - flash_player_required: Ju duhet të keni Flash player për ta përdorur Potlatch, - Flash editorin e OpenStreetMap. Ju mundeni <a href="http://www.adobe.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash">ta - shkarkoni Flash Player nga Adobe.com</a>. <a href="http://wiki.openstreetmap.org/wiki/Editing">Disa - mënyra të tjera</a> janë të mundshme për ta edituar OpenStreetMap. + flash_player_required: Ti duhet të kesh 'Flash Player' për ta përdorur 'Potlatch', + redaktorin e 'OpenStreetMap Flash'. Ti mund ta shkarkosh <a href="http://www.adobe.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash">Flash + Player nga Adobe.com</a>. <a href="http://wiki.openstreetmap.org/wiki/Editing">Disa + mënyra të tjera</a>të për ta redaktuar OpenStreetMap, gjithashtu janë të mundshme. sidebar: - search_results: Rezultatet e Kërkimit - close: Mbylle + search_results: Rezultatet e kërkimit + close: Mbyll search: search: Kërko + from: Prej + to: Për where_am_i: Ku jam unë? key: table: entry: - centre: Qendër Sportive + centre: Qendër sportive + military: Zonë ushtarake + school: + - Shkollë + - Universitet + building: Ndërtesë + station: Stacioni hekurudhor + summit: + - Samit + - majë + richtext_area: + edit: Redakto + preview: Parapamje trace: visibility: - private: Private (ndahen vetem si pika anonime të rendituna) - public: Publike (shfaqet ne listen e të dhanave si e padukshme, pikat e rendituna) - trackable: Mund të përcilelt (vetëm e shkëmbyer në formë anonime, duke porositur - pikë me vula kohore) - identifiable: E indentifikueshme (shfaqet ne listen e te dhanave, pikat i urdheron - me orë) + private: Privat (ndahet vetëm si anonim, pika të parenditura) + public: Publik (ndahet vetëm si anonim, pika të parenditura) + trackable: E gjurmueshme (vetëm e bashkëndarë si anonime, të pikave të rendituea + me vula kohore) + identifiable: Të identifikueshme (të treguara në listën e gjurmëve të identifikueshme, + të pikave të renditura me vulë kohore) create: - upload_trace: Ngarkoj tdhanat e GPS-it - trace_uploaded: E dhana jote GPX asht ngarkue edhe osht ka pret futojen en databazë. - Kjo yakonisht ndodhë mrena gjysë ore, dhe ni imellë vjen te ti en fund të - përfundimit + upload_trace: Ngarko gjurmët e GPS + trace_uploaded: Skeda e juaj GPX është ngarkuar dhe është në pritje për futje + në bazën e të dhënave. Kjo zakonisht ndodhë brenda një gjysmë ore dhe pas + përfundimit do të ju dërgohet një email. edit: - title: Duke ndrzshue të dhanen %{name} - heading: Ndrysho të dhanen %{name} - filename: 'Emri fajllit:' + title: Duke redaktuar gjurmën %{name} + heading: Duke redaktuar gjurmën %{name} + filename: 'Emri i skedës:' download: shkarko - uploaded_at: 'Te ngarkume:' - points: 'Piket:' - start_coord: 'Fillo kordinaten:' + uploaded_at: 'Ngarkuar:' + points: 'Pikë:' + start_coord: 'Fillo koordinatën:' map: harta - edit: ndryshoje + edit: redakto owner: 'Pronari:' - description: 'Pershkrimi:' - tags: 'Etiketa:' - tags_help: Presje e kufizume + description: 'Përshkrimi:' + tags: 'Etiketat:' + tags_help: ndarë me presje save_button: Ruaj ndryshimet - visibility: Dukshmenia - visibility_help: Çka do me than kjo? + visibility: 'Dukshmëria:' + visibility_help: çfarë do të thotë kjo? visibility_help_url: http://wiki.openstreetmap.org/wiki/Visibility_of_GPS_traces trace_form: upload_gpx: 'Ngarko një skedar GPX:' description: 'Përshkrimi:' tags: 'Etiketat:' - tags_help: Presje e kufizume + tags_help: ndarë me presje visibility: 'Dukshmëria:' visibility_help: çfarë do të thotë kjo? visibility_help_url: http://wiki.openstreetmap.org/wiki/Visibility_of_GPS_traces upload_button: Ngarko - help: Ndihma + help: Ndihmë help_url: http://wiki.openstreetmap.org/wiki/Upload trace_header: - upload_trace: Ngarkoni një gjurmë - see_all_traces: Kshyre kejt të dhanat - see_your_traces: Shikoj kejt të dhanat tuja + upload_trace: Ngarko një gjurmë + see_all_traces: Shih të gjitha gjurmët + see_your_traces: Shih gjurmët e tua traces_waiting: Ju keni %{count} të dhëna duke pritur për tu ngrarkuar.Ju lutem pritni deri sa të përfundoj ngarkimi përpara se me ngarku tjetër gjë, pra që mos me blloku rradhën për përdoruesit e tjerë. trace_optionals: - tags: Etiketa + tags: Etiketat view: - title: Duke par gjurmen %{name} - heading: Tuj i kqyr t'dhanat %{name} + title: Duke shfaqur gjurmën %{name} + heading: Duke shfaqur gjurmën %{name} pending: DUKE PRITUR - filename: 'Emri i fajllit:' + filename: 'Emri i skedës:' download: shkarko uploaded: 'Ngarkuar:' - points: 'Piket:' - start_coordinates: 'Fillo kordinimin:' + points: 'Pikë:' + start_coordinates: 'Fillo koordinatën:' map: harta - edit: ndrysho + edit: redakto owner: 'Pronari:' - description: 'Pershkrimi:' + description: 'Përshkrimi:' tags: 'Etiketa:' - none: Asnjo - edit_track: Ndrysho ket gjurm - delete_track: Fshij ket gjurm + none: Asnjë + edit_track: Redakto këtë gjurmë + delete_track: Fshi këtë gjurmë trace_not_found: Gjurma nuk u gjet! - visibility: 'Pamshmeria:' + visibility: 'Dukshmëria:' trace_paging_nav: showing_page: Duke shfaqun faqen %{page} trace: pending: NE PRITJE - count_points: '%{count} piket' - ago: '%{time_in_words_ago} përpara' - more: ma shume - trace_details: Kshryi detalet e të dhanave - view_map: Kshyre Harten - edit: ndrysho - edit_map: Ndryshoje Harten + count_points: '%{count} pikë' + ago: '%{time_in_words_ago} më parë' + more: më shumë + trace_details: Shfaq detajet e gjurmës + view_map: Shiko hartën + edit: redakto + edit_map: Redakto hartën public: PUBLIKE - identifiable: E identifikueshme + identifiable: E IDENTIFIKUESHME private: PRIVAT trackable: E GJURMUESHME by: nga - in: ne + in: në map: harta list: - public_traces: Të dhanat publike të GPS-IT - your_traces: Të dhanat e GPS-it - public_traces_from: Të dhana publike të GPS-it pej %{user} - tagged_with: e etikume me %{tags} + public_traces: Gjurmët publike të GPS + your_traces: Gjurmët e GPS tuaj + public_traces_from: Gjurmët publike të GPS nga %{user} + description: Shfletoni ngarkimet e fundit gjurmëve të GPS + tagged_with: etiketuar me %{tags} delete: - scheduled_for_deletion: Gjurma u parapa per fshirje + scheduled_for_deletion: Gjurmë e planifikuar për fshirje make_public: - made_public: Gjurma u ba publike + made_public: Gjurmë e bërë publike offline_warning: - message: Sistemi i ngarkimit GPX per momentin asht jasht perdonimit + message: Sistemi i ngarkimit të skedës GPX aktualisht është jashtë përdonimit offline: - heading: Mbledhsi i GPX asht jasht linje - message: Mbledshi i skedareve GPX dhe sistemi i ngarkimit per momentin jane - jasht funksionit. + heading: Ruajtësi GPX jashtë linje + message: Ruajtja e skedës GPC dhe sistemi i ngarkimit aktualisht është jashtë + përdonimit oauth_clients: new: submit: Regjistrohu + edit: + submit: Redakto + show: + edit: Redakto detajet + confirm: A je i sigurt? form: name: Emri user: login: - title: Kycu - heading: Kycu - email or username: 'Email Adresa ose Username:' - password: 'Fjalekalimi:' - remember: 'Kujtom mu:' - lost password link: Keni humbur fjalëkalimin? - login_button: Kycu - account not active: Na vjen keq, llogaria juaj nuk është aktive akoma. <br /> - Ju lutem përdorni lidhjen në email konfirmimi llogari të aktivizoni llogarinë - tuaj, ose <a href="%{reconfirm}">të kërkojë një konfirmim email te ri</a> - . - auth failure: Na vjen keq, smunem me ju kyc me ato detaje. + title: Identifikohu + heading: Identifikohu + email or username: 'Adresa e emailit ose emri i përdoruesit:' + password: 'Fjalëkalimi:' + remember: Më mbaj mend + lost password link: Ke humbur fjalëkalimin? + login_button: Identifikohu + register now: Regjistrohu tani + create account minute: Krijoni një llogari. Ajo mer vetëm një minutë kohë. + no account: Nuk ke llogari? + account not active: Na vjen keq, llogaria e jote nuk është aktive akoma.<br + /> Të lutem përdor lidhjen në emailin e konfirmimit, në llogari tënde, për + ta aktivizuar atë, ose <a href="%{reconfirm}">kërko një email konfirmimi të + ri</a> . + account is suspended: Na vjen keq, llogarinë tuaj ka qenë i pezulluar për shkak + të aktivitetit të dyshimtë.<br />Ju lutem kontaktoni <a href="%{webmaster}">webmaster</a> + nëse ju dëshironi për të diskutuar këtë. + auth failure: Na vjen keq, nuk mund të identifikohemi me ato detaje. + openid_logo_alt: Identifikohu me ndonjë ID të hapur + auth_providers: + openid: + title: Identifikohu me OpenID + github: + title: Login me GitHub + wikipedia: + alt: Login me një Llogari në Wikipedia logout: - title: Dil - heading: Dil nga OpenStreetMap - logout_button: Dil + title: Çidentifikohu + heading: Çidentifikohu nga OpenStreetMap + logout_button: Çidentifikohu lost_password: - title: T'ka hup fjalkalimi - heading: Keni harruar fjalëkalimin? - email address: 'Email Adresa:' - new password button: Ndrysho fjalkalimin - help_text: Shkrueje email adresen që je regjistrue me to, do t'ju deromi një - lidhe rreth ksaj ku ju muni me ndrru fjalkalimin - notice email on way: Na vjen keq qe e keni hup :-( po ni email ka me ju ardh - se shepjti edhe muni me ricaktu. - notice email cannot find: Smujtem me gjet qat email adres, na vjen keq. + title: Fjalëkalimi i humbur + heading: Ke harruar fjalëkalimin? + email address: 'Adresa e emailit:' + new password button: Rivendos fjalëkalimin + help_text: Shkruani adresën e emailit që keni përdorur për tu regjistruar, ne + do të dërgojmë një lidhje të cilën mund të përdorni për të rivendosur fjalëkalimin + tuaj. + notice email on way: Na vjen keq e keni humbur atë :-( por një email është në + rrugëtim kështu që ju mund të rivendosni atë së shpejti. + notice email cannot find: Na vjen keq, ne nuk arritë ta gjejmë adresën e emailit + të dhënë. reset_password: - title: Ricakto fjalekalimin - heading: Ricakto fjalekalimin per %{user} - password: 'Fjalekalimi:' - confirm password: 'Konfirmo Fjalekalimin:' - reset: Ricakto Fjalekalimin - flash changed: Fjalëkalimi juaj është ndryshuar. - flash token bad: Sun e gjetem qat oken, kshyre URL nashta ? + title: Rivendos fjalëkalimin + heading: Rivendos fjalëkalimin për %{user} + password: 'Fjalëkalimi:' + confirm password: 'Konfirmo fjalëkalimin:' + reset: Rivendos fjalëkalimin + flash changed: Fjalëkalimi yt është ndryshuar. + flash token bad: Nuk e gjet atë shenjë, kontrollo URL-në? new: title: Krijo llogari - no_auto_account_create: Per momentin spo mujm me ju kriju akount automatikisht. - contact_webmaster: Ju lutna kontaktoni <a href="mailto:webmaster@openstreetmap.org">webmasterin</a> - per me caktu ni akount qe te ju krijohet - na do te merremi me kerkesat sa - ma shpejt qe tjet e mundshme. - license_agreement: Kur ju konfirmoni llogranië tuaj, ju duhet të pajtoheni me - <a href="http://www.osmfoundation.org/wiki/License/Contributor_Terms"> kushtet + no_auto_account_create: Për fat të keq aktualisht nuk jeni në gjendje për të + krijuar automatikisht një llogari për ty. + contact_webmaster: Ju lutem kontaktoni <a href="%{webmaster}">webmaster</a> + për të organizuar krijimin e një llogarie - ne do të përpiqemi dhe të merremi + me kërkesën sa më shpejt që të jetë e mundur. + about: + header: E lirë dhe e editueshme + license_agreement: Kur ju konfirmoni llograinë tuaj, duhet të pajtoheni me <a + href="http://www.osmfoundation.org/wiki/License/Contributor_Terms"> kushtet e përdoruesit</a>. - email address: 'Email Adresa:' - confirm email address: 'Konfirmo Adresen e Emailit:' - not displayed publicly: Nuk u shfaq publikisht (see <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" - title="wiki privacy policy including section on email addresses">privacy policy</a>) - display name: 'Emri i pamshem:' - display name description: Emni jot publik. Ju muni me ndrry ne preferencat ma - von. + email address: 'Adresa e emailit:' + confirm email address: 'Konfirmo adresën e emailit:' + not displayed publicly: Nuk shihet publikisht (shih <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" + title="politika e privatësisë përfshirë seksionin në adresat e emailit të + wiki">privacy policy</a>) + display name: 'Emër i dukshëm:' + display name description: Emri yt publik. Ti mund ta ndryshosh më vonë në preferenca. password: 'Fjalëkalimi:' - confirm password: 'Konfirmo fjalekalimin:' + confirm password: 'Konfirmo fjalëkalimin:' continue: Vazhdo - terms accepted: Faleminderit që keni pranuar kushtet e reja për kontribues! + terms accepted: Faleminderit për pranimin kushteve të reja për kontribues! terms declined url: http://wiki.openstreetmap.org/wiki/Contributor_Terms_Declined terms: - title: Kushtet e Kontribimit - heading: Kushtet e Kontribimit + title: Kushtet për kontribues + heading: Kushtet për kontribues read and accept: Ju lutem lexoni marrëveshjen më poshtë dhe shtypni butonin e dakordimit për të konfirmuar se ju pranoni kushtet e kësaj marrëveshjeje për kontributin tuaj ekzistues dhe të ardhshëm. @@ -732,201 +1384,222 @@ sq: agree: Pajtohem declined: http://wiki.openstreetmap.org/wiki/Contributor_Terms_Declined decline: Nuk e pranoj - legale_select: 'Ju lutem zgjidhni vendin tuaj të qëndrimit:' + legale_select: 'Vendi i banimit:' legale_names: france: Francë italy: Itali rest_of_world: Pjesa tjetër e botës no_such_user: - title: Ska ksi shfrytezuesi - heading: Anëtari %{user} nuk ekziston - body: Na vje keq, ska shfrytzues me ket emen %{user}. Ju lutmi kontrolloni shkrimin, - ose nashta linku ku keni kliku asht gabim. + title: Nuk ka përdorues të tillë + heading: Përdoruesi %{user} nuk ekziston + body: Na vjen keq, nuk ka përdorues me emrin %{user}. Të lutem kontrollo drejtshkrimin, + ose ndoshta linku që ke klikuar është gabim. view: - my diary: ditari im - new diary entry: hyrje e re ne ditar - my edits: ndryshimet e mia - my traces: gjurmet e mia - my settings: preferencat e mia - oauth settings: Konfigurimet oauth - blocks on me: bllokimet e mia - blocks by me: bllokimet e dhana nga un - send message: dergo mesazh - diary: ditari - edits: ndryshimet - traces: gjurmet - remove as friend: heke si shok - add as friend: shtoje si shoq - mapper since: 'Hartues qe prej:' - ago: (para %{time_in_words_ago}) - email address: 'Email adresa:' + my diary: Ditari im + new diary entry: shënim i ri në ditar + my edits: Redaktimet e mia + my traces: Gjurmët e mia + my notes: Shënimet e mia + my messages: Mesazhet e mia + my profile: Profili im + my settings: Preferencat e mia + my comments: Komentet e mia + oauth settings: Konfigurimet i rregullave + blocks on me: Blloqet mbi mua + blocks by me: Bllokimet nga unë + send message: Dërgo mesazh + diary: Ditari + edits: Redaktimet + traces: Gjurmët + notes: Shënimet e hartës + remove as friend: Largo mikun + add as friend: Shto si mik + mapper since: 'Hartues që prej:' + ago: (%{time_in_words_ago} më parë) + latest edit: 'Redaktimi i fundit %{ago}:' + email address: 'Adresa e emailit:' created from: 'Krijuar nga:' status: 'Statusi:' spam score: 'Rezultati me Spam:' description: Përshkrimi - user location: Veni i shfyrtezuesit - if set location: Nqofse e zgedh venin, shum harta edhe sene kan me u paraqit - ktu. Ju muni me caktu venin ton ne %{settings_link} . - settings_link_text: ndryshimet - your friends: Miqtë e juaj - no friends: Hala nuk ke shtue asni shoq. + user location: Vendi i përdoruesit + if set location: Vendosni vendndodhjen e shtëpisë suaj në faqen %{settings_link} + për të parë përdoruesit që ndodhen afër. + settings_link_text: parametrat + your friends: Miqtë tuaj + no friends: Akoma nuk ke shtuar ndonjë mik. km away: '%{count}km larg' m away: '%{count}m larg' - nearby users: Shfrytezuesit e tjer qe jan afer - no nearby users: Hala nuk ka shfrytezues qe pranon hartimin e aftert. + nearby users: Përdoruesit e tjerë aty pranë + no nearby users: Nuk ka përdorues tjerë aty pranë, të cilët pranojnë të hartografojnë. role: administrator: Ky përdorues është një administrator moderator: Ky përdorues është një moderator grant: - administrator: Mundëso qasje administratorit - moderator: Mundeso qasje për moderatorin + administrator: Mundëso qasje administratori + moderator: Mundëso qasje moderatori revoke: - administrator: heq qasjen e administratorit - moderator: heq qasjen e moderatorit - block_history: shih blokimet e marrne - moderator_history: shihe kan e ke blloku - create_block: blloko ket shfrytzues - activate_user: aktivizo ket shfrytezues - deactivate_user: c'aktivizoje ket shfrytezues - confirm_user: konfirmoje këtë përdorues - hide_user: mshife ket shfrytezues - unhide_user: shfaqe ket shfrytzues - delete_user: fshije këtë përdoruesin + administrator: Revoko qasjen e administratorit + moderator: Revoko qasjen e moderatorit + block_history: bllokimet e pranuara + moderator_history: bllokimet e dhëna + create_block: blloko këtë përdorues + activate_user: aktivizo këtë përdorues + deactivate_user: ç'aktivizo këtë përdorues + confirm_user: konfirmo këtë përdorues + hide_user: fsheh këtë përdorues + unhide_user: zbulo këtë përdorues + delete_user: fshi këtë përdorues confirm: Konfirmo popup: - your location: Lokacioni juaj - nearby mapper: Hartues i aftert - friend: Shoq + your location: Vendndodhja e jote + nearby mapper: Hartuesi aty pranë + friend: Mik account: - title: Ndrysho akountin + title: Redakto llogarinë my settings: Preferencat e mia - current email address: 'Email adresa e tanishme:' - new email address: 'Email adresa e re:' - email never displayed publicly: (asniher su kan publike) + current email address: 'Adresa e tanishme e emailit:' + new email address: 'Adresa e re e emailit:' + email never displayed publicly: (asnjëherë nuk është publikuar) + openid: + link text: çfarë është kjo? public editing: - heading: 'Ndryshime publike:' - enabled: E pranishme. Jo anonime dhe muni me i ndryshue t'dhanat. + heading: 'Redaktim publik:' + enabled: I aktivizuar. Jo anonim dhe mund të redaktojë të dhënat. enabled link: http://wiki.openstreetmap.org/wiki/Anonymous_edits enabled link text: çfarë është kjo? - disabled: E ckyckur dhe smuni me i ndryshi te dhanat, te gjitha ndryshime - e ma hershme jan anonime. + disabled: I çaktivizuar dhe nuk mund të redaktojë të dhënat, të gjitha redaktimet + e mëparshme janë anonime. disabled link text: pse nuk mund të redaktoj? public editing note: - heading: Duke ndryshue publikisht + heading: Redaktim publik contributor terms: - heading: 'Kushtet e Kontribimit:' - agreed: Ju duhet të jeni pajtuar me Kushtet e reja të Kontribuesit. - not yet agreed: Ju ende nuk jeni pajtuar me Kushtet e reja për Kontribues. - review link text: Ju lutemi që të përcillni këtë link për të lehtësinë tuaj - për të rishikuar dhe pranuar Kuhstet e Kontribuesit. - agreed_with_pd: Ju gjithashtu keni deklaruar se ju konsideroni që editimet - tuaja të jenë në Domenin Publik. + heading: Kushtet për kontribues + agreed: Ti je pajtuar me kushtet e reja për kontribues. + not yet agreed: Ti ende nuk je pajtuar me kushtet e reja për kontribues. + review link text: Të lutem ndiq i këtë link për të për të lexuar dhe pranuar + kushtet e kontribuesit. + agreed_with_pd: Ti gjithashtu ke deklaruar, që redaktimet e tua të jenë në + pronësi publike. link: http://www.osmfoundation.org/wiki/License/Contributor_Terms link text: Çka është kjo? - profile description: 'Pershkrimi i profilit:' + profile description: 'Përshkrimi i profilit:' preferred languages: 'Gjuhët e parapëlqyera:' - preferred editor: 'Editor i parapëlqyer:' + preferred editor: 'Redaktori i parapëlqyer:' image: 'Imazhi:' + gravatar: + gravatar: Përdor Gravatar + link text: çfarë është kjo? new image: Shto një imazh - keep image: Maje imazhin e tanishem - delete image: Heke imazhin e tanishem - replace image: Ndërroje fotografin e tanishme - image size hint: (imazhet katrore s'paku me madhsi 100x100px doken ma mir) - home location: 'Veni juej:' - no home location: Ju se keni caktu venin e juj. + keep image: Mbaj imazhin e tanishëm + delete image: Heq imazhin e tanishëm + replace image: Zëvendëso imazhin e tanishëm + image size hint: (imazhet katror të paktën 100x100 duken më mirë) + home location: 'Vendndodhja e shtëpisë:' + no home location: Nuk ke shëuar vendndodhjen e shtëpisë tënde. latitude: 'Latituda:' longitude: 'Longituda:' - update home location on click: Ndryshoma venin kur te klikoj ne hart? - save changes button: Ruaj Ndryshimet - make edits public button: Boni gjith ndryshimet e mija publike - return to profile: Kthehu te profili - flash update success confirm needed: Informatat e shfyrtezuesit u ndryshan me - sukses. Shihni emailin per konfirmim. - flash update success: Informatat e anëtarit janë ndryshuar me sukses. + update home location on click: Përditëso vendndodhjen e shtëpisë kur unë klikoj + në hartë! + save changes button: Ruaj ndryshimet + make edits public button: Të gjitha redaktimet e mia bëjë publike + return to profile: Mbrapa te profili + flash update success confirm needed: Informacioni i përdoruesit u përditësua + me sukses. Kontrolloni emailin tuaj për një shënim për të konfirmuar adresën + e re të emailit tuaj. + flash update success: Informacioni i përdoruesit u përditësua me sukses. confirm: - heading: Konfirmo nje akount te shfrytezuesit - press confirm button: Shtypni butonin e mëposhtëm për të aktivizuar llogarinë - tuaj. + heading: Kontrollo emailin tënd! + press confirm button: Shtyp butonin e mëposhtëm për të aktivizuar llogarinë + tënde. button: Konfirmo + success: Llogaria e juaj u konfirmua, ju falemninderit që u regjistruat! already active: Kjo llogari tashmë është konfirmuar. - unknown token: Ajo shenjë duket se nuk ekziston. + unknown token: Kodi i konfirmimit ka skaduar ose nuk ekziston. confirm_resend: success: Ne kemi dërguar një shënim konfrimimi tek %{email} juaj dhe sapo të konfirmoni llogarnië ju do të jeni në gjendje të filloni punën me harta.<br /><br />Nëse ju përdorni një antispam sistem që dërgon kërkesat e konfirmimit - atëherë ju lutem që të shtoni në listën e bardhë webmaster@openstreetmap.org - pasi që ne nuk do të jemi në gjendje të përgjigjemi ndaj çfarëdo kërkese për - konfirmim. + atëherë ju lutem që të shtoni në listën e bardhë %{sender} pasi që ne nuk + do të jemi në gjendje të përgjigjemi ndaj çfarëdo kërkese për konfirmim. failure: Përdoruesi %{name} nuk u gjet. confirm_email: - heading: Konfirmo ni ndryshim te email adreses - press confirm button: Shtypni butonin e mëposhtëm për të konfirmuar e-mail adresën - tuaj të re. + heading: Konfirmoni ndryshimin e adresës së emailit + press confirm button: Shtypni butonin e mëposhtëm për të konfirmuar adresën + e re të emailit tuaj. button: Konfirmo - success: Emaili juaj është konfirmuar, faleminderit që jeni regjistruar! - failure: Ni email adres tashma osht konfirmue me ket token. + success: Konfirmohet ndryshimi i adresës së emailit! + failure: Një adresë emaili tashmë është konfirmuar me këtë shenjë. set_home: flash success: Lokacioni i shtëpisë është ruajtur me sukses go_public: - flash success: Gjitha ndryshimet tuja janë publike tash, edhe tash t'lejohet - me ndryshue + flash success: Të gjitha redaktimet e tua tani janë publike dhe tani të lejohet + t'i redaktosh ato. make_friend: - success: '%{name} eshte shok/shoqe jot/e.' - failed: Na vjen keq, deshtuam ta shtojm %{name} si shok/qe. - already_a_friend: Ju tashmë jeni shok me %{name}. + success: '%{name} është tani mik i juaj.' + failed: Na vjen keq, nuk arritëm të shtojmë %{name} si mik. + already_a_friend: Ju tashmë jeni miq me %{name}. remove_friend: - success: '%{name} u hek pi shokve tu' - not_a_friend: '%{name} nuk osht njoni pi shokve tu.' + success: '%{name} u hoq nga miqtë tuaj.' + not_a_friend: '%{name} nuk është një nga miqtë tuaj.' filter: - not_an_administrator: Ju duhet te jeni administrator per me performu ket aksion. + not_an_administrator: Ju duhet të jetë një administrator për të kryer këtë veprim. list: - title: Përdoruesit + title: Përdoruesi heading: Përdorues showing: - other: një=Faqe e shfaqur %{page} (%{first_item} e %{items}) + one: Faqe %{page} (%{first_item} nga %{items}) + other: Page %{page} (%{first_item}-%{last_item} nga %{items}) summary: '%{name} krijuar nga %{ip_address} më %{date}' summary_no_ip: '%{name} krijuar më %{date}' confirm: Konfirmo përdoruesit e zgjedhur hide: Fshih përdoruesit e zgjedhur - empty: Asnjë përdorues i përafërt nuk u gjet + empty: Asnjë përdorues që përputhet nuk u gjet user_role: filter: - not_an_administrator: Veç administratorat munen me pas rol te menaxhimit, dhe - ju nuk jeni administrator. - not_a_role: Ldihja `%{role}' nuk asht rol valid. - already_has_role: Shfrytzuesi tashme ka ni rol %{role}. - doesnt_have_role: Ky shfrytzeus nuk ka asni rrol %{role} + not_an_administrator: Vetëm administratorët mund të kryejnë menaxhimin e rolit + të përdoruesit, dhe ju nuk jeni një administrator. + not_a_role: Vargu `%{role}' nuk është një rol i vlefshëm. + already_has_role: Përdoruesi tashmë e ka rolin %{role}. + doesnt_have_role: Përdoruesi nuk e ka rolin %{role}. grant: - title: Konfirmo dhanjen e rolit - heading: Konfirmo dhenjen e rolit - are_you_sure: A jeni i sigurt qe po doni mja dhone rolin `%{role}' te perdoruesi + title: Konfirmimi i dhënies së rolit + heading: Konfirmimi i dhënies së rolit + are_you_sure: A jeni i sigurt që ju doni t'i jepni rolin `%{role}' përdoruesit `%{name}'? confirm: Konfirmo - fail: Nuk i dha rol tmadh `%{role}' te perdoruesi `%{name}'. Ju lutna kontrollone - perdoruesin dhe rolin qe a jane te dzte valid. + fail: Nuk mund t'i jepet roli `%{role}' përdoruesit `%{name}'. Ju lutemi, kontrolloni + që përdoruesi dhe roli të dyja të jenë të vlefshme. revoke: - title: Konfirmoje rolin duke e zgjuar - heading: Konfirmoje folin duke e zgjuar - are_you_sure: A jeni i sigurt qe ju doni me zgjue rolin `%{role}' prej perdoruesit + title: Konfirmimi i revokimit të rolit + heading: Konfirmo revokimin e rolit + are_you_sure: A je i sigurt që do ta revokosh rolin `%{role}' prej perdoruesit `%{name}'? confirm: Konfirmo - fail: Nuk munet me zgjue folin `%{role}' prej perdoruesit `%{name}'. Ju lutem - kontrolloje perdoruesin edhe rolin a jane te dyte valid. + fail: Nuk ia doli ta revokoj rolin `%{role}' prej perdoruesit `%{name}'. Të + lutem kontrollo përdoruesin dhe rolin nëse janë të dy të vlefshëm. user_block: new: - reason: Arsyja pse %{name} osht blloku. Ju lutem bëhuni sa më i qet dhe arsyeshëm - që osht e mundshme, tu dhon sa ma shumë detaje që muni rreth situatës, tu - e mbajt në men që mesazhi munet me u pa prej publikut. Maje në men se jo krejt - anëtarët e kuptojn gjuhën e komunitetit, pra ju lutem munoni me përdor terma - të mirë. + reason: Arsyeja pse %{name} është duke u bllokuar. Të lutem je sa më i qetë + dhe arsyeshëm, mundësisht përshkruaj sa më shumë detaje rreth situatës, dhe + mendo që që mesazhi yt është publik. Mendoje që jo të gjithë anëtarët e kuptojnë + gjuhën e komunitetit, prandaj përdor formulime sa më lehtë të kuptueshme. + revoke: + revoke: Revoko! partial: + show: Shfaq + edit: Redakto + revoke: Revoko! confirm: A jeni i sigurt? + status: Statusi + revoker_name: Revokuar nga show: confirm: A jeni i sigurt? javascripts: - map: - base: - mapquest: MapQuest Open site: - edit_tooltip: Edit Harta + edit_tooltip: Redakto hartën + redaction: + show: + destroy: Revoko këtë redaktim + confirm: A je i sigurt? ... diff --git a/config/locales/sr-Latn.yml b/config/locales/sr-Latn.yml index 7d87a61ac..c2267a4e6 100644 --- a/config/locales/sr-Latn.yml +++ b/config/locales/sr-Latn.yml @@ -1,10 +1,12 @@ # Messages for Serbian (Latin script) (srpski (latinica)‎) # Exported from translatewiki.net # Export driver: phpyaml +# Author: Macofe # Author: McDutchie # Author: Milicevic01 # Author: Nemo bis # Author: Rancher +# Author: Сербијана --- sr-Latn: html: @@ -74,7 +76,7 @@ sr-Latn: body: Tekst recipient: Primalac user: - email: E-poÅ¡ta + email: Imejl active: Aktivan display_name: Ime prikaza description: Opis @@ -1021,9 +1023,7 @@ sr-Latn: primary: Glavni put secondary: Sporedni put unclassified: Nekategorisani put - unsurfaced: Neasfaltirani put track: Makadam - byway: Sporedni put bridleway: Konjička staza cycleway: Biciklistička staza footway: PeÅ¡ačka staza @@ -1047,7 +1047,6 @@ sr-Latn: golf: Golf teren park: Park resident: Stambeno područje - tourist: Turistička atrakcija common: - Poljana - livada @@ -1077,7 +1076,6 @@ sr-Latn: tunnel: Isprekidan okvir – tunel bridge: Crni okvir – most private: Privatni posed - permissive: Pristup uz dozvolu destination: Pristup odrediÅ¡tu construction: Putevi u izgradnji richtext_area: @@ -1288,7 +1286,7 @@ sr-Latn: login: title: Prijava heading: Prijava - email or username: 'E-adresa ili korisničko ime:' + email or username: 'Imejl adresa ili korisničko ime:' password: 'Lozinka:' openid: '%{logo} OpenID:' remember: 'Zapamti me:' @@ -1333,12 +1331,12 @@ sr-Latn: title: Otvaranje naloga no_auto_account_create: Nažalost, trenutno nismo u mogućnosti da otvorimo novi nalog. - contact_webmaster: Kontaktirajte <a href="mailto:webmaster@openstreetmap.org">administratora</a> - za otvaranje novog naloga. Obradićemo zahtev Å¡to je pre moguće. + contact_webmaster: Kontaktirajte <a href="%{webmaster}">administratora</a> za + otvaranje novog naloga. Obradićemo zahtev Å¡to je pre moguće. license_agreement: Nakon Å¡to potvrdite nalog, moraćete da prihvatite <a href="http://www.osmfoundation.org/wiki/License/Contributor_Terms">uslove uređivanja</a>. email address: 'E-adresa:' - confirm email address: 'Potvrdite e-adresu:' + confirm email address: 'Potvrdite imejl adresu:' not displayed publicly: Ne prikazuje se javno (pogledajte <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" title="wiki privacy policy including section on email addresses">politiku privatnosti</a>) @@ -1448,7 +1446,7 @@ sr-Latn: title: Uredi nalog my settings: Postavke current email address: 'Trenutna e-adresa:' - new email address: 'Nova e-adresa:' + new email address: 'Nova imejl adresa:' email never displayed publicly: (nikada se ne prikazuje javno) openid: link: http://wiki.openstreetmap.org/wiki/OpenID @@ -1509,8 +1507,8 @@ sr-Latn: confirm_resend: success: Poslali smo novu potvrdnu poruku na %{email}. Nakon Å¡to potvrdite svoj nalog, moći ćete da počnete s mapiranjem.<br /><br />Ako koristite sistem - protiv nepoželjnih poruka, dodajte webmaster@openstreetmap.org u spisak dozvoljenih - adresa jer nismo u mogućnosti da odgovorimo na bilo koji zahtev za potvrdu. + protiv nepoželjnih poruka, dodajte %{sender} u spisak dozvoljenih adresa jer + nismo u mogućnosti da odgovorimo na bilo koji zahtev za potvrdu. failure: Korisnik %{name} nije pronađen. confirm_email: heading: Potvrda promene e-adrese @@ -1685,7 +1683,6 @@ sr-Latn: standard: Standardna cycle_map: Biciklistička mapa transport_map: Saobraćajna mapa - mapquest: Mapkvest open site: edit_tooltip: Uredite mapu edit_disabled_tooltip: Uvećajte prikaz da biste uredili mapu diff --git a/config/locales/sr.yml b/config/locales/sr.yml index 9cf10f448..1d16679b2 100644 --- a/config/locales/sr.yml +++ b/config/locales/sr.yml @@ -2,15 +2,18 @@ # Exported from translatewiki.net # Export driver: phpyaml # Author: Aktron +# Author: Macofe # Author: Magnumns # Author: Milicevic01 # Author: Nemo bis # Author: Nikola Smolenski # Author: Rancher # Author: Sawa +# Author: Srdjan m # Author: Жељко Тодоровић # Author: Милан Јелисавчић # Author: Обрадовић Горан +# Author: Сербијана --- sr: html: @@ -20,45 +23,45 @@ sr: friendly: '%e %B %Y у %H:%M' activerecord: models: - acl: Управљање приступом + acl: Списак ограничења приступа changeset: Скуп измена changeset_tag: Ознака скупа измена country: Земља - diary_comment: Коментар на дневник - diary_entry: Унос у дневнику + diary_comment: Коментар у дневнику + diary_entry: Дневнички запис friend: Пријатељ language: Језик message: Порука - node: Чвор - node_tag: Ознака чвора - notifier: Известилац - old_node: Стари чвор - old_node_tag: Ознака старог чвора + node: Тачка + node_tag: Ознака тачке + notifier: Извештач + old_node: Стара тачка + old_node_tag: Ознака старе тачке old_relation: Стари однос - old_relation_member: Члан старог односа - old_relation_tag: Ознака старог односа - old_way: Стара путања - old_way_node: Чвор старе путање - old_way_tag: Ознака старог пута + old_relation_member: Стари члан односа + old_relation_tag: Стара ознака односа + old_way: Стара линија + old_way_node: Стара тачка линије + old_way_tag: Стара ознака линије relation: Однос relation_member: Члан односа relation_tag: Ознака односа - session: Заседање - trace: Траг - tracepoint: Тачка трага - tracetag: Ознака трага + session: Сесија + trace: Рута + tracepoint: Тачка руте + tracetag: Ознака руте user: Корисник - user_preference: Корисничке поставке - user_token: Кориснички жетон - way: Путања - way_node: Чвор путање - way_tag: Ознака путање + user_preference: Поставке корисника + user_token: Токен корисника + way: Линија + way_node: Тачка линије + way_tag: Ознака линије attributes: diary_comment: body: Текст diary_entry: user: Корисник - title: Тема + title: Наслов latitude: Географска ширина longitude: Географска дужина language: Језик @@ -67,7 +70,7 @@ sr: friend: Пријатељ trace: user: Корисник - visible: Видљиво + visible: Видљивост name: Име size: Величина latitude: Географска ширина @@ -76,13 +79,13 @@ sr: description: Опис message: sender: Пошиљалац - title: Тема + title: Наслов body: Текст recipient: Прималац user: - email: Е-пошта + email: Имејл active: Активан - display_name: Приказано име + display_name: Име за приказ description: Опис languages: Језици pass_crypt: Лозинка @@ -91,51 +94,64 @@ sr: editor: default: Подразумевано (тренутно %{name}) potlatch: - name: Потлач 1 - description: Потлач 1 (уређивач у прегледачу) + name: Potlatch 1 + description: Potlatch 1 (уређивач у прегледачу) id: - name: иД - description: иД (уређивач у интернет прегледачу) + name: iD + description: iD (уређивач у прегледачу) potlatch2: - name: Потлач 2 - description: Потлач 2 (уређивач у прегледачу) + name: Potlatch 2 + description: Potlatch 2 (уређивач у прегледачу) remote: name: Даљинско управљање - description: Даљинско управљање (ЈОСМ или Меркартор) + description: Даљинско управљање (JOSM или Merkaartor) browse: created: Направљено closed: Затворено + created_html: Направљено пре <abbr title='%{title}'>%{time}</abbr> + closed_html: Затворено пре <abbr title='%{title}'>%{time}</abbr> + created_by_html: Направио %{user} пре <abbr title='%{title}'>%{time}</abbr> + deleted_by_html: Избрисао %{user} пре <abbr title='%{title}'>%{time}</abbr> + edited_by_html: Изменио %{user} пре <abbr title='%{title}'>%{time}</abbr> + closed_by_html: Затворио %{user} пре <abbr title='%{title}'>%{time}</abbr> version: Верзија in_changeset: Скуп измена - anonymous: анонимно + anonymous: анониман no_comment: (нема коментара) part_of: Део download_xml: Преузми XML - view_history: Прикажи историју - view_details: Прикажи детаље - location: 'Место:' + view_history: Погледај историју + view_details: Детаљније + location: 'Локација:' changeset: title: 'Скуп измена: %{id}' belongs_to: Аутор - node: Чворови (%{count}) - node_paginated: Чворови (%{x}-%{y} од %{count}) - way: Путање (%{count}) - way_paginated: Путање (%{x}-%{y} од %{count}) + node: Тачке (%{count}) + node_paginated: Тачке (%{x}-%{y} од %{count}) + way: Линије (%{count}) + way_paginated: Линије (%{x}-%{y} од %{count}) relation: Односи (%{count}) relation_paginated: Односи (%{x}-%{y} од %{count}) comment: Коментари (%{count}) + hidden_commented_by: Сакривен је коментар корисника %{user} пре <abbr title='%{exact_time}'>%{when}</abbr> + commented_by: Коментар корисника %{user} пре <abbr title='%{exact_time}'>%{when}</abbr> changesetxml: XML скуп измена osmchangexml: osmChange XML feed: title: Скуп измена %{id} title_comment: Скуп измена %{id} – %{comment} + join_discussion: Пријавите се да бисте се укључили у разговор + discussion: Разговор node: - title: 'Чвор: %{name}' - history_title: 'Историја чвора: %{name}' + title: 'Тачка: %{name}' + history_title: 'Историја тачака: %{name}' way: - title: 'Путања: %{name}' - history_title: 'Историја путање: %{name}' - nodes: Чворови + title: 'Линија: %{name}' + history_title: 'Историја линија: %{name}' + nodes: Тачке + also_part_of: + one: део линије %{related_ways} + other: део линија %{related_ways} relation: title: 'Однос: %{name}' history_title: 'Историја односа: %{name}' @@ -144,161 +160,177 @@ sr: entry: '%{type} %{name}' entry_role: '%{type} %{name} као %{role}' type: - node: Чвор - way: Путања + node: Тачка + way: Линија relation: Однос containing_relation: entry: Однос %{relation_name} entry_role: Однос %{relation_name} (као %{relation_role}) not_found: - sorry: 'Жао нам је, али %{type} #%{id} није пронађен.' + sorry: 'Нажалост, %{type} #%{id} није пронађен.' type: - node: чвор - way: путања + node: тачка + way: линија relation: однос changeset: скуп измена + note: белешка timeout: - sorry: Жао нам је, али добављање података за %{type} са идентификатором %{id} - је предуго трајало. + sorry: Преузимање података за %{type} са ID-јем %{id} предуго траје. type: node: тачка - way: путања + way: линија relation: однос changeset: скуп измена + note: белешка redacted: redaction: Редакција %{id} - message_html: Верзија %{version} типа %{type} не може да се прикаже јер је у - разматрању. Више на %{redaction_link}. + message_html: Верзија %{version} %{type} је редигована и не може бити приказана. + Детаљније на %{redaction_link}. type: - node: чвор - way: путања + node: тачка + way: линија relation: однос start_rjs: - feature_warning: Учитавање %{num_features} карактеристика, због којих твој прегледач - може да буде успорен или да не реагује. Сигурно хоћеш да прикажеш ове податке? + feature_warning: Потребно је преузети %{num_features} објеката, што може успорити + ваш прегледач. Заиста желите да прикажете ове податке? load_data: Учитај податке - loading: Учитавање… + loading: Учитавам… tag_details: tags: Ознаке wiki_link: - key: Страница с описом за ознаку %{key} - tag: Страница с описом за ознаку %{key}=%{value} - wikipedia_link: '%{page} чланак на Википедији' + key: Вики страница с описом ознаке %{key} + tag: Вики страница с описом ознаке %{key}=%{value} + wikidata_link: Ставка %{page} на Википодацима + wikipedia_link: Чланак %{page} на Википедији + telephone_link: Позови %{phone_number} note: title: Белешкаː %{id} new_note: Нова белешка description: Опис - open_title: 'Нерешена белешка #%{note_name}' - closed_title: 'Решена белешка #%{note_name}' - hidden_title: 'Скривена белешка #%{note_name}' - open_by: Направио %{user} <abbr title='%{exact_time}'>пре %{when}</abbr> - open_by_anonymous: Направљено анонимно <abbr title='%{exact_time}'>пре %{when}</abbr> - commented_by: Коментар %{user} <abbr title='%{exact_time}'>пре %{when}</abbr> - commented_by_anonymous: Анониман коментар <abbr title='%{exact_time}'>пре %{when}</abbr> - closed_by: Решио %{user} <abbr title='%{exact_time}'>пре %{when}</abbr> - closed_by_anonymous: Анонимно решено <abbr title='%{exact_time}'>пре %{when}</abbr> - reopened_by: Поново покренуо %{user} <abbr title='%{exact_time}'>пре %{when}</abbr> - reopened_by_anonymous: Анонимно поново покренуто <abbr title='%{exact_time}'>пре - %{when}</abbr> - hidden_by: Сакрио %{user} <abbr title='%{exact_time}'>пре %{when}</abbr> + open_title: Нерешена белешка бр. %{note_name} + closed_title: Решена белешка бр. %{note_name} + hidden_title: Скривена белешка бр. %{note_name} + open_by: Направио %{user} пре <abbr title='%{exact_time}'>%{when}</abbr> + open_by_anonymous: Направио анониман корисник пре <abbr title='%{exact_time}'>%{when}</abbr> + commented_by: Коментар корисника %{user} пре <abbr title='%{exact_time}'>%{when}</abbr> + commented_by_anonymous: Коментар анонимног корисника пре <abbr title='%{exact_time}'>%{when}</abbr> + closed_by: Решио %{user} пре <abbr title='%{exact_time}'>%{when}</abbr> + closed_by_anonymous: Решио анонимни корисник пре <abbr title='%{exact_time}'>%{when}</abbr> + reopened_by: Поново активирао %{user} пре <abbr title='%{exact_time}'>%{when}</abbr> + reopened_by_anonymous: Поново активирао анонимни корисник пре <abbr title='%{exact_time}'>%{when}</abbr> + hidden_by: Сакрио %{user} пре <abbr title='%{exact_time}'>%{when}</abbr> + query: + title: Информације о објектима + introduction: Кликните на мапу да бисте пронашли објекте у близини. + nearby: Објекти у близини + enclosing: Локација changeset: changeset_paging_nav: showing_page: Страница %{page} next: Следећа » previous: « Претходна changeset: - anonymous: Анонимно + anonymous: Анониман no_edits: (нема измена) view_changeset_details: Погледај детаље скупа измена changesets: - id: ИД + id: ID saved_at: Сачувано у user: Корисник comment: Коментар - area: Подручје + area: Област list: title: Скупови измена title_user: Скупови измена корисника %{user} - title_friend: Измене ваших пријатеља - title_nearby: Измене од околних корисника + title_friend: Скупови измена ваших пријатеља + title_nearby: Скупови измена околних корисника empty: Нема скупова измена. empty_area: Нема скупова измена у овој области. empty_user: Нема скупова измена овог корисника. no_more: Нема више скупова измена. - no_more_area: Нема више скупова измена у овој области - no_more_user: Нема више скупова измена овог корисника + no_more_area: Нема више скупова измена у овој области. + no_more_user: Нема више скупова измена овог корисника. load_more: Учитај још timeout: - sorry: Жао нам је, али списак измена који сте захтевали је предугачак. + sorry: Нажалост, преузимање траженог списка измена предуго траје. + rss: + title_all: Разговор о скупу измена OpenStreetMap-а + title_particular: 'Разговор о скупу измена #%{changeset_id} OpenStreetMap-а' + comment: Нови коментар на скуп измена бр. %{changeset_id} корисника %{author} + commented_at_html: Ажурирано пре %{when} + commented_at_by_html: Ажурирао %{user} пре %{when} + full: Целокупан разговор diary_entry: new: - title: Нови унос у дневник + title: Нови дневнички запис + publish_button: Објави list: - title: Кориснички дневници + title: Дневници корисника title_friends: Дневници пријатеља title_nearby: Дневници корисника у близини user_title: Дневник корисника %{user} - in_language_title: Дневници на %{language} - new: Нови унос у дневник - new_title: Састави нови унос у кориснички дневник - no_entries: Нема уноса у дневнику - recent_entries: Скорашњи уноси у дневник - older_entries: Старији уноси - newer_entries: Новији уноси + in_language_title: Дневнички записи на %{language} + new: Нови дневнички запис + new_title: Саставите нови запис у свом дневнику + no_entries: У дневнику нема записа + recent_entries: Скорашњи дневнички записи + older_entries: Старији записи + newer_entries: Новији записи edit: - title: Уреди унос у дневнику - subject: 'Тема:' + title: Уреди дневнички запис + subject: 'Наслов:' body: 'Текст:' language: 'Језик:' - location: 'Место:' + location: 'Локација:' latitude: 'Географска ширина:' longitude: 'Географска дужина:' - use_map_link: користи мапу + use_map_link: Прикажи на мапи save_button: Сачувај - marker_text: Место уноса у дневнику + marker_text: Локација писања белешке view: title: Дневник корисника %{user} | %{title} user_title: Дневник корисника %{user} leave_a_comment: Остави коментар - login_to_leave_a_comment: '%{login_link} да оставиш коментар' - login: Пријави се + login_to_leave_a_comment: '%{login_link} да бисте оставили коментар' + login: Пријавите се save_button: Сачувај no_such_entry: - title: Нема таквог уноса у дневнику - heading: 'Нема уноса с ИД: %{id}' - body: Жао нам је, али нема уноса у дневнику или коментар с ИД %{id}. Провери - исправност уписа или кликнуте везе. + title: Нема таквог дневничког записа + heading: 'Нема записа са ID-јем: %{id}' + body: Нажалост, нема записа или коментара са ID-јем %{id}. Можда је веза неисправна + или сте погрешили у куцању. diary_entry: posted_by: Поставио корисник %{link_user} у %{created} на %{language_link} - comment_link: Прокоментариши овај унос - reply_link: Одговори на овај унос + comment_link: Прокоментариши + reply_link: Одговори comment_count: - one: 1 коментар + zero: Нема коментара + one: '%{count} коментар' other: '%{count} коментара' - edit_link: Уреди овај унос - hide_link: Сакриј овај унос + edit_link: Уреди запис + hide_link: Сакриј запис confirm: Потврди diary_comment: comment_from: Коментар корисника %{link_user} у %{comment_created_at} - hide_link: Сакриј овај коментар + hide_link: Сакриј коментар confirm: Потврди location: - location: 'Место:' + location: 'Локација:' view: Приказ edit: Уреди feed: user: - title: Уноси у дневнику корисника %{user} - description: Скорашњи уноси у дневнику корисника %{user} + title: Дневнички записи корисника %{user} + description: Скорашњи дневнички записи корисника %{user} language: - title: Уноси у дневнику на %{language_name} - description: Скорашњи уноси у дневнику корисника на %{language_name} + title: Дневнички записи на %{language_name} + description: Скорашњи дневнички записи корисника OpenStreetMap-а на %{language_name} all: - title: Уноси у ОпенСтритМап дневнику - description: Скорашњи уноси у дневнику ОпенСтритМап корисника + title: Дневнички записи + description: Скорашњи дневнички записи корисника OpenStreetMap-а comments: - has_commented_on: '%{display_name} је прокоментарисао следеће уносе у дневнику' - post: Постави + has_commented_on: '%{display_name} је прокоментарисао следеће дневничке записе' + post: Порука when: Када comment: Коментар ago: пре %{ago} @@ -307,160 +339,175 @@ sr: export: title: Извоз start: - area_to_export: Подручје за извоз - manually_select: Ручно изаберите друго подручје + area_to_export: Област за извоз + manually_select: Ручно изаберите другу област format_to_export: Формат за извоз - osm_xml_data: ОпенСтритМап XML подаци - map_image: Слика карте (приказује стандардни слој) - embeddable_html: Уградиви HTML код + osm_xml_data: Подаци у XML формату + map_image: Слика мапе (приказује стандардни слој) + embeddable_html: Уградиви HTML кôд licence: Лиценца - export_details: Подаци ОпенСтритМапа су доступни под лиценцом <a href="http://opendatacommons.org/licenses/odbl/1.0/">Open + export_details: Подаци OpenStreetMap-а су доступни под лиценцом <a href="http://opendatacommons.org/licenses/odbl/1.0/">Open Data Commons Open Database License</a> (ODbL). too_large: - advice: 'Уколико горе наведени извоз буде неуспешан, резмотри неки од доле - наведених извора:' - body: 'Ово подручје је превелико за извоз у XML формат. Увећај приказ или - изабери мању површину. За веће преузимање погледај доле наведене изворе:' + advice: 'Ако буде проблема при извозу, послужите се неким од доленаведених + извора:' + body: 'Ова област је превелика за извоз у XML формату. Увећајте приказ, изаберите + мању област или користите један од следећих извора за групно преузимање + података:' planet: - title: Планета ОСМ - description: Редовно освежавани умношци целе ОпенСтритМап базе података + title: Планета OSM + description: Редовно ажурирани примерци целе базе OpenStreetMap-а overpass: - description: Преузми овај пакет са огледала ОпенСтритМап базе података + title: API Overpass-а + description: Преузмите овај оквир са пресликане копије базе OpenStreetMap-а geofabrik: - title: Геофабрик преузимања - description: Редовно освежавани исечци континената, држава, и одређених - градова + title: Преузимања која омогућава Geofabrik + description: Редовно ажурирани исечци континената, земаља и изабраних градова metro: - title: Метро исечци - description: Исечци за велике светске градове и њихову околину + title: Исечци градова + description: Исечци великих светских градова и њихових околних подручја other: - title: Остали извори - description: Додатни извори наведени на ОпенСтритМап викију - options: Поставке + title: Други извори + description: Додатни извори наведени на викију OpenStreetMap-а + options: Опције format: Формат scale: Размера - max: највише + max: макс. image_size: Величина слике - zoom: Увећање - add_marker: Додај ознаку на карту - latitude: 'ГШ:' - longitude: 'ГД:' - output: Излаз - paste_html: Налепи HTML код за уградњу у веб страницу + zoom: Приближи + add_marker: Постави маркер на мапу + latitude: 'Ширина:' + longitude: 'Дужина:' + output: Исход + paste_html: HTML кôд за уградњу на сајт export_button: Извези geocoder: search: title: - latlon: Резултати из <a href="http://openstreetmap.org/">Интернала</a> - us_postcode: Резултати из <a href="http://geocoder.us/">Геокодера</a> - uk_postcode: Резултати из <a href="http://www.npemap.org.uk/">NPEMap-а</a> - ca_postcode: Резултати из <a href="http://geocoder.ca/">Геокодера</a> - osm_nominatim: Резултати из <a href="http://nominatim.openstreetmap.org/">Номинатима</a> - geonames: Резултати из <a href="http://www.geonames.org/">Географских имена</a> - osm_nominatim_reverse: Резултати са <a href="http://nominatim.openstreetmap.org/">Номинатима</a> - geonames_reverse: Резултати са <a href="http://www.geonames.org/">ГеоИмена</a> + latlon: <a href="http://openstreetmap.org/">Унутрашњи резултати</a> + us_postcode: Резултати са сајта <a href="http://geocoder.us/">Geocoder.us</a> + uk_postcode: Резултати са сајта <a href="http://www.npemap.org.uk/">NPEMap/FreeThe + Postcode</a> + ca_postcode: Резултати са сајта <a href="http://geocoder.ca/">Geocoder.ca</a> + osm_nominatim: Резултати са сајта <a href="http://nominatim.openstreetmap.org/">OpenStreetMap + Nominatim</a> + geonames: Резултати са сајта <a href="http://www.geonames.org/">GeoNames</a> + osm_nominatim_reverse: Резултати са сајта <a href="http://nominatim.openstreetmap.org/">OpenStreetMap + Nominatim</a> + geonames_reverse: Резултати са сајта <a href="http://www.geonames.org/">GeoNames</a> search_osm_nominatim: prefix_format: '%{name}' prefix: aerialway: - chair_lift: Лифт столица - drag_lift: Лифт који вуче - station: Ваздушна станица + cable_car: Жичара + chair_lift: Жичара са седиштима + drag_lift: Вучница + gondola: Кабинска жичара + station: Станица жичаре aeroway: aerodrome: Аеродром - apron: Рампа + apron: Пристанишна платформа gate: Капија helipad: Хелиодром runway: Писта taxiway: Рулна стаза terminal: Терминал amenity: + animal_shelter: Азил за животиње arts_centre: Уметнички центар atm: Банкомат bank: Банка bar: Бар bbq: Роштиљ bench: Клупа - bicycle_parking: Бициклистички паркинг - bicycle_rental: Изнајмљивање бицикла - biergarten: Пивска башта - brothel: Јавна кућа + bicycle_parking: Паркинг за бицикле + bicycle_rental: Изнајмљивање бицикала + biergarten: Пивница на отвореном + boat_rental: Услуге изнајмљивања чамаца + brothel: Бордел bureau_de_change: Мењачница bus_station: Аутобуска станица - cafe: Кафе - car_rental: Изнајмљивање аутомобила - car_sharing: Заједничко коришћење аутомобила + cafe: Кафић + car_rental: Агенција за изнајмљивање аутомобила + car_sharing: Краткорочно изнајмљивање аутомобила car_wash: Ауто-перионица casino: Казино - charging_station: Напојна станица + charging_station: Акумулаторска станица + childcare: Агенција за чување деце cinema: Биоскоп clinic: Клиника - college: Факултет - community_centre: Друштвени центар + clock: Часовник + college: Колеџ + community_centre: Месна заједница courthouse: Суд crematorium: Крематоријум - dentist: Зубар - doctors: Лекар + dentist: Стоматолог + doctors: Лекари dormitory: Студентски дом drinking_water: Пијаћа вода driving_school: Ауто-школа embassy: Амбасада emergency_phone: Телефон за хитне случајеве fast_food: Брза храна - ferry_terminal: Трајект - fire_hydrant: Хидрант + ferry_terminal: Трајектни терминал + fire_hydrant: Противпожарни хидрант fire_station: Ватрогасна станица - food_court: Штандови за брзу храну + food_court: Пултови са храном fountain: Фонтана - fuel: Бензинска пумпа + fuel: Гориво + gambling: Коцкарница grave_yard: Гробље - gym: Фитнес центар - health_centre: Дом здравља + gym: Фитнес центар/теретана + health_centre: Здравствени центар hospital: Болница - hunting_stand: Ловачки дом + hunting_stand: Ловачка кула ice_cream: Продавница сладоледа kindergarten: Обданиште library: Библиотека - market: Продавница - marketplace: Пијаца + market: Пијаца + marketplace: Зелена пијаца + monastery: Манастир + motorcycle_parking: Паркинг за мотоцикле nightclub: Ноћни клуб nursery: Јаслице - nursing_home: Дом за негу - office: Пословница + nursing_home: Старачки дом + office: Канцеларија parking: Паркинг + parking_entrance: Улаз на паркинг pharmacy: Апотека - place_of_worship: Место богослужења + place_of_worship: Верски објекат police: Полиција post_box: Поштанско сандуче post_office: Пошта - preschool: Предшколска установа + preschool: Предшколско prison: Затвор pub: Паб - public_building: Установа - reception_area: Пријемно подручје + public_building: Јавна зграда + reception_area: Рецепција recycling: Место за рециклажу restaurant: Ресторан - retirement_home: Старачки дом + retirement_home: Дом пензионера sauna: Сауна school: Школа shelter: Склониште shop: Продавница - shower: Туш + shower: Јавно купатило social_centre: Друштвени центар social_club: Друштвени клуб - social_facility: Социјална установа + social_facility: Социјална заштита studio: Студио swimming_pool: Базен taxi: Такси telephone: Телефонска говорница theatre: Позориште - toilets: Тоалети + toilets: Тоалет townhall: Градска скупштина university: Универзитет vending_machine: Аутомат - veterinary: Ветеринарска хирургија - village_hall: Сеоски дом + veterinary: Ветеринарска клиника + village_hall: Сеоска месна заједница waste_basket: Корпа за отпатке + waste_disposal: Контејнер youth_centre: Дом омладине boundary: administrative: Административна граница @@ -470,127 +517,165 @@ sr: bridge: aqueduct: Аквадукт suspension: Висећи мост - swing: Мост на окретање + swing: Покретни мост viaduct: Вијадукт "yes": Мост building: "yes": Зграда + craft: + brewery: Пивара + carpenter: Столар + electrician: Електричар + gardener: Баштован + painter: Молер + photographer: Фотограф + plumber: Водоинсталатер + shoemaker: Обућар + tailor: Кројач + "yes": Занатска радња emergency: + ambulance_station: Хитна помоћ + defibrillator: Дефибрилатор + landing_site: Место за хитно слетање phone: Телефон за хитне случајеве highway: - bridleway: Коњичка стаза - bus_guideway: Аутобуска трака + abandoned: Напуштени ауто-пут + bridleway: Коњички пут + bus_guideway: Трамвајска линија bus_stop: Аутобуска станица construction: Ауто-пут у изградњи cycleway: Бициклистичка стаза - emergency_access_point: Приступ за случај опасности - footway: Пешачка стаза - ford: Газ - living_street: Улица смиреног промета + elevator: Лифт + emergency_access_point: Прва помоћ + footway: Тротоар + ford: Плићак + living_street: Пешачка зона milestone: Миљоказ motorway: Ауто-пут - motorway_junction: Петља - motorway_link: Мото-пут + motorway_junction: Раскрсница + motorway_link: Прикључни пут path: Стаза pedestrian: Пешачка стаза platform: Платформа - primary: Магистрални пут + primary: Главни пут primary_link: Главни пут - proposed: Предложен пут + proposed: Пројектовани пут raceway: Тркачка стаза - residential: Улица + residential: Стамбена улица rest_area: Одмаралиште road: Пут - secondary: Регионални пут + secondary: Споредни пут secondary_link: Споредни пут - service: Сервисни пут + service: Приступни пут services: Услуге на ауто-путу speed_camera: Фото-радар steps: Степенице street_lamp: Улична светиљка - tertiary: Главна улица + tertiary: Локални пут tertiary_link: Локални пут track: Макадам + traffic_signals: Саобраћајна сигнализација trail: Стаза - trunk: Мото пут - trunk_link: Магистрални пут - unclassified: Некатегорисани пут + trunk: Магистрала + trunk_link: Магистрала + unclassified: Некласификовани пут unsurfaced: Неасфалтирани пут + "yes": Пут historic: archaeological_site: Археолошко налазиште - battlefield: Бојиште + battlefield: Бојно поље boundary_stone: Гранични камен - building: Зграда + building: Историјска зграда + bunker: Бункер castle: Дворац church: Црква - citywalls: Градски зидови - fort: Утврђивање + city_gate: Градска капија + citywalls: Градске зидине + fort: Утврђење + heritage: Културно наслеђе house: Кућа icon: Икона - manor: Племићко имање - memorial: Споменик + manor: Имање + memorial: Меморијални споменик mine: Рудник - monument: Споменик (монумент) + monument: Споменик + roman_road: Римски пут ruins: Рушевине + stone: Камен tomb: Гробница - tower: Торањ + tower: Кула wayside_cross: Крајпуташ - wayside_shrine: Успутно светиште + wayside_shrine: Светилиште покрај пута wreck: Олупина + junction: + "yes": Раскрсница landuse: - allotments: Баште + allotments: Парцеле basin: Басен - brownfield: Земљиште за пренамену + brownfield: Запуштена локација cemetery: Гробље - commercial: Пословно подручје - conservation: Заштићено подручје + commercial: Пословна зона + conservation: Заштићено земљиште construction: Градилиште farm: Фарма - farmland: Поље - farmyard: Фарма + farmland: Обрадиво земљиште + farmyard: Сеоско имање forest: Шума - garages: Гаража + garages: Гараже grass: Трава - greenfield: Зелено поље - industrial: Индустријско подручје + greenfield: Неискоришћено земљиште + industrial: Индустријска зона landfill: Депонија meadow: Ливада - military: Војно подручје + military: Војна зона mine: Рудник orchard: Воћњак quarry: Каменолом - railway: Железничка пруга - recreation_ground: Подручје за рекреацију + railway: Железница + recreation_ground: Рекреативна зона reservoir: Резервоар reservoir_watershed: Акумулациона вододелница - residential: Стамбено подручје - retail: Малопродаја - road: Путно подручје - village_green: Сеоско поље + residential: Стамбена зона + retail: Трговинска зона + road: Путна мрежа + village_green: Зелена површина vineyard: Виноград + "yes": Употреба земљишта leisure: - beach_resort: Одмаралиште на плажи - bird_hide: Склониште за птице + beach_resort: Приобално одмаралиште + bird_hide: Осматрачница за птице + club: Клуб common: Општинско земљиште - fishing: Риболовно подручје + dog_park: Парк за псе + fishing: Место за риболов + fitness_centre: Фитнес центар fitness_station: Технички преглед garden: Башта - golf_course: Голф терен + golf_course: Терен за голф + horse_riding: Услуге јахања коња ice_rink: Клизалиште - marina: Привезиште - miniature_golf: Мини голф + marina: Марина + miniature_golf: Мини-голф nature_reserve: Резерват природе park: Парк - pitch: Спортско игралиште + pitch: Спортски терен playground: Игралиште - recreation_ground: Подручје за рекреацију + recreation_ground: Рекреативна зона + resort: Одмаралиште sauna: Сауна slipway: Навоз sports_centre: Спортски центар stadium: Стадион swimming_pool: Базен - track: Стаза за трчање - water_park: Водени парк + track: Атлетска стаза + water_park: Аквапарк + "yes": Разонода + man_made: + lighthouse: Светионик + pipeline: Цевовод + tower: Кула + works: Фабрика + "yes": Вештачки објекти military: airfield: Војни аеродром barracks: Касарна @@ -605,25 +690,28 @@ sr: cliff: Литица crater: Кратер dune: Дина - fell: Брдо + fell: Голо брдо fjord: Фјорд forest: Шума geyser: Гејзир glacier: Глечер + grassland: Пашњак heath: Равница hill: Брдо island: Острво - land: Земљиште + land: Земља marsh: Мочвара - moor: Мочвара + moor: Вресиште mud: Блато peak: Врх point: Тачка - reef: Гребен + reef: Риф ridge: Гребен rock: Стена + saddle: Превој + sand: Пешчара scree: Осулина - scrub: Гуштара + scrub: Густиш spring: Извор stone: Камен strait: Мореуз @@ -631,46 +719,50 @@ sr: valley: Долина volcano: Вулкан water: Вода - wetland: Мочвара + wetland: Мочварно подручје wood: Шума office: accountant: Рачуновођа + administrative: Администрација architect: Архитекта company: Предузеће employment_agency: Агенција за запошљавање estate_agent: Агенција за некретнине government: Владина служба - insurance: Осигурање + insurance: Агенција за осигурање lawyer: Адвокат - ngo: НВО канцеларија - telecommunication: Телекомуникациона служба + ngo: Невладина организација + telecommunication: Телекомуникациона компанија travel_agent: Туристичка агенција "yes": Канцеларија place: + allotments: Парцеле + block: Блок airport: Аеродром city: Град country: Земља county: Округ farm: Фарма - hamlet: Засеок + hamlet: Заселак house: Кућа houses: Куће island: Острво - islet: Хрид + islet: Острвце isolated_dwelling: Удаљено пребивалиште locality: Локалитет - moor: Мочвара + moor: Вресиште municipality: Општина - neighbourhood: Насеље + neighbourhood: Кварт postcode: Поштански број - region: Подручје + region: Регион sea: Море - state: Савезна држава - subdivision: Подгрупа + state: Држава + subdivision: Административно подручје suburb: Предграђе town: Варошица - unincorporated_area: Слободна земља + unincorporated_area: Неприпојена зона village: Село + "yes": Место railway: abandoned: Напуштена железница construction: Железничка пруга у изградњи @@ -683,204 +775,208 @@ sr: level_crossing: Пружни прелаз light_rail: Лака железница miniature: Минијатурна железница - monorail: Једнотрачна пруга - narrow_gauge: Ускотрачна пруга - platform: Железничка платформа + monorail: Пруга са једним колосеком + narrow_gauge: Пруга уског колосека + platform: Железнички перон preserved: Очувана железница - proposed: Предложена пруга - spur: Пруга + proposed: Пројектована железница + spur: Огранак железничке пруге station: Железничка станица - stop: Станица на прузи - subway: Метро станица + stop: Железничко стајалиште + subway: Метро subway_entrance: Улаз у метро - switch: Скретница + switch: Железничка скретница tram: Трамвај tram_stop: Трамвајско стајалиште shop: - alcohol: Трговина пићем + alcohol: Продавница алкохолних пића antiques: Антикварница - art: Атеље + art: Продавница опреме за уметнике bakery: Пекара - beauty: Парфимерија + beauty: Козметички салон beverages: Продавница пића bicycle: Продавница бицикала books: Књижара boutique: Бутик butcher: Месара - car: Ауто-кућа - car_parts: Ауто-делови + car: Трговац аутомобилима + car_parts: Продавница ауто-делова car_repair: Ауто-сервис carpet: Продавница тепиха charity: Добротворна продавница - chemist: Апотекар - clothes: Бутик - computer: Рачунарска опрема + chemist: Продавница кућне хемије + clothes: Продавница одеће + computer: Продавница рачунара confectionery: Посластичарница - convenience: Потрепштине - copyshop: Копирница - cosmetics: Козметичарска радња - deli: Деликатес + convenience: Продавница мешовите робе + copyshop: Фотокопирница + cosmetics: Козметичка радња + deli: Сендвичара department_store: Робна кућа discount: Дисконт doityourself: Уради сам dry_cleaning: Хемијско чишћење - electronics: Електронска опрема + electronics: Продавница електронике estate_agent: Агент за некретнине farm: Пољопривредна апотека - fashion: Модна продавница + fashion: Продавница модне одеће fish: Рибарница florist: Цвећара - food: Бакалница + food: Продавница хране funeral_directors: Погребно предузеће - furniture: Намештај + furniture: Продавница намештаја gallery: Галерија garden_centre: Вртни центар - general: Продавница мешовите робе - gift: Сувенирница - greengrocer: Пиљарница + general: Продавница робе широке потрошње + gift: Продавница поклона + greengrocer: Продавница воћа и поврћа grocery: Бакалница hairdresser: Фризерски салон - hardware: Гвожђара - hifi: Музичка опрема - insurance: Осигурање - jewelry: Златара - kiosk: Киоск - laundry: Вешерница + hardware: Продавница алата + hifi: Продавница аудио-опреме + insurance: Осигуравајућа компанија + jewelry: Јувелирница + kiosk: Трафика + laundry: Перионица веша mall: Тржни центар - market: Маркет + market: Пијаца mobile_phone: Продавница мобилних телефона motorcycle: Продавница мотоцикала music: Музичка продавница - newsagent: Новинар + newsagent: Новинарница optician: Оптичар organic: Продавница здраве хране - outdoor: Штанд - pet: Продавница кућних љубимаца + outdoor: Продавница опреме за спортове на отвореном + pet: Продавница за кућне љубимце pharmacy: Апотека photo: Фотографска радња salon: Салон second_hand: Продавница половне робе shoes: Продавница обуће shopping_centre: Тржни центар - sports: Спортска опрема - stationery: Папирница + sports: Продавница спортске опреме + stationery: Продавница канцеларијског прибора supermarket: Супермаркет tailor: Кројач toys: Продавница играчака travel_agency: Туристичка агенција video: Видеотека - wine: Трговина пићем + wine: Продавница алкохолних пића "yes": Продавница tourism: alpine_hut: Планинарски дом - artwork: Галерија + apartment: Стан + artwork: Уметничко дело attraction: Атракција bed_and_breakfast: Полупансион - cabin: Колиба + cabin: Брвнара camp_site: Камп - caravan_site: Камп-приколице - chalet: Планинска колиба - guest_house: Гостинска кућа + caravan_site: Парк за камп приколице + chalet: Колиба + gallery: Галерија + guest_house: Преноћиште hostel: Хостел hotel: Хотел information: Информације motel: Мотел museum: Музеј picnic_site: Место за пикник - theme_park: Тематски парк + theme_park: Забавни парк viewpoint: Видиковац zoo: Зоолошки врт tunnel: culvert: Одводни канал "yes": Тунел waterway: - artificial: Вештачки водени пут + artificial: Вештачки водоток boatyard: Бродоградилиште canal: Канал dam: Брана - derelict_canal: Одбачени канал + derelict_canal: Суви канал ditch: Јарак - dock: Пристаниште + dock: Док drain: Одвод - lock: Устава - lock_gate: Поље уставе + lock: Преводница + lock_gate: Врата преводнице mooring: Сидриште - rapids: Брзаци + rapids: Брзак river: Река stream: Поток - wadi: Суво корито реке + wadi: Вади waterfall: Водопад weir: Брана + "yes": Водоток admin_levels: level2: Државна граница - level4: Савезна граница - level5: Регионална граница - level6: Окружна граница - level8: Градска граница - level9: Сеоска граница - level10: Приградска граница + level4: Граница савезне државе + level5: Граница региона + level6: Граница округа + level8: Граница града + level9: Граница села + level10: Граница насеља description: title: - osm_nominatim: Локација из <a href="http://nominatim.openstreetmap.org/">Номинатима</a> - geonames: Локација из <a href="http://www.geonames.org/">ГеоИмена</a> + osm_nominatim: Локација са сајта <a href="http://nominatim.openstreetmap.org/">OpenStreetMap + Nominatim</a> + geonames: Локација са сајта <a href="http://www.geonames.org/">GeoNames</a> types: cities: Градови towns: Варошице places: Места results: no_results: Нема резултата - more_results: Још резултата + more_results: Више резултата layouts: project_name: title: OpenStreetMap h1: OpenStreetMap logo: - alt_text: Логотип ОпенСтритМапа - home: Иди на почетну позицију + alt_text: Логотип OpenStreetMap-а + home: Кућа logout: Одјава log_in: Пријава log_in_tooltip: Пријава са постојећим налогом - sign_up: Отвори налог - start_mapping: Почни да уређујеш карте + sign_up: Регистрација + start_mapping: Почни са мапирањем sign_up_tooltip: Отвори налог за уређивање edit: Уреди history: Историја export: Извези data: Подаци - export_data: Извоз података + export_data: Извези податке gps_traces: ГПС трагови - gps_traces_tooltip: Уреди ГПС трагове - user_diaries: Дневници - user_diaries_tooltip: Погледајте корисничке дневнике + gps_traces_tooltip: Управљај ГПС траговима + user_diaries: Дневници корисника + user_diaries_tooltip: Погледај дневнике корисника edit_with: Уреди помоћу %{editor} - tag_line: Слободна вики карта света - intro_header: Добродошли на ОпенСтритМап! - intro_text: ОпенСтритМапа је карта света, створена од стране људи попут тебе и - слободна је за коришћење под отвореном лиценцом. - intro_2_create_account: Отвори налог - partners_html: Хостинг подржали %{ucl}, %{ic} и %{bytemark}, као и други %{partners}. + tag_line: Слободна вики мапа света + intro_header: Добро дошли на OpenStreetMap! + intro_text: OpenStreetMap је мапа света коју су направили људи попут вас. Слободна + је за коришћење под отвореном лиценцом. + intro_2_create_account: Отворите кориснички налог + partners_html: Хостинг омогућују %{ucl}, %{ic} и %{bytemark}, као и други %{partners}. partners_ucl: VR центар UCL-а - partners_ic: Лондонски краљевски колеџ - partners_bytemark: Хостинг „Бајтмарк“ + partners_ic: Краљевски колеџ у Лондону + partners_bytemark: хостинг Bytemark partners_partners: партнери - osm_offline: База података ОпенСтритМапа је тренутно недоступна док се не заврше - важни радови на одржавању. - osm_read_only: Због радова на одржавању базе података ОпенСтритМапа, исту тренутно - није могуће мењати. - donate: Помозите нам тако што ћете %{link} ради одржавања потребног хардвера. + osm_offline: База OpenStreetMap-а је тренутно недоступна док се не заврше неопходни + радови на одржавању. + osm_read_only: Базу OpenStreetMap-а тренутно није могуће мењати док се не заврше + неопходни радови на одржавању. + donate: Подржите ОpenStreetMap са %{link} за Фонд за обнову хардвера. help: Помоћ about: О нама copyright: Ауторска права community: Заједница community_blogs: Блогови заједнице - community_blogs_title: Блогови чланова заједнице - foundation: Задужбина - foundation_title: Задужбина ОпенСтриМап + community_blogs_title: Блогови чланова заједнице OpenStreetMap + foundation: Фондација + foundation_title: OpenStreetMap Foundation make_a_donation: - title: Подржи ОпенСтритМап новчаним прилогом - text: Приложи новац - learn_more: Сазнај више - more: Још + title: Подржите ОpenStreetMap новчаним прилогом + text: Донирајте + learn_more: Детаљније + more: Више license_page: foreign: title: О овом преводу @@ -897,9 +993,10 @@ sr: legal_babble: title_html: Ауторска права и лиценца intro_1_html: |- - Опенстритмап чине <i>слободни подаци</i>, лиценцирани под <a + OpenStreetMap<sup><a href="#trademarks">®</a></sup> садржи <i>слободне податке</i> који су доступни под лиценцом <a href="http://opendatacommons.org/licenses/odbl/">Open Data - Commons Open Database License</a> (ODbL). + Commons Open Database License</a> (ODbL) организације <a + href="http://osmfoundation.org/">OpenStreetMap Foundation</a> (OSMF). intro_2_html: |2- Можете да умножавате, делите, преносите и прилагођавате наше податке, све док именујете Опенстритмап и њене @@ -928,8 +1025,9 @@ sr: title: Пример за навођење more_title_html: Сазнај више more_1_html: |- - Више о употреби података и како да нас наводите можете пронаћи на <a - href="http://wiki.openstreetmap.org/wiki/Legal_FAQ">Правним ЧПП</a>. + Више о употреби података и како да нас наводите можете наћи на <a + href="http://osmfoundation.org/Licence">страници лиценце OSMF</a> и у <a + href="http://wiki.openstreetmap.org/wiki/Legal_FAQ">честим правним питањима</a>. more_2_html: |- Иако OpenStreetMap ради с отвореним подацима, не можемо понудити бесплатан АПИ за мапе независним програмерима. @@ -989,9 +1087,9 @@ sr: водич са најбитнијим стварима које је потребно знати. whats_on_the_map: title: Шта је на карти - on_html: ОпенСтритМап је место за уцртавање <em>стварних и актуелних</em> ствари - на карту - то укључује милионе грађевина, путева, и других детаља о местима. - Можеш да уцрташ било коју ствар из стварног света која ти је занимљива. + on_html: На мапи OpenStreetMap-а се налазе објекти који <em>постоје у датом + тренутку</em>, попут милиона грађевина, путева и других елемената локалитета. + Слободно можете да забележите било које детаље спољног света који су вам занимљиви. off_html: Оно што се <em>не</em> рачуна су пристрасне оцене, историјски или хипотетички подаци, и подаци заштићени ауторским правима. Ако немаш изричиту дозволу, не умножавај папирне и карте са интернета. @@ -1002,10 +1100,10 @@ sr: editor_html: <strong>Уређивач</strong> је програм или алат на интернету помоћу којег се уређује карта. node_html: <strong>Чвор</strong> је тачка на карти, нпр. ресторан или дрво. - way_html: <strong>Путања</strong> је линије или површина, нпр. пут, поток, језеро - или зграда. - tag_html: <strong>Ознака</strong> је део података о тачки или путањи, нпр. име - ресторана или ограничење брзине на неком путу. + way_html: <strong>Линија</strong> је крива или подручје попут пута, потока, + језера или грађевине. + tag_html: <strong>Ознака</strong> је јединица којом се описује тачка или линија, + нпр. име ресторана или ограничење брзине на одређеном путу. questions: title: Питања? paragraph_1_html: |- @@ -1025,9 +1123,9 @@ sr: title: Како да помогнем join_the_community: title: Прикључи се заједници - explanation_html: Ако приметиш проблем са нашим картографским подацима, нпр. - недостаје пут или твоја адреса, најбољи начин за наставак је да се прикључиш - ОпенСтритМап заједници и сам додаш или поправиш податке. + explanation_html: Ако приметите проблем са подацима на нашој мапи (нпр. одсуство + пута или адресе) најбољи начин је да се придружите заједници OpenStreetMap + и самостално додате или исправите податке. add_a_note: instructions_html: |- Само кликни <a class='icon note'></a> или исту иконицу на приказу карте. @@ -1047,6 +1145,8 @@ sr: description: Почни са овим брзим водичем који покрива основе ОпенСтритМапа help: description: Постави питање или нађи одговор на ОСМ страници за питања и одговоре. + forums: + title: Форуми wiki: url: http://wiki.openstreetmap.org/wiki/Sr:Main_Page title: wiki.openstreetmap.org/wiki/Sr:Main_Page @@ -1054,23 +1154,23 @@ sr: about_page: next: Следеће copyright_html: <span>©</span>ОпенСтритМап<br>сарадници - used_by: '%{name} покреће карте на хиљадама веб страница, мобилних програма, и - уређаја' - lede_text: ОпенСтритМап је направила заједница картографа који сарађују и одржавају - податке о путевима, стазама, кафићима, железничким станицама, и још пуно тога, - шитом света. + used_by: '%{name} обезбеђује картографске податке хиљадама сајтова, мобилних апликација + и уређаја' + lede_text: OpenStreetMap је направила заједница картографа који додавају и одржавају + податке о путевима, стазама, кафићима, железничким станицама и многим другим + објектима широм света. local_knowledge_title: Локално знање - local_knowledge_html: ОпенСтритМап наглашава локално знање. Сарадници користе - слике из ваздуха, ГПС уређаје, и технички не тако напредне теренске карте да - су ОСМ подаци прецизни и тренутно важећи. + local_knowledge_html: OpenStreetMap придаје значај локалном знању. Учесници користе + снимке из ваздуха, GPS уређаје и обичне теренске мапе у циљу провере исправности + и ажурности OSM-а. community_driven_title: Заједница је покретач open_data_title: Отцорени подаци partners_title: Партнери notifier: diary_comment_notification: - subject: '[OpenStreetMap] %{user} је прокоментарисао ваш унос у дневнику' + subject: '%{user} је прокоментарисао ваш дневнички запис' hi: Поздрав, %{to_user}, - header: '%{from_user} прокоментариса ваш скорашњи унос у дневнику под насловом + header: '%{from_user} је прокоментарисао ваш скорашњи дневнички запис под насловом %{subject}:' footer: Можете прочитати коментаре на %{readurl}, прокоментарисати на %{commenturl} или одговорити на %{replyurl} @@ -1104,15 +1204,15 @@ sr: greeting: Здраво! created: Неко (надамо се ти) је управо отворио налог на %{site_url}. email_confirm: - subject: '[OpenStreetMap] Потврди адресу е-поште' + subject: '[OpenStreetMap] Потврдите Вашу имејл адресу' email_confirm_plain: greeting: Поздрав, - hopefully_you: Неко (вероватно ви) желео би да промени е-адресу са %{server_url} + hopefully_you: Неко (вероватно ви) желео би да промени имејл адресу са %{server_url} на %{new_address}. click_the_link: Ако сте то ви, кликните на везу испод да бисте потврдили измене. email_confirm_html: greeting: Поздрав, - hopefully_you: Неко (вероватно ви) желео би да промени е-адресу са %{server_url} + hopefully_you: Неко (вероватно Ви) желео би да промени имејл адресу са %{server_url} на %{new_address}. click_the_link: Ако сте то ви, кликните на везу испод да бисте потврдили измене. lost_password: @@ -1226,8 +1326,9 @@ sr: мапа. Преузмите га <a href="http://www.adobe.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash">одавде</a>. Доступне су и <a href="http://wiki.openstreetmap.org/wiki/Editing">неке друге могућности</a> за уређивање Опенстритмапа. - potlatch_unsaved_changes: Нисте сачували измене. Да бисте то урадили, поништите - текућу путању или тачку, ако уређујете наживо, или кликните на дугме за чување. + potlatch_unsaved_changes: Имате несачуване измене. (Да бисте их сачували у Potlatch-у, + демаркирајте тренутни пут или тачку, ако уређујете у „живом“ режиму, или кликните + на дугме за чување, ако постоји.) potlatch2_not_configured: Потлач 2 није подешен. Погледајте http://wiki.openstreetmap.org/wiki/The_Rails_Port potlatch2_unsaved_changes: Нисте сачували измене. Да бисте то урадили, кликните на дугме за чување. @@ -1245,13 +1346,12 @@ sr: table: entry: motorway: Ауто-пут - trunk: Мото пут + main_road: Главни пут + trunk: Ауто-пут primary: Магистрални пут - secondary: Регионални пут - unclassified: Некатегорисани пут - unsurfaced: Неасфалтирани пут + secondary: Споредни пут + unclassified: Локални пут track: Макадам - byway: Споредни пут bridleway: Коњичка стаза cycleway: Бициклистичка стаза footway: Пешачка стаза @@ -1275,7 +1375,6 @@ sr: golf: Голф терен park: Парк resident: Стамбено подручје - tourist: Туристичка атракција common: - Пољана - ливада @@ -1305,7 +1404,6 @@ sr: tunnel: Испрекидан оквир – тунел bridge: Црни оквир – мост private: Приватни посед - permissive: Приступ уз дозволу destination: Приступ одредишту construction: Путеви у изградњи richtext_area: @@ -1333,7 +1431,7 @@ sr: identifiable: Може се препознати (приказано у списку трагова као јавне, поређане и датиране тачке) create: - upload_trace: Отпреми ГПС траг + upload_trace: Отпремање ГПС трага trace_uploaded: GPX датотека је отпремљена и чека убацивање у базу. Ово обично траје око пола сата, након чега ћете добити обавештење о завршетку. edit: @@ -1369,8 +1467,12 @@ sr: upload_trace: Отпреми траг see_all_traces: Погледај све трагове see_your_traces: Погледај своје трагове - traces_waiting: Имате %{count} трагова на чекању за слање. Сачекајте да се прво - они заврше пре отпремања нових трагова, да не бисте блокирали друге кориснике. + traces_waiting: + one: '%{count} траг чека на отпремање. Молимо вас да сачекате окончање преноса + пре него што отпремите друге. Тиме нећете оптеретити сервер другим корисницима.' + other: '%{count} трага чекају на отпремање. Молимо вас да сачекате окончање + преноса пре него што отпремите друге. Тиме нећете оптеретити сервер другим + корисницима.' trace_optionals: tags: Ознаке view: @@ -1393,7 +1495,7 @@ sr: trace_not_found: Траг није пронађен. visibility: 'Видљивост:' trace_paging_nav: - showing_page: Приказ странице %{page} + showing_page: Страница %{page} older: Старији трагови newer: Новији трагови trace: @@ -1415,10 +1517,10 @@ sr: list: public_traces: Јавни ГПС трагови your_traces: Ваши ГПС трагови - public_traces_from: Јавни ГПС трагови корисника %{user} + public_traces_from: Јавни GPS трагови корисника %{user} tagged_with: ' означени са %{tags}' - empty_html: Овде још нема ништа. <a href='%{upload_link}'>Отпремите нови траг</a> - или сазнајте више о ГПС трагању на <a href='http://wiki.openstreetmap.org/wiki/Beginners_Guide_1.2'>вики + empty_html: Овде још увек нема ништа. <a href='%{upload_link}'>Отпремите нови + траг</a> или сазнајте више о GPS траговима на <a href='http://wiki.openstreetmap.org/wiki/Beginners_Guide_1.2'>вики страници</a>. delete: scheduled_for_deletion: Траг постављен за брисање @@ -1447,10 +1549,10 @@ sr: allow_to: 'Дозволи програму да:' allow_read_prefs: чита ваше корисничке поставке. allow_write_prefs: мења ваше корисничке поставке. - allow_write_diary: прави уносе у дневнику, коментарише и додаје пријатеље. + allow_write_diary: прави дневничке записе, коментарише и додаје пријатеље. allow_write_api: мења мапу. - allow_read_gpx: чита ваше приватне ГПС трагове. - allow_write_gpx: отпрема ГПС трагове. + allow_read_gpx: чита ваше приватне GPS трагове. + allow_write_gpx: отпрема GPS трагове. revoke: flash: Опозвали сте новчић за %{application} oauth_clients: @@ -1467,17 +1569,17 @@ sr: url: 'Адреса захтевног новчића:' access_url: 'Адреса приступног новчића:' authorize_url: 'Адреса овлашћења:' - support_notice: Подржавамо HMAC-SHA1, као и обичан текст у режиму SSL. + support_notice: Подржавамо HMAC-SHA1 (препоручује се) и RSA-SHA1 потписе. edit: Детаљи измене delete: Обриши клијент confirm: Јесте ли сигурни? requests: 'Захтевање следећих дозвола од корисника:' allow_read_prefs: чита корисничке поставке. allow_write_prefs: мења корисничке поставке. - allow_write_diary: прави уносе у дневнику, коментарише и додаје пријатеље. + allow_write_diary: прави дневничке записе, коментарише и додаје пријатеље. allow_write_api: мења мапу. - allow_read_gpx: чита приватне ГПС трагове. - allow_write_gpx: отпрема ГПС трагове. + allow_read_gpx: чита приватне GPS трагове. + allow_write_gpx: отпрема GPS трагове. allow_write_notes: измени белешке. index: title: OAuth детаљи @@ -1500,10 +1602,10 @@ sr: requests: 'Захтевај следеће дозволе од корисника:' allow_read_prefs: читање корисничких поставки. allow_write_prefs: мењање корисничких поставки. - allow_write_diary: прављење уноса у дневнику, коментарисање и додавање пријатеља. + allow_write_diary: прави дневничке записе, коментарише и додаје пријатеље. allow_write_api: мењање мапе. - allow_read_gpx: читање приватних ГПС трагова. - allow_write_gpx: отпремање ГПС трагова. + allow_read_gpx: чита приватне GPS трагове. + allow_write_gpx: отпрема GPS трагове. allow_write_notes: измени белешке. not_found: sorry: Жао нам је, %{type} није пронађен. @@ -1517,7 +1619,7 @@ sr: login: title: Пријава heading: Пријава - email or username: 'Е-адреса или корисничко име:' + email or username: 'Имејл адреса или корисничко име:' password: 'Лозинка:' openid: '%{logo} OpenID:' remember: Запамти ме @@ -1537,6 +1639,11 @@ sr: о проблему. auth failure: Не могу да вас пријавим с унетим подацима. openid_logo_alt: Пријавите се с OpenID-јем + auth_providers: + openid: + title: Пријавити се са OpenID + facebook: + title: Пријавити се са Facebook-ом logout: title: Одјава heading: Одјава @@ -1544,12 +1651,12 @@ sr: lost_password: title: Повратак лозинке heading: Заборавили сте лозинку? - email address: 'Е-адреса:' + email address: 'Имејл адреса:' new password button: Поништи лозинку help_text: Унесите е-адресу коју сте унели при упису, а ми ћемо вам послати везу помоћу које можете да поништите лозинку. notice email on way: Порука за поништавање лозинке је послата. - notice email cannot find: Е-адреса није пронађена. + notice email cannot find: Имејл адреса није пронађена, жао нам је. reset_password: title: Поништи лозинку heading: Поништавање лозинке за %{user} @@ -1559,15 +1666,15 @@ sr: flash changed: Ваша лозинка је промењена. flash token bad: Такав новчић није пронађен. Проверите адресу. new: - title: Пријави се + title: Регистрација no_auto_account_create: Нажалост, тренутно нисмо у могућности да отворимо нови налог. - contact_webmaster: Контактирајте <a href="mailto:webmaster@openstreetmap.org">администратора</a> - за отварање новог налога. Обрадићемо захтев што је пре могуће. + contact_webmaster: Контактирајте <a href="%{webmaster}">администратора</a> за + отварање новог налога. Обрадићемо захтев што је пре могуће. license_agreement: Након што потврдите налог, мораћете да прихватите <a href="http://www.osmfoundation.org/wiki/License/Contributor_Terms">услове уређивања</a>. - email address: 'Е-адреса:' - confirm email address: 'Потврдите е-адресу:' + email address: 'Имејл адреса:' + confirm email address: 'Потврдите имејл адресу:' not displayed publicly: Не приказује се јавно (погледајте <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" title="wiki privacy policy including section on email addresses">политику приватности</a>) @@ -1576,7 +1683,7 @@ sr: променити у поставкама. password: 'Лозинка:' confirm password: 'Потврдите лозинку:' - continue: Пријави се + continue: Отвори налог terms accepted: Хвала вам што прихватате нове услове уређивања. terms declined: Жао нам је што сте одлучили да не прихватите нове услове уређивања. Погледајте <a href="%{url}">ову страницу</a> за више информација. @@ -1609,7 +1716,7 @@ sr: коју сте кликнули. view: my diary: Мој дневник - new diary entry: нови унос у дневнику + new diary entry: нови дневнички запис my edits: Моје измене my traces: Моји трагови my notes: Моје белешке @@ -1634,7 +1741,7 @@ sr: ct declined: Одбијено ct accepted: Прихваћено пре %{ago} дана latest edit: 'Последња измена пре %{ago}:' - email address: 'Е-адреса:' + email address: 'Имејл адреса:' created from: 'Направљено из:' status: 'Стање:' spam score: 'Оцена спама:' @@ -1658,16 +1765,16 @@ sr: revoke: administrator: Опозови овлашћења администратора moderator: Опозови овлашћења уредника - block_history: добијене блокаде - moderator_history: дате блокаде + block_history: Активне блокаде + moderator_history: Извршене блокаде comments: Коментари - create_block: блокирај овог корисника - activate_user: активирај овог корисника - deactivate_user: деактивирај овог корисника - confirm_user: потврди овог корисника - hide_user: сакриј овог корисника - unhide_user: откриј овог корисника - delete_user: обриши овог корисника + create_block: Блокирај корисника + activate_user: Активирај корисника + deactivate_user: Деактивирај корисника + confirm_user: Потврди овог корисника + hide_user: Сакриј корисника + unhide_user: Откриј корисника + delete_user: Избриши корисника confirm: Потврди friends_changesets: Спискови измена пријатеља friends_diaries: Дневник пријатеља @@ -1680,9 +1787,10 @@ sr: account: title: Уреди налог my settings: Поставке - current email address: 'Тренутна е-адреса:' - new email address: 'Нова е-адреса:' + current email address: 'Тренутна имејл адреса:' + new email address: 'Нова имејл адреса:' email never displayed publicly: (никада се не приказује јавно) + external auth: 'Спољна аутентификација:' openid: link: http://wiki.openstreetmap.org/wiki/OpenID link text: шта је ово? @@ -1733,12 +1841,12 @@ sr: make edits public button: Нека све моје измене буду јавне return to profile: Назад на профил flash update success confirm needed: Подаци о кориснику су успешно ажурирани. - Проверите е-пошту да бисте потврдили своју нову е-адресу. + Проверите имејл да бисте потврдили Вашу нову имејл адресу. flash update success: Подаци о кориснику су успешно ажурирани. confirm: - heading: Провери своју е-пошту! + heading: Проверите Ваш имејл! introduction_1: Послалисмо ти е-писмо за потврду. - introduction_2: Потврди свој налог тако што ћеш кликнути на везу у е-писму и + introduction_2: Потврди свој налог тако што ћеш кликнути на везу у имејлу и моћићеш да почнеш са цртањем карте. press confirm button: Притисните дугме за потврду да бисте активирали налог. button: Потврди @@ -1750,16 +1858,17 @@ sr: confirm_resend: success: Послали смо нову потврдну поруку на %{email}. Након што потврдите свој налог, моћи ћете да почнете с мапирањем.<br /><br />Ако користите систем против - непожељних порука, додајте webmaster@openstreetmap.org у списак дозвољених - адреса јер нисмо у могућности да одговоримо на било који захтев за потврду. + непожељних порука, додајте %{sender} у списак дозвољених адреса јер нисмо + у могућности да одговоримо на било који захтев за потврду. failure: Корисник %{name} није пронађен. confirm_email: - heading: Потврда промене е-адресе - press confirm button: Кликните на дугме за потврду да бисте потврдили своју - нову е-адресу. + heading: Потврда промене имејл адресе + press confirm button: Кликните на дугме за потврду да бисте потврдили Вашу нову + имејл адресу. button: Потврди - success: Ваша е-адреса је потврђена. Хвала вам на упису! + success: Промена ваше е-адресе је потврђенаǃ failure: Е-адреса с овим новчићем је већ потврђена. + unknown_token: Вредност кода за потврду је истекла или тај код не постоји. set_home: flash success: Место становања је успешно сачувано go_public: @@ -1987,7 +2096,6 @@ sr: standard: Стандардна cycle_map: Бициклистичка мапа transport_map: Саобраћајна мапа - mapquest: Мапквест опен hot: Хуманитарни layers: header: Слојеви карте @@ -2004,15 +2112,21 @@ sr: createnote_disabled_tooltip: Увећај да додаш белешку на карту map_notes_zoom_in_tooltip: Увећај да видиш белешке на карти map_data_zoom_in_tooltip: Увећај да видиш податке са карте + queryfeature_tooltip: Информације о објектима + queryfeature_disabled_tooltip: Зумирај на информације о објектима changesets: show: comment: Коментар + subscribe: Пријави ме + unsubscribe: Одјави ме hide_comment: сакриј unhide_comment: прикажи notes: new: - intro: Видиш грешку или недостатак? Обавести остале картографе. Помери ознаку - на одговарајуће место и опиши проблем у белешци. (Не уписуј личне податке.) + intro: Наишли сте на грешку или нешто недостаје? Обавестите друге картографе + како бисмо решили проблем. Преместите маркер на исправно место и напишите + објашњење. Молимо вас да не уносите личне податке, информације из мапа заштићених + ауторским правима или спискове каталога. add: Додај белешку show: anonymous_warning: Ова белешка садржи коментаре анонимних корисника које би @@ -2023,6 +2137,51 @@ sr: comment_and_resolve: Коментариши и реши comment: Коментариши edit_help: Помери карту и увећај на место које хоћеш да уредиш, затим кликни овде. + directions: + engines: + graphhopper_bicycle: Бициклом (GraphHopper) + graphhopper_foot: Пешке (GraphHopper) + mapquest_bicycle: Бициклом (MapQuest) + mapquest_car: Аутомобилом (MapQuest) + mapquest_foot: Пешке (MapQuest) + osrm_car: Аутомобилом (OSRM) + mapzen_bicycle: Бициклом (Mapzen) + mapzen_car: Аутомобилом (Mapzen) + mapzen_foot: Пешке (Mapzen) + directions: Путања + distance: Удаљеност + errors: + no_route: Не могу да пронађем руту између та два места. + no_place: Нажалост, не могу да пронађем то место. + instructions: + continue_without_exit: Наставите на %{name} + slight_right_without_exit: Мало удесно у %{name} + turn_right_without_exit: Скрените десно у %{name} + sharp_right_without_exit: Нагло удесно у %{name} + uturn_without_exit: Полукружно окретање дуж %{name} + sharp_left_without_exit: Нагло улево у %{name} + turn_left_without_exit: Скрените лево у %{name} + slight_left_without_exit: Мало улево у %{name} + via_point_without_exit: (преко тачке) + follow_without_exit: Пратите %{name} + roundabout_without_exit: На кружном току скрените на %{name} + leave_roundabout_without_exit: Напустите кружни ток – %{name} + stay_roundabout_without_exit: Останите на кружном току – %{name} + start_without_exit: Почните са краја %{name} + destination_without_exit: Стигните на одредиште + against_oneway_without_exit: Идите једносмерном на %{name} + end_oneway_without_exit: Крај једносмерне на %{name} + roundabout_with_exit: На кружном току изаберите излаз %{exit} на %{name} + unnamed: без имена + courtesy: Путању је омогућио %{link} + time: Време + query: + node: Тачка + way: Линија + relation: Однос + nothing_found: Нема објеката у близини + error: 'Грешка при повезивању са %{server}: %{error}%{error}' + timeout: Истекло је време за повезивање са %{server} redaction: edit: description: Опис diff --git a/config/locales/sv.yml b/config/locales/sv.yml index 1a9f5c83b..4ab28ea6d 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -18,6 +18,7 @@ # Author: Liftarn # Author: Lokal Profil # Author: Luen +# Author: Macofe # Author: Magol # Author: Malmis # Author: Nastoshka @@ -25,6 +26,7 @@ # Author: Per # Author: Pladask # Author: Poxnar +# Author: Rockyfelle # Author: Ruila # Author: Sannab # Author: Sendelbach @@ -105,7 +107,7 @@ sv: user: email: E-post active: Aktiv - display_name: Synligt namn + display_name: Visa namn description: Beskrivning languages: SprÃ¥k pass_crypt: Lösenord @@ -193,6 +195,7 @@ sv: way: sträcka relation: relation changeset: ändringsset + note: not timeout: sorry: Tyvärr tog data för %{type} med id %{id} för lÃ¥ng tid att hämta. type: @@ -200,6 +203,7 @@ sv: way: sträcka relation: relation changeset: ändringsset + note: not redacted: redaction: Omarbetning %{id} message_html: Version %{version} av denna %{type} kan inte visas dÃ¥ den har @@ -241,9 +245,10 @@ sv: sedan</abbr> hidden_by: Gömd av %{user} <abbr title='%{exact_time}'>%{when} sedan</abbr> query: - title: FrÃ¥gan Funktioner + title: Undersök kartobjekt introduction: Klicka pÃ¥ kartan för att hitta närliggande funktioner. nearby: Finns i närheten + enclosing: Omgivande kartobjekt changeset: changeset_paging_nav: showing_page: Sida %{page} @@ -284,6 +289,7 @@ sv: diary_entry: new: title: Nytt dagboksinlägg + publish_button: Publicera list: title: Användardagböcker title_friends: Vänners dagböcker @@ -423,7 +429,7 @@ sv: cable_car: Linbana chair_lift: Stollift drag_lift: Släplift - gondola: Gondolbanan + gondola: Gondolbana station: Linbanestation aeroway: aerodrome: Flygfält @@ -566,7 +572,7 @@ sv: bridleway: Ridstig bus_guideway: SpÃ¥rbussväg bus_stop: BusshÃ¥llplats - construction: Väg under konstruktion + construction: Motorväg under konstruktion cycleway: CykelspÃ¥r elevator: Hiss emergency_access_point: Utryckningsplats @@ -584,7 +590,7 @@ sv: primary_link: PÃ¥-/avfart till riksväg (primär väg) proposed: Föreslagen väg raceway: Racerbana - residential: BostadsomrÃ¥de + residential: Bostadsgata rest_area: Rastplats road: Väg secondary: Länsväg (sekundärväg) @@ -612,7 +618,7 @@ sv: bunker: Bunker castle: Slott church: Kyrka - city_gate: stadsporten + city_gate: Stadsport citywalls: Stadsmurar fort: Fort heritage: Världsarv @@ -1056,10 +1062,10 @@ sv: href="http://wiki.openstreetmap.org/wiki/Legal_FAQ">juridiska FAQ</a>. more_2_html: |- - Även om OpenStreetMap är öppen data, kan vi inte tillhandahÃ¥lla nÃ¥got gratis kart-API för tredjepartsutvecklare. - Se vÃ¥r <a href="http://wiki.openstreetmap.org/wiki/API_usage_policy">användningspolicy för API</a>, - <a href="http://wiki.openstreetmap.org/wiki/Tile_usage_policy">användningspolicy för kartrutor</a> - och <a href="http://wiki.openstreetmap.org/wiki/Nominatim#Usage_Policy">användningspolicy för Nominatim</a>. + Även om OpenStreetMap är öppen data, kan vi inte tillhandahÃ¥lla nÃ¥got gratis kart-API för tredjeparter. + Se vÃ¥r <a href="https://operations.osmfoundation.org/policies/api/">användningspolicy för API</a>, + <a href="https://operations.osmfoundation.org/policies/tiles/">användningspolicy för kartrutor</a> + och <a href="https://operations.osmfoundation.org/policies/nominatim/">användningspolicy för Nominatim</a>. contributors_title_html: VÃ¥ra bidragsgivare contributors_intro_html: |- VÃ¥ra bidragsgivare är tusentals individer. Vi inkluderar ocksÃ¥ @@ -1088,6 +1094,11 @@ sv: contributors_nz_html: |- <strong>Nya Zeeland</strong>: InnehÃ¥ller data frÃ¥n Land Information New Zealand. Crown Copyright reserved. + contributors_si_html: |- + <strong>Slovenien</strong>: InnehÃ¥ller uppgifter frÃ¥n + <a href="http://www.gu.gov.si/en/">Surveying and Mapping Authority</a> och + <a href="http://www.mkgp.gov.si/en/">Ministry of Agriculture, Forestry and Food</a> + (offentlig information i Slovenien). contributors_za_html: |- <strong>Sydafrika</strong>: InnehÃ¥ller data frÃ¥n <a href="http://www.ngi.gov.za/">Chief Directorate: @@ -1114,6 +1125,11 @@ sv: lagts in i OpenStreetMaps databas eller till den här webbplatsen, se vÃ¥rt <a href="http://www.osmfoundation.org/wiki/License/Takedown_procedure">borttagningsförfarande</a> eller fyll i vÃ¥rt <a href="http://dmca.openstreetmap.org/">online-formulär</a> direkt. + trademarks_title_html: <span id="trademarks"></span>Varumärken + trademarks_1_html: OpenStreetMap, förstoringsglas-logotypen och State of the + Map är registrerade varumärken hos OpenStreetMap Foundation. Om du har frÃ¥gor + gällande din användning av varumärkena, vänligen skicka frÃ¥gorna till <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">arbetsgruppen + för licenser</a>. welcome_page: title: Välkommen! introduction_html: Välkommen till OpenStreetMap, den fria och redigerbara kartan @@ -1141,6 +1157,14 @@ sv: en väg, bäck, sjö eller byggnad. tag_html: En <strong>tagg</strong> är en bit data om en nod eller väg, till exempel en restaurangs namn eller en vägs hastighetsbegränsning. + rules: + title: Regler! + paragraph_1_html: "OpenStreetMap har fÃ¥ formella regler, men vi förväntar oss + att alla deltagare samarbetar och kommunicerar med gemenskapen. Om du funderar + pÃ¥\nnÃ¥gon annan aktivitet än manuell redigering av sidan, läs och följ anvisningarna + pÃ¥ \n<a href=\"http://wiki.openstreetmap.org/wiki/Import/Guidelines\">Import</a> + och \n<a href=\"http://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct\">Automatiserade + redigeringar</a>." questions: title: NÃ¥gra frÃ¥gor? paragraph_1_html: |- @@ -1214,7 +1238,7 @@ sv: about_page: next: Nästa copyright_html: <span>©</span>OpenStreetMap<br>bidragsgivare - used_by: '%{name} förser hundratals webbsidor, mobilappar och fysiska apparater + used_by: '%{name} förser tusentals webbsidor, mobilappar och fysiska apparater med kartdata' lede_text: OpenStreetMap är byggt av en gemenskap av kartografer som bidrar och underhÃ¥ller data om vägar, stigar, caféer, järnvägsstationer och mycket mer, @@ -1235,13 +1259,21 @@ sv: distribuera resultatet under samma licens. Se <a href=''%{copyright_path}''>sidan för Upphovsrätt och Licens</a> för detaljer.' legal_title: Juridik + legal_html: "Denna sida och mÃ¥nga andra liknande tjänster drivs formellt av \n<a + href=\"http://osmfoundation.org/\">OpenStreetMap Foundation</a> (OSMF) \npÃ¥ + gemenskapens vägnar. Användning av alla OSMF-opererade tjänster är föremÃ¥l\nför + vÃ¥ra <a href=\"http://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy\">\npolicyer + för acceptabel användning</a> och vÃ¥r <a href=\"http://wiki.osmfoundation.org/wiki/Privacy_Policy\">integritetspolicy</a>\n<br> + \nVänligen <a href=\"http://osmfoundation.org/Contact\">kontakta OSMF</a> \nom + du har frÃ¥gor eller funderingar om licenser, upphovsrätt eller andra rättsliga + frÃ¥gor." partners_title: Partners notifier: diary_comment_notification: - subject: '[OpenStreetMap] %{user} kommenterade ditt dagboksinlägg' + subject: '[OpenStreetMap] %{user} kommenterade pÃ¥ ett dagboksinlägg' hi: Hej %{to_user}, - header: '%{from_user} har kommenterat ditt dagboksinlägg pÃ¥ OpenStreetMap med - rubriken %{subject}:' + header: '%{from_user} har kommenterat dagboksinlägget pÃ¥ OpenStreetMap med rubriken + %{subject}:' footer: Du kan ocksÃ¥ läsa kommentaren pÃ¥ %{readurl} och du kan kommentera pÃ¥ %{commenturl} eller svara pÃ¥ %{replyurl} message_notification: @@ -1468,15 +1500,17 @@ sv: table: entry: motorway: Motorväg + main_road: Huvudväg trunk: Nationell stamväg/motortrafikled primary: Primär väg (riksväg) secondary: Sekundär väg (större länsväg) unclassified: Oklassificerad väg - unsurfaced: Oasfalterad väg track: SpÃ¥r - byway: Förbifart bridleway: Ridstig cycleway: Cykelväg + cycleway_national: Nationell cykelväg + cycleway_regional: Regional cykelväg + cycleway_local: Lokal cykelväg footway: GÃ¥ngväg rail: Järnväg subway: Tunnelbana @@ -1498,7 +1532,6 @@ sv: golf: Golfbana park: Park resident: BostadsomrÃ¥de - tourist: Turistattraktion common: - Allmänning - äng @@ -1528,9 +1561,11 @@ sv: tunnel: Streckade kanter = tunnel bridge: Svarta kanter = bro private: Privat tillgÃ¥ng - permissive: Endast tillträde för behöriga destination: Förbjuden genomfart construction: Vägar under konstruktion + bicycle_shop: Cykelaffär + bicycle_parking: Cykelparkering + toilets: Toaletter richtext_area: edit: Redigera preview: Förhandsgranska @@ -1653,13 +1688,14 @@ sv: offline_warning: message: GPX-uppladdningssystemet är för tillfället otillgängligt. offline: - heading: GPX förvaring är offlien + heading: GPX-lagring offline message: GPX-uppladdningssystemet är för närvarande inte tillgängligt. georss: title: OpenStreetMap GPS-spÃ¥r description: description_with_count: - other: en=GPX-fil med %{count} punkter frÃ¥n %{user} + one: GPX-fil med %{count} punkt frÃ¥n %{user} + other: GPX-fil med %{count} punkter frÃ¥n %{user} description_without_count: GPX-fil frÃ¥n %{user} application: require_cookies: @@ -1672,7 +1708,7 @@ sv: för att fÃ¥ reda pÃ¥ mer. need_to_see_terms: Din tillgÃ¥ng till API:t är tillfälligt avstängd. Logga in pÃ¥ webbgränssnittet för att se bidragsvillkor. Du behöver inte godkänna dem, - men du mÃ¥ste se dem. + men du mÃ¥ste titta pÃ¥ dem. oauth: oauthorize: title: Auktorisera tillgÃ¥ng till ditt konto @@ -1687,6 +1723,7 @@ sv: allow_read_gpx: läs dina privata GPS-spÃ¥r. allow_write_gpx: ladda upp GPS-spÃ¥r allow_write_notes: ändra anteckningar. + grant_access: Bevilja Ã¥tkomst oauthorize_success: title: Auktoriseringsbegäran tillÃ¥ten allowed: Du har beviljat en applikation %{app_name} tillgÃ¥ng till ditt konto. @@ -1799,6 +1836,12 @@ sv: windowslive: title: Logga in med Windows Live alt: Logga in med ett Windows Live-konto + github: + title: Logga in med GitHub + alt: Logga in med ett GitHub-Konto + wikipedia: + title: Logga in med Wikipedia + alt: Logga in med ett Wikipedia-konto yahoo: title: Logga in med Yahoo alt: Logga in med ett Yahoo OpenID @@ -1833,9 +1876,8 @@ sv: title: Registrera no_auto_account_create: Tyvärr kan vi för närvarande inte kan skapa ett konto Ã¥t dig automatiskt. - contact_webmaster: Kontakta <a href="mailto:webmaster@openstreetmap.org">webbansvarig</a> - för att fÃ¥ ett konto skapat – vi kommer att behandla ansökan sÃ¥ snart som - möjligt. + contact_webmaster: Kontakta <a href="%{webmaster}">webbansvarig</a> för att + fÃ¥ ett konto skapat – vi kommer att behandla ansökan sÃ¥ snart som möjligt. about: header: Fri och redigerbar html: |- @@ -1844,8 +1886,9 @@ sv: license_agreement: När du bekräftar ditt konto mÃ¥ste du samtycka till <a href="http://www.osmfoundation.org/wiki/License/Contributor_Terms">bidragsgivarvillkoren</a>. email address: 'E-postadress:' confirm email address: 'Bekräfta e-postadress:' - not displayed publicly: Visas inte offentligt (se <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" - title="wikins integritetspolicy (inkluderar avsnitt om e-postadresser)">integritetspolicyn</a>) + not displayed publicly: Din adress visas inte offentligt, se vÃ¥r <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" + title="OSMF-integritetspolicy som inkluderar avsnitt om e-postadresser">integritetspolicy</a> + för mer information display name: 'Visat namn:' display name description: Ditt offentligt visade användarnamn. Du kan ändra detta senare i inställningarna. @@ -1885,6 +1928,7 @@ sv: heading: Användaren %{user} finns inte body: Det finns ingen användare med namnet %{user}. Kontrollera stavningen, eller sÃ¥ kanske länken är trasig. + deleted: raderad view: my diary: Min dagbok new diary entry: nytt dagboksinlägg @@ -1937,16 +1981,16 @@ sv: revoke: administrator: Återkalla administratörsrättigheter moderator: Återkalla moderatorrättigheter - block_history: tilldelade blockeringar - moderator_history: utdelade blockeringar + block_history: Aktiva blockeringar + moderator_history: Utdelade blockeringar comments: Kommentarer - create_block: blockera denna användare - activate_user: aktivera denna användare - deactivate_user: avaktivera denna användare - confirm_user: bekräfta denna användare - hide_user: dölj denna användare - unhide_user: sluta dölja användaren - delete_user: radera denna användare + create_block: Blockera denna användare + activate_user: Aktivera denna användare + deactivate_user: Inaktivera denna användare + confirm_user: Bekräfta denna användare + hide_user: Dölj denna användare + unhide_user: Sluta dölja användare + delete_user: Radera denna användare confirm: Bekräfta friends_changesets: vänners ändringsset friends_diaries: vänners dagboksinlägg @@ -2000,6 +2044,8 @@ sv: gravatar: gravatar: Använd Gravatar link text: vad är detta? + disabled: Gravatar har inaktiverats. + enabled: Din Gravatar har aktiverats. new image: Lägg till en bild keep image: BehÃ¥ll nuvarande bild delete image: Ta bort nuvarande bild @@ -2024,7 +2070,7 @@ sv: press confirm button: Klicka pÃ¥ bekräftelseknappen nedan för att aktivera ditt konto. button: Bekräfta - success: Ditt konto är bekräftat, tack för att du registrerade dig. + success: Ditt konto är bekräftat, tack för att du registrerade dig! already active: Detta konto har redan bekräftats. unknown token: Denna bekräftelsekod har gÃ¥tt ut eller finns inte. reconfirm_html: Om du vill att vi ska skicka bekräftelsemailet igen, <a href="%{reconfirm}">klicka @@ -2033,8 +2079,7 @@ sv: success: Vi har skickat ett nytt bekräftelsemeddelande till %{email} och sÃ¥ snart du bekräftat ditt konto kommer du kunna börja kartera.<br /><br />Om du använder ett antispamsystem som skickar bekräftelsemeddelanden se till - att du vitlistar webmaster@openstreetmap.org dÃ¥ vi inte kan svara pÃ¥ nÃ¥gra - sÃ¥dana begäranden. + att du vitlistar %{sender} dÃ¥ vi inte kan svara pÃ¥ nÃ¥gra sÃ¥dana begäranden. failure: Användaren %{name} hittades inte. confirm_email: heading: Bekräfta byte av e-postadress @@ -2070,7 +2115,7 @@ sv: summary: '%{name} skapades frÃ¥n %{ip_address} den %{date}' summary_no_ip: '%{name} skapad %{date}' confirm: Bekräfta valda användare - hide: Göm valda användare + hide: Dölj valda användare empty: Inga användare hittades suspended: title: Kontot avstängt @@ -2088,6 +2133,18 @@ sv: auth_failure: connection_failed: Anslutning till autentiseringsleverantören misslyckades invalid_credentials: Ogiltiga autentiseringsuppgifter + no_authorization_code: Ingen behörighetskod + unknown_signature_algorithm: Okänd signaturalgoritm + invalid_scope: Ogiltiga omfattning + auth_association: + heading: Ditt ID är inte associerat med ett OpenStreetMap-konto ännu. + option_1: |- + Om du är ny pÃ¥ OpenStreetMap, vänligen skapa ett nytt konto + med hjälp av formuläret nedan. + option_2: |- + Om du redan har ett konto, kan du logga in pÃ¥ ditt konto + med hjälp av ditt användarnamn och lösenord och sedan koppla kontot + med ditt ID i dina användarinställningar. user_role: filter: not_an_administrator: Endast adminstratörer kan ändra användares roller och @@ -2203,6 +2260,8 @@ sv: heading: '%{block_on} blockerad av %{block_by}' time_future: Upphör om %{time} time_past: Slutade för %{time} sedan + created: Skapad + ago: '%{time} sedan' status: Status show: Visa edit: Redigera @@ -2253,6 +2312,7 @@ sv: link: Länk eller HTML long_link: Länk short_link: Kort länk + geo_uri: Geo-URI embed: HTML custom_dimensions: Ange anpassade dimensioner format: 'Format:' @@ -2264,10 +2324,13 @@ sv: center_marker: Centrera kartan pÃ¥ markören paste_html: Klistra in HTML-koden för att publicera pÃ¥ en webbsida view_larger_map: Visa större karta + only_standard_layer: Endast standardlagret kan exporteras som en bild + embed: + report_problem: Rapportera ett problem key: title: Kartnyckel tooltip: Kartnyckel - tooltip_disabled: Kartnyckeln finns bara för standardlagret + tooltip_disabled: Kartnyckeln finns inte för detta lager map: zoom: in: Zooma in @@ -2284,6 +2347,7 @@ sv: header: Kartskikt notes: Kartanteckningar data: Kartdata + gps: Offentliga GPS-spÃ¥r overlays: Aktivera lager för felsökning av kartan title: Lager copyright: © <a href='%{copyright_url}'>OpenStreetMaps bidragsgivare</a> @@ -2295,8 +2359,8 @@ sv: createnote_disabled_tooltip: Zooma in för att lägga till anteckningar pÃ¥ kartan map_notes_zoom_in_tooltip: Zooma in för att se kartanteckningar map_data_zoom_in_tooltip: Zooma in för att se kartdata - queryfeature_tooltip: FrÃ¥ge funktioner - queryfeature_disabled_tooltip: Zooma in för att frÃ¥ga om funktioner + queryfeature_tooltip: Undersök kartobjekt + queryfeature_disabled_tooltip: Zooma in för att undersöka kartobjekt changesets: show: comment: Kommentera @@ -2329,12 +2393,48 @@ sv: mapquest_car: Bil (MapQuest) mapquest_foot: GÃ¥ende (MapQuest) osrm_car: Bil (OSRM) + mapzen_bicycle: Cykel (Mapzen) + mapzen_car: Bil (Mapzen) + mapzen_foot: Fot (Mapzen) directions: Vägbeskrivning distance: AvstÃ¥nd errors: no_route: Kunde inte hitta en väg mellan dessa tvÃ¥ platser. no_place: Ledsen - kunde inte hitta platsen. instructions: + continue_without_exit: Fortsätt pÃ¥ %{name} + slight_right_without_exit: Svag högersväng in pÃ¥ %{name} + offramp_right_without_exit: Ta rampen till höger in pÃ¥ %{name} + onramp_right_without_exit: Sväng vänster pÃ¥ rampen till %{name} + endofroad_right_without_exit: Vid slutet av vägen, sväng höger in pÃ¥ %{name} + merge_right_without_exit: Sväng rakt in pÃ¥ %{name} + fork_right_without_exit: Vid vägskälet sväng höger in pÃ¥ %{name} + turn_right_without_exit: Högersväng in pÃ¥ %{name} + sharp_right_without_exit: Skarp högersväng in pÃ¥ %{name} + uturn_without_exit: U-sväng längs %{name} + sharp_left_without_exit: Skarp vänstersväng in pÃ¥ %{name} + turn_left_without_exit: Vänstersväng in pÃ¥ %{name} + offramp_left_without_exit: Ta rampen till vänster in pÃ¥ %{name} + onramp_left_without_exit: Sväng vänster pÃ¥ rampen in till %{name} + endofroad_left_without_exit: Vid slutet av vägen, sväng vänster in pÃ¥ %{name} + merge_left_without_exit: Sväng vänster in pÃ¥ %{name} + fork_left_without_exit: Vid vägskälet sväng vänster in pÃ¥ %{name} + slight_left_without_exit: Svag vänstersväng in pÃ¥ %{name} + via_point_without_exit: (via punkt) + follow_without_exit: Följ %{name} + roundabout_without_exit: I rondellen ta av mot %{name} + leave_roundabout_without_exit: Lämna rondellen - %{name} + stay_roundabout_without_exit: Stanna kvar i rondellen - %{name} + start_without_exit: Börja vid slutet av %{name} + destination_without_exit: NÃ¥ destination + against_oneway_without_exit: Kör mot enkelriktat pÃ¥ %{name} + end_oneway_without_exit: Slutet av enkelriktat pÃ¥ %{name} + roundabout_with_exit: Vid rondellen, ta avfart %{exit} mot %{name} + turn_left_with_exit: I rondellen, sväng vänster till %{name} + slight_left_with_exit: I rondellen, sväng vänster till %{name} + turn_right_with_exit: I rondellen, sväng höger till %{name} + slight_right_with_exit: I rondellen, sväng höger till %{name} + continue_with_exit: I rondellen, fortsätt rakt fram till %{name} unnamed: namnlös courtesy: Vägbeskrivning med tillstÃ¥nd av %{link} time: Tid diff --git a/config/locales/te.yml b/config/locales/te.yml index 814d02f28..01b684276 100644 --- a/config/locales/te.yml +++ b/config/locales/te.yml @@ -3,6 +3,7 @@ # Export driver: phpyaml # Author: Arjunaraoc # Author: Chaduvari +# Author: Gayatri # Author: Kiranmayee # Author: Ravichandra # Author: Veeven @@ -15,6 +16,7 @@ te: activerecord: models: acl: అనుమతి నియంత్రణ జాబితా + changeset: మార్పుల సమితి country: దేశం diary_comment: డైరీ వ్యాఖ్య diary_entry: దినచర్య పద్దు @@ -88,7 +90,11 @@ te: way: మార్గాలు (%{count}) relation: సంబంధాలు (%{count}) relation_paginated: '%{count} లో %{x}-%{y} యొక్క సంబంధాలు' + comment: వ్యాఖ్యలు (%{count}) + commented_by: '%{user} నుండి వ్యాఖ్య <abbr title=''%{exact_time}''>%{when} క్రితం</abbr>' discussion: చర్చ + node: + title: 'బిందువు: %{name}' relation: title: 'సంబంధం: %{name}' history_title: 'సంబంధపు చరిత్ర: %{name}' @@ -102,12 +108,15 @@ te: not_found: sorry: 'క్షమించండి, %{type} #%{id} కనబడలేదు.' type: + way: దారి relation: సంబంధం timeout: type: + way: దారి relation: సంబంధం redacted: type: + way: దారి relation: సంబంధం start_rjs: loading: లోడవుతోంది... @@ -118,6 +127,8 @@ te: title: 'గమనిక: %{id}' new_note: కొత్త గమనిక description: వివరణ + query: + nearby: దగ్గర్లోని విశేషాలు changeset: changeset_paging_nav: showing_page: పేజీ %{page} @@ -140,9 +151,11 @@ te: diary_entry: new: title: కొత్త దినచర్య పద్దు + publish_button: ప్రచురించు list: title: వాడుకరుల డైరీలు title_friends: స్నేహితుల దినచర్యలు + title_nearby: చుట్టుపక్కల వాడుకరుల డైరీలు user_title: '%{user} యొక్క దినచర్య' in_language_title: '%{language}లో ఉన్న డైరీ పద్దులు' new: కొత్త దినచర్య పద్దు @@ -151,6 +164,7 @@ te: older_entries: పాత పద్దులు newer_entries: కొత్త పద్దులు edit: + title: డైరీ పద్దును మార్చు subject: 'విషయం:' body: 'వివరణ:' language: 'భాష:' @@ -273,6 +287,7 @@ te: marketplace: సంత nursery: పిల్లల బడి office: కార్యాలయం + parking: పార్కింగు pharmacy: మందుల దుకాణం place_of_worship: పూజా స్థలం police: పోలీసు @@ -297,6 +312,10 @@ te: "yes": వంతెన building: "yes": భవనం + craft: + painter: పెయింటర్ + photographer: చాయాగ్రాహకుడు + tailor: దర్జీ highway: footway: కాలినడక దారి milestone: మైలురాయి @@ -311,10 +330,11 @@ te: secondary_link: ద్వితీయ శ్రేణి రహదారి steps: మెట్లు street_lamp: వీధి దీపం + "yes": దారి historic: battlefield: యుద్ధరంగం boundary_stone: సరిహద్దు రాయి - building: భవనం + building: చారిత్రక కట్టడం castle: కోట church: చర్చి citywalls: నగర గోడలు @@ -327,6 +347,8 @@ te: ruins: శిథిలాలు tomb: సమాధి tower: గోపురం + junction: + "yes": కూడలి landuse: cemetery: శ్మశానం commercial: వాణిజ్య ప్రదేశం @@ -347,6 +369,7 @@ te: reservoir: జలాశయం reservoir_watershed: జలాశయం residential: నివాస ప్రాంతం + "yes": భూఉపయోగం leisure: beach_resort: బీచి రిసార్టు bird_hide: పక్షులకు ఆవాసం @@ -367,6 +390,7 @@ te: mud: బురద peak: శిఖరం rock: రాయి + sand: ఇసుక spring: ఊట stone: రాయి strait: జలసంధి @@ -406,6 +430,7 @@ te: toys: బొమ్మల అంగడి "yes": దుకాణం tourism: + apartment: అపార్టుమెంట్ hotel: హోటెల్ information: సమాచారం museum: ప్రదర్శన శాల @@ -483,11 +508,17 @@ te: title: ఎలా తోడ్పడాలి help_page: title: సహాయం పొందడం + welcome: + title: OSMకి స్వాగతం about_page: next: తదుపరి local_knowledge_title: స్థానిక పరిజ్ఞానం partners_title: భాగస్వాములు notifier: + diary_comment_notification: + hi: హలో %{to_user}, + message_notification: + hi: హలో %{to_user}, gpx_notification: with_description: వివరణతో signup_confirm: @@ -551,7 +582,6 @@ te: wood: కలప park: పార్కు resident: నివాస ప్రాంతం - tourist: పర్యాటక ఆకర్షణ common: - పచ్చికబయలు - పచ్చికబయలు @@ -569,6 +599,7 @@ te: building: ప్రముఖ కట్టడము station: రైల్వే స్టేషన్ construction: నిర్మాణంలో ఉన్న రహదార్లు + toilets: మరుగుదొడ్లు richtext_area: edit: మార్చు preview: మునుజూపు @@ -653,9 +684,9 @@ te: title: నమోదవ్వండి email address: 'ఈమెయిలు చిరునామా:' confirm email address: 'ఈమెయిలు చిరునామాని నిర్ధారించండి:' - not displayed publicly: బహిరంగంగా చూపించబడదు (<a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" - title="wiki privacy policy including section on email addresses">గోప్యతా విధానాన్ని</a> - చూడండి) + not displayed publicly: మీ చిరునామా బహిరంగంగా చూపబడదు, మరింత సమాచారం కోసం మా + <a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy" title="OSMF గోప్యతా + విధానం, ఈమెయిలు చిరునామాల విభాగం కూడా ఉంది">గోప్యతా విధానాన్ని</a> చూడండి display name: 'చూపించే పేరు:' password: 'సంకేతపదం:' confirm password: 'సంకేతపదాన్ని నిర్ధారించండి:' @@ -717,8 +748,10 @@ te: new email address: 'కొత్త ఈమెయిల్ చిరునామా:' email never displayed publicly: (బహిరంగంగా ఎన్నటికీ చూపించబడదు) openid: + link: https://wiki.openstreetmap.org/wiki/OpenID link text: ఇది ఏమిటి? public editing: + enabled link: https://wiki.openstreetmap.org/wiki/Anonymous_edits enabled link text: ఇది ఏమిటి? disabled link text: నేను ఎందుకు మార్చలేను? contributor terms: @@ -752,7 +785,7 @@ te: press confirm button: మీ కొత్త ఈమెయిలు చిరునామాను నిర్ధారించడానికి క్రింది నిర్ధారింపు బొత్తాన్ని నొక్కండి. button: నిర్ధారించు - success: మీ ఈమెయిలు చిరునామా నిర్ధారణ అయింది, నమోదైనందుకు ధన్యవాదాలు! + success: మీ ఈమెయిలు చిరునామా నిర్ధారణ అయింది! go_public: flash success: ఇప్పుడు మీ మార్పుచేర్పులన్నీ బహిరంగం, మీరు ఇక నుండి దిద్దుబాట్లు చేయవచ్చు. @@ -796,6 +829,7 @@ te: show: time_future: '%{time}లో ముగుస్తుంది' time_past: '%{time} క్రితం ముగిసింది' + ago: '%{time} క్రితం' status: స్థితి show: చూపించు edit: మార్చు @@ -830,12 +864,21 @@ te: layers: notes: పటపు గమనికలు data: పటం భోగట్టా + copyright: © <a href='%{copyright_url}'>ఓపెన్‌స్ట్రీట్‌మాప్ తోడ్పాటుదార్లు</a> donate_link_text: <a class='donate-attr' href='%{donate_url}'>విరాళం ఇవ్వండి</a> + changesets: + show: + comment: వ్యాఖ్య notes: show: hide: దాచు comment_and_resolve: వ్యాఖ్యానించి పరిష్కరించండి comment: వ్యాఖ్యానించండి + directions: + distance: దూరం + time: సమయం + query: + relation: సంబంధం redaction: edit: description: వివరణ diff --git a/config/locales/tl.yml b/config/locales/tl.yml index 1c204048b..eb6915e4b 100644 --- a/config/locales/tl.yml +++ b/config/locales/tl.yml @@ -6,6 +6,8 @@ # Author: Ianlopez1115 # Author: Jewel457 # Author: Jojit fb +# Author: Leeheonjin +# Author: Macofe # Author: 아라 --- tl: @@ -1081,13 +1083,12 @@ tl: table: entry: motorway: Daanan ng Sasakyang may Motor + main_road: Pangunahing daan trunk: Punong Kalsada primary: Pangunahing kalsada secondary: Pampangalawang kalsada unclassified: Kalsadang walang kaurian - unsurfaced: Kalsadang hindi patag track: Bakas - byway: Landas na hindi madaanan bridleway: Daanan ng Kabayo cycleway: Daanan ng motorsiklo o bisikleta footway: Lakaran ng tao @@ -1111,7 +1112,6 @@ tl: golf: Kurso ng golp park: Liwasan resident: Pook na panuluyan - tourist: Pang-akit ng turista common: - Karaniwan - kaparangan @@ -1141,7 +1141,6 @@ tl: tunnel: Ginitlingang pambalot = lagusan bridge: Itim na pambalot = tulay private: Pribadong pagpunta - permissive: Mapagpaubayang pagpapapunta destination: Pagpapapunta sa patutunguhan construction: Mga kalsadang ginagawa richtext_area: @@ -1418,7 +1417,7 @@ tl: title: Likhain ang akawnt no_auto_account_create: Sa kasamaang-palad pangkasalukuyang hindi namin magawang kusang lumikha ng akawnt para sa iyo. - contact_webmaster: Mangyaring makipag-uganay sa <a href="mailto:webmaster@openstreetmap.org">panginoon + contact_webmaster: Mangyaring makipag-uganay sa <a href="%{webmaster}">panginoon ng web</a> upang makipagkasundo para sa isang lilikhaing akawnt - susubukan namin at harapin ang kahilingan sa lalong madaling panahon. license_agreement: Kapag tiniyak mo ang iyong akawnt kakailanganin mong sumang-ayon @@ -1616,8 +1615,8 @@ tl: tiniyak mo nang iyong akawnt sa lalong madaling panahon maaari ka nang magsimula sa pagmamapa.<br /><br />Kung gumagamit ka ng isang sistemang panlaban sa basurang liham na nagpapadala ng mga kahilingan ng pagtitiyak, pakitiyak na - itala mo sa puting-talaan ang webmaster@openstreetmap.org dahil hindi namin - magagawang tumugon sa anumang mga kahilingan ng pagtitiyak. + itala mo sa puting-talaan ang %{sender} dahil hindi namin magagawang tumugon + sa anumang mga kahilingan ng pagtitiyak. failure: Hindi natagpuan ang tagagamit na si %{name}. confirm_email: heading: Tiyakin ang isang pagpapalit ng tirahan ng e-liham @@ -1820,7 +1819,6 @@ tl: standard: Pamantayan cycle_map: Mapa ng Pagbibisikleta transport_map: Mapa ng Transportasyon - mapquest: Bukas ang MapQuest site: edit_tooltip: Baguhin ang mapa edit_disabled_tooltip: Lumapit upang baguhin ang mapa diff --git a/config/locales/tr.yml b/config/locales/tr.yml index cd1aeb282..9b50f41be 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -2,16 +2,23 @@ # Exported from translatewiki.net # Export driver: phpyaml # Author: Alerque +# Author: Alpkant +# Author: Captantrips # Author: Emperyan # Author: Erdemaslancan # Author: George Animal # Author: Gizemb +# Author: Imabadplayer # Author: Incelemeelemani # Author: Joseph # Author: Katpatuka +# Author: Kumkumuk # Author: Mavrikant +# Author: McAang # Author: Meelo +# Author: Rapsar # Author: Ruila +# Author: Sadrettin # Author: SalihB # Author: Sayginer # Author: Sucsuzz @@ -183,6 +190,7 @@ tr: way: yol relation: ilişki changeset: değişiklik takımı + note: Not timeout: sorry: Üzgünüz, %{type} olan verisi %{id} almak için çok uzun sürdü. type: @@ -190,6 +198,7 @@ tr: way: yol relation: ilişki changeset: değişiklik takımı + note: Not redacted: redaction: Redaksiyon %{id} type: @@ -207,6 +216,7 @@ tr: wiki_link: key: '%{key} parametresi için Viki açıklaması' tag: '%{key}=%{value} parametresi için Viki açıklaması' + wikidata_link: Vikidatada bulunan %{page} ögesi wikipedia_link: '%{page} hakkında Vikipedi maddesi' telephone_link: '%{phone_number} ara' note: @@ -269,6 +279,7 @@ tr: diary_entry: new: title: Yeni Günlük Girdisi + publish_button: Yayınla list: title: Kullanıcıların günlükleri title_friends: Arkadaşlarının günlükleri @@ -308,7 +319,7 @@ tr: posted_by: '%{link_user} tarafından %{created} tarihinde %{language_link} dilinde gönderildi' comment_link: Bu girdisi yorumla - reply_link: Bu girdisi yanıtla + reply_link: Bu girdiyi yanıtla comment_count: one: 1 yorum zero: yorumsuz @@ -356,11 +367,14 @@ tr: export_details: OpenStreetMap verileri, <a href="http://opendatacommons.org/licenses/odbl/1.0/">Open Data Commons Open Database License</a> (ODbL) altında lisanslanmıştır. too_large: + advice: 'Yukarıdaki dışa aktarım başarısız olursa, lütfen aşağıdaki kaynaklardan + birini kullanmayı düşünün:' body: Bu alan OpenStreetMap XML verisi olarak verilmesine kadar büyüktür. Lütfen yakınlaştır veya daha küçük bir alan seç ya da aşağıdaki verilen diğer kaynakları kullan. planet: title: OSM Gezegeni + description: Tam OpenStreetMap veritabanının düzenli güncellenen kopyası overpass: title: Overpass API geofabrik: @@ -370,6 +384,7 @@ tr: description: Büyükşehir ile banliyölerin çıktıkları other: title: Diğer Kaynaklar + description: OpenStreetMap vikisinde listelenen ek kaynaklar options: Seçenekler format: Biçim scale: Ölçek @@ -399,6 +414,7 @@ tr: search_osm_nominatim: prefix: aerialway: + cable_car: Teleferik chair_lift: Chair Lift drag_lift: Sürükleyen Asansör gondola: Telesiyej @@ -451,6 +467,7 @@ tr: ferry_terminal: Feribot Terminali fire_hydrant: Yangın musluğu fire_station: Itfaiye + food_court: Yiyecek Reyonu fountain: Fıskiye fuel: Petrol ofisi gambling: Kumarhane @@ -787,17 +804,17 @@ tr: art: Sanat Galerisi bakery: Fırın beauty: Güzellik Salonu - beverages: İçecek Dükkanı + beverages: İçecek Dükkânı bicycle: Bisikletçi books: Kitap Evi boutique: Butik butcher: Kasap car: Araba Galerisi - car_parts: Araba Parçası Dükkanı + car_parts: Araba Parçaları car_repair: Oto tamir - carpet: Halı Dükkanı + carpet: Halı Dükkânı chemist: Eczacı - clothes: Giysi Dükkanı + clothes: Giysi Dükkânı computer: Bilgisayar Mağazası confectionery: Pastane convenience: Bakkal @@ -806,19 +823,20 @@ tr: deli: Şarküteri department_store: Mağaza discount: Ä°ndirimli Ürünler Mağazası + doityourself: Kendin Yap dry_cleaning: Kuru Temizleme electronics: Elektronik Mağazası estate_agent: Emlakçı farm: Manav - fashion: Moda Dükkanı - fish: Balık Dükkanı + fashion: Moda Dükkânı + fish: Balık Dükkânı florist: Çiçekçi - food: Yiyecek Dükkanı + food: Yiyecek Dükkânı furniture: Mobilya gallery: Galeri garden_centre: Bahçe Merkezi general: Bakkal - gift: Hediyelik Eşya Dükkanı + gift: Hediyelik Eşya Dükkânı greengrocer: Manav grocery: Manav hairdresser: Kuaför @@ -830,19 +848,19 @@ tr: laundry: Çamaşırhane mall: Alışveriş merkezi market: Market - mobile_phone: Cep Telefonu Dükkanı - motorcycle: Motosiklet Dükkanı + mobile_phone: Cep Telefonu Dükkânı + motorcycle: Motosiklet Dükkânı music: Müzik Mağazası newsagent: Gazete bayii optician: Gözlükçü - organic: Organik Yiyecek Dükkanı + organic: Organik Yiyecek Dükkânı outdoor: Outdoor Sporları Mağazası pet: Hayvan Mağazası pharmacy: Eczane photo: Fotoğrafçı salon: Kuaför - second_hand: Ä°kinci El Dükkanı - shoes: Ayakkabı Dükkanı + second_hand: Ä°kinci El Dükkânı + shoes: Ayakkabı Dükkânı shopping_centre: Alışveriş Merkezi sports: Spor Malzemeleri Mağazası stationery: Kırtasiye @@ -850,7 +868,7 @@ tr: tailor: Terzi toys: Oyuncakçı travel_agency: Seyahat Acentası - video: Video-CD Dükkanı + video: Video-CD Dükkânı wine: Şarap evi "yes": Dükkan tourism: @@ -926,7 +944,7 @@ tr: sign_up: Kaydol start_mapping: Harita Çizmeye Başla sign_up_tooltip: Düzenleme moduna girmek için bir hesap oluştur - edit: Düzenle + edit: Değiştir history: Geçmiş export: Dışa aktar data: Veri @@ -1037,6 +1055,7 @@ tr: help_page: title: Yardım Almak welcome: + url: /hoşgeldiniz title: OSM'ye hoşgeldin! description: OpenStreetMap temellerini öğrenmek için kısa bir kılavuz ile başla. beginners_guide: @@ -1114,6 +1133,7 @@ tr: click_the_link: Bu istek sana aitse şifre sıfırlamak için aşağıdaki bağlantıyı tıkla. note_comment_notification: + anonymous: Anonim kullanıcı greeting: Merhaba, commented: subject_own: '[OpenStreetMap] notlarından birisini %{commenter} tarafından @@ -1195,6 +1215,7 @@ tr: close: Kapat search: search: Ara + get_directions: Yol tarifi al where_am_i: Ben neredeyim? where_am_i_title: Arama motoru kullanarak geçerli konumunu tanımlar submit_text: Git @@ -1206,9 +1227,7 @@ tr: primary: Devlet Yolu secondary: Ä°l yolu unclassified: Sınıflandırılmamış yol - unsurfaced: Ham yolu track: Toprak yolu - byway: Yan yolu bridleway: Binici yolu cycleway: Bisiklet yolu footway: Yaya yolu @@ -1232,7 +1251,6 @@ tr: golf: Golf sahası park: Park resident: Yerleşim bölgesi - tourist: Turistik yer common: - Çimen - mera @@ -1262,6 +1280,7 @@ tr: tunnel: çizgili kenar = tünel bridge: Siyah kenar = köprü private: Özel giriş + destination: Hedef noktası construction: yapım aşamasında yolu richtext_area: edit: Düzenle @@ -1410,6 +1429,8 @@ tr: register now: Şimdi kayıt ol with username: 'OpenStreetMap hesabınız var mı? Lütfen kullanıcı adı ve şifrenizle giriş yapınız:' + with external: 'Alternatif olarak, bir üçüncü parti uygulaması kullanarak oturum + açın:' new to osm: OpenStreetMap sitesinde yeni misiniz? to make changes: OpenStreetMap verileri değiştirmek için bir hesabın olması gerekir. @@ -1461,6 +1482,8 @@ tr: 'tercihlerim' bölümünde değiştirebilirsin. password: 'Şifre:' confirm password: 'Şifre Onayla:' + use external auth: 'Alternatif olarak, bir üçüncü parti uygulaması kullanarak + oturum açın:' continue: Kaydol terms accepted: Yeni katılımcı şartları kabul ettiğin için teşekkür ederiz! terms: @@ -1488,6 +1511,7 @@ tr: heading: '%{user} adlı bir kullanıcı yok.' body: Üzgünüz, %{user} adlı bir kullanıcı yok. Lütfen yazımınızı denetleyin veya tıkladığınız bağlantı belki yanlış idi. + deleted: silindi view: my diary: Günlüğüm new diary entry: yeni kayıt @@ -1744,7 +1768,6 @@ tr: standard: Standart cycle_map: Bisikletler için Harita transport_map: Ulaşım Haritası - mapquest: MapQuest Open hot: Ä°nsancıl layers: header: Harita Katmanları diff --git a/config/locales/uk.yml b/config/locales/uk.yml index d89bd99af..1bb10997a 100644 --- a/config/locales/uk.yml +++ b/config/locales/uk.yml @@ -12,10 +12,13 @@ # Author: Dittaeva # Author: Dubyk # Author: Dudka +# Author: Green Zero # Author: KEL +# Author: Macofe # Author: Mykola Swarnyk # Author: Nemo bis # Author: Olvin +# Author: Piramidion # Author: Prima klasy4na # Author: Riwnodennyk # Author: Ruila @@ -60,7 +63,7 @@ uk: trace: Трек tracepoint: Точка треку tracetag: Теґ треку - user: Користувач + user: Учасник user_preference: Налаштування користувача user_token: Код підтвердження користувача way: Лінія @@ -183,6 +186,7 @@ uk: way: лінія relation: зв’язок changeset: набір змін + note: примітка timeout: sorry: На жаль, %{type} з ідентифікатором %{id}, має занадто багато даних, щоб їх отримати. @@ -191,6 +195,7 @@ uk: way: лінія relation: зв’язок changeset: набір змін + note: примітка redacted: redaction: Редакція %{id} message_html: Версія %{version} типу %{type} не може бути показана через те, @@ -281,6 +286,7 @@ uk: diary_entry: new: title: Створити новий запис у щоденнику + publish_button: Опублікувати list: title: Щоденник користувача title_friends: Щоденники друзів @@ -466,7 +472,7 @@ uk: driving_school: Автошкола embassy: Амбасада emergency_phone: Телефон для екстрених викликів - fast_food: Забігайлівка + fast_food: Швидке харчування ferry_terminal: Поромна станція fire_hydrant: Пожежний гідрант fire_station: Пожежна станція @@ -519,7 +525,7 @@ uk: telephone: Телефон theatre: Театр toilets: Туалет - townhall: Ратуша + townhall: Управління населеного пункту university: Університет vending_machine: Торговий автомат veterinary: Ветлікарня @@ -548,7 +554,7 @@ uk: painter: Художник photographer: Фотограф plumber: Сантехнік - shoemaker: Ремонт взуття + shoemaker: Швець tailor: Кравець "yes": Товари для рукоділля emergency: @@ -630,7 +636,7 @@ uk: landuse: allotments: Сади-городи basin: Резервуар - brownfield: Колишня промзона + brownfield: Територія очищена під нову забудову cemetery: Кладовище commercial: Торгівельно-офісна територія conservation: Заповідник @@ -641,7 +647,7 @@ uk: forest: Ліс garages: Гаражі grass: Трава - greenfield: Поле + greenfield: Територія виділена під забудову industrial: Промзона landfill: Звалище meadow: Левада @@ -719,7 +725,7 @@ uk: island: Острів land: Суша marsh: Болото - moor: Торфовище + moor: Якірна стоянка mud: Грязюка peak: Пік point: Точка @@ -738,7 +744,7 @@ uk: volcano: Вулкан water: Вода wetland: Заболочені землі - wood: Ліс + wood: Дерева office: accountant: Бухгалтер administrative: Адміністрація @@ -768,7 +774,7 @@ uk: islet: Острівець isolated_dwelling: Окреме господарство locality: Місцевість - moor: Пустище + moor: Якірна стоянка municipality: Муніципалітет neighbourhood: Мікрорайон postcode: Індекс @@ -780,7 +786,7 @@ uk: town: Місто unincorporated_area: Неприєднанні території village: Село - "yes": Квартал + "yes": Місцевість railway: abandoned: Занедбані колії construction: Будівництво колії @@ -810,7 +816,7 @@ uk: alcohol: Спиртні напої на винос antiques: Антикваріат art: Художній салон - bakery: Хліб + bakery: Пекарня beauty: Салон краси beverages: Напої bicycle: Веломагазин @@ -822,11 +828,11 @@ uk: car_repair: Автомайстерня carpet: Килими charity: Соціальний магазин - chemist: Фармація + chemist: Побутова хімія clothes: Одяг computer: Комп’ютерна крамниця confectionery: Кондитерська - convenience: Мінімаркет + convenience: Міні-маркет copyshop: Послуги копіювання cosmetics: Магазин косметики deli: Делікатеси @@ -836,7 +842,7 @@ uk: dry_cleaning: Хімчистка electronics: Магазин електроніки estate_agent: Агентство нерухомості - farm: Сільська крамниця + farm: Фермерський магазин fashion: Модний одяг fish: Риба florist: Квіти @@ -849,7 +855,7 @@ uk: gift: Подарунки greengrocer: Овочі, фрукти grocery: Бакалія - hairdresser: Перукар + hairdresser: Перукарня hardware: Господарські товари hifi: Аудіо-техніка insurance: Страхування @@ -858,7 +864,7 @@ uk: laundry: Пральня mall: Торгівельно-розважальний центр market: Магазин - mobile_phone: Мобільний салон + mobile_phone: Магазин мобільних телефонів motorcycle: Мотоцикли music: Музика newsagent: Газетний кіоск @@ -887,7 +893,7 @@ uk: artwork: Мистецтво attraction: Цікаві місця bed_and_breakfast: Ліжко та сніданок - cabin: Хатина + cabin: Хатинка camp_site: Турбаза caravan_site: Майданчик для трейлерів chalet: Шале @@ -913,14 +919,14 @@ uk: derelict_canal: Покинутий канал ditch: Рів dock: Док - drain: Стік + drain: Стічна канава lock: Шлюз lock_gate: Шлюзові ворота mooring: Якірна стоянка rapids: Пороги river: Річка stream: Струмок - wadi: Русло + wadi: Ваді (Сухе русло) waterfall: Водоспад weir: Гребля "yes": Водний маршрут @@ -949,7 +955,7 @@ uk: alt_text: Логотип OpenStreetMap home: Додому logout: Вийти - log_in: Ввійти + log_in: Увійти log_in_tooltip: Увійти під існуючим обліковим записом sign_up: Реєстрація start_mapping: Почати мапити @@ -998,7 +1004,7 @@ uk: title: Про цей переклад text: У разі суперечностей між цим перекладом та %{english_original_link}, оригінал англійською має перевагу. - english_link: оригінал англійською + english_link: оригіналом англійською native: title: Про цю сторінку text: Ви переглядаєте англійську версію сторінки авторських прав. Ви можете @@ -1009,13 +1015,13 @@ uk: legal_babble: title_html: Авторські права та ліцензування intro_1_html: |- - Дані OpenStreetMap<sup><a href="#trademarks">®</a></sup> є <i>відкритими даними</i>, що ліцензуються на - умовах Ліцензії <a href="http://opendatacommons.org/licenses/odbl/">Open Data Commons Open Database License</a> (ODbL) організацією <a - href="http://osmfoundation.org/">OpenStreetMap Foundation</a> (OSMF). + Дані OpenStreetMap<sup><a href="#trademarks">®</a></sup> є <i>відкритими даними</i>, що ліцензуються <a + href="http://osmfoundation.org/">OpenStreetMap Foundation</a> (OSMF) на + умовах Ліцензії <a href="http://opendatacommons.org/licenses/odbl/">Open Data Commons Open Database License</a> (ODbL). intro_2_html: Ви можете вільно копіювати, поширювати, передавати й змінювати - наші дані, посилаючись при цьому на OpenStreetMap та її спільноту. Якщо ви - змінюєте наші дані чи створюєте на їх основі свої, ви повинні розповсюджувати - результати під такою ж Ліцензією. Повний <a href="http://opendatacommons.org/licenses/odbl/1.0/">чинний + наші дані, посилаючись при цьому на OpenStreetMap та спільноту. Якщо ви змінюєте + наші дані чи створюєте на їх основі свої, ви повинні розповсюджувати результати + під такою ж Ліцензією. Повний <a href="http://opendatacommons.org/licenses/odbl/1.0/">чинний текст</a> Ліцензії пояснює ваші права та обов’язки. intro_3_html: "Мапи в графічному вигляді, а також документація розповсюджуються на умовах <a href=\"http://creativecommons.org/licenses/by-sa/2.0/\">Ліцензії @@ -1043,13 +1049,13 @@ uk: more_1_html: Дізнайтеся більше про використання наших даних та про те, як посилатися на нас як на джерело, на <a href="http://osmfoundation.org/Licence">сторінці ліцензії OSMF</a> та у <a href="http://wiki.openstreetmap.org/wiki/Legal_FAQ">відповідях - спільноти щодо юридичних питань</a>. - more_2_html: Хоча дані OpenStreetMap є відкритими даними, ми не в змозі надавати - безкоштовний API для сторонніх розробників. Ознайомтесь із нашими <a href="http://wiki.openstreetmap.org/wiki/API_usage_policy">Правилами - використання API</a>, <a href="http://wiki.openstreetmap.org/wiki/Tile_usage_policy">Правилами - використання графічних мап</a> та <a href="http://wiki.openstreetmap.org/wiki/Nominatim#Usage_Policy">Правилами + спільноти щодо правових питань</a>. + more_2_html: Хоча дані OpenStreetMap є відкритими, ми не в змозі надавати безкоштовний + API для сторонніх розробників. Ознайомтесь із нашими <a href="https://operations.osmfoundation.org/policies/api/">Правилами + використання API</a>, <a href="https://operations.osmfoundation.org/policies/tiles/">Правилами + використання графічних мап</a> та <a href="https://operations.osmfoundation.org/policies/nominatim/">Правилами використання сервісу Nominatim</a>. - contributors_title_html: З нами співпрацюють + contributors_title_html: Наші учасники contributors_intro_html: 'Нашими учасниками є тисячі людей. Ми також включаємо дані від національних картографічних агенцій, які розповсюджуються на умовах відкритих ліцензій, серед них:' @@ -1081,8 +1087,8 @@ uk: дані Ordnance Survey © Crown copyright and database right 2012.' contributors_footer_1_html: Щоб отримати більш докладну інформацію про ці та інші джерела, що були використані для покращення мапи OpenStreetMap, будь - ласка, перегляньте сторінку <a href="http://wiki.openstreetmap.org/wiki/Contributors">Учасники</a> - у OpenStreetMap Вікі. + ласка, перегляньте сторінку <a href="http://wiki.openstreetmap.org/wiki/Contributors">Учасники</a> + OpenStreetMap Вікі. contributors_footer_2_html: |2- Включення даних до OpenStreetMap не означає, що постачальник цих даних якимось чином підтримує OpenStreetMap, надає @@ -1162,7 +1168,7 @@ uk: add_a_note: instructions_html: |- Просто натисніть <a class='icon note'></a> або подібну піктограму на мапі. - В результаті на на мапі з’явиться маркер, який ви зможете переміщувати шляхом перетягування. Додайте ваше повідомлення, а потім натисніть кнопку Зберегти, і інші учасники матимуть змогу з цим розбіратись. + У результаті, на мапі з'явиться маркер, який Ви зможете перетягувати на мапі. Додайте Ваше повідомлення, а потім натисніть кнопку Зберегти, і інші учасники матимуть змогу з цим розібратись. other_concerns: title: Інші проблеми explanation_html: |- @@ -1207,9 +1213,9 @@ uk: description: Перегляньте вікі щоб отримати докладу OSM документацію. about_page: next: Далі - copyright_html: <span>©</span>Учасники OpenStreetMap<br> - used_by: '%{name} надає картографічні дані для сотень веб-сайтів, мобільних застосунків - та апаратних пристроїв' + copyright_html: <span>©</span>Учасники<br>OpenStreetMap + used_by: '%{name} надає картографічні дані для тисяч веб-сайтів, мобільних застосунків + та різних пристроїв' lede_text: OpenStreetMap створений спільнотою маперів, які вносять і підтримують дані про дороги, стежки, кав’ярні, вокзали і багато чого іншого по всьому світу. local_knowledge_title: Знання місцевості @@ -1223,13 +1229,16 @@ uk: <a href='http://blogs.openstreetmap.org/'>блоги спільноти</a> і сайт <a href='http://www.osmfoundation.org/'>фундації OSM</a>. open_data_title: Відкриті дані open_data_html: |- - OpenStreetMap — це <i>відкриті дані</i>: ви можете вільно використовувати їх для будь-яких цілей до тих пір, поки ви згадуєте OpenStreetMap і його учасників. Якщо ви змінюєте дані або на основі даних будуєте власні певним чином, ви можете розповсюджувати результат лише під тією ж самою ліцензією. Дивіться сторінку <a href='%{copyright_path}'>авторські права і - ліцензії</a>, щоб отримати докладну інформацію. + OpenStreetMap — це <i>відкриті дані</i>: Ви можете вільно використовувати їх для будь-яких цілей доти, поки посилаєтесь OpenStreetMap та його учасників. Якщо Ви змінюєте дані або на основі даних будуєте певним чином власні, Ви можете розповсюджувати результат лише під тією самою ліцензією. Дивіться сторінку <a href='%{copyright_path}'>«Авторські права і + ліцензії»</a>, щоб отримати докладну інформацію. legal_title: Правова інформація - legal_html: "Цей сайт та багато інших пов’язаних сервісів формально керуються + legal_html: "Цей сайт та багато інших повʼязаних сервісів формально керуються \n<a href='http://osmfoundation.org/'>OpenStreetMap Foundation</a> (OSMF) \nвід - імені спільноти.\n<br> \nБудь ласка, <a href='http://osmfoundation.org/Contact'>зв'яжіться - з OSMF</a>, \nякщо у Вас є запитання чи проблеми щодо ліцензування, авторських + імені спільноти. Використання усіх сервісів, підконтрольних OSMF, здійснюється + на основі <a href=\"http://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy\">\nПравил + щодо прийнятного використання</a> та нашій <a href=\"http://wiki.osmfoundation.org/wiki/Privacy_Policy\">Політиці + конфіденційності</a>.\n<br> \nБудь ласка, <a href='http://osmfoundation.org/Contact'>звʼяжіться + з OSMF</a>, \nякщо у Вас є питання чи проблеми щодо ліцензування, авторських прав та інших юридичних питань." partners_title: Партнери notifier: @@ -1430,15 +1439,15 @@ uk: remote_failed: Редагування не вдалося — переконайтеся, що JOSM або Merkaartor завантажений та втулок дистанційного керування увімкнений. edit: - not_public: Ви не зробили свої правки загальнодоступними. + not_public: Ви не зробили свої редагування загальнодоступними. not_public_description: 'Ви не можете більше анонімно редагувати мапу. Ви можете зробити ваші редагування загальнодоступними тут: %{user_page}.' user_page_link: сторінка користувача anon_edits_link_text: З’ясувати в чому справа. flash_player_required: Для використання редактора Potlatch потрібний Flash-плеєр. Ви можете <a href="http://www.adobe.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash">завантажити - Flash-плеєр з Adobe.com</a>. Існують й <a href="http://wiki.openstreetmap.org/wiki/Uk:Editing">інші - можливості</a> для правки в OpenStreetMap. + Flash-плеєр з Adobe.com</a>. Існують також <a href="http://wiki.openstreetmap.org/wiki/Uk:Editing">інші + можливості</a> редагування даних в OpenStreetMap. potlatch_unsaved_changes: Є незбережені зміни. (Для збереження в Potlatch зніміть виділення з колії або точки, якщо редагуєте «вживу», або натисніть кнопку «зберегти», якщо ви в режимі відкладеного збереження.) @@ -1465,15 +1474,17 @@ uk: table: entry: motorway: Автомагістраль + main_road: Головна дорога trunk: Шосе primary: Головна дорога secondary: Другорядна дорога unclassified: Дорога без класифікації - unsurfaced: Дорога без покриття track: Путівець - byway: Стежка bridleway: Дорога для їзди кіньми cycleway: Вело-доріжка + cycleway_national: Державна велосипедна доріжка + cycleway_regional: Регіональна велосипедна доріжка + cycleway_local: Місцева велосипедна доріжка footway: Пішохідна доріжка rail: Залізниця subway: Лінія метро @@ -1495,7 +1506,6 @@ uk: golf: Поле для гольфу park: Парк resident: Жила зона - tourist: Визначні пам'ятки common: - Суспільні землі - левада @@ -1525,9 +1535,11 @@ uk: tunnel: Тунель (пунктиром) bridge: Міст (жирна лінія) private: Приватний доступ - permissive: Дозвільний доступ destination: Цільовий доступ construction: Будівництво дороги + bicycle_shop: Веломагазин + bicycle_parking: Стоянка для велосипедів + toilets: Туалети richtext_area: edit: Правити preview: Попередній перегляд @@ -1559,15 +1571,15 @@ uk: trace_uploaded: Ваш GPX-файл був надісланий та чекає додання у базу даних. Це зазвичай відбувається протягом півгодини, після чого вам буде надіслано листа. edit: - title: Правка треку %{name} - heading: Правка треку %{name} + title: Редагування треку %{name} + heading: Редагування треку %{name} filename: 'Ім’я файлу:' download: завантажити uploaded_at: 'Завантажено на сервер:' points: 'Кількість точок:' start_coord: 'Координати початку:' map: мапа - edit: правка + edit: редагувати owner: 'Власник:' description: 'Опис:' tags: 'Теґи:' @@ -1589,6 +1601,15 @@ uk: upload_trace: Надіслати GPS-трек на сервер see_all_traces: Показати всі треки see_your_traces: Показати всі ваші треки + traces_waiting: '{{PLURAL|one=%{count} ваш трек очікує завантаження на сервер. + Будь ласка, дочекайтесь завершення завантаження перед завантаженням на сервер + інших треків, що дозволить іншим користувачам також надіслати свої треки.|few=%{count} + ваших треки очікують завантаження на сервер. Будь ласка, дочекайтесь завершення + їх завантаження перед завантаженням на сервер інших треків, що дозволить іншим + користувачам також надіслати свої треки.|%{count} ваших треків очікують завантаження + на сервер. Будь ласка, дочекайтесь завершення їх завантаження перед завантаженням + на сервер інших треків, що дозволить іншим користувачам також надіслати свої + треки.' trace_optionals: tags: 'Теґи:' view: @@ -1682,6 +1703,7 @@ uk: allow_read_gpx: читати ваші приватні GPS-треки. allow_write_gpx: передавати GPS-треки на сервер. allow_write_notes: змінювати нотатки. + grant_access: Надання Доступу oauthorize_success: title: Дозволено запит на авторизацію allowed: Ви надали програмі %{app_name} доступ до вашого облікового запису. @@ -1794,8 +1816,14 @@ uk: windowslive: title: Увійти з Windows Live alt: Увійти з облікового запису Windows Live + github: + title: Увійти через GitHub + alt: Вхід через обліковий запис GitHub + wikipedia: + title: Увійти через Вікіпедію + alt: Вхід через обліковий запис у Вікіпедії yahoo: - title: Увійти через Yahoo + title: Увійти з облікового запису Yahoo alt: Увійти з Yahoo OpenID wordpress: title: Увійти через Wordpress @@ -1829,11 +1857,11 @@ uk: title: Реєстрація no_auto_account_create: На жаль, ми в даний час не в змозі створити для вас обліковий запис автоматично. - contact_webmaster: Будь-ласка, зверніться до <a href="mailto:webmaster@openstreetmap.org">вебмастера</a> + contact_webmaster: Будь-ласка, зверніться до <a href="%{webmaster}">вебмастера</a> з проханням створити подібний обліковий запис. Ми спробуємо це зробити і відповісти настільки швидко, наскільки це можливо. about: - header: Вільний і доступний для редагування + header: Вільні й доступні для редагування html: |- <p>На відміну від інших мап, мапи OpenStreetMap повністю створюються такими ж людьми як ви, вони доступні всім для виправлення, оновлення, завантаження і використання.</p> @@ -1842,12 +1870,12 @@ uk: Співпраці</a>. email address: 'Адреса ел. пошти:' confirm email address: 'Підтвердити адресу ел. пошти:' - not displayed publicly: Не показується загальнодоступно (див. <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" - title="Вікі про політику конфіденційності, включаючи розділ про адреси електронної - пошти"> політику конфіденційності</a>) - display name: 'Показувати ім’я:' - display name description: Ваше загальнодоступне ім’я. Ви можете змінити його - потім у ваших налаштуваннях. + not displayed publicly: Не показується загальнодоступно, див. нашу <a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy" + title="OSMF privacy policy including section on email addresses">політику + конфіденційності</a>, щоб отримати більше інформації + display name: 'Прізвисько:' + display name description: Ваше ім’я користувача, доступне всім. Ви можете змінити + його потім у ваших налаштуваннях. external auth: 'Автентифікація через:' password: 'Пароль:' confirm password: 'Повторіть пароль:' @@ -1856,11 +1884,6 @@ uk: auth no password: Під час використання автентифікації через третю сторону пароль не потрібен, але для деяких додаткових інструментів або серверів він все ще знадобиться. - auth association: "<p>Ваш ID, ще не пов’язаний з вашим обліковим записом OpenStreetMap.</p>\n<ul>\n<li>Якщо - ви новачок в OpenStreetMap, будь ласка, створіть новий обліковий запис, використовуючи - форму нижче.</li>\n<li>\n Якщо у вас вже є обліковий запис, ви можете увійти - до нього, \n використовуючи ваші ім'я користувача і пароль, і асоціювати - свій обліковий запис з вашим ID в налаштуваннях.\n</li>\n</ul>" continue: Зареєструватись terms accepted: Дякуємо за прийняття нових умов співпраці! terms declined: Нам шкода, що ви вирішили не приймати нові Умови Співпраці. @@ -1891,6 +1914,7 @@ uk: heading: Користувача %{user} не існує. body: Вибачте, немає користувача з ім'ям %{user}. Будь ласка, перевірте правильність його введення. Можливо, ви перейшли з помилкового посилання. + deleted: вилучено view: my diary: Мій щоденник new diary entry: новий запис @@ -1943,16 +1967,16 @@ uk: revoke: administrator: Відкликати права адміністратора moderator: Відкликати права модератора - block_history: отримані блокування - moderator_history: створені блокування + block_history: Активні блокування + moderator_history: Створені блокування comments: Коментарі - create_block: блокувати користувача - activate_user: активувати цього користувача - deactivate_user: де-активувати цього користувача - confirm_user: підтвердити користувача - hide_user: приховати цього користувача - unhide_user: показати цього користувача - delete_user: вилучити цього користувача + create_block: Заблокувати цього учасника + activate_user: Активувати цього учасника + deactivate_user: Де-активувати цього учасника + confirm_user: Підтвердити цього учасника + hide_user: Приховати цього учасника + unhide_user: Показати цього учасника + delete_user: Вилучити цього учасника confirm: Підтвердити friends_changesets: набори змін друзів friends_diaries: записи в щоденниках друзів @@ -1963,7 +1987,7 @@ uk: nearby mapper: Користувач поруч з вами friend: Друг account: - title: Правка облікового запису + title: Редагувати обліковий запис my settings: Мої налаштування current email address: 'Поточна адреса електронної пошти:' new email address: 'Нова адреса електронної пошти:' @@ -1976,13 +2000,13 @@ uk: link text: що це? public editing: heading: 'Загальнодоступне редагування:' - enabled: Включено. Можна редагувати. Правки не анонімні. + enabled: Увімкнено. Не анонім і можна редагувати дані. enabled link: http://wiki.openstreetmap.org/wiki/Uk:Anonymous_edits enabled link text: що це? - disabled: Відключений і не може вносити правки, всі попередні зміни анонімні. + disabled: Вимкнено й не можна редагувати дані, всі попередні редагування анонімні. disabled link text: чому я не можу вносити зміни? public editing note: - heading: Загальнодоступна правка + heading: Загальнодоступне редагування text: На даний момент ваші редагування анонімні й ніхто не може відправляти вам повідомлення або бачити ваше місце розташування. Щоб показати, що ви редагували і дозволити людям зв'язатися з вами через веб-сайт, натисніть @@ -2008,6 +2032,8 @@ uk: gravatar: gravatar: Використовувати Gravatar link text: Що це? + disabled: Gravatar вимкнено. + enabled: Показ Вашого Gravatar'а увімкнено. new image: Додати зображення keep image: Залишити поточне зображення delete image: Видалити поточне зображення @@ -2020,7 +2046,7 @@ uk: update home location on click: Оновлювати моє місце розташування, коли я клацаю на мапу? save changes button: Зберегти зміни - make edits public button: Зробити всі мої правки загальнодоступними + make edits public button: Зробити всі мої редагування загальнодоступними return to profile: Повернення до профілю flash update success confirm needed: Інформацію про користувача успішно оновлено. Перевірте свою електронну пошту, щоб підтвердити вашу нову адресу. @@ -2039,13 +2065,11 @@ uk: reconfirm_html: Якщо ви бажаєте, аби ми повторно надіслали ще одне підтвердження електронною поштою, то <a href="%{reconfirm}">натисніть тут</a>. confirm_resend: - success: Користувача успішно зареєстровано. Перевірте вашу електрону пошту (%{email}) - на наявність листа з підтвердженням, натисніть на посилання в ньому та можете - негайно починати створювати мапу.<br /><br /> Зауважте, що ви не зможете увійти, - доки ви не підтвердите адресу вашої електронної пошти. <br /><br />Якщо ви - користуєтесь системою анти-спаму, що надсилає запити на підтвердження, внесіть - до «білого» списку адресу webmaster@openstreetmap.org, так як ми не в змозі - відповідати на такі запити. + success: Ми надіслали на вашу електрону пошту (%{email}) листа для підтвердження + реєстрації, після того як ви натиснете на посиланні в ньому, ви отримаєте + можливість вносити зміни до мапи.<br /><br />Якщо ви користуєтесь системою + анти-спаму, що надсилає запити на підтвердження, внесіть до «білого» списку + адресу %{sender}, так як ми не в змозі відповідати на такі запити. failure: Користувача %{name} не знайдено. confirm_email: heading: Підтвердить зміну адреси електронної пошти @@ -2058,8 +2082,8 @@ uk: set_home: flash success: Ваше місце розташування збережено go_public: - flash success: Всі ваші правки тепер є загальнодоступними, і ви тепер можете - правити. + flash success: Усі Ваші редагування тепер є загальнодоступними, і Ви тепер можете + редагувати. make_friend: heading: Додати %{user} як друга? button: Додати як друга @@ -2098,6 +2122,13 @@ uk: no_authorization_code: Немає коду авторизації unknown_signature_algorithm: Невідомий алгоритм підпису invalid_scope: Недійсна область + auth_association: + heading: Ваш ID ще не пов'язаний із обліковим записом OpenStreetMap. + option_1: Якщо ви вперше в OpenStreetMap – створіть новий обліковий запис, використовуючи + форму нижче. + option_2: Якщо у вас вже є обліковий запис, то ви можете увійти до нього, використовуючи + своє імʼя користувача і пароль, а потім звʼязати обліковий запис із вашим + ID користувача у налаштуваннях. user_role: filter: not_an_administrator: Тільки адміністратори можуть керувати ролями користувачів, @@ -2202,7 +2233,7 @@ uk: next: Наступна → previous: ← Попередня helper: - time_future: Закінчується в %{time}. + time_future: До закінчення %{time}. until_login: Активне до тих пір, доки користувач не увійде в систему. time_past: Закінчилось %{time} тому. blocks_on: @@ -2216,7 +2247,7 @@ uk: show: title: '%{block_on}, заблокував: %{block_by}' heading: '%{block_on}, заблокував: %{block_by}' - time_future: Закінчується %{time} + time_future: До закінчення %{time} time_past: Закінчилось %{time} назад created: Створено ago: '%{time} тому' @@ -2283,10 +2314,14 @@ uk: center_marker: Центрувати мапу на маркері paste_html: HTML-код для вбудування у сайт view_larger_map: Переглянути більшу мапу + only_standard_layer: Тільки стандартний шар може бути експортований у вигляді + зображення + embed: + report_problem: Повідомити про проблему key: title: Умовні знаки tooltip: Умовні знаки - tooltip_disabled: Легенда мапи доступна лише для Стандартного шару + tooltip_disabled: Легенда мапи недоступна для цього шару map: zoom: in: Збільшити @@ -2298,12 +2333,12 @@ uk: standard: Стандартний cycle_map: ВелоМапа transport_map: Мапа Транспорту - mapquest: MapQuest Open hot: Humanitarian‎ layers: header: Шари мапи notes: Нотатки data: Дані + gps: Публічні GPS-треки overlays: Увімкніть наступні шари для пошуку і усунення помилок на мапі title: Шари copyright: © <a href='%{copyright_url}'>Учасники OpenStreetMap</a> @@ -2349,13 +2384,52 @@ uk: mapquest_car: Машина (MapQuest) mapquest_foot: Пішки (MapQuest) osrm_car: Машина (OSRM) + mapzen_bicycle: Велосипед (Mapzen) + mapzen_car: Автомобіль (Mapzen) + mapzen_foot: Пішки (Mapzen) directions: Маршрут distance: Відстань errors: no_route: Не вдалося знайти маршрут між цими двома точками. no_place: Вибачте - не можу знайти це місце. instructions: + continue_without_exit: Рухайтесь далі по %{name} + slight_right_without_exit: Плавно поверніть праворуч на %{name} + offramp_right_without_exit: Прямуйте праворуч на зʼїзд в напрямку %{name} + onramp_right_without_exit: Поверніть праворуч на зʼїзд в напрямку %{name} + endofroad_right_without_exit: В кінці дороги поверніть праворуч на %{name} + merge_right_without_exit: Приєднайтесь до руху праворуч на %{name} + fork_right_without_exit: На розвилці поверніть праворуч на %{name} + turn_right_without_exit: Поверніть праворуч на %{name} + sharp_right_without_exit: Різко поверніть праворуч на %{name} + uturn_without_exit: Розверніться на %{name} + sharp_left_without_exit: Різко поверніть ліворуч на %{name} + turn_left_without_exit: Поверніть ліворуч на %{name} + offramp_left_without_exit: Прямуйте ліворуч на зʼїзд в напрямку %{name} + onramp_left_without_exit: Поверніть ліворуч на зʼїзд в напрямку %{name} + endofroad_left_without_exit: В кінці дороги поверніть ліворуч на %{name} + merge_left_without_exit: Приєднайтесь до руху ліворуч на %{name} + fork_left_without_exit: На розвилці поверніть ліворуч на %{name} + slight_left_without_exit: Плавно поверніть ліворуч на %{name} + via_point_without_exit: (проміжний пункт) + follow_without_exit: Рухайтесь далі по %{name} + roundabout_without_exit: На кільці поверніть на %{name} + leave_roundabout_without_exit: Виїзд з кільця - %{name} + stay_roundabout_without_exit: Залишайтесь на кільці - %{name} + start_without_exit: Почніть з %{name} + destination_without_exit: Ви на місці + against_oneway_without_exit: Рухайтесь проти одностороннього руху по %{name} + end_oneway_without_exit: Кінець одностороннього руху по %{name} roundabout_with_exit: На кільці поверніть на %{exit} виїзд на %{name} + turn_left_with_exit: На перехресті з круговим рухом поверніть ліворуч на %{name} + slight_left_with_exit: На перехресті з круговим рухом плавно поверніть ліворуч + на %{name} + turn_right_with_exit: На перехресті з круговим рухом поверніть праворуч на + %{name} + slight_right_with_exit: На перехресті з круговим рухом плавно поверніть праворуч + на %{name} + continue_with_exit: На перехресті з круговим рухом продовжуйте рух прямо на + %{name} unnamed: без імені courtesy: Маршрут наданий %{link} time: Час diff --git a/config/locales/vi.yml b/config/locales/vi.yml index 2a3bd44b6..b9281dc07 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -3,6 +3,7 @@ # Export driver: phpyaml # Author: Dinhxuanduyet # Author: KhangND +# Author: Macofe # Author: Minh Nguyen # Author: Nemo bis # Author: Ninomax @@ -164,6 +165,7 @@ vi: way: lối relation: quan hệ changeset: bộ thay đổi + note: ghi chú timeout: sorry: Rất tiếc, đã chờ lấy dữ liệu của %{type} có ID %{id} quá lâu. type: @@ -171,6 +173,7 @@ vi: way: lối relation: quan hệ changeset: bộ thay đổi + note: ghi chú redacted: redaction: Dãy ẩn %{id} message_html: Không thể xem phiên bản %{version} của %{type} này vì nó đã bị @@ -255,6 +258,7 @@ vi: diary_entry: new: title: Mục Nhật ký Mới + publish_button: Xuất bản list: title: Các Nhật ký Cá nhân title_friends: Các nhật ký của bạn bè @@ -623,7 +627,7 @@ vi: orchard: Vườn Cây quarry: Mỏ Đá railway: Đường sắt - recreation_ground: Sân chÆ¡i + recreation_ground: Sân Giải trí reservoir: Bể nước reservoir_watershed: LÆ°u vá»±c Hồ Nhân tạo residential: Khu vá»±c Nhà ở @@ -1019,10 +1023,9 @@ vi: Hãy đọc thêm chi tiết về việc sá»­ dụng dữ liệu của chúng tôi và cách ghi công chúng tôi tại <a href="http://osmfoundation.org/Licence">OSMF Licence page</a> and the community <a <a href="http://wiki.openstreetmap.org/wiki/Legal_FAQ?uselang=vi">Hỏi đáp Pháp lý</a>. more_2_html: Tuy OpenStreetMap là một nguồn dữ liệu mở, nhÆ°ng chúng tôi không - thể cung cấp API miễn phí cho những nhà phát triển bên thứ ba truy cập bản - đồ. Hãy xem <a href="http://wiki.openstreetmap.org/wiki/API_usage_policy?uselang=vi">Quy - định Sá»­ dụng API</a>, <a href="http://wiki.openstreetmap.org/wiki/Tile_usage_policy?uselang=vi">Quy - định Sá»­ dụng Mảnh Bản đồ</a>, và <a href="http://wiki.openstreetmap.org/wiki/Nominatim#Usage_Policy">Quy + thể cung cấp API miễn phí cho bên thứ ba truy cập bản đồ. Hãy xem <a href="https://operations.osmfoundation.org/policies/api/">Quy + định Sá»­ dụng API</a>, <a href="https://operations.osmfoundation.org/policies/tiles/">Quy + định Sá»­ dụng Mảnh Bản đồ</a>, và <a href="https://operations.osmfoundation.org/policies/nominatim/">Quy định Sá»­ dụng Nominatim</a>. contributors_title_html: Những người đóng góp vào đây contributors_intro_html: 'Dá»± án này nhờ công sức đóng góp của hàng ngàn cá nhân @@ -1070,9 +1073,9 @@ vi: trình <i>takedown</i></a> hoặc nộp đơn trá»±c tiếp tại <a href="http://dmca.openstreetmap.org/">trang khiếu nại trá»±c tuyến</a> của chúng tôi. trademarks_title_html: <span id="trademarks"></span>Nhãn hiệu - trademarks_1_html: OpenStreetMap và biểu trÆ°ng kính lúp đều là nhãn hiệu đăng - ký của Quỹ OpenStreetMap. Nếu bạn có thắc mắc về cách sá»­ dụng các nhãn hiệu - này, xin vui lòng liên lạc với <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group?uselang=vi">Nhóm + trademarks_1_html: OpenStreetMap, biểu trÆ°ng kính lúp, và State of the Map đều + là nhãn hiệu đăng ký của Quỹ OpenStreetMap. Nếu bạn có thắc mắc về cách sá»­ + dụng các nhãn hiệu này, xin vui lòng liên lạc với <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group?uselang=vi">Nhóm làm việc Giấy phép</a>. welcome_page: title: Hoan nghênh! @@ -1122,7 +1125,7 @@ vi: Chỉ việc <a href='%{map_url}'>mở bản đồ</a> và bấm hình ghi chú <span class='icon note'></span> để thả đinh ghim trên bản đồ. Kéo ghim vào đúng vị trí, ghi lời miêu tả vấn đề, và bấm “Thêm Ghi chú”. Cộng đồng sẽ cố gắng sá»­a theo ý của bạn. fixthemap: - title: Báo cáo lỗi / Sá»­a bản đồ + title: Báo lỗi / Sá»­a bản đồ how_to_help: title: Cách giúp đỡ join_the_community: @@ -1178,7 +1181,7 @@ vi: about_page: next: Tiếp copyright_html: <span>©</span>những người<br>đóng góp vào<br>OpenStreetMap - used_by: '%{name} là nguồn dữ liệu bản đồ của hàng trăm trang Web, ứng dụng di + used_by: '%{name} là nguồn dữ liệu bản đồ của hàng ngàn trang Web, ứng dụng di động, và thiết bị phần cứng' lede_text: OpenStreetMap được xây dá»±ng bởi cộng đồng những người đóng góp và bảo quản dữ liệu về đường sá, tòa nhà, quán cà phê, nhà ga, và đủ mọi thứ ở khắp @@ -1202,15 +1205,15 @@ vi: Bản quyền và Giấy phép</a>.' legal_title: Pháp luật legal_html: |- - Trang Web này và nhiều dịch vụ có liên quan được hoạt động chính thức bởi <a href='http://osmfoundation.org/?uselang=vi'>Quỹ OpenStreetMap</a> (OSMF) thay mặt cho cộng đồng. + Trang Web này và nhiều dịch vụ có liên quan được hoạt động chính thức bởi <a href='http://osmfoundation.org/?uselang=vi'>Quỹ OpenStreetMap</a> (OSMF) thay mặt cho cộng đồng. Việc sá»­ dụng các dịch vụ do OSMF hoạt động phải tuân theo <a href="https://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy?uselang=vi">các Quy định Sá»­ dụng Hợp lý</a> và <a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy?uselang=vi">Quy định về Quyền Riêng tÆ°</a> của chúng tôi. <br> Xin vui lòng <a href='http://osmfoundation.org/Contact?uselang=vi'>liên lạc với OSMF</a> nếu bạn có thắc mắc về giấy phép, bản quyền, hoặc vấn đề pháp luật khác. partners_title: Nhà bảo trợ notifier: diary_comment_notification: - subject: '[OpenStreetMap] %{user} đã bình luận về mục nhật ký của bạn' + subject: '[OpenStreetMap] %{user} đã bình luận về mục nhật ký' hi: Chào %{to_user}, - header: '%{from_user} đã bình luận về mục nhật ký gần đây của bạn tại OpenStreetMap + header: '%{from_user} đã bình luận về mục nhật ký gần đây tại OpenStreetMap với tiêu đề %{subject}:' footer: Bạn cÅ©ng có thể đọc bình luận tại %{readurl}, bình luận tại %{commenturl}, hoặc trả lời tại %{replyurl} @@ -1306,6 +1309,7 @@ vi: chú gần %{place}.' details: Xem chi tiết về ghi chú tại %{url}. changeset_comment_notification: + hi: Chào %{to_user}, greeting: Chào bạn, commented: subject_own: '[OpenStreetMap] %{commenter} đã bình luận về một bộ thay đổi @@ -1319,6 +1323,8 @@ vi: partial_changeset_with_comment: với lời bình luận “%{changeset_comment}” partial_changeset_without_comment: không có lời bình luận details: Xem chi tiết về bộ thay đổi tại %{url}. + unsubscribe: Để ngừng nhận các thông báo về bộ thay đổi này, mở %{url} và bấm + “Không theo dõi”. message: inbox: title: Hộp thÆ° @@ -1433,15 +1439,17 @@ vi: table: entry: motorway: Đường cao tốc + main_road: Đại lộ trunk: Xa lộ primary: Đường chính secondary: Đường lớn unclassified: Đường không phân loại - unsurfaced: Đường không lát track: Đường mòn - byway: Đường mòn đa mốt bridleway: Đường cưỡi ngá»±a cycleway: Đường xe đạp + cycleway_national: Quốc lộ xe đạp + cycleway_regional: Xa lộ xe đạp + cycleway_local: Đường xe đạp địa phÆ°Æ¡ng footway: Đường đi bộ rail: Đường sắt subway: Đường ngầm @@ -1463,7 +1471,6 @@ vi: golf: Sân golf park: Công viên resident: Khu vá»±c nhà ở - tourist: NÆ¡i du lịch common: - Đất công - bãi cỏ @@ -1493,9 +1500,11 @@ vi: tunnel: Đường đứt nét = đường hầm bridge: Đường rắn = cầu private: Đường riêng - permissive: Đường cho phép destination: Chỉ giao thông địa phÆ°Æ¡ng construction: Đường đang xây + bicycle_shop: Tiệm xe đạp + bicycle_parking: Chỗ đậu xe đạp + toilets: Vệ sinh richtext_area: edit: Sá»­a đổi preview: Xem trước @@ -1624,7 +1633,8 @@ vi: georss: title: Tuyến đường GPS OpenStreetMap description: - description_with_count: Tập tin GPX của %{user} có %{count} địa điểm + description_with_count: + other: Tập tin GPX của %{user} có %{count} địa điểm description_without_count: Tập tin GPX của %{user} application: require_cookies: @@ -1652,6 +1662,7 @@ vi: allow_read_gpx: truy cập các tuyến đường GPS bí mật của bạn. allow_write_gpx: tải lên tuyến đường GPS. allow_write_notes: thay đổi ghi chú. + grant_access: Cấp phép Truy cập oauthorize_success: title: Yêu cầu cho phép được chấp nhận allowed: Bạn đã cho phép ứng dụng %{app_name} truy cập tài khoản của bạn. @@ -1763,6 +1774,12 @@ vi: windowslive: title: Đăng nhập qua Windows Live alt: Đăng nhập dùng tài khoản Windows Live + github: + title: Đăng nhập qua GitHub + alt: Đăng nhập dùng tài khoản GitHub + wikipedia: + title: Đăng nhập qua Wikipedia + alt: Đăng nhập qua Tài khoản Wikipedia yahoo: title: Đăng nhập qua Yahoo! alt: Đăng nhập dùng OpenID của Yahoo! @@ -1798,7 +1815,7 @@ vi: title: Mở tài khoản no_auto_account_create: Rất tiếc, chúng ta hiện không có khả năng tạo ra tài khoản tá»± động cho bạn. - contact_webmaster: Xin hãy liên lạc với <a href="mailto:webmaster@openstreetmap.org">webmaster</a> + contact_webmaster: Xin hãy liên lạc với <a href="%{webmaster}">webmaster</a> để xin họ tạo ra tài khoản - chúng tôi sẽ cố gắng thỏa mãn yêu cầu nhanh lẹ. about: header: Tá»± do sá»­ dụng và sá»­a đổi @@ -1809,9 +1826,10 @@ vi: Điều kiện Đóng góp</a>. email address: 'Địa chỉ ThÆ° điện tá»­:' confirm email address: 'Xác nhận Địa chỉ ThÆ° điện tá»­:' - not displayed publicly: Không được hiển thị công khai (xem <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy?uselang=vi" - title="Quy định quyền riêng tÆ° wiki, có đoạn nói về địa chỉ thÆ° điện tá»­">quy - định quyền riêng tÆ°</a>) + not displayed publicly: Địa chỉ thÆ° điện tá»­ của bạn không được hiển thị công + khai (xem thêm chi tiết trong <a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy?uselang=vi" + title="Quy định quyền riêng tÆ° OSMF, có đoạn nói về địa chỉ thÆ° điện tá»­">quy + định quyền riêng tÆ°</a> của chúng tôi) display name: 'Tên hiển thị:' display name description: Tên người dùng của bạn được hiển thị công khai. Bạn có thể thay đổi tên này về sau trong tùy chọn. @@ -1821,14 +1839,6 @@ vi: use external auth: Hoặc đăng nhập qua dịch vụ bên thứ ba auth no password: Nếu xác minh qua dịch vụ bên thứ ba, bạn không cần nhập mật khẩu, nhÆ°ng một số công cụ hoặc máy chủ khác có thể vẫn yêu cầu mật khẩu. - auth association: |- - <p>ID của bạn chÆ°a được liên kết với một tài khoản OpenStreetMap.</p> - <ul> - <li>Nếu bạn mới đến OpenStreetMap, xin vui lòng tạo tài khoản mới dùng biểu mẫu bên dưới.</li> - <li> - Nếu bạn đã có tài khoản, đăng nhập dùng tên người dùng và mật khẩu của bạn, rồi liên kết tài khoản với ID của bạn trong trang tùy chọn. - </li> - </ul> continue: Mở tài khoản terms accepted: Cám Æ¡n bạn đã chấp nhận các điều khoản đóng góp mới! terms declined: Chúng tôi rất tiếc rằng bạn đã quyết định không chấp nhận các @@ -1863,6 +1873,7 @@ vi: heading: Người dùng %{user} không tồn tại body: Rất tiếc, không có người dùng với tên %{user}. Xin hãy kiểm tra chính tả, hoặc có lẽ bạn đã theo một liên kết sai. + deleted: đã xóa view: my diary: Nhật ký của Tôi new diary entry: mục nhật ký mới @@ -1914,16 +1925,16 @@ vi: revoke: administrator: Rút quyền quản lý viên moderator: Rút quyền điều hành viên - block_history: tác vụ cấm người này - moderator_history: tác vụ cấm bởi người này + block_history: Tác vụ Cấm Người Này + moderator_history: Tác vụ Cấm bởi Người Này comments: Bình luận - create_block: cấm người dùng này - activate_user: kích hoạt tài khoản này - deactivate_user: vô hiệu hóa tài khoản này - confirm_user: xác nhận người dùng này - hide_user: ẩn tài khoản này - unhide_user: hiện tài khoản này - delete_user: xóa tài khoản này + create_block: Cấm Người dùng Này + activate_user: Kích hoạt Tài khoản Này + deactivate_user: Vô hiệu hóa Tài khoản Này + confirm_user: Xác nhận Người dùng Này + hide_user: Ẩn Tài khoản Này + unhide_user: Hiện Tài khoản Này + delete_user: Xóa Tài khoản Này confirm: Xác nhận friends_changesets: bộ thay đổi của bạn bè friends_diaries: mục nhật ký của bạn bè @@ -1976,6 +1987,8 @@ vi: gravatar: Sá»­ dụng Gravatar link: http://wiki.openstreetmap.org/wiki/Gravatar?uselang=vi link text: đây là gì? + disabled: Hình Gravatar của bạn đã bị tắt. + enabled: Hình Gravatar của bạn đã bị kích hoạt. new image: Thêm hình keep image: Giữ hình hiện dùng delete image: Xóa hình hiện dùng @@ -2008,8 +2021,8 @@ vi: confirm_resend: success: Chúng tôi đã gá»­i thÆ° xác nhận đến %{email}; ngay khi xác nhận tài khoản, bạn sẽ có thể vẽ bản đồ.<br /><br />Nếu hộp thÆ° của bạn gá»­i thÆ° yêu cầu xác - nhận để chống thÆ° rác, xin chắc chắn thêm webmaster@openstreetmap.org vào - danh sách trắng, vì chúng tôi không thể trả lời những yêu cầu xác nhận này. + nhận để chống thÆ° rác, xin chắc chắn thêm %{sender} vào danh sách trắng, vì + chúng tôi không thể trả lời những yêu cầu xác nhận này. failure: Không tìm thấy người dùng %{name}. confirm_email: heading: Xác nhận thay đổi địa chỉ thÆ° điện tá»­ @@ -2066,6 +2079,13 @@ vi: no_authorization_code: Không có mã cho phép unknown_signature_algorithm: Thuật toán chữ ký không rõ invalid_scope: Phạm vi không hợp lệ + auth_association: + heading: ID của bạn chÆ°a được liên kết với một tài khoản OpenStreetMap. + option_1: Nếu bạn mới đến OpenStreetMap, xin vui lòng tạo tài khoản mới dùng + biểu mẫu bên dưới. + option_2: Nếu bạn đã có tài khoản, bạn có thể đăng nhập vào tài khoản của bạn + dùng tên người dùng và mật khẩu của bạn rồi liên kết tài khoản với ID của + bạn trong tùy chọn. user_role: filter: not_an_administrator: Chỉ các quản lý viên có quyền quản lý quyền của người @@ -2242,27 +2262,30 @@ vi: center_marker: Chuyển ghim vào giữa bản đồ paste_html: Dán HTML để nhúng vào trang Web view_larger_map: Xem Bản đồ Rộng hÆ¡n + only_standard_layer: Chỉ có thể xuất lớp chuẩn ra hình ảnh + embed: + report_problem: Báo vấn đề key: title: Chú giải Bản đồ tooltip: Chú giải Bản đồ - tooltip_disabled: Bảng Chú giải chỉ có sẵn cho lớp Chuẩn + tooltip_disabled: Bảng Chú giải không có sẵn cho lớp này map: zoom: in: Phóng to out: Thu nhỏ locate: - title: Nhảy tới Vị trí của Tôi + title: Bay tới Vị trí của Tôi popup: Bạn hiện đang ở cách đây {distance} {unit} base: standard: Chuẩn cycle_map: Bản đồ Xe đạp transport_map: Bản đồ Giao thông - mapquest: MapQuest Mở hot: Nhân đạo layers: header: Lớp Bản đồ notes: Ghi chú Bản đồ data: Dữ liệu Bản đồ + gps: Tuyến đường GPS Công khai overlays: Bật lớp phủ để gỡ lỗi trên bản đồ title: Lớp copyright: © <a href='%{copyright_url}'>những người đóng góp vào OpenStreetMap</a> @@ -2308,6 +2331,9 @@ vi: mapquest_car: Xe hÆ¡i (MapQuest) mapquest_foot: Đi bộ (MapQuest) osrm_car: Xe hÆ¡i (OSRM) + mapzen_bicycle: Xe đạp (Mapzen) + mapzen_car: Xe hÆ¡i (Mapzen) + mapzen_foot: Đi bộ (Mapzen) directions: Chỉ đường distance: Tầm xa errors: @@ -2316,11 +2342,21 @@ vi: instructions: continue_without_exit: Chạy tiếp trên %{name} slight_right_without_exit: Nghiêng về bên phải vào %{name} + offramp_right_without_exit: Đi vào lối ra bên phải vào %{name} + onramp_right_without_exit: Quẹo phải vào lối bên phải vào %{name} + endofroad_right_without_exit: Tới cuối đường quẹo phải vào %{name} + merge_right_without_exit: Nhập sang phải vào %{name} + fork_right_without_exit: Tới ngã ba quẹo phải vào %{name} turn_right_without_exit: Quẹo phải vào %{name} sharp_right_without_exit: Quẹo gắt bên phải vào %{name} uturn_without_exit: Quay trở lại vào %{name} sharp_left_without_exit: Quẹo gắt bên trái vào %{name} turn_left_without_exit: Quẹo trái vào %{name} + offramp_left_without_exit: Đi vào lối ra bên trái vào %{name} + onramp_left_without_exit: Quẹo phải vào lối bên trái vào %{name} + endofroad_left_without_exit: Tới cuối đường quẹo trái vào %{name} + merge_left_without_exit: Nhập sang trái vào %{name} + fork_left_without_exit: Tới ngã ba quẹo trái vào %{name} slight_left_without_exit: Nghiêng về bên trái vào %{name} via_point_without_exit: (địa điểm trên đường) follow_without_exit: Chạy theo %{name} @@ -2332,6 +2368,11 @@ vi: against_oneway_without_exit: Chạy ngược chiều trên %{name} end_oneway_without_exit: Kết thúc khúc một chiều trên %{name} roundabout_with_exit: Tại bùng binh, đi ra tại đường thứ %{exit} tức %{name} + turn_left_with_exit: Tới bùng binh quẹo trái vào %{name} + slight_left_with_exit: Tới bùng binh nghiêng về bên trái vào %{name} + turn_right_with_exit: Tới bùng binh quẹo phải vào %{name} + slight_right_with_exit: Tới bùng binh nghiêng về bên phải vào %{name} + continue_with_exit: Tới bùng binh đi thẳng vào %{name} unnamed: không tên courtesy: Chỉ đường do %{link} cung cấp time: Thời gian diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index 58243e8cc..3378c085b 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -18,6 +18,7 @@ # Author: NigelSoft # Author: PhiLiP # Author: Qiyue2001 +# Author: RyRubyy # Author: Shizhao # Author: StephDC # Author: Xiaomingyan @@ -185,6 +186,7 @@ zh-CN: way: 路径 relation: 关系 changeset: 修改集合 + note: 注释 timeout: sorry: 对不起,检索 id 为 %{id} 的 %{type} 的数据时间过长。 type: @@ -192,6 +194,7 @@ zh-CN: way: 路径 relation: 关系 changeset: 修改集合 + note: 注释 redacted: redaction: 编辑 %{id} message_html: 该 %{type} 版本 %{version} 无法显示,因为其已被编辑。详情请见%{redaction_link}。 @@ -271,6 +274,7 @@ zh-CN: diary_entry: new: title: 新日记文章 + publish_button: 发布 list: title: 用户日记 title_friends: 朋友的日记 @@ -303,7 +307,7 @@ zh-CN: save_button: 保存 no_such_entry: title: 没有这篇日记文章 - heading: 没有 ID 为:%{id} 的文章 + heading: 没有ID为 %{id} 的条目 body: 对不起,没有 id 为 %{id} 的日记文章或评论。请检查您的拼写,或是您可能点击了错误的链接。 diary_entry: posted_by: '%{link_user} 于 %{created} 以%{language_link}发表' @@ -336,7 +340,7 @@ zh-CN: description: 最近的 OpenStreetMap 用户日记文章 comments: has_commented_on: '%{display_name} 已评论以下日记文章' - post: 发表 + post: 帖子 when: 时间 comment: 评论 ago: '%{ago} 前' @@ -367,7 +371,7 @@ zh-CN: title: Geofabrik 下载 description: 定期更新的洲、 国家和特定城市的摘录 metro: - title: 大城市摘录 + title: 大都市摘录 description: 世界主要城市和周边地区的摘录 other: title: 其他来源 @@ -406,7 +410,7 @@ zh-CN: chair_lift: 登山吊椅 drag_lift: 上山牵引机 gondola: 索道 - station: 缆车站台 + station: 索道站 aeroway: aerodrome: 小型飞机场 apron: 停机坪 @@ -468,7 +472,7 @@ zh-CN: kindergarten: 幼儿园 library: 图书馆 market: 市场 - marketplace: 市场 + marketplace: 商场 monastery: 修道院 motorcycle_parking: 摩托车停放处 nightclub: 夜总会 @@ -754,7 +758,7 @@ zh-CN: isolated_dwelling: 独立的住宅 locality: 地区 moor: 荒野 - municipality: 自治市 + municipality: 直辖市 neighbourhood: 居住区 postcode: 邮政编码 region: 地区 @@ -1014,13 +1018,13 @@ zh-CN: 请在<a href="http://osmfoundation.org/Licence">OSMF许可协议页面</a>和<a href="http://wiki.openstreetmap.org/wiki/Legal_FAQ">法律常见问题</a>阅读更多关于使用我们的数据,以及如何表明我们是作者的信息。 - more_2_html: 尽管 OpenStreetMap 开放数据,但是我们无法为第三方开发人员提供免费的地图 API。详见我们的 <a href="http://wiki.openstreetmap.org/wiki/API_usage_policy">API使用政策</a>、<a - href="http://wiki.openstreetmap.org/wiki/Tile_usage_policy">图块使用政策</a>及<a - href="http://wiki.openstreetmap.org/wiki/Nominatim#Usage_Policy">名称服务使用政策</a>。 + more_2_html: 尽管 OpenStreetMap 开放数据,但是我们无法为第三方提供免费的地图 API。详见我们的 <a href="https://operations.osmfoundation.org/policies/api/">API使用政策</a>、<a + href="https://operations.osmfoundation.org/policies/tiles/">地图图块使用政策</a>及<a + href="https://operations.osmfoundation.org/policies/nominatim/">名称服务使用政策</a>。 contributors_title_html: 我们的贡献者 contributors_intro_html: 我们的数据来源于成千上万人的贡献。但我们也从国家测绘机构等处获取公共版权的数据,其中包括: contributors_at_html: <strong>奥地利</strong>:包含来自 <a href="http://data.wien.gv.at/">Stadt - Wien</a>(<a href="http://creativecommons.org/licenses/by/3.0/at/deed.de">CC + Wien</a>(<a href="http://creativecommons.org/licenses/by/3.0/at/deed.zh">CC BY</a>协议)、<a href="http://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm">Land Vorarlberg</a>及 Land Tirol (修订的 <a href="http://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/">CC-BY AT</a>协议)的数据。 @@ -1040,14 +1044,14 @@ zh-CN: contributors_gb_html: <strong>英国</strong>:包含来自 Ordnance 的调查数据,© Crown 版权所有及数据库权利,2010-12。 contributors_footer_1_html: |- 关于其进一步的细节,及其他被用来帮助提升 OpenStreetMap 的来源,详见 OpenStreetMap Wiki 的<a - href="http://wiki.openstreetmap.org/wiki/Contributors">贡献者页面</a>。 + href="http://wiki.openstreetmap.org/wiki/Zh-hans:Contributors">贡献者页面</a>。 contributors_footer_2_html: OpenStreetMap 纳入数据并不意味着原始数据提供者认可 OpenStreetMap、提供任何担保或担负任何法律责任。 infringement_title_html: 著作权侵犯 infringement_1_html: OSM 的贡献者会被提醒,绝不要在没有著作权人的明确许可时添加来自任何有著作权的来源的数据(如谷歌地图或印刷地图)。 infringement_2_html: 如果您认为版权的材料已被不恰当地添加的 OpenStreetMap 数据库或该网站,请参见我们的<a href="http://www.osmfoundation.org/wiki/License/Takedown_procedure">撤除程序</a>,或直接在我们的<a href="http://dmca.openstreetmap.org/">在线申报页面</a>上提出。 trademarks_title_html: <span id="trademarks"></span>商标 - trademarks_1_html: OpenStreetMap和放大镜标志是OpenStreetMap基金会的注册商标。如果您对使用这些标志有任何问题,请在<a + trademarks_1_html: OpenStreetMap、放大镜标志和地图状态是OpenStreetMap基金会的注册商标。如果您对使用这些标志有任何问题,请在<a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">授权工作组</a>提出您的问题。 welcome_page: title: 欢迎! @@ -1065,6 +1069,8 @@ zh-CN: tag_html: <strong>标签</strong>是关于节点或路径的简短数据,例如餐馆的名字或者道路的速度限制。 rules: title: 规则! + paragraph_1_html: OpenStreetMap很少有正式规则,但我们期待所有参与者能合作,并与社区沟通。如果您在考虑任何除手工编辑的活动,请阅读并遵守<a + href='http://wiki.openstreetmap.org/wiki/Import/Guidelines'>导入</a>和<a href='http://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct'>自动编辑</a>的指导。 questions: title: 还有疑问吗? paragraph_1_html: OpenStreetMap 有若干资源用于学习该项目,提问和回答问题,以及讨论与制作地图相关的话题并且撰写相关文档。<a @@ -1105,8 +1111,10 @@ zh-CN: description: 在 OSM 的问答网站提问或查找回答。 mailing_lists: title: 邮件列表 + description: 询问问题或在广泛或局部的邮件列表中讨论有趣事件 forums: title: 论坛 + description: 面向更喜欢电子公告栏样式界面的用户的问题和讨论。 irc: title: IRC description: 在很多不同的语言和在很多话题间交互聊天。 @@ -1120,7 +1128,7 @@ zh-CN: about_page: next: 下一页 copyright_html: <span>©</span>OpenStreetMap<br> 贡献者 - used_by: '%{name} 驱动了数以百计的网站,移动应用,以及硬件设备的地图数据。' + used_by: '%{name} 驱动了数以千计的网站,移动应用,以及硬件设备的地图数据。' lede_text: OpenStreetMap 是一个由地图制作爱好者组成的社区。这些爱好者提供并维护世界各地关于道路、小道、咖啡馆、铁路车站等各种各样的数据。 local_knowledge_title: 本地知识库 local_knowledge_html: OpenStreetMap 强调使用本地知识。贡献者们使用航空图像、GPS 设备与传统的地区地图来确保 OSM @@ -1135,15 +1143,16 @@ zh-CN: OpenStreetMap。如果您改变或者使用这些数据,您必须按照相同的版权协议发布结果。详情请参见<a href='%{copyright_path}'>版权协议</a>。 legal_title: 法律 legal_html: |- - 此网站和很多其他相关服务已由<a href='http://osmfoundation.org/'>OpenStreetMap基金会</a>(OSMF)正式代表社群运营。 + 此网站和很多其他相关服务已由<a href='http://osmfoundation.org/'>OpenStreetMap基金会</a>(OSMF)正式代表社群运营。使用所有由OSMF运营的服务均需符合我们的<a href="http://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy"> + 可接受使用方针</a>和我们的<a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy">隐私政策</a> <br> 如果您有许可协议、版权或其他法律问题,请<a href='http://osmfoundation.org/Contact'>联络OSMF</a>。 partners_title: 合作伙伴 notifier: diary_comment_notification: - subject: '[OpenStreetMap] %{user} 在您的日记项目留下了评论' + subject: '[OpenStreetMap] %{user} 在日记项目留下了评论' hi: 您好,%{to_user}: - header: '%{from_user} 评论了在您最近的主题为 %{subject} 的 OpenStreetMap 日记文章:' + header: '%{from_user} 评论了主题为 %{subject} 的 OpenStreetMap 日记文章:' footer: 您也可以通过%{readurl}来读取评论,并且在%{commenturl}来撰写评论或者通过%{replyurl}回复 message_notification: subject_header: '[OpenStreetMap] %{subject}' @@ -1216,6 +1225,7 @@ zh-CN: commented_note: '%{commenter} 重新激活了您感兴趣的一个地图笔记。该笔记位于 %{place} 附近。' details: 更多关于笔记的详细信息可以在%{url}找到。 changeset_comment_notification: + hi: 您好,%{to_user}: greeting: 您好, commented: subject_own: '[OpenStreetMap] %{commenter}在您的一个修改集合中做出了评论' @@ -1225,6 +1235,7 @@ zh-CN: partial_changeset_with_comment: 带评论“%{changeset_comment}” partial_changeset_without_comment: 没有评论 details: 更多关于修改集合的详细信息可以在 %{url} 找到。 + unsubscribe: 要从该修改集合中退订,请访问%{url},并点击“退订”。 message: inbox: title: 收件箱 @@ -1330,15 +1341,17 @@ zh-CN: table: entry: motorway: 高速公路 + main_road: 主干道 trunk: 主干道路 primary: 一级道路 secondary: 二级道路 unclassified: 无等级道路 - unsurfaced: 无铺面道路 track: 小路 - byway: 小路 bridleway: 马道 cycleway: 自行车道 + cycleway_national: 国家自行车道 + cycleway_regional: 地区自行车道 + cycleway_local: 本地自行车道 footway: 步道 rail: 铁路 subway: 地铁 @@ -1360,7 +1373,6 @@ zh-CN: golf: 高尔夫球场 park: 公园 resident: 住宅区 - tourist: 旅游景点 common: - 公地 - 草地 @@ -1390,9 +1402,11 @@ zh-CN: tunnel: 双虚线 = 隧道 bridge: 双实线 = æ¡¥ private: 私人 - permissive: 允许访问 destination: 目标访问 construction: 在建道路 + bicycle_shop: 自行车店 + bicycle_parking: 自行车停车场 + toilets: 洗手间 richtext_area: edit: 编辑 preview: 预览 @@ -1470,7 +1484,7 @@ zh-CN: owner: 所有人: description: 说明: tags: 标签: - none: 空 + none: 无 edit_track: 编辑这条轨迹 delete_track: 删除这条轨迹 trace_not_found: 未找到轨迹! @@ -1501,7 +1515,7 @@ zh-CN: public_traces_from: 来自 %{user} 的公开 GPS 轨迹 description: 浏览最近上传的 GPS 轨迹 tagged_with: 以 %{tags} 标记 - empty_html: 尚无轨迹。<a href='%{upload_link}'>上传新轨迹</a>或在<a href='http://wiki.openstreetmap.org/wiki/Beginners_Guide_1.2'>wiki页面</a>上了解 + empty_html: 尚无轨迹。<a href='%{upload_link}'>上传新轨迹</a>或在<a href='http://wiki.openstreetmap.org/wiki/Zh-hans:Beginners_Guide_1.2'>wiki页面</a>上了解 GPS 轨迹。 delete: scheduled_for_deletion: 计划删除的轨迹 @@ -1539,6 +1553,7 @@ zh-CN: allow_read_gpx: 读取您的私人 GPS 轨迹。 allow_write_gpx: 上传 GPS 轨迹。 allow_write_notes: 修改笔记。 + grant_access: 授予访问权 oauthorize_success: title: 已允许授权申请 allowed: 您已授权 %{app_name} 应用访问您的账户。 @@ -1618,7 +1633,7 @@ zh-CN: remember: 记住我 lost password link: 忘记密码? login_button: 登录 - register now: 现在就注册 + register now: 立即注册 with username: 已经有 OpenStreetMap 账户?请使用您的用户名和密码登录: with external: 或者使用第三方服务登录: new to osm: 第一次来到 OpenStreetMap? @@ -1642,6 +1657,12 @@ zh-CN: windowslive: title: 使用Windows Live登录 alt: 使用一个Windows Live账户登录 + github: + title: 使用GitHub登录 + alt: 通过GitHub账户登录 + wikipedia: + title: 使用维基百科登录 + alt: 使用维基百科账户登录 yahoo: title: 使用Yahoo登录 alt: 使用Yahoo OpenID登录 @@ -1674,8 +1695,7 @@ zh-CN: new: title: 注册 no_auto_account_create: 很遗憾,我们目前无法为您自动创建一个帐户。 - contact_webmaster: 请联系<a href="mailto:webmaster@openstreetmap.org">网站管理员</a>来安排创建一个账户 - - 我们将尽快尝试处理您的请求。 + contact_webmaster: 请联系<a href="%{webmaster}">网站管理员</a>来安排创建一个账户 - 我们将尽快尝试处理您的请求。 about: header: 自由且可编辑 html: |- @@ -1684,8 +1704,8 @@ zh-CN: license_agreement: 当您确认您的帐户时,您需要同意<a href="http://www.osmfoundation.org/wiki/License/Contributor_Terms">贡献者条款</a>。 email address: 电子邮件地址: confirm email address: 确认电子邮件地址: - not displayed publicly: 不公开显示(参阅<a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" - title="wiki privacy policy including section on email addresses">隐私政策</a>) + not displayed publicly: 您的地址未公开显示,请参见我们的<a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy" + title="OSMF隐私政策,包含部分电子邮件地址">隐私政策</a>以获取更多信息 display name: 显示名称: display name description: 您公开显示的用户名。您可以稍后在首选项中进行修改。 external auth: 第三方身份验证: @@ -1693,15 +1713,6 @@ zh-CN: confirm password: 确认密码: use external auth: 或者使用第三方服务登录 auth no password: 通过第三方身份验证,您不再需要密码,但一些额外工具或服务器可能仍然需要。 - auth association: |- - <p>您的ID目前尚未与一个OpenStreetMap账户相关联。</p> - <ul> - <li>如果您刚刚接触OpenStreetMap,请使用下方的表格创建一个账户。</li> - <li> - 如果您已经拥有了一个账户,您可以使用您的用户名和密码 - 登陆您的账户,之后可以在用户设置中将账户与您的ID关联。 - </li> - </ul> continue: 注册 terms accepted: 感谢您接受新的贡献条款! terms declined: 我们很遗憾您已决定不接受新的贡献者条款。有关详细信息,请参阅<a href="%{url}">æ­¤ wiki 页面</a>. @@ -1727,6 +1738,7 @@ zh-CN: title: 没有此用户 heading: 用户 %{user} 不存在 body: 对不起,没有名为 %{user} 的用户。请检查您的拼写,或者可能是点击了错误的链接。 + deleted: 已删除 view: my diary: 我的日记 new diary entry: 新日记文章 @@ -1748,7 +1760,7 @@ zh-CN: remove as friend: 删除朋友 add as friend: 添加朋友 mapper since: 绘图始于: - ago: (%{time_in_words_ago} 前) + ago: (%{time_in_words_ago} 前) ct status: 贡献者条款: ct undecided: 未决定 ct declined: 已拒绝 @@ -1777,12 +1789,12 @@ zh-CN: revoke: administrator: 撤销管理员权限 moderator: 撤销管理员权限 - block_history: 接受的封禁 + block_history: 激活的封禁 moderator_history: 执行封禁者 comments: 评论 - create_block: 阻止此用户 - activate_user: 启用该用户 - deactivate_user: 停用该用户 + create_block: 封禁此用户 + activate_user: 启用此用户 + deactivate_user: 停用此用户 confirm_user: 确认此用户 hide_user: 隐藏此用户 unhide_user: 取消隐藏此用户 @@ -1833,6 +1845,8 @@ zh-CN: gravatar: 使用 Gravatar link: http://wiki.openstreetmap.org/wiki/Gravatar link text: 这是什么? + disabled: Gravatar已被禁用。 + enabled: 您的Gravatar显示已启用。 new image: 添加图像 keep image: 保持当前图像 delete image: 删除当前图像 @@ -1859,8 +1873,7 @@ zh-CN: unknown token: 确认码已经过期或不存在。 reconfirm_html: 如果您需要我们重新发送确认邮件,<a href="%{reconfirm}">请点击这里</a>。 confirm_resend: - success: 我们已经发送一封新的确认电子邮件到 %{email},只要您确认您的帐户,您就可以开始制图了。<br /><br />如果您使用的反垃圾邮件系统发送确认请求,那么请确保您的白名单中有 - webmaster@openstreetmap.org,因为我们无法回复任何确认请求。 + success: 我们已经发送一封新的确认电子邮件到 %{email},只要您确认您的帐户,您就可以开始制图了。<br /><br />如果您使用的反垃圾邮件系统发送确认请求,那么请确保您的白名单中有%{sender},因为我们无法回复任何确认请求。 failure: 用户 %{name} 未找到。 confirm_email: heading: 确认电子邮件地址修改 @@ -1876,7 +1889,7 @@ zh-CN: make_friend: heading: 添加 %{user} 为朋友? button: 添加为朋友 - success: '%{name} 现在是您的好友!' + success: '%{name} 现在已成为您的好友!' failed: 对不起,未能添加 %{name} 为朋友。 already_a_friend: 您已经和 %{name} 是朋友了。 remove_friend: @@ -1916,6 +1929,10 @@ zh-CN: no_authorization_code: 没有授权码 unknown_signature_algorithm: 未知签名算法 invalid_scope: 无效范围 + auth_association: + heading: 您的ID尚未与OpenStreetMap账户相关联。 + option_1: 如果您是OpenStreetMap的新手,请使用下面的表单创建一个新账户。 + option_2: 如果您已拥有一个账户,您可以使用您的用户名和密码登录您的账户,然后在您的用户设置中将账户与您的ID相关联。 user_role: filter: not_an_administrator: 只有管理员可以执行用户角色管理,而您不是管理员。 @@ -2080,10 +2097,13 @@ zh-CN: center_marker: 以标记作为地图中心 paste_html: 粘贴HTML以嵌入网站 view_larger_map: 查看更大的地图 + only_standard_layer: 只有标准图层可被导出为图片 + embed: + report_problem: 报告问题 key: title: 图例 tooltip: 图例 - tooltip_disabled: 图例仅适用于标准图层 + tooltip_disabled: 图例不可用于此图层 map: zoom: in: 放大 @@ -2095,12 +2115,12 @@ zh-CN: standard: 标准 cycle_map: 自行车地图 transport_map: 交通地图 - mapquest: MapQuest Open hot: Humanitarian layers: header: 地图图层 notes: 地图笔记 data: 地图数据 + gps: 公开 GPS 痕迹 overlays: 启用解决地图问题的覆盖层 title: 图层 copyright: © <a href='%{copyright_url}'>OpenStreetMap 贡献者</a> @@ -2141,6 +2161,9 @@ zh-CN: mapquest_car: 汽车(MapQuest) mapquest_foot: 步行(MapQuest) osrm_car: 汽车(OSRM) + mapzen_bicycle: 自行车(Mapzen) + mapzen_car: 汽车(Mapzen) + mapzen_foot: 脚(Mapzen) directions: 方向 distance: 距离 errors: @@ -2149,11 +2172,21 @@ zh-CN: instructions: continue_without_exit: 在%{name}上直走 slight_right_without_exit: 稍向右转至%{name} + offramp_right_without_exit: 在右侧上坡前往%{name} + onramp_right_without_exit: 右转上坡至%{name} + endofroad_right_without_exit: 在道路尽头右转至%{name} + merge_right_without_exit: 向右并线至%{name} + fork_right_without_exit: 在交叉口右转至%{name} turn_right_without_exit: 右转至%{name} sharp_right_without_exit: 向右急转至%{name} uturn_without_exit: 沿着%{name}掉头 sharp_left_without_exit: 向左急转至%{name} turn_left_without_exit: 左转至%{name} + offramp_left_without_exit: 在左侧上坡前往%{name} + onramp_left_without_exit: 左转上坡至%{name} + endofroad_left_without_exit: 在道路尽头左转至%{name} + merge_left_without_exit: 向左并线至%{name} + fork_left_without_exit: 在交叉口左转至%{name} slight_left_without_exit: 稍向左转至%{name} via_point_without_exit: (通过点) follow_without_exit: 关注%{name} @@ -2165,6 +2198,11 @@ zh-CN: against_oneway_without_exit: '%{name}单向行驶' end_oneway_without_exit: '%{name}单向终点' roundabout_with_exit: 在环形交叉的%{exit}号出口离开前往%{name} + turn_left_with_exit: 在环形交叉左转至%{name} + slight_left_with_exit: 在环形交叉稍向左转至%{name} + turn_right_with_exit: 在环形交叉右转至%{name} + slight_right_with_exit: 在环形交叉稍向右转至%{name} + continue_with_exit: 在环形交叉继续直行至%{name} unnamed: 未命名道路 courtesy: 方向经由%{link} time: 时间 diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index 7837908d0..29495539c 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -7,14 +7,18 @@ # Author: Foothsu # Author: Hlaw # Author: Impersonator 1 +# Author: Jiazheng0609 # Author: Justincheng12345 +# Author: Kly # Author: LNDDYL +# Author: Learnerq # Author: Liuxinyu970226 # Author: Mikepanhu # Author: Mmyangfl # Author: Mywood # Author: Orinx # Author: Pesder +# Author: Reke # Author: Ruila # Author: Shangkuanlc # Author: Simon Shek @@ -60,7 +64,7 @@ zh-TW: tracetag: 軌跡標籤 user: 使用者 user_preference: 使用者偏好設定 - user_token: 使用者密鑰 + user_token: 使用者權杖 way: 路徑 way_node: 路徑節點 way_tag: 路徑標籤 @@ -78,7 +82,7 @@ zh-TW: friend: 好友 trace: user: 使用者 - visible: 可見性 + visible: 可見的 name: 名稱 size: 大小 latitude: 緯度 @@ -129,7 +133,7 @@ zh-TW: part_of: 屬於: download_xml: 下載 XML view_history: 檢視歷史 - view_details: 檢視詳細資訊 + view_details: 檢視詳細資料 location: 位置: changeset: title: 變更集:%{id} @@ -180,6 +184,7 @@ zh-TW: way: 路徑 relation: 關聯 changeset: 變更集 + note: 註釋 timeout: sorry: 抱歉,索取 id 為 %{id} 的 %{type} 資料,花費時間過長。 type: @@ -187,6 +192,7 @@ zh-TW: way: 路徑 relation: 關聯 changeset: 變更集 + note: 註釋 redacted: redaction: 編修程序 %{id} message_html: æ­¤ %{type} 的版本 %{version} 已被編修,因此未能顯示。詳細資訊請參閱 %{redaction_link}。 @@ -235,7 +241,7 @@ zh-TW: changeset: anonymous: 匿名 no_edits: (沒有編輯) - view_changeset_details: 檢視變更集詳細資訊 + view_changeset_details: 檢視變更集詳細資料 changesets: id: ID saved_at: 已儲存於 @@ -266,6 +272,7 @@ zh-TW: diary_entry: new: title: 新日記項目 + publish_button: 發佈 list: title: 日記 title_friends: 好友的日記 @@ -331,7 +338,7 @@ zh-TW: description: OpenStreetMap 使用者最近的日記項目 comments: has_commented_on: '%{display_name} 在以下的日記項目發表了評論' - post: 發表 + post: 貼文 when: 於 comment: 評論 ago: '%{ago} 前' @@ -399,7 +406,7 @@ zh-TW: chair_lift: 登山吊椅 drag_lift: 上山牽引梯 gondola: 空中纜車 - station: 航空站 + station: 空中纜車車站 aeroway: aerodrome: 機場 apron: 停機坪 @@ -551,21 +558,21 @@ zh-TW: motorway_junction: 高速公路交匯處 motorway_link: 高速公路連接路 path: 小徑 - pedestrian: 行人專用道路 + pedestrian: 人行道 platform: 車站月台 - primary: 主要道路 + primary: 一級道路 primary_link: 主要道路 proposed: 計畫道路 raceway: 賽道 residential: 住宅區道路 rest_area: 休息區 road: 道路 - secondary: 次級道路 + secondary: 二級道路 secondary_link: 次級道路連接路 service: 服務道路 services: 高速公路休息區 speed_camera: 測速照相機 - steps: 梯級 + steps: 階梯 street_lamp: 路燈 tertiary: 三級道路 tertiary_link: 三級道路連接路 @@ -984,8 +991,8 @@ zh-TW: intro_2_html: |- 您可以自由地複製、散布、傳輸及修改我們的資料,前提是您須標明作者為 OpenStreetMap 及其貢獻者。若您在我們的資料上作修改或據之衍生其他資料 ,則只可依相同授權條款散佈有關成果。授權的<a href="http://opendatacommons.org/licenses/odbl/1.0/">法律原文</a>詳述您的權責。 - intro_3_html: 我們地圖影像塊的製圖法以及我們的文件,以<a href="http://creativecommons.org/licenses/by-sa/2.0/">共享創意-署名-相同方式共享 - 2.0</a>(CC BY-SA) 條款授權。 + intro_3_html: 我們地圖影像塊的製圖法以及我們的文件,以<a href="http://creativecommons.org/licenses/by-sa/2.0/deed.zh_TW">創用CC + 姓名標示-相同方式分享 (CC BY-SA) 2.0版</a>條款授權。 credit_title_html: 如何標明作者是 OpenStreetMap credit_1_html: 我們要求您以“© OpenStreetMap 貢獻者”標明作者。 credit_2_html: 您亦須清晰註明,有關資料可透過開放資料庫授權條款取得。若使用我們的影像塊,則須註明其製圖法是按 CC-BY-SA 授權。您可以透過連結至<a @@ -1001,15 +1008,16 @@ zh-TW: more_title_html: 尋找更多 more_1_html: |- 在<a - href="http://wiki.openstreetmap.org/wiki/Legal_FAQ">常見法律問題</a>中,可閱讀更多關於使用我們的資料,以及如何標明我們是作者的資料。 - more_2_html: 雖然 OpenStreetMap 是開放資料,但我們無法為第三方開發人員提供免費的地圖 API。詳見我們的<a href="http://wiki.openstreetmap.org/wiki/API_usage_policy">API - 使用政策</a>、<a href="http://wiki.openstreetmap.org/wiki/Tile_usage_policy">地圖影像塊使用政策</a>及<a - href="http://wiki.openstreetmap.org/wiki/Nominatim#Usage_Policy">Nominatim + href="http://osmfoundation.org/Licence">OSMF 授權條款頁面</a>與<a + href="http://wiki.openstreetmap.org/wiki/Zh-hant:Legal_FAQ">法律上的常見問題</a>中,可閱讀更多關於使用我們的資料,以及如何標明我們是作者的資料。 + more_2_html: 雖然 OpenStreetMap 是開放資料,但我們無法為第三方提供免費的地圖 API。詳見我們的<a href="https://operations.osmfoundation.org/policies/api/">API + 使用政策</a>、<a href="https://operations.osmfoundation.org/policies/tiles/">地圖影像塊使用政策</a>及<a + href="https://operations.osmfoundation.org/policies/nominatim/">Nominatim 服務使用政策</a>。 contributors_title_html: 我們的貢獻者 contributors_intro_html: 我們的貢獻者為成千上萬的人。我們也收納了從國家測繪機構及其他來源等取得的開放版權資料,其中包括: contributors_at_html: <strong>奧地利</strong>:包含來自 <a href="http://data.wien.gv.at/">Stadt - Wien</a> (<a href="http://creativecommons.org/licenses/by/3.0/at/deed.de">CC + Wien</a> (<a href="http://creativecommons.org/licenses/by/3.0/at/deed.zh_TW">CC BY</a>授權) 、<a href="http://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm">Land Vorarlberg</a>及 Land Tirol (修訂的<a href="http://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/">CC-BY AT</a>授權) 的資料。 @@ -1032,6 +1040,10 @@ zh-TW: contributors_nz_html: |- <strong>紐西蘭</strong>: 包含來自 Land Information New Zealand (Crown Copyright reserved) 的資料。 + contributors_si_html: |- + <strong>斯洛維尼亞</strong>:包含來自<a href="http://www.gu.gov.si/en/">Surveying and Mapping Authority</a>和 + <a href="http://www.mkgp.gov.si/en/">Ministry of Agriculture, Forestry and Food</a> + (斯洛維尼亞公開資訊). contributors_za_html: |- <strong>南非</strong>: 包含來自 <a href="http://www.ngi.gov.za/">Chief Directorate: @@ -1052,6 +1064,9 @@ zh-TW: infringement_2_html: 如果你認為有版權的材料被不恰當地加入到 OpenStreetMap 資料庫或此網站,請請參考我們的<a href="http://www.osmfoundation.org/wiki/License/Takedown_procedure">撤除程序</a>,或直接在我們的<a href="http://dmca.openstreetmap.org/">網上申報頁面</a>提出。 trademarks_title_html: <span id="trademarks"></span>商標 + trademarks_1_html: 開放街圖、放大鏡logo和開放街圖研討會是開放街圖基金會的註冊商標。如果你對於使用這些商標有疑問的話,請將你的問題寄到<a + href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">授權條款工作小組 + (Licence Working Group)</a>。 welcome_page: title: 歡迎! introduction_html: 歡迎來到 OpenStreetMap,自由和可編輯的世界地圖。您目前已經登入,可以開始繪製地圖。這裡有一份您須知道最重要事項的快速指南。 @@ -1071,6 +1086,8 @@ zh-TW: tag_html: <strong>標籤</strong>是關於節點或路徑的簡要資料,例如餐廳的名字或道路的速度限制。 rules: title: 規則! + paragraph_1_html: 開放街圖沒有多少正式規則,除了所有參與者都得與社群合作和溝通。如果你有想過用人工以外的方式參與的話,請先熟讀和遵循<a + href='http://wiki.openstreetmap.org/wiki/Import/Guidelines'>匯入</a>以及<a href='http://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct'>自動化編輯</a>守則。 questions: title: 有任何問題嗎? paragraph_1_html: OpenStreetMap 有一些資源,可用於學習本專案、提出和回答問題,以及討論和紀錄與製作地圖相關的話題。 <a @@ -1112,8 +1129,10 @@ zh-TW: description: 在 OSM 的問答網站提出問題或搜尋答案。 mailing_lists: title: 郵件論壇 + description: 在不同主題或是地區的郵件論壇問問題或是討論有趣的事物。 forums: title: 論壇 + description: 給習慣論壇型式的地方問問題和討論 irc: title: IRC description: 使用各種不同語言在各種主題聊天互動。 @@ -1127,7 +1146,7 @@ zh-TW: about_page: next: 下一頁 copyright_html: <span>©</span>OpenStreetMap<br>貢獻者 - used_by: '%{name} 為數以百計的網站、行動 app 與硬體裝置,提供地圖資料' + used_by: '%{name} 為數以千計的網站、app 與硬體裝置提供地圖資料' lede_text: OpenStreetMap 是由製圖者社群所建立,他們提供及不斷更新包括有關世界各地的道路、路徑、咖啡館、火車站等等的資料。 local_knowledge_title: 地方知識 local_knowledge_html: |- @@ -1144,14 +1163,15 @@ zh-TW: 及其貢獻者。若您在我們的資料上作修改或以之透過某些方式衍生其他資料,則只可依相同授權條款散佈有關成果。詳情請參閱<a href='%{copyright_path}'>版權及授權條款頁面</a>。 legal_title: 法律資訊 legal_html: "本站以及許多相關的服務正式由<a href='http://osmfoundation.org/'>OpenStreetMap 基金會</a> - (OSMF) 代表社群所營運。\n<br> \n若您有任何授權、版權或其他法律諮詢與問題,請<a href='http://osmfoundation.org/Contact'>聯絡 - OSMF</a>。" + (OSMF) 代表社群所營運。所有使用的OSMF運行服務皆符合我們的<a href=\"http://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy\">可接受使用政策</a>和<a + href=\"http://wiki.osmfoundation.org/wiki/Privacy_Policy\">隱私政策</a>\n<br> \n若您有任何授權、版權或其他法律諮詢與問題,請<a + href='http://osmfoundation.org/Contact'>聯絡 OSMF</a>。" partners_title: 合作夥伴 notifier: diary_comment_notification: - subject: '[OpenStreetMap] %{user} 已評論於您的日記項目' + subject: '[OpenStreetMap] %{user} 已評論日記項目' hi: '%{to_user} 您好,' - header: '%{from_user} 在您最近主旨為 %{subject} 的 OpenStreetMap 日記項目留下評論:' + header: '%{from_user} 評論主旨為 %{subject} 的 OpenStreetMap 日記項目:' footer: 您也可以在 %{readurl} 閱讀評論,並且在 %{commenturl} 留下評論,或在 %{replyurl} 回覆 message_notification: hi: '%{to_user} 您好,' @@ -1222,8 +1242,9 @@ zh-TW: subject_other: '[OpenStreetMap] %{commenter} 再次開啟你感興趣的註記。' your_note: '%{commenter} 已經再次開啟你其中一筆接近 %{place} 的地圖註記。' commented_note: '%{commenter} 重新開啟了一個您曾評論的地圖註記。該註記位於 %{place} 附近。' - details: 關於註記的更多詳細訊息可在 %{url} 找到。 + details: 關於註記的更多詳細資料可在 %{url} 找到。 changeset_comment_notification: + hi: 嗨 %{to_user}, greeting: 您好, commented: subject_own: '[OpenStreetMap] %{commenter}% 在您的變更集評論' @@ -1233,6 +1254,7 @@ zh-TW: partial_changeset_with_comment: 評論 "%{changeset_comment}" partial_changeset_without_comment: 沒有評論 details: 關於變更集的詳情可在 %{url} 找到。 + unsubscribe: 要取消訂閱此變更集的更新內容,請訪問%{url}並點擊「取消訂閱」。 message: inbox: title: 收件匣 @@ -1342,15 +1364,17 @@ zh-TW: table: entry: motorway: 高速公路 + main_road: 主要道路 trunk: 主要幹路 - primary: 主要道路 - secondary: 次要道路 + primary: 一級道路 + secondary: 二級道路 unclassified: 未分級道路 - unsurfaced: 未鋪設道路 track: 行車小徑 - byway: 小路 bridleway: 馬道 cycleway: 自行車道 + cycleway_national: 國家自行車道 + cycleway_regional: 區域自行車道 + cycleway_local: 本地自行車道 footway: 步道 rail: 鐵路 subway: 地鐵 @@ -1372,7 +1396,6 @@ zh-TW: golf: 高爾夫球場 park: 公園 resident: 住宅區 - tourist: 旅遊景點 common: - 共有地 - 草地 @@ -1402,9 +1425,11 @@ zh-TW: tunnel: 虛線邊框 = 隧道 bridge: 黑線邊框 = 橋樑 private: 私人進出 - permissive: 許可進出 destination: 目的地進出 construction: 道路施工中 + bicycle_shop: 自行車店 + bicycle_parking: 自行車停車位 + toilets: 洗手間 richtext_area: edit: 編輯 preview: 預覽 @@ -1493,7 +1518,7 @@ zh-TW: count_points: '%{count} 個點' ago: '%{time_in_words_ago} 之前' more: 更多 - trace_details: 檢視軌跡詳細資訊 + trace_details: 檢視軌跡詳細資料 view_map: 檢視地圖 edit: 編輯 edit_map: 編輯地圖 @@ -1510,7 +1535,7 @@ zh-TW: public_traces_from: '%{user} 的公開 GPS 軌跡' description: 瀏覽最近的 GPS 軌跡上傳 tagged_with: 有如下標籤:%{tags} - empty_html: 還沒有軌跡。<a href='%{upload_link}'>上傳新的軌跡</a>或在 <a href='http://wiki.openstreetmap.org/wiki/Beginners_Guide_1.2'>wiki + empty_html: 還沒有軌跡。<a href='%{upload_link}'>上傳新的軌跡</a>或在 <a href='http://wiki.openstreetmap.org/wiki/Zh-hant:Beginners_Guide_1.2'>wiki 頁面</a>上瞭解更多有關 GPS 軌跡的資訊。 delete: scheduled_for_deletion: 軌跡已被排程刪除 @@ -1548,6 +1573,7 @@ zh-TW: allow_read_gpx: 讀取您的私人 GPS 軌跡。 allow_write_gpx: 上傳 GPS 軌跡。 allow_write_notes: 修改註記。 + grant_access: 授權存取 oauthorize_success: title: 允許授權請求 allowed: 您已授權應用程式 %{app_name} 使用您的帳號。 @@ -1555,7 +1581,7 @@ zh-TW: oauthorize_failure: title: 授權請求失敗 denied: 您已拒絕應用程式 %{app_name} 使用您的帳號。 - invalid: 授權密鑰無效。 + invalid: 授權權杖無效。 revoke: flash: 您已經撤銷 %{application} 的授權密鑰。 oauth_clients: @@ -1568,8 +1594,8 @@ zh-TW: show: title: '%{app_name} 的 OAuth 詳細資料' key: 消費者金鑰: - secret: 消費者密鑰: - url: 請求密鑰 URL: + secret: 消費者祕密金鑰: + url: 要求權杖 URL: access_url: 存取記號 URL: authorize_url: 授權 URL: support_notice: 我們支援 HMAC-SHA1 (建議) 和 RSA-SHA1 署名。 @@ -1651,6 +1677,12 @@ zh-TW: windowslive: title: 使用 Windows Live 登入 alt: 使用 Windows Live 帳號登入 + github: + title: 使用 GitHub 登入 + alt: 使用 GitHub 帳號登入 + wikipedia: + title: 以維基百科登入 + alt: 以維基百科帳號登入 yahoo: title: 使用 Yahoo 登入 alt: 使用 Yahoo OpenID 登入 @@ -1683,7 +1715,7 @@ zh-TW: new: title: 註冊 no_auto_account_create: 很不幸的我們現在無法自動為您建立帳號。 - contact_webmaster: 請聯絡 <a href="mailto:webmaster@openstreetmap.org">網站管理者</a>安排要建立的帳號,我們會儘快嘗試並處理這個要求。 + contact_webmaster: 請聯絡<a href="%{webmaster}">網站管理者</a>來建立的帳號,我們會儘快嘗試並處理這項要求。 about: header: 自由及可編輯 html: |- @@ -1693,8 +1725,8 @@ zh-TW: 。 email address: 電子郵件地址: confirm email address: 確認電子郵件地址: - not displayed publicly: 不要公開顯示 (請看 <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" - title="wiki privacy policy including section on email addresses">隱私權政策</a>) + not displayed publicly: 您的地址未公開顯示,請看我們的<a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy" + title="包含部份電郵地址的OSMF隱私權政策">隱私權政策</a>來獲得更多訊息 display name: 顯示名稱: display name description: 您公開顯示的使用者名稱。您可以稍後在偏好設定中改變它。 external auth: 第三方身份認證 @@ -1702,14 +1734,6 @@ zh-TW: confirm password: 確認密碼: use external auth: 或者使用第三方服務登入 auth no password: 使用第三方認証無須填寫密碼,但部份額外工具或伺服器可能仍需要使用密碼。 - auth association: |- - <p>您的 ID 尚未連結至 OpenStreetMap 帳號。</p> - <ul> - <li>若您是 OpenStreetMap 的新使用者,請使用以下表單建立新帳號。</li> - <li> - 若您已有帳號,您可以使用您的使用者名稱及密碼登入您的帳號,然後於您的使用者設定中連結您的帳號至 ID。 - </li> - </ul> continue: 註冊 terms accepted: 感謝您接受新的貢獻條款! terms declined: 我們很遺憾你已決定不接受新的貢獻者條款。有關詳細資訊,請參閱<a href="%{url}">æ­¤ wiki 頁面</a>。 @@ -1732,6 +1756,7 @@ zh-TW: title: 沒有這個使用者 heading: 使用者 %{user} 不存在 body: 抱歉,沒有名為 %{user} 的使用者。請檢查您的拼字,或者可能是您按到錯誤的連結。 + deleted: 已刪除 view: my diary: 我的日記 new diary entry: 新增日記項目 @@ -1782,16 +1807,16 @@ zh-TW: revoke: administrator: 撤銷行政員權限 moderator: 撤銷管理者權限 - block_history: 接受封鎖 + block_history: 被封鎖 moderator_history: 給予封鎖 comments: 評論 - create_block: 封鎖這個使用者 - activate_user: 開啟這個使用者 - deactivate_user: 停用這個使用者 - confirm_user: 確認這個使用者 - hide_user: 隱藏這個使用者 - unhide_user: 取消隱藏這個使用者 - delete_user: 刪除這個使用者 + create_block: 封鎖這位使用者 + activate_user: 解除這位使用者的封鎖狀態 + deactivate_user: 使用者停權 + confirm_user: 確認這位使用者 + hide_user: 隱藏這位使用者 + unhide_user: 取消隱藏這位使用者 + delete_user: 刪除這位使用者 confirm: 確認 friends_changesets: 好友的變更集 friends_diaries: 好友的日記項目 @@ -1838,6 +1863,8 @@ zh-TW: gravatar: gravatar: 使用 Gravatar link text: 這是什麼? + disabled: Gravatar已停用。 + enabled: 您的Gravatar顯示功能已啟用。 new image: 加入圖片 keep image: 保持目前的圖片 delete image: 移除目前的圖片 @@ -1864,8 +1891,8 @@ zh-TW: unknown token: 確認碼已經過期或不存在。 reconfirm_html: 如果你需要我們重新發送確認電子郵件,<a href="%{reconfirm}">請按這裡</a>。 confirm_resend: - success: 我們已經發送一封新的確認電子郵件到 %{email},只要你確認你的帳號,你就可以開始製圖了。 <br /><br />如果你使用會發送確認請求的反垃圾郵件系統,請確保你將 - webmaster@openstreetmap.org 加入白名單中,因為我們無法回覆任何確認請求。 + success: 我們已經傳送一封新的確認電子郵件至 %{email},只要你確認你的帳號,你就可以開始製圖了。 <br /><br />如果你使用會傳送確認請求的反垃圾郵件系統,請確保你將 + %{sender} 加入白名單中,因為我們無法回覆任何確認請求。 failure: 找不到使用者 %{name}。 confirm_email: heading: 確認電子郵件地址的變更 @@ -1914,6 +1941,10 @@ zh-TW: no_authorization_code: 無授權碼 unknown_signature_algorithm: 不明的簽章演算法 invalid_scope: 無效範圍 + auth_association: + heading: 您的ID尚未與OpenStreetMap帳號關聯。 + option_1: 如果您新來到OpenStreetMap,請使用下方表單建立一個帳號。 + option_2: 如果您已擁有一個帳號,您可以用您的使用者名稱與密碼登入您的帳號,並在使用者設定中關連您的ID。 user_role: filter: not_an_administrator: 只有行政員可以進行使用者身份管理,但是您並不是行政員。 @@ -2065,6 +2096,7 @@ zh-TW: link: 連結或 HTML long_link: 連結 short_link: 簡短連結 + geo_uri: Geo URL embed: HTML custom_dimensions: 設定自訂的尺寸 format: 格式: @@ -2076,10 +2108,13 @@ zh-TW: center_marker: 將標記設為地圖中心點 paste_html: 貼上 HTML 以嵌入網站 view_larger_map: 查看更大的地圖 + only_standard_layer: 只有標準圖層能匯出成圖片 + embed: + report_problem: 回報問題 key: title: 圖例 tooltip: 圖例 - tooltip_disabled: 圖例僅適用於標準圖層 + tooltip_disabled: 圖例不適用這個圖層 map: zoom: in: 放大 @@ -2091,12 +2126,12 @@ zh-TW: standard: 標準 cycle_map: 單車地圖 transport_map: 交通運輸地圖 - mapquest: MapQuest Open hot: 人道救援 layers: header: 地圖圖層 notes: 地圖註記 data: 地圖資料 + gps: 公開GPS軌跡 overlays: 開啟覆蓋層,以為地圖解決問題 title: 圖層 copyright: © <a href='%{copyright_url}'>OpenStreetMap 貢獻者</a> @@ -2137,6 +2172,9 @@ zh-TW: mapquest_car: 開車 (MapQuest) mapquest_foot: 徒步 (MapQuest) osrm_car: 開車 (OSRM) + mapzen_bicycle: 腳踏車 (Mapzen) + mapzen_car: 開車 (Mapzen) + mapzen_foot: 徒步 (Mapzen) directions: 路線 distance: 距離 errors: @@ -2145,11 +2183,21 @@ zh-TW: instructions: continue_without_exit: 繼續行駛 %{name} slight_right_without_exit: 靠右至 %{name} + offramp_right_without_exit: 在右側上坡前往%{name} + onramp_right_without_exit: 右轉上坡至%{name} + endofroad_right_without_exit: 在道路盡頭右轉至%{name} + merge_right_without_exit: 向右併線至%{name} + fork_right_without_exit: 在叉路口右轉至%{name} turn_right_without_exit: 右轉至 %{name} sharp_right_without_exit: 右急轉至 %{name} uturn_without_exit: 迴轉沿著 %{name} sharp_left_without_exit: 左急轉至 %{name} turn_left_without_exit: 左轉至 %{name} + offramp_left_without_exit: 在左側上坡前往%{name} + onramp_left_without_exit: 左轉上坡至%{name} + endofroad_left_without_exit: 在道路盡頭左轉至%{name} + merge_left_without_exit: 向左併線至%{name} + fork_left_without_exit: 在叉路口左轉至%{name} slight_left_without_exit: 靠左至 %{name} via_point_without_exit: (通過點) follow_without_exit: 延著 %{name} @@ -2160,7 +2208,12 @@ zh-TW: destination_without_exit: 到達目地 against_oneway_without_exit: 沿著單行道 %{name} 行駛 end_oneway_without_exit: 單行道終點於 %{name} - roundabout_with_exit: 於圓環進入出口 %{name} 至 %{name} + roundabout_with_exit: 從圓環出口 %{exit} 離開至 %{name} + turn_left_with_exit: 於圓環左轉至%{name} + slight_left_with_exit: 於圓環靠左至%{name} + turn_right_with_exit: 於圓環右轉至%{name} + slight_right_with_exit: 於圓環靠右至%{name} + continue_with_exit: 於圓環繼續直行至%{name} unnamed: 未命名 courtesy: 感謝 %{link} 提供路線資訊 time: 時間 @@ -2197,7 +2250,7 @@ zh-TW: create: flash: 修訂已建立 update: - flash: 已儲存更改。 + flash: 已儲存變更。 destroy: not_empty: 修訂尚未清空。請在銷毀前清除所有此修訂的版本。 flash: 修訂已銷毀。 diff --git a/config/nginx.conf b/config/nginx.conf deleted file mode 100644 index ae349b746..000000000 --- a/config/nginx.conf +++ /dev/null @@ -1,266 +0,0 @@ -# Run as www-data -user www-data www-data; - -# Use two worker processes -worker_processes 2; - -# Define PID files -pid /var/run/nginx.pid; - -# Define error log -error_log /var/log/nginx/error.log; - -events { - # max clients = worker_processes * worker_connections - worker_connections 1024; -} - -http { - # Configure MIME types - include /etc/nginx/mime.types; - default_type application/octet-stream; - - # Configure network details - sendfile on; - keepalive_timeout 65; - tcp_nodelay on; - - # Define access log - access_log /var/log/nginx/access.log; - - # Configure compression (text/html is compressed by default) - gzip on; - gzip_min_length 1100; - gzip_buffers 4 8k; - gzip_types text/plain application/x-javascript application/x-shockwave-flash text/css; - - #NO CGI SUPPORT IN NGINX fix stat .pl later - - # Define fastcgi backend for web pages - upstream web_backend { - server 127.0.0.1:8000; - server 127.0.0.1:8001; - server 127.0.0.1:8002; - server 127.0.0.1:8003; - server 127.0.0.1:8004; - server 127.0.0.1:8005; - server 127.0.0.1:8006; - server 127.0.0.1:8007; - server 127.0.0.1:8008; - server 127.0.0.1:8009; - server 127.0.0.1:8010; - server 127.0.0.1:8011; - server 127.0.0.1:8012; - server 127.0.0.1:8013; - server 127.0.0.1:8014; - server 127.0.0.1:8015; - server 127.0.0.1:8016; - server 127.0.0.1:8017; - server 127.0.0.1:8018; - server 127.0.0.1:8019; - server 127.0.0.1:8020; - server 127.0.0.1:8021; - server 127.0.0.1:8022; - server 127.0.0.1:8023; - server 127.0.0.1:8024; - server 127.0.0.1:8025; - } - - # Define fastcgi backend for geocoder searches - upstream geocoder_backend { - server 127.0.0.1:8026; - server 127.0.0.1:8027; - server 127.0.0.1:8028; - server 127.0.0.1:8029; - } - - # Define fastcgi backend for api requests - upstream api_backend { - server 127.0.0.1:8030; - server 127.0.0.1:8031; - server 127.0.0.1:8032; - server 127.0.0.1:8033; - server 127.0.0.1:8034; - server 127.0.0.1:8035; - server 127.0.0.1:8036; - server 127.0.0.1:8037; - server 127.0.0.1:8038; - server 127.0.0.1:8039; - server 127.0.0.1:8040; - server 127.0.0.1:8041; - server 127.0.0.1:8042; - server 127.0.0.1:8043; - server 127.0.0.1:8044; - } - - # Define fastcgi backend for bulk api requests - upstream bulkapi_backend { - server 10.0.0.10:8000; - server 10.0.0.11:8000; - server 10.0.0.12:8000; - server 10.0.0.10:8001; - server 10.0.0.11:8001; - server 10.0.0.12:8001; - server 10.0.0.10:8002; - server 10.0.0.11:8002; - server 10.0.0.12:8002; - server 10.0.0.10:8003; - server 10.0.0.11:8003; - server 10.0.0.12:8003; - server 10.0.0.10:8004; - server 10.0.0.11:8004; - server 10.0.0.12:8004; - } - - # Define fastcgi backend for tiles@home requests - upstream tah_backend { - server 10.0.0.10:8005; - server 10.0.0.11:8005; - server 10.0.0.12:8005; - } - - server { - # Listen on port 80 - listen 80; - - # Serve rails public files - root /home/rails/public; - - # Use index.html as the index page - index index.html; - - # Redirect trac requests for historical reasons - location /trac/ { - rewrite ^/trac/(.*)$ http://trac.openstreetmap.org/$1 permanent; - } - - # Redirect wiki requests for historical reasons - location /wiki/ { - rewrite ^/wiki/(.*)$ http://wiki.openstreetmap.org/$1 permanent; - } - - # Placeholder for blocking abuse - include /etc/nginx/blocked_hosts; - allow all; - - # Block some bulk download agents - if ($http_user_agent ~* LWP::Simple|downloadosm|BBBike) { - return 403; - } - - # Block some robots - if ($http_user_agent ~* msnbot|twiceler) { - return 403; - } - - # Map api.openstreetmap/0.n/... to api.openstreetmap/api/0.n/... - if ($host ~* ^api\.) { - rewrite ^/(0\.[0-9]+)/(.*)$ /api/$1/$2; - rewrite ^/capabilities$ /api/capabilities; - } - - # Strip asset tags - location ~ ^/(images|javascripts|openlayers|stylesheets|user/image)/ { - # Strip asset tags - rewrite ^/(.*)/[0-9]+$ /$1; - - # Set expiry to the maximum - the asset tag will change - # when there is a new version - expires max; - - # Only cache OpenLayers for seven days though - if ($uri ~ ^/openlayers/) { - expires 7d; - } - } - - # Cache the embedded map page for seven days - location ~ ^/export/embed.html$ { - expires 7d; - } - - # Include fastcgi configuration - include /etc/nginx/fastcgi_params; - fastcgi_param REQUEST_URI $uri; - - # Handle tiles@home requests - location /api/ { - if ($http_user_agent ~ "^tilesAtHome") { - #deny all; - fastcgi_pass tah_backend; - break; - } - } - - # Handle bulk api requests - location ~ ^/api/0\.6/(map|relation|trackpoints|amf|amf/read|swf/trackpoints|trace/[0-9]+/data)$ { - fastcgi_read_timeout 300; - fastcgi_pass bulkapi_backend; - break; - } - - # Send search requests to the bulk api backend - location ~ ^/api/0\.6/.*/search$ { - fastcgi_read_timeout 300; - fastcgi_pass bulkapi_backend; - break; - } - - # Send requests for full objects to the bulk api backend - location ~ ^/api/0\.6/.*/full$ { - fastcgi_read_timeout 300; - fastcgi_pass bulkapi_backend; - break; - } - - # Handle the remaining api requests - location ~ ^/api/0\.6/ { - fastcgi_pass api_backend; - break; - } - - # Deny old and unknown API versions - location ~ ^/api/0\.[0-9]+/ { - return 404; - } - - # Send unversioned capabilities requests to the api backend - location = /api/capabilities { - fastcgi_pass api_backend; - break; - } - - # Send geocoder searches to the geocoder backend - location /geocoder/ { - fastcgi_pass geocoder_backend; - break; - } - - # Send everything else to the web backend unless it exists - # in the rails public tree - location / { - fastcgi_index index.html; - - if (!-f $request_filename) { - fastcgi_pass web_backend; - break; - } - } - - # Set the MIME type for crossdomain.xml policy files - # or flash will ignore it - location ~ /crossdomain\.xml$ { - types { - text/x-cross-domain-policy xml; - } - } - - # Give munin access to some statistics - location /server-status { - stub_status on; - access_log off; - allow 127.0.0.1; - deny all; - } - } -} diff --git a/config/preinitializer.rb b/config/preinitializer.rb index de8367e9f..07f105722 100644 --- a/config/preinitializer.rb +++ b/config/preinitializer.rb @@ -1,17 +1,15 @@ require "yaml" -if defined?(Rake.application) && Rake.application.top_level_tasks.grep(/^(default$|test(:|$))/).any? - env = "test" -else - env = ENV["RAILS_ENV"] || "development" -end +env = if defined?(Rake.application) && Rake.application.top_level_tasks.grep(/^(default$|test(:|$))/).any? + "test" + else + ENV["RAILS_ENV"] || "development" + end config = YAML.load_file(File.expand_path(env == "test" ? "../example.application.yml" : "../application.yml", __FILE__)) ENV.each do |key, value| - if key.match(/^OSM_(.*)$/) - Object.const_set(Regexp.last_match(1).upcase, value) - end + Object.const_set(Regexp.last_match(1).upcase, value) if key =~ /^OSM_(.*)$/ end config[env].each do |key, value| diff --git a/config/routes.rb b/config/routes.rb index 085d67417..59c0dac86 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -228,6 +228,8 @@ OpenStreetMap::Application.routes.draw do match "/user/:display_name/diary/:id/edit" => "diary_entry#edit", :via => [:get, :post], :id => /\d+/ match "/user/:display_name/diary/:id/hide" => "diary_entry#hide", :via => :post, :id => /\d+/, :as => :hide_diary_entry match "/user/:display_name/diary/:id/hidecomment/:comment" => "diary_entry#hidecomment", :via => :post, :id => /\d+/, :comment => /\d+/, :as => :hide_diary_comment + match "/user/:display_name/diary/:id/subscribe" => "diary_entry#subscribe", :via => :post, :as => :diary_entry_subscribe, :id => /\d+/ + match "/user/:display_name/diary/:id/unsubscribe" => "diary_entry#unsubscribe", :via => :post, :as => :diary_entry_unsubscribe, :id => /\d+/ # user pages match "/user/:display_name" => "user#view", :via => :get, :as => "user" diff --git a/db/README b/db/README deleted file mode 100644 index 814dcb96c..000000000 --- a/db/README +++ /dev/null @@ -1,44 +0,0 @@ -Creating database -=================== - -OSM server uses a Postgres database with the following name: - -openstreetmap - -You may create it with your preferable client or run next (linux) command: - -$ createdb openstreetmap - -Creating functions for PgSQL -============================== - -Run this command in the db/functions directory: - -$ make libpgosm.so - -You might also need to install: -- postgresql development libraries: $ sudo apt-get install postgresql-server-dev-8.3 -- ruby development libraries: $ sudo apt-get install ruby1.8-dev -for build to succeed. - -Now create the function as follows: - -$ psql openstreetmap -(This may need authentication or a -u <dbowneruid>) - -> CREATE FUNCTION maptile_for_point(int8, int8, int4) RETURNS int4 - AS '/path/to/rails-port/db/functions/libpgosm.so', 'maptile_for_point' - LANGUAGE C STRICT; - -Creating database skeleton tables -=================================== - -Run this command from the root of your rails directory: - -$ rake db:migrate - -This will create the db for you - -You will need to make sure the database connection is configured in database.yml in config directory -You might start with example configuration provided: -$ cp config/example.database.yml config/database.yml diff --git a/db/functions/Makefile b/db/functions/Makefile index 231496d40..dac1889dc 100644 --- a/db/functions/Makefile +++ b/db/functions/Makefile @@ -1,3 +1,6 @@ +PG_CONFIG ?= pg_config +DESTDIR ?= . + QTDIR=../../lib/quad_tile OS=$(shell uname -s) @@ -7,19 +10,15 @@ else LDFLAGS=-shared endif -all: libpgosm.so +all: ${DESTDIR}/libpgosm.so clean: - $(RM) *.so *.o - -libpgosm.so: quadtile-pgsql.o maptile-pgsql.o xid_to_int4-pgsql.o - cc ${LDFLAGS} -o libpgosm.so quadtile-pgsql.o maptile-pgsql.o xid_to_int4-pgsql.o + $(RM) ${DESTDIR}/*.so ${DESTDIR}/*.o -quadtile-pgsql.o: quadtile.c ${QTDIR}/quad_tile.h - cc -I `pg_config --includedir` -I `pg_config --includedir-server` -I${QTDIR} -fPIC -O3 -DUSE_PGSQL -c -o quadtile-pgsql.o quadtile.c +${DESTDIR}/libpgosm.so: ${DESTDIR}/quadtile.o ${DESTDIR}/maptile.o ${DESTDIR}/xid_to_int4.o + cc ${LDFLAGS} -o $@ $^ -maptile-pgsql.o: maptile.c - cc -I `pg_config --includedir` -I `pg_config --includedir-server` -fPIC -O3 -DUSE_PGSQL -c -o maptile-pgsql.o maptile.c +${DESTDIR}/%.o: %.c + cc -I `${PG_CONFIG} --includedir` -I `${PG_CONFIG} --includedir-server` -I${QTDIR} -fPIC -O3 -DUSE_PGSQL -c -o $@ $< -xid_to_int4-pgsql.o: xid_to_int4.c - cc -I `pg_config --includedir` -I `pg_config --includedir-server` -fPIC -O3 -DUSE_PGSQL -c -o xid_to_int4-pgsql.o xid_to_int4.c +${DESTDIR}/quadtile.o: ${QTDIR}/quad_tile.h diff --git a/db/migrate/001_create_osm_db.rb b/db/migrate/001_create_osm_db.rb index 985997ac2..ddbfe259d 100644 --- a/db/migrate/001_create_osm_db.rb +++ b/db/migrate/001_create_osm_db.rb @@ -216,6 +216,5 @@ class CreateOsmDb < ActiveRecord::Migration add_index "ways", ["id"], :name => "ways_id_version_idx" end - def self.down - end + def self.down; end end diff --git a/db/migrate/008_remove_segments.rb b/db/migrate/008_remove_segments.rb index 241a144b0..8ca894d92 100644 --- a/db/migrate/008_remove_segments.rb +++ b/db/migrate/008_remove_segments.rb @@ -2,7 +2,7 @@ require "migrate" class RemoveSegments < ActiveRecord::Migration def self.up - have_segs = select_value("SELECT count(*) FROM current_segments").to_i != 0 + have_segs = select_value("SELECT count(*) FROM current_segments").to_i.nonzero? if have_segs prefix = File.join Dir.tmpdir, "008_remove_segments.#{$PROCESS_ID}." @@ -11,13 +11,13 @@ class RemoveSegments < ActiveRecord::Migration src = "#{cmd}.cc" if !File.exist?(cmd) || File.mtime(cmd) < File.mtime(src) system("c++ -O3 -Wall `mysql_config --cflags --libs` " + - "#{src} -o #{cmd}") || fail + "#{src} -o #{cmd}") || raise end conn_opts = ActiveRecord::Base.connection - .instance_eval { @connection_options } + .instance_eval { @connection_options } args = conn_opts.map(&:to_s) + [prefix] - fail "#{cmd} failed" unless system cmd, *args + raise "#{cmd} failed" unless system cmd, *args tempfiles = %w(ways way_nodes way_tags relations relation_members relation_tags) .map { |base| prefix + base } @@ -53,7 +53,7 @@ class RemoveSegments < ActiveRecord::Migration # now get the data back csvopts = "FIELDS TERMINATED BY ',' ENCLOSED BY '\"' ESCAPED BY '\"' LINES TERMINATED BY '\\n'" - tempfiles.each { |fn| File.chmod 0644, fn } if have_segs + tempfiles.each { |fn| File.chmod 0o644, fn } if have_segs if have_segs execute "LOAD DATA INFILE '#{ways}' INTO TABLE ways #{csvopts} (id, user_id, timestamp) SET visible = 1, version = 1" @@ -81,6 +81,6 @@ class RemoveSegments < ActiveRecord::Migration end def self.down - fail ActiveRecord::IrreversibleMigration + raise ActiveRecord::IrreversibleMigration end end diff --git a/db/migrate/020_populate_node_tags_and_remove.rb b/db/migrate/020_populate_node_tags_and_remove.rb index d12ede317..640019b15 100644 --- a/db/migrate/020_populate_node_tags_and_remove.rb +++ b/db/migrate/020_populate_node_tags_and_remove.rb @@ -2,7 +2,7 @@ require "migrate" class PopulateNodeTagsAndRemove < ActiveRecord::Migration def self.up - have_nodes = select_value("SELECT count(*) FROM current_nodes").to_i != 0 + have_nodes = select_value("SELECT count(*) FROM current_nodes").to_i.nonzero? if have_nodes prefix = File.join Dir.tmpdir, "020_populate_node_tags_and_remove.#{$PROCESS_ID}." @@ -11,12 +11,12 @@ class PopulateNodeTagsAndRemove < ActiveRecord::Migration src = "#{cmd}.c" if !File.exist?(cmd) || File.mtime(cmd) < File.mtime(src) system("cc -O3 -Wall `mysql_config --cflags --libs` " + - "#{src} -o #{cmd}") || fail + "#{src} -o #{cmd}") || raise end conn_opts = ActiveRecord::Base.connection.instance_eval { @connection_options } args = conn_opts.map(&:to_s) + [prefix] - fail "#{cmd} failed" unless system cmd, *args + raise "#{cmd} failed" unless system cmd, *args tempfiles = %w(nodes node_tags current_nodes current_node_tags) .map { |base| prefix + base } @@ -31,8 +31,8 @@ class PopulateNodeTagsAndRemove < ActiveRecord::Migration create_table :current_node_tags, :id => false do |t| t.column :id, :bigint, :null => false - t.column :k, :string, :default => "", :null => false - t.column :v, :string, :default => "", :null => false + t.column :k, :string, :default => "", :null => false + t.column :v, :string, :default => "", :null => false end create_table :node_tags, :id => false do |t| @@ -56,7 +56,7 @@ class PopulateNodeTagsAndRemove < ActiveRecord::Migration end def self.down - fail ActiveRecord::IrreversibleMigration + raise ActiveRecord::IrreversibleMigration # add_column :nodes, "tags", :text, :default => "", :null => false # add_column :current_nodes, "tags", :text, :default => "", :null => false end diff --git a/db/migrate/021_move_to_innodb.rb b/db/migrate/021_move_to_innodb.rb index b58817ed9..edfecdfd9 100644 --- a/db/migrate/021_move_to_innodb.rb +++ b/db/migrate/021_move_to_innodb.rb @@ -18,8 +18,8 @@ class MoveToInnodb < ActiveRecord::Migration # As the initial version of all nodes, ways and relations is 0, we set the # current version to something less so that we can update the version in # batches of 10000 - tbl.classify.constantize.update_all("version=-1") - while tbl.classify.constantize.count(:conditions => { :version => -1 }) > 0 + tbl.classify.constantize.update_all(:version => -1) + while tbl.classify.constantize.where(:version => -1).count > 0 tbl.classify.constantize.update_all("version=(SELECT max(version) FROM #{tbl} WHERE #{tbl}.id = current_#{tbl}.id)", { :version => -1 }, { :limit => 10000 }) end # execute "UPDATE current_#{tbl} SET version = " + @@ -36,6 +36,6 @@ class MoveToInnodb < ActiveRecord::Migration end def self.down - fail ActiveRecord::IrreversibleMigration + raise ActiveRecord::IrreversibleMigration end end diff --git a/db/migrate/022_key_constraints.rb b/db/migrate/022_key_constraints.rb index aa4c496c9..5a6a9296f 100644 --- a/db/migrate/022_key_constraints.rb +++ b/db/migrate/022_key_constraints.rb @@ -47,6 +47,6 @@ class KeyConstraints < ActiveRecord::Migration end def self.down - fail ActiveRecord::IrreversibleMigration + raise ActiveRecord::IrreversibleMigration end end diff --git a/db/migrate/023_add_changesets.rb b/db/migrate/023_add_changesets.rb index 9039bb5d6..3cf268dd0 100644 --- a/db/migrate/023_add_changesets.rb +++ b/db/migrate/023_add_changesets.rb @@ -29,7 +29,7 @@ class AddChangesets < ActiveRecord::Migration # all the changesets will have the id of the user that made them. # We need to generate a changeset for each user in the database execute "INSERT INTO changesets (id, user_id, created_at, open)" + - "SELECT id, id, creation_time, false from users;" + "SELECT id, id, creation_time, false from users;" @conv_user_tables.each do |tbl| rename_column tbl, :user_id, :changeset_id @@ -40,7 +40,7 @@ class AddChangesets < ActiveRecord::Migration def self.down # It's not easy to generate the user ids from the changesets - fail ActiveRecord::IrreversibleMigration + raise ActiveRecord::IrreversibleMigration # drop_table "changesets" # drop_table "changeset_tags" end diff --git a/db/migrate/030_add_foreign_keys.rb b/db/migrate/030_add_foreign_keys.rb index 54820aab1..02d9813bd 100644 --- a/db/migrate/030_add_foreign_keys.rb +++ b/db/migrate/030_add_foreign_keys.rb @@ -9,6 +9,6 @@ class AddForeignKeys < ActiveRecord::Migration end def self.down - fail ActiveRecord::IrreversibleMigration + raise ActiveRecord::IrreversibleMigration end end diff --git a/db/migrate/034_create_languages.rb b/db/migrate/034_create_languages.rb index 05a70e7a9..c41856e1e 100644 --- a/db/migrate/034_create_languages.rb +++ b/db/migrate/034_create_languages.rb @@ -10,7 +10,7 @@ class CreateLanguages < ActiveRecord::Migration add_primary_key :languages, [:code] - Language.load("#{Rails.root}/config/languages.yml") + Language.load(Rails.root.join("config", "languages.yml")) add_foreign_key :users, :languages, :column => :locale, :primary_key => :code, :name => "users_locale_fkey" add_foreign_key :diary_entries, :languages, :column => :language_code, :primary_key => :code, :name => "diary_entries_language_code_fkey" diff --git a/db/migrate/040_create_oauth_tables.rb b/db/migrate/040_create_oauth_tables.rb index 4b3725365..a2eeeca7a 100644 --- a/db/migrate/040_create_oauth_tables.rb +++ b/db/migrate/040_create_oauth_tables.rb @@ -9,7 +9,7 @@ class CreateOauthTables < ActiveRecord::Migration t.string :secret, :limit => 50 t.integer :user_id - t.timestamps + t.timestamps :null => true end add_index :client_applications, :key, :unique => true @@ -20,7 +20,7 @@ class CreateOauthTables < ActiveRecord::Migration t.string :token, :limit => 50 t.string :secret, :limit => 50 t.timestamp :authorized_at, :invalidated_at - t.timestamps + t.timestamps :null => true end add_index :oauth_tokens, :token, :unique => true @@ -29,7 +29,7 @@ class CreateOauthTables < ActiveRecord::Migration t.string :nonce t.integer :timestamp - t.timestamps + t.timestamps :null => true end add_index :oauth_nonces, [:nonce, :timestamp], :unique => true end diff --git a/db/migrate/041_add_fine_o_auth_permissions.rb b/db/migrate/041_add_fine_o_auth_permissions.rb index dcb77a2b6..598cb3c04 100644 --- a/db/migrate/041_add_fine_o_auth_permissions.rb +++ b/db/migrate/041_add_fine_o_auth_permissions.rb @@ -1,6 +1,6 @@ class AddFineOAuthPermissions < ActiveRecord::Migration PERMISSIONS = [:allow_read_prefs, :allow_write_prefs, :allow_write_diary, - :allow_write_api, :allow_read_gpx, :allow_write_gpx] + :allow_write_api, :allow_read_gpx, :allow_write_gpx].freeze def self.up PERMISSIONS.each do |perm| diff --git a/db/migrate/044_create_user_roles.rb b/db/migrate/044_create_user_roles.rb index b5e439406..bae5a3cad 100644 --- a/db/migrate/044_create_user_roles.rb +++ b/db/migrate/044_create_user_roles.rb @@ -8,7 +8,7 @@ class CreateUserRoles < ActiveRecord::Migration t.column :user_id, :bigint, :null => false t.column :role, :user_role_enum, :null => false - t.timestamps + t.timestamps :null => true end User.where(:administrator => true).each do |user| diff --git a/db/migrate/045_create_user_blocks.rb b/db/migrate/045_create_user_blocks.rb index cdb36cd15..71081f5c1 100644 --- a/db/migrate/045_create_user_blocks.rb +++ b/db/migrate/045_create_user_blocks.rb @@ -10,7 +10,7 @@ class CreateUserBlocks < ActiveRecord::Migration t.column :needs_view, :boolean, :null => false, :default => false t.column :revoker_id, :bigint - t.timestamps + t.timestamps :null => true end add_foreign_key :user_blocks, :users, :name => "user_blocks_user_id_fkey" diff --git a/db/migrate/20120318201948_create_redactions.rb b/db/migrate/20120318201948_create_redactions.rb index bb9786db4..8a1cf6bf3 100644 --- a/db/migrate/20120318201948_create_redactions.rb +++ b/db/migrate/20120318201948_create_redactions.rb @@ -6,7 +6,7 @@ class CreateRedactions < ActiveRecord::Migration t.string :title t.text :description - t.timestamps + t.timestamps :null => true end [:nodes, :ways, :relations].each do |tbl| diff --git a/db/migrate/20140117185510_drop_countries.rb b/db/migrate/20140117185510_drop_countries.rb index fe9144cbb..083319284 100644 --- a/db/migrate/20140117185510_drop_countries.rb +++ b/db/migrate/20140117185510_drop_countries.rb @@ -1,5 +1,5 @@ class DropCountries < ActiveRecord::Migration - def change + def up drop_table :countries end end diff --git a/db/migrate/20140507110937_create_changeset_comments.rb b/db/migrate/20140507110937_create_changeset_comments.rb index 26c257cbc..0b36fa228 100644 --- a/db/migrate/20140507110937_create_changeset_comments.rb +++ b/db/migrate/20140507110937_create_changeset_comments.rb @@ -4,7 +4,7 @@ class CreateChangesetComments < ActiveRecord::Migration def change create_table :changeset_comments do |t| t.column :changeset_id, :bigint, :null => false - t.column :author_id, :bigint, :null => false + t.column :author_id, :bigint, :null => false t.text :body, :null => false t.timestamp :created_at, :null => false t.boolean :visible, :null => false diff --git a/db/migrate/20150111192335_subscribe_old_changesets.rb b/db/migrate/20150111192335_subscribe_old_changesets.rb index cd0938318..cca8293f5 100644 --- a/db/migrate/20150111192335_subscribe_old_changesets.rb +++ b/db/migrate/20150111192335_subscribe_old_changesets.rb @@ -5,6 +5,5 @@ class SubscribeOldChangesets < ActiveRecord::Migration end end - def down - end + def down; end end diff --git a/db/migrate/20150818224516_set_default_gravatar_to_false_for_privacy.rb b/db/migrate/20150818224516_set_default_gravatar_to_false_for_privacy.rb new file mode 100644 index 000000000..49f94c9de --- /dev/null +++ b/db/migrate/20150818224516_set_default_gravatar_to_false_for_privacy.rb @@ -0,0 +1,9 @@ +class SetDefaultGravatarToFalseForPrivacy < ActiveRecord::Migration + def up + change_column :users, :image_use_gravatar, :boolean, :default => false + end + + def down + change_column :users, :image_use_gravatar, :boolean, :default => true + end +end diff --git a/db/migrate/20161002153425_add_join_table_between_users_and_diary_entries.rb b/db/migrate/20161002153425_add_join_table_between_users_and_diary_entries.rb new file mode 100644 index 000000000..cb8e455dd --- /dev/null +++ b/db/migrate/20161002153425_add_join_table_between_users_and_diary_entries.rb @@ -0,0 +1,19 @@ +require "migrate" + +class AddJoinTableBetweenUsersAndDiaryEntries < ActiveRecord::Migration + def self.up + create_table :diary_entry_subscriptions, :id => false do |t| + t.column :user_id, :bigint, :null => false + t.column :diary_entry_id, :bigint, :null => false + end + + add_primary_key :diary_entry_subscriptions, [:user_id, :diary_entry_id] + add_index :diary_entry_subscriptions, [:diary_entry_id] + add_foreign_key :diary_entry_subscriptions, :diary_entries, :name => "diary_entry_subscriptions_diary_entry_id_fkey" + add_foreign_key :diary_entry_subscriptions, :users, :name => "diary_entry_subscriptions_user_id_fkey" + end + + def self.down + drop_table :diary_entry_subscriptions + end +end diff --git a/db/migrate/20161011010929_subscribe_authors_to_diary_entries.rb b/db/migrate/20161011010929_subscribe_authors_to_diary_entries.rb new file mode 100644 index 000000000..3fcbdf5fb --- /dev/null +++ b/db/migrate/20161011010929_subscribe_authors_to_diary_entries.rb @@ -0,0 +1,9 @@ +class SubscribeAuthorsToDiaryEntries < ActiveRecord::Migration + def up + DiaryEntry.find_each do |diary_entry| + diary_entry.subscriptions.create(:user => diary_entry.user) unless diary_entry.subscribers.exists?(diary_entry.user.id) + end + end + + def down; end +end diff --git a/db/structure.sql b/db/structure.sql index c7e26ac66..63af3304d 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -2,12 +2,16 @@ -- PostgreSQL database dump -- +-- Dumped from database version 9.5.4 +-- Dumped by pg_dump version 9.5.4 + SET statement_timeout = 0; SET lock_timeout = 0; SET client_encoding = 'UTF8'; SET standard_conforming_strings = on; SET check_function_bodies = false; SET client_min_messages = warning; +SET row_security = off; -- -- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: - @@ -126,7 +130,7 @@ CREATE TYPE user_status_enum AS ENUM ( CREATE FUNCTION maptile_for_point(bigint, bigint, integer) RETURNS integer LANGUAGE c STRICT - AS '/srv/www/master.osm.compton.nu/db/functions/libpgosm.so', 'maptile_for_point'; + AS '$libdir/libpgosm', 'maptile_for_point'; -- @@ -135,7 +139,7 @@ CREATE FUNCTION maptile_for_point(bigint, bigint, integer) RETURNS integer CREATE FUNCTION tile_for_point(integer, integer) RETURNS bigint LANGUAGE c STRICT - AS '/srv/www/master.osm.compton.nu/db/functions/libpgosm.so', 'tile_for_point'; + AS '$libdir/libpgosm', 'tile_for_point'; -- @@ -144,7 +148,7 @@ CREATE FUNCTION tile_for_point(integer, integer) RETURNS bigint CREATE FUNCTION xid_to_int4(xid) RETURNS integer LANGUAGE c IMMUTABLE STRICT - AS '/srv/www/master.osm.compton.nu/db/functions/libpgosm.so', 'xid_to_int4'; + AS '$libdir/libpgosm', 'xid_to_int4'; SET default_tablespace = ''; @@ -152,15 +156,15 @@ SET default_tablespace = ''; SET default_with_oids = false; -- --- Name: acls; Type: TABLE; Schema: public; Owner: -; Tablespace: +-- Name: acls; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE acls ( id integer NOT NULL, address inet, - k character varying NOT NULL, - v character varying, - domain character varying + k character varying(255) NOT NULL, + v character varying(255), + domain character varying(255) ); @@ -184,7 +188,7 @@ ALTER SEQUENCE acls_id_seq OWNED BY acls.id; -- --- Name: changeset_comments; Type: TABLE; Schema: public; Owner: -; Tablespace: +-- Name: changeset_comments; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE changeset_comments ( @@ -217,18 +221,18 @@ ALTER SEQUENCE changeset_comments_id_seq OWNED BY changeset_comments.id; -- --- Name: changeset_tags; Type: TABLE; Schema: public; Owner: -; Tablespace: +-- Name: changeset_tags; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE changeset_tags ( changeset_id bigint NOT NULL, - k character varying DEFAULT ''::character varying NOT NULL, - v character varying DEFAULT ''::character varying NOT NULL + k character varying(255) DEFAULT ''::character varying NOT NULL, + v character varying(255) DEFAULT ''::character varying NOT NULL ); -- --- Name: changesets; Type: TABLE; Schema: public; Owner: -; Tablespace: +-- Name: changesets; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE changesets ( @@ -264,7 +268,7 @@ ALTER SEQUENCE changesets_id_seq OWNED BY changesets.id; -- --- Name: changesets_subscribers; Type: TABLE; Schema: public; Owner: -; Tablespace: +-- Name: changesets_subscribers; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE changesets_subscribers ( @@ -274,15 +278,15 @@ CREATE TABLE changesets_subscribers ( -- --- Name: client_applications; Type: TABLE; Schema: public; Owner: -; Tablespace: +-- Name: client_applications; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE client_applications ( id integer NOT NULL, - name character varying, - url character varying, - support_url character varying, - callback_url character varying, + name character varying(255), + url character varying(255), + support_url character varying(255), + callback_url character varying(255), key character varying(50), secret character varying(50), user_id integer, @@ -318,18 +322,18 @@ ALTER SEQUENCE client_applications_id_seq OWNED BY client_applications.id; -- --- Name: current_node_tags; Type: TABLE; Schema: public; Owner: -; Tablespace: +-- Name: current_node_tags; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE current_node_tags ( node_id bigint NOT NULL, - k character varying DEFAULT ''::character varying NOT NULL, - v character varying DEFAULT ''::character varying NOT NULL + k character varying(255) DEFAULT ''::character varying NOT NULL, + v character varying(255) DEFAULT ''::character varying NOT NULL ); -- --- Name: current_nodes; Type: TABLE; Schema: public; Owner: -; Tablespace: +-- Name: current_nodes; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE current_nodes ( @@ -364,31 +368,31 @@ ALTER SEQUENCE current_nodes_id_seq OWNED BY current_nodes.id; -- --- Name: current_relation_members; Type: TABLE; Schema: public; Owner: -; Tablespace: +-- Name: current_relation_members; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE current_relation_members ( relation_id bigint NOT NULL, member_type nwr_enum NOT NULL, member_id bigint NOT NULL, - member_role character varying NOT NULL, + member_role character varying(255) NOT NULL, sequence_id integer DEFAULT 0 NOT NULL ); -- --- Name: current_relation_tags; Type: TABLE; Schema: public; Owner: -; Tablespace: +-- Name: current_relation_tags; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE current_relation_tags ( relation_id bigint NOT NULL, - k character varying DEFAULT ''::character varying NOT NULL, - v character varying DEFAULT ''::character varying NOT NULL + k character varying(255) DEFAULT ''::character varying NOT NULL, + v character varying(255) DEFAULT ''::character varying NOT NULL ); -- --- Name: current_relations; Type: TABLE; Schema: public; Owner: -; Tablespace: +-- Name: current_relations; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE current_relations ( @@ -420,7 +424,7 @@ ALTER SEQUENCE current_relations_id_seq OWNED BY current_relations.id; -- --- Name: current_way_nodes; Type: TABLE; Schema: public; Owner: -; Tablespace: +-- Name: current_way_nodes; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE current_way_nodes ( @@ -431,18 +435,18 @@ CREATE TABLE current_way_nodes ( -- --- Name: current_way_tags; Type: TABLE; Schema: public; Owner: -; Tablespace: +-- Name: current_way_tags; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE current_way_tags ( way_id bigint NOT NULL, - k character varying DEFAULT ''::character varying NOT NULL, - v character varying DEFAULT ''::character varying NOT NULL + k character varying(255) DEFAULT ''::character varying NOT NULL, + v character varying(255) DEFAULT ''::character varying NOT NULL ); -- --- Name: current_ways; Type: TABLE; Schema: public; Owner: -; Tablespace: +-- Name: current_ways; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE current_ways ( @@ -474,7 +478,7 @@ ALTER SEQUENCE current_ways_id_seq OWNED BY current_ways.id; -- --- Name: diary_comments; Type: TABLE; Schema: public; Owner: -; Tablespace: +-- Name: diary_comments; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE diary_comments ( @@ -509,19 +513,19 @@ ALTER SEQUENCE diary_comments_id_seq OWNED BY diary_comments.id; -- --- Name: diary_entries; Type: TABLE; Schema: public; Owner: -; Tablespace: +-- Name: diary_entries; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE diary_entries ( id bigint NOT NULL, user_id bigint NOT NULL, - title character varying NOT NULL, + title character varying(255) NOT NULL, body text NOT NULL, created_at timestamp without time zone NOT NULL, updated_at timestamp without time zone NOT NULL, latitude double precision, longitude double precision, - language_code character varying DEFAULT 'en'::character varying NOT NULL, + language_code character varying(255) DEFAULT 'en'::character varying NOT NULL, visible boolean DEFAULT true NOT NULL, body_format format_enum DEFAULT 'markdown'::format_enum NOT NULL ); @@ -547,7 +551,17 @@ ALTER SEQUENCE diary_entries_id_seq OWNED BY diary_entries.id; -- --- Name: friends; Type: TABLE; Schema: public; Owner: -; Tablespace: +-- Name: diary_entry_subscriptions; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE diary_entry_subscriptions ( + user_id bigint NOT NULL, + diary_entry_id bigint NOT NULL +); + + +-- +-- Name: friends; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE friends ( @@ -577,7 +591,7 @@ ALTER SEQUENCE friends_id_seq OWNED BY friends.id; -- --- Name: gps_points; Type: TABLE; Schema: public; Owner: -; Tablespace: +-- Name: gps_points; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE gps_points ( @@ -592,12 +606,12 @@ CREATE TABLE gps_points ( -- --- Name: gpx_file_tags; Type: TABLE; Schema: public; Owner: -; Tablespace: +-- Name: gpx_file_tags; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE gpx_file_tags ( gpx_id bigint DEFAULT 0 NOT NULL, - tag character varying NOT NULL, + tag character varying(255) NOT NULL, id bigint NOT NULL ); @@ -622,19 +636,19 @@ ALTER SEQUENCE gpx_file_tags_id_seq OWNED BY gpx_file_tags.id; -- --- Name: gpx_files; Type: TABLE; Schema: public; Owner: -; Tablespace: +-- Name: gpx_files; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE gpx_files ( id bigint NOT NULL, user_id bigint NOT NULL, visible boolean DEFAULT true NOT NULL, - name character varying DEFAULT ''::character varying NOT NULL, + name character varying(255) DEFAULT ''::character varying NOT NULL, size bigint, latitude double precision, longitude double precision, "timestamp" timestamp without time zone NOT NULL, - description character varying DEFAULT ''::character varying NOT NULL, + description character varying(255) DEFAULT ''::character varying NOT NULL, inserted boolean NOT NULL, visibility gpx_visibility_enum DEFAULT 'public'::gpx_visibility_enum NOT NULL ); @@ -660,24 +674,24 @@ ALTER SEQUENCE gpx_files_id_seq OWNED BY gpx_files.id; -- --- Name: languages; Type: TABLE; Schema: public; Owner: -; Tablespace: +-- Name: languages; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE languages ( - code character varying NOT NULL, - english_name character varying NOT NULL, - native_name character varying + code character varying(255) NOT NULL, + english_name character varying(255) NOT NULL, + native_name character varying(255) ); -- --- Name: messages; Type: TABLE; Schema: public; Owner: -; Tablespace: +-- Name: messages; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE messages ( id bigint NOT NULL, from_user_id bigint NOT NULL, - title character varying NOT NULL, + title character varying(255) NOT NULL, body text NOT NULL, sent_on timestamp without time zone NOT NULL, message_read boolean DEFAULT false NOT NULL, @@ -708,19 +722,19 @@ ALTER SEQUENCE messages_id_seq OWNED BY messages.id; -- --- Name: node_tags; Type: TABLE; Schema: public; Owner: -; Tablespace: +-- Name: node_tags; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE node_tags ( node_id bigint NOT NULL, version bigint NOT NULL, - k character varying DEFAULT ''::character varying NOT NULL, - v character varying DEFAULT ''::character varying NOT NULL + k character varying(255) DEFAULT ''::character varying NOT NULL, + v character varying(255) DEFAULT ''::character varying NOT NULL ); -- --- Name: nodes; Type: TABLE; Schema: public; Owner: -; Tablespace: +-- Name: nodes; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE nodes ( @@ -737,11 +751,11 @@ CREATE TABLE nodes ( -- --- Name: note_comments; Type: TABLE; Schema: public; Owner: -; Tablespace: +-- Name: note_comments; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE note_comments ( - id bigint NOT NULL, + id integer NOT NULL, note_id bigint NOT NULL, visible boolean NOT NULL, created_at timestamp without time zone NOT NULL, @@ -772,11 +786,11 @@ ALTER SEQUENCE note_comments_id_seq OWNED BY note_comments.id; -- --- Name: notes; Type: TABLE; Schema: public; Owner: -; Tablespace: +-- Name: notes; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE notes ( - id bigint NOT NULL, + id integer NOT NULL, latitude integer NOT NULL, longitude integer NOT NULL, tile bigint NOT NULL, @@ -807,12 +821,12 @@ ALTER SEQUENCE notes_id_seq OWNED BY notes.id; -- --- Name: oauth_nonces; Type: TABLE; Schema: public; Owner: -; Tablespace: +-- Name: oauth_nonces; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE oauth_nonces ( id integer NOT NULL, - nonce character varying, + nonce character varying(255), "timestamp" integer, created_at timestamp without time zone, updated_at timestamp without time zone @@ -839,7 +853,7 @@ ALTER SEQUENCE oauth_nonces_id_seq OWNED BY oauth_nonces.id; -- --- Name: oauth_tokens; Type: TABLE; Schema: public; Owner: -; Tablespace: +-- Name: oauth_tokens; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE oauth_tokens ( @@ -859,9 +873,9 @@ CREATE TABLE oauth_tokens ( allow_write_api boolean DEFAULT false NOT NULL, allow_read_gpx boolean DEFAULT false NOT NULL, allow_write_gpx boolean DEFAULT false NOT NULL, - callback_url character varying, + callback_url character varying(255), verifier character varying(20), - scope character varying, + scope character varying(255), valid_to timestamp without time zone, allow_write_notes boolean DEFAULT false NOT NULL ); @@ -887,15 +901,15 @@ ALTER SEQUENCE oauth_tokens_id_seq OWNED BY oauth_tokens.id; -- --- Name: redactions; Type: TABLE; Schema: public; Owner: -; Tablespace: +-- Name: redactions; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE redactions ( id integer NOT NULL, - title character varying, + title character varying(255), description text, - created_at timestamp without time zone, - updated_at timestamp without time zone, + created_at timestamp without time zone NOT NULL, + updated_at timestamp without time zone NOT NULL, user_id bigint NOT NULL, description_format format_enum DEFAULT 'markdown'::format_enum NOT NULL ); @@ -921,33 +935,33 @@ ALTER SEQUENCE redactions_id_seq OWNED BY redactions.id; -- --- Name: relation_members; Type: TABLE; Schema: public; Owner: -; Tablespace: +-- Name: relation_members; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE relation_members ( relation_id bigint DEFAULT 0 NOT NULL, member_type nwr_enum NOT NULL, member_id bigint NOT NULL, - member_role character varying NOT NULL, + member_role character varying(255) NOT NULL, version bigint DEFAULT 0 NOT NULL, sequence_id integer DEFAULT 0 NOT NULL ); -- --- Name: relation_tags; Type: TABLE; Schema: public; Owner: -; Tablespace: +-- Name: relation_tags; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE relation_tags ( relation_id bigint DEFAULT 0 NOT NULL, - k character varying DEFAULT ''::character varying NOT NULL, - v character varying DEFAULT ''::character varying NOT NULL, + k character varying(255) DEFAULT ''::character varying NOT NULL, + v character varying(255) DEFAULT ''::character varying NOT NULL, version bigint NOT NULL ); -- --- Name: relations; Type: TABLE; Schema: public; Owner: -; Tablespace: +-- Name: relations; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE relations ( @@ -961,16 +975,16 @@ CREATE TABLE relations ( -- --- Name: schema_migrations; Type: TABLE; Schema: public; Owner: -; Tablespace: +-- Name: schema_migrations; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE schema_migrations ( - version character varying NOT NULL + version character varying(255) NOT NULL ); -- --- Name: user_blocks; Type: TABLE; Schema: public; Owner: -; Tablespace: +-- Name: user_blocks; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE user_blocks ( @@ -1007,26 +1021,26 @@ ALTER SEQUENCE user_blocks_id_seq OWNED BY user_blocks.id; -- --- Name: user_preferences; Type: TABLE; Schema: public; Owner: -; Tablespace: +-- Name: user_preferences; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE user_preferences ( user_id bigint NOT NULL, - k character varying NOT NULL, - v character varying NOT NULL + k character varying(255) NOT NULL, + v character varying(255) NOT NULL ); -- --- Name: user_roles; Type: TABLE; Schema: public; Owner: -; Tablespace: +-- Name: user_roles; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE user_roles ( id integer NOT NULL, user_id bigint NOT NULL, - role user_role_enum NOT NULL, created_at timestamp without time zone, updated_at timestamp without time zone, + role user_role_enum NOT NULL, granter_id bigint NOT NULL ); @@ -1051,13 +1065,13 @@ ALTER SEQUENCE user_roles_id_seq OWNED BY user_roles.id; -- --- Name: user_tokens; Type: TABLE; Schema: public; Owner: -; Tablespace: +-- Name: user_tokens; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE user_tokens ( id bigint NOT NULL, user_id bigint NOT NULL, - token character varying NOT NULL, + token character varying(255) NOT NULL, expiry timestamp without time zone NOT NULL, referer text ); @@ -1083,40 +1097,40 @@ ALTER SEQUENCE user_tokens_id_seq OWNED BY user_tokens.id; -- --- Name: users; Type: TABLE; Schema: public; Owner: -; Tablespace: +-- Name: users; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE users ( - email character varying NOT NULL, + email character varying(255) NOT NULL, id bigint NOT NULL, - pass_crypt character varying NOT NULL, + pass_crypt character varying(255) NOT NULL, creation_time timestamp without time zone NOT NULL, - display_name character varying DEFAULT ''::character varying NOT NULL, + display_name character varying(255) DEFAULT ''::character varying NOT NULL, data_public boolean DEFAULT false NOT NULL, description text DEFAULT ''::text NOT NULL, home_lat double precision, home_lon double precision, home_zoom smallint DEFAULT 3, nearby integer DEFAULT 50, - pass_salt character varying, + pass_salt character varying(255), image_file_name text, email_valid boolean DEFAULT false NOT NULL, - new_email character varying, - creation_ip character varying, - languages character varying, + new_email character varying(255), + creation_ip character varying(255), + languages character varying(255), status user_status_enum DEFAULT 'pending'::user_status_enum NOT NULL, terms_agreed timestamp without time zone, consider_pd boolean DEFAULT false NOT NULL, - auth_uid character varying, - preferred_editor character varying, + preferred_editor character varying(255), terms_seen boolean DEFAULT false NOT NULL, + auth_uid character varying(255), description_format format_enum DEFAULT 'markdown'::format_enum NOT NULL, - image_fingerprint character varying, + image_fingerprint character varying(255), changesets_count integer DEFAULT 0 NOT NULL, traces_count integer DEFAULT 0 NOT NULL, diary_entries_count integer DEFAULT 0 NOT NULL, - image_use_gravatar boolean DEFAULT true NOT NULL, - image_content_type character varying, + image_use_gravatar boolean DEFAULT false NOT NULL, + image_content_type character varying(255), auth_provider character varying ); @@ -1141,7 +1155,7 @@ ALTER SEQUENCE users_id_seq OWNED BY users.id; -- --- Name: way_nodes; Type: TABLE; Schema: public; Owner: -; Tablespace: +-- Name: way_nodes; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE way_nodes ( @@ -1153,19 +1167,19 @@ CREATE TABLE way_nodes ( -- --- Name: way_tags; Type: TABLE; Schema: public; Owner: -; Tablespace: +-- Name: way_tags; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE way_tags ( way_id bigint DEFAULT 0 NOT NULL, - k character varying NOT NULL, - v character varying NOT NULL, + k character varying(255) NOT NULL, + v character varying(255) NOT NULL, version bigint NOT NULL ); -- --- Name: ways; Type: TABLE; Schema: public; Owner: -; Tablespace: +-- Name: ways; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE ways ( @@ -1333,7 +1347,7 @@ ALTER TABLE ONLY users ALTER COLUMN id SET DEFAULT nextval('users_id_seq'::regcl -- --- Name: acls_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: +-- Name: acls_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY acls @@ -1341,7 +1355,7 @@ ALTER TABLE ONLY acls -- --- Name: changeset_comments_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: +-- Name: changeset_comments_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY changeset_comments @@ -1349,7 +1363,7 @@ ALTER TABLE ONLY changeset_comments -- --- Name: changesets_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: +-- Name: changesets_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY changesets @@ -1357,7 +1371,7 @@ ALTER TABLE ONLY changesets -- --- Name: client_applications_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: +-- Name: client_applications_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY client_applications @@ -1365,7 +1379,7 @@ ALTER TABLE ONLY client_applications -- --- Name: current_node_tags_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: +-- Name: current_node_tags_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY current_node_tags @@ -1373,7 +1387,7 @@ ALTER TABLE ONLY current_node_tags -- --- Name: current_nodes_pkey1; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: +-- Name: current_nodes_pkey1; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY current_nodes @@ -1381,7 +1395,7 @@ ALTER TABLE ONLY current_nodes -- --- Name: current_relation_members_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: +-- Name: current_relation_members_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY current_relation_members @@ -1389,7 +1403,7 @@ ALTER TABLE ONLY current_relation_members -- --- Name: current_relation_tags_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: +-- Name: current_relation_tags_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY current_relation_tags @@ -1397,7 +1411,7 @@ ALTER TABLE ONLY current_relation_tags -- --- Name: current_relations_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: +-- Name: current_relations_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY current_relations @@ -1405,7 +1419,7 @@ ALTER TABLE ONLY current_relations -- --- Name: current_way_nodes_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: +-- Name: current_way_nodes_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY current_way_nodes @@ -1413,7 +1427,7 @@ ALTER TABLE ONLY current_way_nodes -- --- Name: current_way_tags_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: +-- Name: current_way_tags_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY current_way_tags @@ -1421,7 +1435,7 @@ ALTER TABLE ONLY current_way_tags -- --- Name: current_ways_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: +-- Name: current_ways_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY current_ways @@ -1429,7 +1443,7 @@ ALTER TABLE ONLY current_ways -- --- Name: diary_comments_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: +-- Name: diary_comments_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY diary_comments @@ -1437,7 +1451,7 @@ ALTER TABLE ONLY diary_comments -- --- Name: diary_entries_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: +-- Name: diary_entries_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY diary_entries @@ -1445,7 +1459,15 @@ ALTER TABLE ONLY diary_entries -- --- Name: friends_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: +-- Name: diary_entry_subscriptions_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY diary_entry_subscriptions + ADD CONSTRAINT diary_entry_subscriptions_pkey PRIMARY KEY (user_id, diary_entry_id); + + +-- +-- Name: friends_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY friends @@ -1453,7 +1475,7 @@ ALTER TABLE ONLY friends -- --- Name: gpx_file_tags_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: +-- Name: gpx_file_tags_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY gpx_file_tags @@ -1461,7 +1483,7 @@ ALTER TABLE ONLY gpx_file_tags -- --- Name: gpx_files_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: +-- Name: gpx_files_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY gpx_files @@ -1469,7 +1491,7 @@ ALTER TABLE ONLY gpx_files -- --- Name: languages_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: +-- Name: languages_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY languages @@ -1477,7 +1499,7 @@ ALTER TABLE ONLY languages -- --- Name: messages_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: +-- Name: messages_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY messages @@ -1485,7 +1507,7 @@ ALTER TABLE ONLY messages -- --- Name: node_tags_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: +-- Name: node_tags_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY node_tags @@ -1493,7 +1515,7 @@ ALTER TABLE ONLY node_tags -- --- Name: nodes_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: +-- Name: nodes_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY nodes @@ -1501,7 +1523,7 @@ ALTER TABLE ONLY nodes -- --- Name: note_comments_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: +-- Name: note_comments_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY note_comments @@ -1509,7 +1531,7 @@ ALTER TABLE ONLY note_comments -- --- Name: notes_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: +-- Name: notes_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY notes @@ -1517,7 +1539,7 @@ ALTER TABLE ONLY notes -- --- Name: oauth_nonces_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: +-- Name: oauth_nonces_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY oauth_nonces @@ -1525,7 +1547,7 @@ ALTER TABLE ONLY oauth_nonces -- --- Name: oauth_tokens_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: +-- Name: oauth_tokens_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY oauth_tokens @@ -1533,7 +1555,7 @@ ALTER TABLE ONLY oauth_tokens -- --- Name: redactions_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: +-- Name: redactions_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY redactions @@ -1541,7 +1563,7 @@ ALTER TABLE ONLY redactions -- --- Name: relation_members_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: +-- Name: relation_members_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY relation_members @@ -1549,7 +1571,7 @@ ALTER TABLE ONLY relation_members -- --- Name: relation_tags_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: +-- Name: relation_tags_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY relation_tags @@ -1557,7 +1579,7 @@ ALTER TABLE ONLY relation_tags -- --- Name: relations_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: +-- Name: relations_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY relations @@ -1565,7 +1587,7 @@ ALTER TABLE ONLY relations -- --- Name: user_blocks_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: +-- Name: user_blocks_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY user_blocks @@ -1573,7 +1595,7 @@ ALTER TABLE ONLY user_blocks -- --- Name: user_preferences_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: +-- Name: user_preferences_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY user_preferences @@ -1581,7 +1603,7 @@ ALTER TABLE ONLY user_preferences -- --- Name: user_roles_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: +-- Name: user_roles_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY user_roles @@ -1589,7 +1611,7 @@ ALTER TABLE ONLY user_roles -- --- Name: user_tokens_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: +-- Name: user_tokens_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY user_tokens @@ -1597,7 +1619,7 @@ ALTER TABLE ONLY user_tokens -- --- Name: users_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: +-- Name: users_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY users @@ -1605,7 +1627,7 @@ ALTER TABLE ONLY users -- --- Name: way_nodes_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: +-- Name: way_nodes_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY way_nodes @@ -1613,7 +1635,7 @@ ALTER TABLE ONLY way_nodes -- --- Name: way_tags_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: +-- Name: way_tags_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY way_tags @@ -1621,7 +1643,7 @@ ALTER TABLE ONLY way_tags -- --- Name: ways_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: +-- Name: ways_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY ways @@ -1629,420 +1651,427 @@ ALTER TABLE ONLY ways -- --- Name: acls_k_idx; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- Name: acls_k_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX acls_k_idx ON acls USING btree (k); -- --- Name: changeset_tags_id_idx; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- Name: changeset_tags_id_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX changeset_tags_id_idx ON changeset_tags USING btree (changeset_id); -- --- Name: changesets_bbox_idx; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- Name: changesets_bbox_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX changesets_bbox_idx ON changesets USING gist (min_lat, max_lat, min_lon, max_lon); -- --- Name: changesets_closed_at_idx; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- Name: changesets_closed_at_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX changesets_closed_at_idx ON changesets USING btree (closed_at); -- --- Name: changesets_created_at_idx; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- Name: changesets_created_at_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX changesets_created_at_idx ON changesets USING btree (created_at); -- --- Name: changesets_user_id_created_at_idx; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- Name: changesets_user_id_created_at_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX changesets_user_id_created_at_idx ON changesets USING btree (user_id, created_at); -- --- Name: changesets_user_id_id_idx; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- Name: changesets_user_id_id_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX changesets_user_id_id_idx ON changesets USING btree (user_id, id); -- --- Name: current_nodes_tile_idx; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- Name: current_nodes_tile_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX current_nodes_tile_idx ON current_nodes USING btree (tile); -- --- Name: current_nodes_timestamp_idx; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- Name: current_nodes_timestamp_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX current_nodes_timestamp_idx ON current_nodes USING btree ("timestamp"); -- --- Name: current_relation_members_member_idx; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- Name: current_relation_members_member_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX current_relation_members_member_idx ON current_relation_members USING btree (member_type, member_id); -- --- Name: current_relations_timestamp_idx; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- Name: current_relations_timestamp_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX current_relations_timestamp_idx ON current_relations USING btree ("timestamp"); -- --- Name: current_way_nodes_node_idx; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- Name: current_way_nodes_node_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX current_way_nodes_node_idx ON current_way_nodes USING btree (node_id); -- --- Name: current_ways_timestamp_idx; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- Name: current_ways_timestamp_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX current_ways_timestamp_idx ON current_ways USING btree ("timestamp"); -- --- Name: diary_comment_user_id_created_at_index; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- Name: diary_comment_user_id_created_at_index; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX diary_comment_user_id_created_at_index ON diary_comments USING btree (user_id, created_at); -- --- Name: diary_comments_entry_id_idx; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- Name: diary_comments_entry_id_idx; Type: INDEX; Schema: public; Owner: - -- CREATE UNIQUE INDEX diary_comments_entry_id_idx ON diary_comments USING btree (diary_entry_id, id); -- --- Name: diary_entry_created_at_index; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- Name: diary_entry_created_at_index; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX diary_entry_created_at_index ON diary_entries USING btree (created_at); -- --- Name: diary_entry_language_code_created_at_index; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- Name: diary_entry_language_code_created_at_index; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX diary_entry_language_code_created_at_index ON diary_entries USING btree (language_code, created_at); -- --- Name: diary_entry_user_id_created_at_index; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- Name: diary_entry_user_id_created_at_index; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX diary_entry_user_id_created_at_index ON diary_entries USING btree (user_id, created_at); -- --- Name: friends_user_id_idx; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- Name: friends_user_id_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX friends_user_id_idx ON friends USING btree (user_id); -- --- Name: gpx_file_tags_gpxid_idx; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- Name: gpx_file_tags_gpxid_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX gpx_file_tags_gpxid_idx ON gpx_file_tags USING btree (gpx_id); -- --- Name: gpx_file_tags_tag_idx; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- Name: gpx_file_tags_tag_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX gpx_file_tags_tag_idx ON gpx_file_tags USING btree (tag); -- --- Name: gpx_files_timestamp_idx; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- Name: gpx_files_timestamp_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX gpx_files_timestamp_idx ON gpx_files USING btree ("timestamp"); -- --- Name: gpx_files_user_id_idx; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- Name: gpx_files_user_id_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX gpx_files_user_id_idx ON gpx_files USING btree (user_id); -- --- Name: gpx_files_visible_visibility_idx; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- Name: gpx_files_visible_visibility_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX gpx_files_visible_visibility_idx ON gpx_files USING btree (visible, visibility); -- --- Name: index_changeset_comments_on_created_at; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- Name: index_changeset_comments_on_created_at; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX index_changeset_comments_on_created_at ON changeset_comments USING btree (created_at); -- --- Name: index_changesets_subscribers_on_changeset_id; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- Name: index_changesets_subscribers_on_changeset_id; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX index_changesets_subscribers_on_changeset_id ON changesets_subscribers USING btree (changeset_id); -- --- Name: index_changesets_subscribers_on_subscriber_id_and_changeset_id; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- Name: index_changesets_subscribers_on_subscriber_id_and_changeset_id; Type: INDEX; Schema: public; Owner: - -- CREATE UNIQUE INDEX index_changesets_subscribers_on_subscriber_id_and_changeset_id ON changesets_subscribers USING btree (subscriber_id, changeset_id); -- --- Name: index_client_applications_on_key; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- Name: index_client_applications_on_key; Type: INDEX; Schema: public; Owner: - -- CREATE UNIQUE INDEX index_client_applications_on_key ON client_applications USING btree (key); -- --- Name: index_note_comments_on_body; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- Name: index_diary_entry_subscriptions_on_diary_entry_id; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX index_diary_entry_subscriptions_on_diary_entry_id ON diary_entry_subscriptions USING btree (diary_entry_id); + + +-- +-- Name: index_note_comments_on_body; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX index_note_comments_on_body ON note_comments USING gin (to_tsvector('english'::regconfig, body)); -- --- Name: index_note_comments_on_created_at; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- Name: index_note_comments_on_created_at; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX index_note_comments_on_created_at ON note_comments USING btree (created_at); -- --- Name: index_oauth_nonces_on_nonce_and_timestamp; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- Name: index_oauth_nonces_on_nonce_and_timestamp; Type: INDEX; Schema: public; Owner: - -- CREATE UNIQUE INDEX index_oauth_nonces_on_nonce_and_timestamp ON oauth_nonces USING btree (nonce, "timestamp"); -- --- Name: index_oauth_tokens_on_token; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- Name: index_oauth_tokens_on_token; Type: INDEX; Schema: public; Owner: - -- CREATE UNIQUE INDEX index_oauth_tokens_on_token ON oauth_tokens USING btree (token); -- --- Name: index_user_blocks_on_user_id; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- Name: index_user_blocks_on_user_id; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX index_user_blocks_on_user_id ON user_blocks USING btree (user_id); -- --- Name: messages_from_user_id_idx; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- Name: messages_from_user_id_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX messages_from_user_id_idx ON messages USING btree (from_user_id); -- --- Name: messages_to_user_id_idx; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- Name: messages_to_user_id_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX messages_to_user_id_idx ON messages USING btree (to_user_id); -- --- Name: nodes_changeset_id_idx; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- Name: nodes_changeset_id_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX nodes_changeset_id_idx ON nodes USING btree (changeset_id); -- --- Name: nodes_tile_idx; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- Name: nodes_tile_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX nodes_tile_idx ON nodes USING btree (tile); -- --- Name: nodes_timestamp_idx; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- Name: nodes_timestamp_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX nodes_timestamp_idx ON nodes USING btree ("timestamp"); -- --- Name: note_comments_note_id_idx; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- Name: note_comments_note_id_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX note_comments_note_id_idx ON note_comments USING btree (note_id); -- --- Name: notes_created_at_idx; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- Name: notes_created_at_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX notes_created_at_idx ON notes USING btree (created_at); -- --- Name: notes_tile_status_idx; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- Name: notes_tile_status_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX notes_tile_status_idx ON notes USING btree (tile, status); -- --- Name: notes_updated_at_idx; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- Name: notes_updated_at_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX notes_updated_at_idx ON notes USING btree (updated_at); -- --- Name: points_gpxid_idx; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- Name: points_gpxid_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX points_gpxid_idx ON gps_points USING btree (gpx_id); -- --- Name: points_tile_idx; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- Name: points_tile_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX points_tile_idx ON gps_points USING btree (tile); -- --- Name: relation_members_member_idx; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- Name: relation_members_member_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX relation_members_member_idx ON relation_members USING btree (member_type, member_id); -- --- Name: relations_changeset_id_idx; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- Name: relations_changeset_id_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX relations_changeset_id_idx ON relations USING btree (changeset_id); -- --- Name: relations_timestamp_idx; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- Name: relations_timestamp_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX relations_timestamp_idx ON relations USING btree ("timestamp"); -- --- Name: unique_schema_migrations; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- Name: unique_schema_migrations; Type: INDEX; Schema: public; Owner: - -- CREATE UNIQUE INDEX unique_schema_migrations ON schema_migrations USING btree (version); -- --- Name: user_id_idx; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- Name: user_id_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX user_id_idx ON friends USING btree (friend_user_id); -- --- Name: user_roles_id_role_unique; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- Name: user_roles_id_role_unique; Type: INDEX; Schema: public; Owner: - -- CREATE UNIQUE INDEX user_roles_id_role_unique ON user_roles USING btree (user_id, role); -- --- Name: user_tokens_token_idx; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- Name: user_tokens_token_idx; Type: INDEX; Schema: public; Owner: - -- CREATE UNIQUE INDEX user_tokens_token_idx ON user_tokens USING btree (token); -- --- Name: user_tokens_user_id_idx; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- Name: user_tokens_user_id_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX user_tokens_user_id_idx ON user_tokens USING btree (user_id); -- --- Name: users_auth_idx; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- Name: users_auth_idx; Type: INDEX; Schema: public; Owner: - -- CREATE UNIQUE INDEX users_auth_idx ON users USING btree (auth_provider, auth_uid); -- --- Name: users_display_name_idx; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- Name: users_display_name_idx; Type: INDEX; Schema: public; Owner: - -- CREATE UNIQUE INDEX users_display_name_idx ON users USING btree (display_name); -- --- Name: users_display_name_lower_idx; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- Name: users_display_name_lower_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX users_display_name_lower_idx ON users USING btree (lower((display_name)::text)); -- --- Name: users_email_idx; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- Name: users_email_idx; Type: INDEX; Schema: public; Owner: - -- CREATE UNIQUE INDEX users_email_idx ON users USING btree (email); -- --- Name: users_email_lower_idx; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- Name: users_email_lower_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX users_email_lower_idx ON users USING btree (lower((email)::text)); -- --- Name: way_nodes_node_idx; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- Name: way_nodes_node_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX way_nodes_node_idx ON way_nodes USING btree (node_id); -- --- Name: ways_changeset_id_idx; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- Name: ways_changeset_id_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX ways_changeset_id_idx ON ways USING btree (changeset_id); -- --- Name: ways_timestamp_idx; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- Name: ways_timestamp_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX ways_timestamp_idx ON ways USING btree ("timestamp"); @@ -2208,6 +2237,22 @@ ALTER TABLE ONLY diary_entries ADD CONSTRAINT diary_entries_user_id_fkey FOREIGN KEY (user_id) REFERENCES users(id); +-- +-- Name: diary_entry_subscriptions_diary_entry_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY diary_entry_subscriptions + ADD CONSTRAINT diary_entry_subscriptions_diary_entry_id_fkey FOREIGN KEY (diary_entry_id) REFERENCES diary_entries(id); + + +-- +-- Name: diary_entry_subscriptions_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY diary_entry_subscriptions + ADD CONSTRAINT diary_entry_subscriptions_user_id_fkey FOREIGN KEY (user_id) REFERENCES users(id); + + -- -- Name: friends_friend_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- @@ -2452,7 +2497,7 @@ ALTER TABLE ONLY ways -- PostgreSQL database dump complete -- -SET search_path TO "$user",public; +SET search_path TO "$user", public; INSERT INTO schema_migrations (version) VALUES ('1'); @@ -2548,6 +2593,12 @@ INSERT INTO schema_migrations (version) VALUES ('20150111192335'); INSERT INTO schema_migrations (version) VALUES ('20150222101847'); +INSERT INTO schema_migrations (version) VALUES ('20150818224516'); + +INSERT INTO schema_migrations (version) VALUES ('20161002153425'); + +INSERT INTO schema_migrations (version) VALUES ('20161011010929'); + INSERT INTO schema_migrations (version) VALUES ('21'); INSERT INTO schema_migrations (version) VALUES ('22'); diff --git a/lib/auth.rb b/lib/auth.rb index 636173928..434994329 100644 --- a/lib/auth.rb +++ b/lib/auth.rb @@ -1,6 +1,9 @@ module Auth - PROVIDERS = { "None" => "", "OpenID" => "openid" } - PROVIDERS["Google"] = "google" if defined?(GOOGLE_AUTH_ID) - PROVIDERS["Facebook"] = "facebook" if defined?(FACEBOOK_AUTH_ID) - PROVIDERS["Windows Live"] = "windowslive" if defined?(WINDOWSLIVE_AUTH_ID) + PROVIDERS = { "None" => "", "OpenID" => "openid" }.tap do |providers| + providers["Google"] = "google" if defined?(GOOGLE_AUTH_ID) + providers["Facebook"] = "facebook" if defined?(FACEBOOK_AUTH_ID) + providers["Windows Live"] = "windowslive" if defined?(WINDOWSLIVE_AUTH_ID) + providers["GitHub"] = "github" if defined?(GITHUB_AUTH_ID) + providers["Wikipedia"] = "wikipedia" if defined?(WIKIPEDIA_AUTH_ID) + end.freeze end diff --git a/lib/bounding_box.rb b/lib/bounding_box.rb index e2dfcd3ff..11e831cfe 100644 --- a/lib/bounding_box.rb +++ b/lib/bounding_box.rb @@ -6,8 +6,6 @@ class BoundingBox SCALED_LON_LIMIT = LON_LIMIT * GeoRecord::SCALE SCALED_LAT_LIMIT = LAT_LIMIT * GeoRecord::SCALE - public - def initialize(min_lon, min_lat, max_lon, max_lat) @min_lon = min_lon.to_f unless min_lon.nil? @min_lat = min_lat.to_f unless min_lat.nil? @@ -45,14 +43,22 @@ class BoundingBox # only try to expand the bbox if there is a value for every coordinate # which there will be from the previous line as long as array does not contain a nil if bbox.complete? - @min_lon = [-SCALED_LON_LIMIT, - bbox.min_lon + margin * (min_lon - max_lon)].max if bbox.min_lon < min_lon - @min_lat = [-SCALED_LAT_LIMIT, - bbox.min_lat + margin * (min_lat - max_lat)].max if bbox.min_lat < min_lat - @max_lon = [+SCALED_LON_LIMIT, - bbox.max_lon + margin * (max_lon - min_lon)].min if bbox.max_lon > max_lon - @max_lat = [+SCALED_LAT_LIMIT, - bbox.max_lat + margin * (max_lat - min_lat)].min if bbox.max_lat > max_lat + if bbox.min_lon < min_lon + @min_lon = [-SCALED_LON_LIMIT, + bbox.min_lon + margin * (min_lon - max_lon)].max + end + if bbox.min_lat < min_lat + @min_lat = [-SCALED_LAT_LIMIT, + bbox.min_lat + margin * (min_lat - max_lat)].max + end + if bbox.max_lon > max_lon + @max_lon = [+SCALED_LON_LIMIT, + bbox.max_lon + margin * (max_lon - min_lon)].min + end + if bbox.max_lat > max_lat + @max_lat = [+SCALED_LAT_LIMIT, + bbox.max_lat + margin * (max_lat - min_lat)].min + end end self end @@ -60,15 +66,17 @@ class BoundingBox def check_boundaries # check the bbox is sane if min_lon > max_lon - fail OSM::APIBadBoundingBox.new( - "The minimum longitude must be less than the maximum longitude, but it wasn't") + raise OSM::APIBadBoundingBox.new( + "The minimum longitude must be less than the maximum longitude, but it wasn't" + ) end if min_lat > max_lat - fail OSM::APIBadBoundingBox.new( - "The minimum latitude must be less than the maximum latitude, but it wasn't") + raise OSM::APIBadBoundingBox.new( + "The minimum latitude must be less than the maximum latitude, but it wasn't" + ) end if min_lon < -LON_LIMIT || min_lat < -LAT_LIMIT || max_lon > +LON_LIMIT || max_lat > +LAT_LIMIT - fail OSM::APIBadBoundingBox.new("The latitudes must be between #{-LAT_LIMIT} and #{LAT_LIMIT}," + + raise OSM::APIBadBoundingBox.new("The latitudes must be between #{-LAT_LIMIT} and #{LAT_LIMIT}," + " and longitudes between #{-LON_LIMIT} and #{LON_LIMIT}") end self @@ -77,7 +85,7 @@ class BoundingBox def check_size(max_area = MAX_REQUEST_AREA) # check the bbox isn't too large if area > max_area - fail OSM::APIBadBoundingBox.new("The maximum bbox size is " + max_area.to_s + + raise OSM::APIBadBoundingBox.new("The maximum bbox size is " + max_area.to_s + ", and your request was too large. Either request a smaller area, or use planet.osm") end self @@ -158,20 +166,23 @@ class BoundingBox "#{min_lon},#{min_lat},#{max_lon},#{max_lat}" end - private - - def self.from_bbox_array(bbox_array) - unless bbox_array - fail OSM::APIBadUserInput.new( - "The parameter bbox is required, and must be of the form min_lon,min_lat,max_lon,max_lat") + class << self + private + + def from_bbox_array(bbox_array) + unless bbox_array + raise OSM::APIBadUserInput.new( + "The parameter bbox is required, and must be of the form min_lon,min_lat,max_lon,max_lat" + ) + end + # Take an array of length 4, create a bounding box with min_lon, min_lat, max_lon and + # max_lat within their respective boundaries. + min_lon = [[bbox_array[0].to_f, -LON_LIMIT].max, +LON_LIMIT].min + min_lat = [[bbox_array[1].to_f, -LAT_LIMIT].max, +LAT_LIMIT].min + max_lon = [[bbox_array[2].to_f, +LON_LIMIT].min, -LON_LIMIT].max + max_lat = [[bbox_array[3].to_f, +LAT_LIMIT].min, -LAT_LIMIT].max + BoundingBox.new(min_lon, min_lat, max_lon, max_lat) end - # Take an array of length 4, create a bounding box with min_lon, min_lat, max_lon and - # max_lat within their respective boundaries. - min_lon = [[bbox_array[0].to_f, -LON_LIMIT].max, +LON_LIMIT].min - min_lat = [[bbox_array[1].to_f, -LAT_LIMIT].max, +LAT_LIMIT].min - max_lon = [[bbox_array[2].to_f, +LON_LIMIT].min, -LON_LIMIT].max - max_lat = [[bbox_array[3].to_f, +LAT_LIMIT].min, -LAT_LIMIT].max - BoundingBox.new(min_lon, min_lat, max_lon, max_lat) end def update!(bbox) diff --git a/lib/classic_pagination/pagination.rb b/lib/classic_pagination/pagination.rb index b48844000..f12ff095f 100644 --- a/lib/classic_pagination/pagination.rb +++ b/lib/classic_pagination/pagination.rb @@ -61,7 +61,7 @@ module ActionController DEFAULT_OPTIONS[:group] = nil else # A hash holding options for controllers using macro-style pagination - OPTIONS = {} + OPTIONS = {}.freeze # The default options for pagination DEFAULT_OPTIONS = { @@ -78,7 +78,7 @@ module ActionController :select => nil, :group => nil, :parameter => "page" - } + }.freeze end def self.included(base) #:nodoc: @@ -93,9 +93,10 @@ module ActionController valid_options << :actions unless in_action unknown_option_keys = options.keys - valid_options - fail ActionController::ActionControllerError, - "Unknown options: #{unknown_option_keys.join(', ')}" unless - unknown_option_keys.empty? + unless unknown_option_keys.empty? + raise ActionController::ActionControllerError, + "Unknown options: #{unknown_option_keys.join(', ')}" + end options[:singular_name] ||= ActiveSupport::Inflector.singularize(collection_id.to_s) options[:class_name] ||= ActiveSupport::Inflector.camelize(options[:singular_name]) @@ -155,8 +156,7 @@ module ActionController def create_paginators_and_retrieve_collections #:nodoc: Pagination::OPTIONS[self.class].each do |collection_id, options| - next unless options[:actions].include? action_name if - options[:actions] + next if options[:actions] && !options[:actions].include?(action_name) paginator, collection = paginator_and_collection_for(collection_id, options) @@ -226,7 +226,7 @@ module ActionController # than or equal to zero). The page CGI parameter for links defaults to # "page" and can be overridden with +page_parameter+. def initialize(controller, item_count, items_per_page, current_page = 1) - fail ArgumentError, "must have at least one item per page" if + raise ArgumentError, "must have at least one item per page" if items_per_page <= 0 @controller = controller @@ -243,7 +243,7 @@ module ActionController # not belong to this Paginator, an ArgumentError is raised. def current_page=(page) if page.is_a? Page - fail ArgumentError, "Page/Paginator mismatch" unless + raise ArgumentError, "Page/Paginator mismatch" unless page.paginator == self end page = page.to_i @@ -254,19 +254,19 @@ module ActionController def current_page @current_page ||= self[@current_page_number] end - alias_method :current, :current_page + alias current current_page # Returns a new Page representing the first page in this paginator. def first_page @first_page ||= self[1] end - alias_method :first, :first_page + alias first first_page # Returns a new Page representing the last page in this paginator. def last_page @last_page ||= self[page_count] end - alias_method :last, :last_page + alias last last_page # Returns the number of pages in this paginator. def page_count @@ -274,11 +274,11 @@ module ActionController 1 else q, r = @item_count.divmod(@items_per_page) - r == 0 ? q : q + 1 + r.zero? ? q : q + 1 end end - alias_method :length, :page_count + alias length page_count # Returns true if this paginator contains the page of index +number+. def has_page_number?(number) @@ -311,7 +311,7 @@ module ActionController @number = 1 unless @paginator.has_page_number? @number end attr_reader :paginator, :number - alias_method :to_i, :number + alias to_i number # Compares two Page objects and returns true when they represent the # same page (i.e., their paginators are the same and they have the @@ -327,7 +327,7 @@ module ActionController # left-hand page comes after the right-hand page. Raises ArgumentError # if the pages do not belong to the same Paginator object. def <=>(other) - fail ArgumentError unless @paginator == other.paginator + raise ArgumentError unless @paginator == other.paginator @number <=> other.number end @@ -417,7 +417,7 @@ module ActionController def pages (@first.number..@last.number).to_a.collect! { |n| @paginator[n] } end - alias_method :to_a, :pages + alias to_a pages end end end diff --git a/lib/classic_pagination/pagination_helper.rb b/lib/classic_pagination/pagination_helper.rb index 238b8836e..18decb119 100644 --- a/lib/classic_pagination/pagination_helper.rb +++ b/lib/classic_pagination/pagination_helper.rb @@ -13,7 +13,7 @@ module ActionView :always_show_anchors => true, :link_to_current_page => false, :params => {} - } + }.freeze end # Creates a basic HTML link bar for the given +paginator+. Links will be created @@ -97,7 +97,7 @@ module ActionView current_page = paginator.current_page window_pages = current_page.window(options[:window_size]).pages - return if window_pages.length <= 1 unless link_to_current_page + return unless link_to_current_page || window_pages.length > 1 first = paginator.first last = paginator.last @@ -113,11 +113,11 @@ module ActionView end window_pages.each do |page| - if current_page == page && !link_to_current_page - html << page.number.to_s - else - html << yield(page.number) - end + html << if current_page == page && !link_to_current_page + page.number.to_s + else + yield(page.number) + end html << " " end diff --git a/lib/consistency_validations.rb b/lib/consistency_validations.rb index a385ae1be..0d17d2830 100644 --- a/lib/consistency_validations.rb +++ b/lib/consistency_validations.rb @@ -7,26 +7,26 @@ module ConsistencyValidations # This will throw an exception if there is an inconsistency def check_consistency(old, new, user) if new.id != old.id || new.id.nil? || old.id.nil? - fail OSM::APIPreconditionFailedError.new("New and old IDs don't match on #{new.class}. #{new.id} != #{old.id}.") + raise OSM::APIPreconditionFailedError.new("New and old IDs don't match on #{new.class}. #{new.id} != #{old.id}.") elsif new.version != old.version - fail OSM::APIVersionMismatchError.new(new.id, new.class.to_s, new.version, old.version) + raise OSM::APIVersionMismatchError.new(new.id, new.class.to_s, new.version, old.version) elsif new.changeset.nil? - fail OSM::APIChangesetMissingError.new + raise OSM::APIChangesetMissingError.new elsif new.changeset.user_id != user.id - fail OSM::APIUserChangesetMismatchError.new + raise OSM::APIUserChangesetMismatchError.new elsif !new.changeset.is_open? - fail OSM::APIChangesetAlreadyClosedError.new(new.changeset) + raise OSM::APIChangesetAlreadyClosedError.new(new.changeset) end end # This is similar to above, just some validations don't apply def check_create_consistency(new, user) if new.changeset.nil? - fail OSM::APIChangesetMissingError.new + raise OSM::APIChangesetMissingError.new elsif new.changeset.user_id != user.id - fail OSM::APIUserChangesetMismatchError.new + raise OSM::APIUserChangesetMismatchError.new elsif !new.changeset.is_open? - fail OSM::APIChangesetAlreadyClosedError.new(new.changeset) + raise OSM::APIChangesetAlreadyClosedError.new(new.changeset) end end @@ -37,11 +37,11 @@ module ConsistencyValidations # check user credentials - only the user who opened a changeset # may alter it. if changeset.nil? - fail OSM::APIChangesetMissingError.new + raise OSM::APIChangesetMissingError.new elsif user.id != changeset.user_id - fail OSM::APIUserChangesetMismatchError.new + raise OSM::APIUserChangesetMismatchError.new elsif !changeset.is_open? - fail OSM::APIChangesetAlreadyClosedError.new(changeset) + raise OSM::APIChangesetAlreadyClosedError.new(changeset) end end end diff --git a/lib/country.rb b/lib/country.rb index 48a721a49..3af7e0a21 100644 --- a/lib/country.rb +++ b/lib/country.rb @@ -9,7 +9,7 @@ class Country @max_lon = max_lon end - def self.find_by_code(code) + def self.find(code) countries[code] end diff --git a/lib/daemons/gpx_import_ctl b/lib/daemons/gpx_import_ctl index 43fb48c15..00b3a00b3 100755 --- a/lib/daemons/gpx_import_ctl +++ b/lib/daemons/gpx_import_ctl @@ -11,11 +11,13 @@ class Hash end end -options = YAML.load( +options = YAML.safe_load( ERB.new( IO.read( File.dirname(__FILE__) + "/../../config/daemons.yml" - )).result).with_symbols! + ) + ).result +).with_symbols! options[:dir_mode] = options[:dir_mode].to_sym Daemons.run File.dirname(__FILE__) + "/gpx_import.rb", options diff --git a/lib/diff_reader.rb b/lib/diff_reader.rb index 459143076..c2e7f1839 100644 --- a/lib/diff_reader.rb +++ b/lib/diff_reader.rb @@ -11,7 +11,7 @@ class DiffReader "node" => Node, "way" => Way, "relation" => Relation - } + }.freeze ## # Construct a diff reader by giving it a bunch of XML +data+ to parse @@ -57,7 +57,7 @@ class DiffReader # care of that for us. if @reader.node_type == 1 # element name = @reader.name - attributes = {} + attributes = {} if @reader.has_attributes? while @reader.move_to_next_attribute == 1 @@ -85,8 +85,10 @@ class DiffReader def with_model with_element do |model_name, _model_attributes| model = MODELS[model_name] - fail OSM::APIBadUserInput.new("Unexpected element type #{model_name}, " + - "expected node, way or relation.") if model.nil? + if model.nil? + raise OSM::APIBadUserInput.new("Unexpected element type #{model_name}, " + + "expected node, way or relation.") + end # new in libxml-ruby >= 2, expand returns an element not associated # with a document. this means that there's no encoding parameter, # which means basically nothing works. @@ -109,9 +111,9 @@ class DiffReader # Checks a few invariants. Others are checked in the model methods # such as save_ and delete_with_history. def check(model, xml, new) - fail OSM::APIBadXMLError.new(model, xml) if new.nil? + raise OSM::APIBadXMLError.new(model, xml) if new.nil? unless new.changeset_id == @changeset.id - fail OSM::APIChangesetMismatchError.new(new.changeset_id, @changeset.id) + raise OSM::APIChangesetMismatchError.new(new.changeset_id, @changeset.id) end end @@ -128,7 +130,7 @@ class DiffReader # take the first element and check that it is an osmChange element @reader.read - fail OSM::APIBadUserInput.new("Document element should be 'osmChange'.") if @reader.name != "osmChange" + raise OSM::APIBadUserInput.new("Document element should be 'osmChange'.") if @reader.name != "osmChange" result = OSM::API.new.get_xml_doc result.root.name = "diffResult" @@ -145,12 +147,12 @@ class DiffReader # when this element is saved it will get a new ID, so we save it # to produce the mapping which is sent to other elements. placeholder_id = xml["id"].to_i - fail OSM::APIBadXMLError.new(model, xml) if placeholder_id.nil? + raise OSM::APIBadXMLError.new(model, xml) if placeholder_id.nil? # check if the placeholder ID has been given before and throw # an exception if it has - we can't create the same element twice. model_sym = model.to_s.downcase.to_sym - fail OSM::APIBadUserInput.new("Placeholder IDs must be unique for created elements.") if ids[model_sym].include? placeholder_id + raise OSM::APIBadUserInput.new("Placeholder IDs must be unique for created elements.") if ids[model_sym].include? placeholder_id # some elements may have placeholders for other elements in the # diff, so we must fix these before saving the element. @@ -209,7 +211,7 @@ class DiffReader # delete doesn't have to contain a full payload, according to # the wiki docs, so we just extract the things we need. new_id = xml["id"].to_i - fail OSM::APIBadXMLError.new(model, xml, "ID attribute is required") if new_id.nil? + raise OSM::APIBadXMLError.new(model, xml, "ID attribute is required") if new_id.nil? # if the ID is a placeholder then map it to the real ID model_sym = model.to_s.downcase.to_sym @@ -250,7 +252,7 @@ class DiffReader else # no other actions to choose from, so it must be the users fault! - fail OSM::APIChangesetActionInvalid.new(action_name) + raise OSM::APIChangesetActionInvalid.new(action_name) end end diff --git a/lib/editors.rb b/lib/editors.rb index 1c5427b94..21f646228 100644 --- a/lib/editors.rb +++ b/lib/editors.rb @@ -1,4 +1,4 @@ module Editors - ALL_EDITORS = %w(potlatch potlatch2 id remote) - RECOMMENDED_EDITORS = %w(id potlatch2 remote) + ALL_EDITORS = %w(potlatch potlatch2 id remote).freeze + RECOMMENDED_EDITORS = %w(id potlatch2 remote).freeze end diff --git a/lib/gpx.rb b/lib/gpx.rb index f1c82cf92..3ec11c5c4 100644 --- a/lib/gpx.rb +++ b/lib/gpx.rb @@ -63,7 +63,7 @@ module GPX highlightgc.stroke("#000000") highlightgc.fill("#000000") - images = frames.times.collect do + images = Array(frames) do Magick::Image.new(width, height) do |image| image.background_color = "white" image.format = "GIF" @@ -81,11 +81,11 @@ module GPX if m > 0 frames.times do |n| - if n == mm - gc = highlightgc.dup - else - gc = linegc.dup - end + gc = if n == mm + highlightgc.dup + else + linegc.dup + end gc.line(px, py, oldpx, oldpy) @@ -148,13 +148,11 @@ module GPX end end - private - TrkPt = Struct.new(:segment, :latitude, :longitude, :altitude, :timestamp) do def valid? latitude && longitude && timestamp && - latitude >= -90 && latitude <= 90 && - longitude >= -180 && longitude <= 180 + latitude >= -90 && latitude <= 90 && + longitude >= -180 && longitude <= 180 end end end diff --git a/lib/id.rb b/lib/id.rb index 15f918e79..3adfecf65 100644 --- a/lib/id.rb +++ b/lib/id.rb @@ -1,3 +1,3 @@ module ID - LOCALES = Rails.root.join("vendor/assets/iD/iD/locales").entries.map { |p| p.basename.to_s[/(.*).json/] && $1 }.compact + LOCALES = Locale.list(Rails.root.join("vendor", "assets", "iD", "iD", "locales").entries.map { |p| p.basename.to_s[/(.*).json/] && Regexp.last_match(1) }.compact) end diff --git a/lib/locale.rb b/lib/locale.rb new file mode 100644 index 000000000..e10f06632 --- /dev/null +++ b/lib/locale.rb @@ -0,0 +1,44 @@ +class Locale < I18n::Locale::Tag::Rfc4646 + class List < Array + attr_reader :locales + + def initialize(tags) + super(tags.map { |tag| Locale.tag(tag) }).compact! + end + + def candidates(preferred) + preferred.expand & self + end + + def preferred(preferred) + candidates(preferred).first + end + + def expand + map(&:candidates).flatten.uniq << Locale.default + end + end + + def self.list(*tags) + List.new(tags.flatten) + end + + def self.default + tag(I18n.default_locale) + end + + def self.available + @available ||= List.new(I18n.available_locales) + end + + def candidates + [self.class.new(language, script, region, variant), + self.class.new(language, script, region), + self.class.new(language, script, nil, variant), + self.class.new(language, script), + self.class.new(language, nil, region, variant), + self.class.new(language, nil, region), + self.class.new(language, nil, nil, variant), + self.class.new(language)] + end +end diff --git a/lib/migrate.rb b/lib/migrate.rb index 9008b0a9f..21c1b2cf2 100644 --- a/lib/migrate.rb +++ b/lib/migrate.rb @@ -29,7 +29,7 @@ module ActiveRecord end def alter_primary_key(table_name, new_columns) - execute "ALTER TABLE #{quote_table_name(table_name)} DROP CONSTRAINT #{quote_table_name(table_name + "_pkey")}" + execute "ALTER TABLE #{quote_table_name(table_name)} DROP CONSTRAINT #{quote_table_name(table_name + '_pkey')}" execute "ALTER TABLE #{quote_table_name(table_name)} ADD PRIMARY KEY (#{quote_column_name(new_columns)})" end diff --git a/lib/not_redactable.rb b/lib/not_redactable.rb index fb945612a..7fe119fea 100644 --- a/lib/not_redactable.rb +++ b/lib/not_redactable.rb @@ -6,6 +6,6 @@ module NotRedactable end def redact!(_r) - fail OSM::APICannotRedactError.new + raise OSM::APICannotRedactError.new end end diff --git a/lib/osm.rb b/lib/osm.rb index 7556e631b..80b68c2a9 100644 --- a/lib/osm.rb +++ b/lib/osm.rb @@ -498,27 +498,23 @@ module OSM root["generator"] = GENERATOR root["copyright"] = COPYRIGHT_OWNER root["attribution"] = ATTRIBUTION_URL - root["license"] = LICENSE_URL + root["license"] = LICENSE_URL doc.root = root doc end end def self.ip_to_country(ip_address) - Timer.timeout(4) do - ipinfo = Quova::IpInfo.new(ip_address) if defined?(QUOVA_USERNAME) - - if ipinfo && ipinfo.status == Quova::SUCCESS - country = ipinfo.country_code - else - country = http_client.get("http://api.hostip.info/country.php?ip=#{ip_address}").body - country = "GB" if country == "UK" - end + ipinfo = geoip_database.country(ip_address) if defined?(GEOIP_DATABASE) - return country.upcase + if ipinfo + country = ipinfo.country_code2 + else + country = http_client.get("http://api.hostip.info/country.php?ip=#{ip_address}").body + country = "GB" if country == "UK" end - return nil + return country rescue StandardError return nil end @@ -526,7 +522,7 @@ module OSM def self.ip_location(ip_address) code = OSM.ip_to_country(ip_address) - if code && country = Country.find_by_code(code) + if code && country = Country.find(code) return { :minlon => country.min_lon, :minlat => country.min_lat, :maxlon => country.max_lon, :maxlat => country.max_lat } end @@ -563,8 +559,8 @@ module OSM # Return the terms and conditions text for a given country def self.legal_text_for_country(country_code) - file_name = File.join(Rails.root, "config", "legales", country_code.to_s + ".yml") - file_name = File.join(Rails.root, "config", "legales", DEFAULT_LEGALE + ".yml") unless File.exist? file_name + file_name = Rails.root.join("config", "legales", country_code.to_s + ".yml") + file_name = Rails.root.join("config", "legales", DEFAULT_LEGALE + ".yml") unless File.exist? file_name YAML.load_file(file_name) end @@ -573,8 +569,8 @@ module OSM @http_client ||= Faraday.new end - # Set the HTTP client to use - def self.http_client=(client) - @http_client = client + # Return the GeoIP database handle + def self.geoip_database + @geoip_database ||= GeoIP.new(GEOIP_DATABASE) if defined?(GEOIP_DATABASE) end end diff --git a/lib/password_hash.rb b/lib/password_hash.rb index fe618ba7a..c65df2c4f 100644 --- a/lib/password_hash.rb +++ b/lib/password_hash.rb @@ -6,8 +6,8 @@ require "digest/md5" module PasswordHash SALT_BYTE_SIZE = 32 HASH_BYTE_SIZE = 32 - PBKDF2_ITERATIONS = 1000 - DIGEST_ALGORITHM = "sha512" + PBKDF2_ITERATIONS = 10000 + DIGEST_ALGORITHM = "sha512".freeze def self.create(password) salt = SecureRandom.base64(SALT_BYTE_SIZE) @@ -45,8 +45,6 @@ module PasswordHash false end - private - def self.hash(password, salt, iterations, size, algorithm) digest = OpenSSL::Digest.new(algorithm) pbkdf2 = OpenSSL::PKCS5.pbkdf2_hmac(password, salt, iterations, size, digest) diff --git a/lib/potlatch.rb b/lib/potlatch.rb index 27ee0253b..717622762 100644 --- a/lib/potlatch.rb +++ b/lib/potlatch.rb @@ -24,15 +24,13 @@ module Potlatch # Return eight-byte double-precision float def self.getdouble(s) - a = s.read(8).unpack("G") # G big-endian, E little-endian + a = s.read(8).unpack("G") # G big-endian, E little-endian a[0] end # Return numeric array def self.getarray(s) - getlong(s).times.collect do - getvalue(s) - end + Array.new(getlong(s)) { getvalue(s) } end # Return object/hash @@ -42,23 +40,22 @@ module Potlatch break if key == "" arr[key] = getvalue(s) end - s.getbyte # skip the 9 'end of object' value + s.getbyte # skip the 9 'end of object' value arr end # Parse and get value def self.getvalue(s) case s.getbyte - when 0 then return getdouble(s) # number - when 1 then return s.getbyte # boolean - when 2 then return getstring(s) # string - when 3 then return getobject(s) # object/hash - when 5 then return nil # null - when 6 then return nil # undefined - when 8 then s.read(4) # mixedArray - return getobject(s) # | - when 10 then return getarray(s) # array - else return nil # error + when 0 then getdouble(s) # number + when 1 then s.getbyte # boolean + when 2 then getstring(s) # string + when 3 then getobject(s) # object/hash + when 5 then nil # null + when 6 then nil # undefined + when 8 then s.read(4) # mixedArray + getobject(s) # | + when 10 then getarray(s) # array end end @@ -180,21 +177,21 @@ module Potlatch presettype = "" presetcategory = "" # StringIO.open(txt) do |file| - File.open("#{Rails.root}/config/potlatch/presets.txt") do |file| - file.each_line do|line| + File.open(Rails.root.join("config", "potlatch", "presets.txt")) do |file| + file.each_line do |line| t = line.chomp if t =~ %r{(\w+)/(\w+)} - presettype = $1 - presetcategory = $2 + presettype = Regexp.last_match(1) + presetcategory = Regexp.last_match(2) presetmenus[presettype].push(presetcategory) presetnames[presettype][presetcategory] = ["(no preset)"] elsif t =~ /^([\w\s]+):\s?(.+)$/ - pre = $1 - kv = $2 + pre = Regexp.last_match(1) + kv = Regexp.last_match(2) presetnames[presettype][presetcategory].push(pre) presets[pre] = {} - kv.split(",").each do|a| - presets[pre][$1] = $2 if a =~ /^(.+)=(.*)$/ + kv.split(",").each do |a| + presets[pre][Regexp.last_match(1)] = Regexp.last_match(2) if a =~ /^(.+)=(.*)$/ end end end @@ -204,14 +201,14 @@ module Potlatch colours = {} casing = {} areas = {} - File.open("#{Rails.root}/config/potlatch/colours.txt") do |file| + File.open(Rails.root.join("config", "potlatch", "colours.txt")) do |file| file.each_line do |line| next unless line.chomp =~ /(\w+)\s+([^\s]+)\s+([^\s]+)\s+([^\s]+)/ - tag = $1 - colours[tag] = $2.hex if $2 != "-" - casing[tag] = $3.hex if $3 != "-" - areas[tag] = $4.hex if $4 != "-" + tag = Regexp.last_match(1) + colours[tag] = Regexp.last_match(2).hex if Regexp.last_match(2) != "-" + casing[tag] = Regexp.last_match(3).hex if Regexp.last_match(3) != "-" + areas[tag] = Regexp.last_match(4).hex if Regexp.last_match(4) != "-" end end @@ -219,21 +216,21 @@ module Potlatch relcolours = {} relalphas = {} relwidths = {} - File.open("#{Rails.root}/config/potlatch/relation_colours.txt") do |file| + File.open(Rails.root.join("config", "potlatch", "relation_colours.txt")) do |file| file.each_line do |line| next unless line.chomp =~ /(\w+)\s+([^\s]+)\s+([^\s]+)\s+([^\s]+)/ - tag = $1 - relcolours[tag] = $2.hex if $2 != "-" - relalphas[tag] = $3.to_i if $3 != "-" - relwidths[tag] = $4.to_i if $4 != "-" + tag = Regexp.last_match(1) + relcolours[tag] = Regexp.last_match(2).hex if Regexp.last_match(2) != "-" + relalphas[tag] = Regexp.last_match(3).to_i if Regexp.last_match(3) != "-" + relwidths[tag] = Regexp.last_match(4).to_i if Regexp.last_match(4) != "-" end end # Read POI presets icon_list = [] icon_tags = {} - File.open("#{Rails.root}/config/potlatch/icon_presets.txt") do |file| + File.open(Rails.root.join("config", "potlatch", "icon_presets.txt")) do |file| file.each_line do |line| (icon, tags) = line.chomp.split("\t") icon_list.push(icon) @@ -244,18 +241,18 @@ module Potlatch # Read auto-complete autotags = { "point" => {}, "way" => {}, "POI" => {} } - File.open("#{Rails.root}/config/potlatch/autocomplete.txt") do |file| - file.each_line do|line| + File.open(Rails.root.join("config", "potlatch", "autocomplete.txt")) do |file| + file.each_line do |line| next unless line.chomp =~ %r{^([\w:]+)/(\w+)\s+(.+)$} - tag = $1 - type = $2 - values = $3 - if values == "-" - autotags[type][tag] = [] - else - autotags[type][tag] = values.split(",").sort.reverse - end + tag = Regexp.last_match(1) + type = Regexp.last_match(2) + values = Regexp.last_match(3) + autotags[type][tag] = if values == "-" + [] + else + values.split(",").sort.reverse + end end end diff --git a/lib/potlatch2.rb b/lib/potlatch2.rb index df3b42e9e..a20a16f5b 100644 --- a/lib/potlatch2.rb +++ b/lib/potlatch2.rb @@ -14,6 +14,7 @@ module Potlatch2 "ca" => "ca", "ce" => "ce", "cs" => "cs_CZ", + "cy" => "cy", "da" => "da", "de" => "de_DE", "de-Formal" => "de-formal", @@ -41,6 +42,7 @@ module Potlatch2 "hu" => "hu", "ia" => "ia", "id" => "id", + "is" => "is", "it" => "it_IT", "ja" => "ja_JP", "ka" => "ka", @@ -73,6 +75,7 @@ module Potlatch2 "ru" => "ru", "rue" => "rue", "sah" => "sah", + "scn" => "scn", "sk" => "sk", "sl" => "sl", "sq" => "sq", @@ -92,5 +95,5 @@ module Potlatch2 "yi" => "yi", "zh" => "zh_CN", "zh-TW" => "zh_TW" - } + }.freeze end diff --git a/lib/quad_tile.rb b/lib/quad_tile.rb index 8aee1b74a..347e7a817 100644 --- a/lib/quad_tile.rb +++ b/lib/quad_tile.rb @@ -72,7 +72,7 @@ module QuadTile end end - sql.push("#{prefix}tile IN (#{single.join(',')})") if single.size > 0 + sql.push("#{prefix}tile IN (#{single.join(',')})") unless single.empty? "( " + sql.join(" OR ") + " )" end diff --git a/lib/quad_tile/quad_tile.h b/lib/quad_tile/quad_tile.h index f868ff515..86fa1802d 100644 --- a/lib/quad_tile/quad_tile.h +++ b/lib/quad_tile/quad_tile.h @@ -1,6 +1,6 @@ #include <math.h> -inline unsigned int xy2tile(unsigned int x, unsigned int y) +static inline unsigned int xy2tile(unsigned int x, unsigned int y) { unsigned int tile = 0; int i; @@ -14,12 +14,12 @@ inline unsigned int xy2tile(unsigned int x, unsigned int y) return tile; } -inline unsigned int lon2x(double lon) +static inline unsigned int lon2x(double lon) { return round((lon + 180.0) * 65535.0 / 360.0); } -inline unsigned int lat2y(double lat) +static inline unsigned int lat2y(double lat) { return round((lat + 90.0) * 65535.0 / 180.0); } diff --git a/lib/quova.rb b/lib/quova.rb deleted file mode 100644 index b09f8acea..000000000 --- a/lib/quova.rb +++ /dev/null @@ -1,65 +0,0 @@ -## -# Load required libraries -require "soap/wsdlDriver" - -## -# Monkey patch WSDL parser to stop it moaning -module WSDL - class Parser - def warn(_msg) - end - end -end - -## -# Provide interface to Quova geolocation service -module Quova - ## - # Access details for WSDL description - WSDL_URL = "https://webservices.quova.com/OnDemand/GeoPoint/v1/default.asmx?WSDL" - WSDL_USER = QUOVA_USERNAME - WSDL_PASS = QUOVA_PASSWORD - - ## - # Status codes - SUCCESS = 0 - IPV6_NO_SUPPORT = 1 - INVALID_CREDENTIALS = 2 - NOT_MAPPED = 3 - INVALID_IP_FORMAT = 4 - IP_ADDRESS_NULL = 5 - ACCESS_DENIED = 6 - QUERY_LIMIT = 7 - OUT_OF_SERVICE = 10 - - ## - # Create SOAP endpoint - @soap = SOAP::WSDLDriverFactory.new(WSDL_URL).create_rpc_driver - @soap.options["protocol.http.basic_auth"] << [WSDL_URL, WSDL_USER, WSDL_PASS] - - ## - # Accessor for SOAP endpoint - def self.soap - @soap - end - - ## - # Class representing geolocation details for an IP address - class IpInfo - def initialize(ip_address) - @ipinfo = Quova.soap.GetIpInfo(:ipAddress => ip_address) - end - - def status - @ipinfo["GetIpInfoResult"]["Response"]["Status"].to_i - end - - def country_code - @ipinfo["GetIpInfoResult"]["Location"]["Country"]["Name"] - end - - def country_confidence - @ipinfo["GetIpInfoResult"]["Location"]["Country"]["Confidence"] - end - end -end diff --git a/lib/redactable.rb b/lib/redactable.rb index a42164ec7..6adfec72a 100644 --- a/lib/redactable.rb +++ b/lib/redactable.rb @@ -13,10 +13,10 @@ module Redactable def redact!(redaction) # check that this version isn't the current version - fail OSM::APICannotRedactError.new if self.is_latest_version? + raise OSM::APICannotRedactError.new if is_latest_version? # make the change self.redaction = redaction - self.save! + save! end end diff --git a/lib/rich_text.rb b/lib/rich_text.rb index 7325a2a28..83eb23540 100644 --- a/lib/rich_text.rb +++ b/lib/rich_text.rb @@ -25,15 +25,15 @@ module RichText doc = Nokogiri::HTML(to_html) - if doc.content.length > 0 + if doc.content.empty? + link_proportion = 0 + else doc.xpath("//a").each do |link| link_count += 1 link_size += link.content.length end link_proportion = link_size.to_f / doc.content.length.to_f - else - link_proportion = 0 end [link_proportion - 0.2, 0.0].max * 200 + link_count * 40 @@ -80,26 +80,12 @@ module RichText end def self.html_renderer - @html_renderer ||= Renderer.new(:filter_html => true, :safe_links_only => true) + @html_renderer ||= Redcarpet::Render::XHTML.new(:filter_html => true, :safe_links_only => true, :link_attributes => { :rel => "nofollow" }) end def self.html_parser @html_parser ||= Redcarpet::Markdown.new(html_renderer, :no_intra_emphasis => true, :autolink => true, :space_after_headers => true) end - - class Renderer < Redcarpet::Render::XHTML - def link(link, _title, alt_text) - "<a rel=\"nofollow\" href=\"#{link}\">#{alt_text}</a>" - end - - def autolink(link, link_type) - if link_type == :email - "<a rel=\"nofollow\" href=\"mailto:#{link}\">#{link}</a>" - else - "<a rel=\"nofollow\" href=\"#{link}\">#{link}</a>" - end - end - end end class Text < Base diff --git a/lib/session_persistence.rb b/lib/session_persistence.rb index 2244a3e63..d4dd1cc1d 100644 --- a/lib/session_persistence.rb +++ b/lib/session_persistence.rb @@ -20,13 +20,17 @@ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. module SessionPersistence - private + class << self + private - # Install filter when we are included - def self.included(controller) - controller.after_filter :persist_session + # Install filter when we are included + def included(controller) + controller.after_filter :persist_session + end end + private + # Override this method if you don't want to use session[:_remember_for]. def session_persistence_key :_remember_for diff --git a/lib/short_link.rb b/lib/short_link.rb index ddf37b67a..ec83ce33f 100644 --- a/lib/short_link.rb +++ b/lib/short_link.rb @@ -10,78 +10,80 @@ module ShortLink # URL-friendly. ARRAY = ("A".."Z").to_a + ("a".."z").to_a + ("0".."9").to_a + ["_", "~"] - ## - # Given a string encoding a location, returns the [lon, lat, z] tuple of that - # location. - def self.decode(str) - x = 0 - y = 0 - z = 0 - z_offset = 0 + class << self + ## + # Given a string encoding a location, returns the [lon, lat, z] tuple of that + # location. + def decode(str) + x = 0 + y = 0 + z = 0 + z_offset = 0 - # keep support for old shortlinks which use the @ character, now - # replaced by the ~ character because twitter is horribly broken - # and we can't have that. - str.gsub!("@", "~") + # keep support for old shortlinks which use the @ character, now + # replaced by the ~ character because twitter is horribly broken + # and we can't have that. + str.tr!("@", "~") - str.each_char do |c| - t = ARRAY.index c - if t.nil? - z_offset -= 1 - else - 3.times do - x <<= 1 - x |= 1 unless (t & 32).zero? - t <<= 1 + str.each_char do |c| + t = ARRAY.index c + if t.nil? + z_offset -= 1 + else + 3.times do + x <<= 1 + x |= 1 unless (t & 32).zero? + t <<= 1 - y <<= 1 - y |= 1 unless (t & 32).zero? - t <<= 1 + y <<= 1 + y |= 1 unless (t & 32).zero? + t <<= 1 + end + z += 3 end - z += 3 end + # pack the coordinates out to their original 32 bits. + x <<= (32 - z) + y <<= (32 - z) + + # project the parameters back to their coordinate ranges. + [(x * 360.0 / 2**32) - 180.0, + (y * 180.0 / 2**32) - 90.0, + z - 8 - (z_offset % 3)] end - # pack the coordinates out to their original 32 bits. - x <<= (32 - z) - y <<= (32 - z) - # project the parameters back to their coordinate ranges. - [(x * 360.0 / 2**32) - 180.0, - (y * 180.0 / 2**32) - 90.0, - z - 8 - (z_offset % 3)] - end + ## + # given a location and zoom, return a short string representing it. + def encode(lon, lat, z) + code = interleave_bits(((lon + 180.0) * 2**32 / 360.0).to_i, + ((lat + 90.0) * 2**32 / 180.0).to_i) + str = "" + # add eight to the zoom level, which approximates an accuracy of + # one pixel in a tile. + ((z + 8) / 3.0).ceil.times do |i| + digit = (code >> (58 - 6 * i)) & 0x3f + str << ARRAY[digit] + end + # append characters onto the end of the string to represent + # partial zoom levels (characters themselves have a granularity + # of 3 zoom levels). + ((z + 8) % 3).times { str << "-" } - ## - # given a location and zoom, return a short string representing it. - def self.encode(lon, lat, z) - code = interleave_bits(((lon + 180.0) * 2**32 / 360.0).to_i, - ((lat + 90.0) * 2**32 / 180.0).to_i) - str = "" - # add eight to the zoom level, which approximates an accuracy of - # one pixel in a tile. - ((z + 8) / 3.0).ceil.times do |i| - digit = (code >> (58 - 6 * i)) & 0x3f - str << ARRAY[digit] + str end - # append characters onto the end of the string to represent - # partial zoom levels (characters themselves have a granularity - # of 3 zoom levels). - ((z + 8) % 3).times { str << "-" } - str - end - - private + private - ## - # interleaves the bits of two 32-bit numbers. the result is known - # as a Morton code. - def self.interleave_bits(x, y) - c = 0 - 31.downto(0) do |i| - c = (c << 1) | ((x >> i) & 1) - c = (c << 1) | ((y >> i) & 1) + ## + # interleaves the bits of two 32-bit numbers. the result is known + # as a Morton code. + def interleave_bits(x, y) + c = 0 + 31.downto(0) do |i| + c = (c << 1) | ((x >> i) & 1) + c = (c << 1) | ((y >> i) & 1) + end + c end - c end end diff --git a/lib/tasks/add_version_to_nodes.rake b/lib/tasks/add_version_to_nodes.rake index cdcf13a3e..11f639abd 100644 --- a/lib/tasks/add_version_to_nodes.rake +++ b/lib/tasks/add_version_to_nodes.rake @@ -1,6 +1,6 @@ namespace "db" do desc "Adds a version number to the nodes table" - task :node_version do + task :node_version do require File.dirname(__FILE__) + "/../../config/environment" increment = 1000 @@ -28,7 +28,7 @@ namespace "db" do temp_old_node.timestamp = node.timestamp temp_old_node.tile = node.tile temp_old_node.version = n - temp_old_node.save! || fail + temp_old_node.save! || raise n += 1 end end diff --git a/public/robots.txt b/public/robots.txt index f248bb1ed..b21e7a06e 100644 --- a/public/robots.txt +++ b/public/robots.txt @@ -17,3 +17,5 @@ Disallow: /*lat= Disallow: /*node= Disallow: /*way= Disallow: /*relation= + +Host: www.openstreetmap.org diff --git a/script/cleanup b/script/cleanup index d7f29239c..3eaeef7c6 100755 --- a/script/cleanup +++ b/script/cleanup @@ -3,5 +3,6 @@ require File.dirname(__FILE__) + "/../config/environment" UserToken.delete_all("expiry < NOW()") +OauthNonce.delete_all("timestamp < EXTRACT(EPOCH FROM NOW() - INTERVAL '1 day')") exit 0 diff --git a/script/deliver-message b/script/deliver-message index 04dcb881b..46f9642e7 100755 --- a/script/deliver-message +++ b/script/deliver-message @@ -2,26 +2,28 @@ require File.dirname(__FILE__) + "/../config/environment" -exit 0 unless recipient = ARGV[0].match(/^([cm])-(\d+)-(.*)$/) - -if recipient[1] == "c" - comment = DiaryComment.find(recipient[2]) +if recipient = ARGV[0].match(/^c-(\d+)-(\d+)-(.*)$/) + comment = DiaryComment.find(recipient[1]) digest = comment.digest - date = diary_comment.created_at - from = comment.diary_entry.user + date = comment.created_at + from = User.find(recipient[2]) to = comment.user -else - message = Message.find(recipient[2]) + token = recipient[3] +elsif recipient = ARGV[0].match(/^m-(\d+)-(.*)$/) + message = Message.find(recipient[1]) digest = message.digest date = message.sent_on from = message.recipient to = message.sender + token = recipient[2] +else + exit 0 end -exit 0 unless recipient[3] == digest[0, 6] +exit 0 unless token == digest[0, 6] exit 0 if date < 1.month.ago -message.update_attribute(:message_read, true) if message +message.update(:message_read => true) if message mail = Mail.new(STDIN.readlines.join) diff --git a/script/gravatar b/script/gravatar new file mode 100755 index 000000000..b86b79366 --- /dev/null +++ b/script/gravatar @@ -0,0 +1,17 @@ +#!/usr/bin/env ruby + +# require File.dirname(__FILE__) + "/../config/environment" + +start = 0 +User.where("image_use_gravatar AND id >=" + start.to_s).order("id").find_each do |user| + p "checked up to id " + user.id.to_s if (user.id % 1000).zero? # just give a rough indication where we are for restarting + next if user.image.present? + hash = Digest::MD5.hexdigest(user.email.downcase) + url = "https://www.gravatar.com/avatar/#{hash}?d=404" # without d=404 we will always get an image back + response = OSM.http_client.get(URI.parse(url)) + user.image_use_gravatar = response.success? + user.save + sleep(1) +end + +exit 0 diff --git a/script/rails b/script/rails index e667e55e3..9a5a81dcf 100755 --- a/script/rails +++ b/script/rails @@ -1,6 +1,6 @@ #!/usr/bin/env ruby # This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application. -APP_PATH = File.expand_path("../../config/application", __FILE__) -require File.expand_path("../../config/boot", __FILE__) +APP_PATH = File.expand_path("../../config/application", __FILE__) +require File.expand_path("../../config/boot", __FILE__) require "rails/commands" diff --git a/script/vagrant/setup/provision.sh b/script/vagrant/setup/provision.sh index 912a62958..a3cfec7f8 100644 --- a/script/vagrant/setup/provision.sh +++ b/script/vagrant/setup/provision.sh @@ -1,8 +1,11 @@ #!/usr/bin/env bash +# abort on error +set -e + # set locale to UTF-8 compatible. apologies to non-english speakers... +locale-gen en_GB.utf8 update-locale LANG=en_GB.utf8 LC_ALL=en_GB.utf8 -locale-gen export LANG=en_GB.utf8 export LC_ALL=en_GB.utf8 @@ -13,41 +16,41 @@ apt-get update apt-get upgrade -y # install packages as explained in INSTALL.md -apt-get install -y ruby1.9.1 libruby1.9.1 ruby1.9.1-dev ri1.9.1 \ - libmagickwand-dev libxml2-dev libxslt1-dev nodejs \ - apache2 apache2-threaded-dev build-essential git-core \ - postgresql postgresql-contrib libpq-dev postgresql-server-dev-all \ - libsasl2-dev -gem1.9.1 install bundle +apt-get install -y ruby2.3 libruby2.3 ruby2.3-dev \ + libmagickwand-dev libxml2-dev libxslt1-dev nodejs \ + apache2 apache2-dev build-essential git-core \ + postgresql postgresql-contrib libpq-dev postgresql-server-dev-all \ + libsasl2-dev imagemagick +gem2.3 install bundler ## install the bundle necessary for openstreetmap-website pushd /srv/openstreetmap-website # do bundle install as a convenience -sudo -u vagrant -H bundle install +sudo -u ubuntu -H bundle install --retry=10 --jobs=2 # create user and database for openstreetmap-website -db_user_exists=`sudo -u postgres psql postgres -tAc "select 1 from pg_roles where rolname='vagrant'"` +db_user_exists=`sudo -u postgres psql postgres -tAc "select 1 from pg_roles where rolname='ubuntu'"` if [ "$db_user_exists" != "1" ]; then - sudo -u postgres createuser -s vagrant - sudo -u vagrant -H createdb -E UTF-8 -O vagrant openstreetmap - sudo -u vagrant -H createdb -E UTF-8 -O vagrant osm_test + sudo -u postgres createuser -s ubuntu + sudo -u ubuntu createdb -E UTF-8 -O ubuntu openstreetmap + sudo -u ubuntu createdb -E UTF-8 -O ubuntu osm_test # add btree_gist extension - sudo -u vagrant -H psql -c "create extension btree_gist" openstreetmap - sudo -u vagrant -H psql -c "create extension btree_gist" osm_test + sudo -u ubuntu psql -c "create extension btree_gist" openstreetmap + sudo -u ubuntu psql -c "create extension btree_gist" osm_test fi # build and set up postgres extensions pushd db/functions -sudo -u vagrant make -sudo -u vagrant psql openstreetmap -c "CREATE OR REPLACE FUNCTION maptile_for_point(int8, int8, int4) RETURNS int4 AS '/srv/openstreetmap-website/db/functions/libpgosm.so', 'maptile_for_point' LANGUAGE C STRICT" -sudo -u vagrant psql openstreetmap -c "CREATE OR REPLACE FUNCTION tile_for_point(int4, int4) RETURNS int8 AS '/srv/openstreetmap-website/db/functions/libpgosm.so', 'tile_for_point' LANGUAGE C STRICT" -sudo -u vagrant psql openstreetmap -c "CREATE OR REPLACE FUNCTION xid_to_int4(xid) RETURNS int4 AS '/srv/openstreetmap-website/db/functions/libpgosm.so', 'xid_to_int4' LANGUAGE C STRICT" +sudo -u ubuntu make +sudo -u ubuntu psql openstreetmap -c "CREATE OR REPLACE FUNCTION maptile_for_point(int8, int8, int4) RETURNS int4 AS '/srv/openstreetmap-website/db/functions/libpgosm.so', 'maptile_for_point' LANGUAGE C STRICT" +sudo -u ubuntu psql openstreetmap -c "CREATE OR REPLACE FUNCTION tile_for_point(int4, int4) RETURNS int8 AS '/srv/openstreetmap-website/db/functions/libpgosm.so', 'tile_for_point' LANGUAGE C STRICT" +sudo -u ubuntu psql openstreetmap -c "CREATE OR REPLACE FUNCTION xid_to_int4(xid) RETURNS int4 AS '/srv/openstreetmap-website/db/functions/libpgosm.so', 'xid_to_int4' LANGUAGE C STRICT" popd # set up sample configs if [ ! -f config/database.yml ]; then - sudo -u vagrant cp config/example.database.yml config/database.yml + sudo -u ubuntu cp config/example.database.yml config/database.yml fi if [ ! -f config/application.yml ]; then - sudo -u vagrant cp config/example.application.yml config/application.yml + sudo -u ubuntu cp config/example.application.yml config/application.yml fi # migrate the database to the latest version -sudo -u vagrant rake db:migrate +sudo -u ubuntu rake db:migrate popd diff --git a/test/controllers/amf_controller_test.rb b/test/controllers/amf_controller_test.rb index 13f01530d..6272f6fe2 100644 --- a/test/controllers/amf_controller_test.rb +++ b/test/controllers/amf_controller_test.rb @@ -308,8 +308,7 @@ class AmfControllerTest < ActionController::TestCase # try to get version 1 v1 = ways(:way_with_versions_v2) { latest.id => "", - v1.way_id => v1.timestamp.strftime("%d %b %Y, %H:%M:%S") - }.each do |id, t| + v1.way_id => v1.timestamp.strftime("%d %b %Y, %H:%M:%S") }.each do |id, t| amf_content "getway_old", "/1", [id, t] post :amf_read assert_response :success @@ -329,10 +328,9 @@ class AmfControllerTest < ActionController::TestCase way_id = current_ways(:way_with_versions).id { "foo" => "bar", way_id => "not a date", - way_id => "2009-03-25 00:00:00", # <- wrong format - way_id => "0 Jan 2009 00:00:00", # <- invalid date - -1 => "1 Jan 2009 00:00:00" # <- invalid ID - }.each do |id, t| + way_id => "2009-03-25 00:00:00", # <- wrong format + way_id => "0 Jan 2009 00:00:00", # <- invalid date + -1 => "1 Jan 2009 00:00:00" }.each do |id, t| # <- invalid amf_content "getway_old", "/1", [id, t] post :amf_read assert_response :success @@ -352,8 +350,7 @@ class AmfControllerTest < ActionController::TestCase # try to get specific version of non-existent way [[0, ""], [0, "1 Jan 1970, 00:00:00"], - [v1.way_id, (v1.timestamp - 10).strftime("%d %b %Y, %H:%M:%S")] - ].each do |id, t| + [v1.way_id, (v1.timestamp - 10).strftime("%d %b %Y, %H:%M:%S")]].each do |id, t| amf_content "getway_old", "/1", [id, t] post :amf_read assert_response :success @@ -369,8 +366,7 @@ class AmfControllerTest < ActionController::TestCase def test_getway_old_invisible v1 = ways(:invisible_way) # try to get deleted version - [[v1.way_id, (v1.timestamp + 10).strftime("%d %b %Y, %H:%M:%S")] - ].each do |id, t| + [[v1.way_id, (v1.timestamp + 10).strftime("%d %b %Y, %H:%M:%S")]].each do |id, t| amf_content "getway_old", "/1", [id, t] post :amf_read assert_response :success @@ -464,6 +460,7 @@ class AmfControllerTest < ActionController::TestCase assert_equal -1, result[0] assert_match /must be logged in/, result[1] + create(:user_block, :user => users(:blocked_user)) amf_content "findgpx", "/1", [1, "blocked@openstreetmap.org:test"] post :amf_read assert_response :success @@ -476,7 +473,7 @@ class AmfControllerTest < ActionController::TestCase end def test_findgpx_by_id - trace = gpx_files(:anon_trace_file) + trace = create(:trace, :visibility => "private", :user => users(:public_user)) amf_content "findgpx", "/1", [trace.id, "test@example.com:test"] post :amf_read @@ -534,7 +531,10 @@ class AmfControllerTest < ActionController::TestCase def test_findrelations_by_tags visible_relation = current_relations(:visible_relation) + create(:relation_tag, :relation => visible_relation, :k => "test", :v => "yes") used_relation = current_relations(:used_relation) + create(:relation_tag, :relation => used_relation, :k => "test", :v => "yes") + create(:relation_tag, :relation => used_relation, :k => "name", :v => "Test Relation") amf_content "findrelations", "/1", ["yes"] post :amf_read @@ -1358,24 +1358,24 @@ class AmfControllerTest < ActionController::TestCase def amf_parse_response req = StringIO.new(@response.body) - req.read(2) # version + req.read(2) # version # parse through any headers - headers = AMF.getint(req) # Read number of headers - headers.times do # Read each header - AMF.getstring(req) # | - req.getc # | skip boolean - AMF.getvalue(req) # | + headers = AMF.getint(req) # Read number of headers + headers.times do # Read each header + AMF.getstring(req) # | + req.getc # | skip boolean + AMF.getvalue(req) # | end # parse through responses results = {} - bodies = AMF.getint(req) # Read number of bodies - bodies.times do # Read each body - message = AMF.getstring(req) # | get message name - AMF.getstring(req) # | get index in response sequence - AMF.getlong(req) # | get total size in bytes - args = AMF.getvalue(req) # | get response (probably an array) + bodies = AMF.getint(req) # Read number of bodies + bodies.times do # Read each body + message = AMF.getstring(req) # | get message name + AMF.getstring(req) # | get index in response sequence + AMF.getlong(req) # | get total size in bytes + args = AMF.getvalue(req) # | get response (probably an array) results[message] = args end @amf_result = results diff --git a/test/controllers/api_controller_test.rb b/test/controllers/api_controller_test.rb index d10e5277e..540f303ed 100644 --- a/test/controllers/api_controller_test.rb +++ b/test/controllers/api_controller_test.rb @@ -6,14 +6,14 @@ class ApiControllerTest < ActionController::TestCase def setup super - @badbigbbox = %w(-0.1,-0.1,1.1,1.1 10,10,11,11) - @badmalformedbbox = %w(-0.1 hello + @badbigbbox = %w(-0.1,-0.1,1.1,1.1 10,10,11,11) + @badmalformedbbox = %w(-0.1 hello 10N2W10.1N2.1W) - @badlatmixedbbox = %w(0,0.1,0.1,0 -0.1,80,0.1,70 0.24,54.34,0.25,54.33) - @badlonmixedbbox = %w(80,-0.1,70,0.1 54.34,0.24,54.33,0.25) + @badlatmixedbbox = %w(0,0.1,0.1,0 -0.1,80,0.1,70 0.24,54.34,0.25,54.33) + @badlonmixedbbox = %w(80,-0.1,70,0.1 54.34,0.24,54.33,0.25) # @badlatlonoutboundsbbox = %w{ 191,-0.1,193,0.1 -190.1,89.9,-190,90 } - @goodbbox = %w(-0.1,-0.1,0.1,0.1 51.1,-0.1,51.2,0 - -0.1,%20-0.1,%200.1,%200.1 -0.1edcd,-0.1d,0.1,0.1 -0.1E,-0.1E,0.1S,0.1N S0.1,W0.1,N0.1,E0.1) + @goodbbox = %w(-0.1,-0.1,0.1,0.1 51.1,-0.1,51.2,0 + -0.1,%20-0.1,%200.1,%200.1 -0.1edcd,-0.1d,0.1,0.1 -0.1E,-0.1E,0.1S,0.1N S0.1,W0.1,N0.1,E0.1) # That last item in the goodbbox really shouldn't be there, as the API should # reall reject it, however this is to test to see if the api changes. end @@ -53,6 +53,7 @@ class ApiControllerTest < ActionController::TestCase def test_map node = current_nodes(:used_node_1) + tag = create(:node_tag, :node => node) # Need to split the min/max lat/lon out into their own variables here # so that we can test they are returned later. minlon = node.lon - 0.1 @@ -70,7 +71,7 @@ class ApiControllerTest < ActionController::TestCase assert_select "bounds[minlon='#{minlon}'][minlat='#{minlat}'][maxlon='#{maxlon}'][maxlat='#{maxlat}']", :count => 1 assert_select "node[id='#{node.id}'][lat='#{node.lat}'][lon='#{node.lon}'][version='#{node.version}'][changeset='#{node.changeset_id}'][visible='#{node.visible}'][timestamp='#{node.timestamp.xmlschema}']", :count => 1 do # This should really be more generic - assert_select "tag[k='test'][v='yes']" + assert_select "tag[k='#{tag.k}'][v='#{tag.v}']" end assert_select "way", :count => 2 assert_select "way[id='1']", :count => 1 @@ -84,6 +85,7 @@ class ApiControllerTest < ActionController::TestCase # the same as the node we are looking at def test_map_inclusive node = current_nodes(:used_node_1) + tag = create(:node_tag, :node => node) bbox = "#{node.lon},#{node.lat},#{node.lon},#{node.lat}" get :map, :bbox => bbox assert_response :success, "The map call should have succeeded" @@ -91,7 +93,7 @@ class ApiControllerTest < ActionController::TestCase assert_select "bounds[minlon='#{node.lon}'][minlat='#{node.lat}'][maxlon='#{node.lon}'][maxlat='#{node.lat}']", :count => 1 assert_select "node[id='#{node.id}'][lat='#{node.lat}'][lon='#{node.lon}'][version='#{node.version}'][changeset='#{node.changeset_id}'][visible='#{node.visible}'][timestamp='#{node.timestamp.xmlschema}']", :count => 1 do # This should really be more generic - assert_select "tag[k='test'][v='yes']" + assert_select "tag[k='#{tag.k}'][v='#{tag.v}']" end assert_select "way", :count => 2 assert_select "way[id='1']", :count => 1 @@ -132,7 +134,9 @@ class ApiControllerTest < ActionController::TestCase end def test_tracepoints - point = gpx_files(:public_trace_file) + point = create(:trace, :visibility => "public", :latitude => 1, :longitude => 1) do |trace| + create(:tracepoint, :trace => trace, :latitude => 1 * GeoRecord::SCALE, :longitude => 1 * GeoRecord::SCALE) + end minlon = point.longitude - 0.001 minlat = point.latitude - 0.001 maxlon = point.longitude + 0.001 @@ -148,7 +152,10 @@ class ApiControllerTest < ActionController::TestCase end def test_tracepoints_trackable - point = gpx_files(:trackable_trace_file) + point = create(:trace, :visibility => "trackable", :latitude => 51.51, :longitude => -0.14) do |trace| + create(:tracepoint, :trace => trace, :trackid => 1, :latitude => (51.510 * GeoRecord::SCALE).to_i, :longitude => (-0.140 * GeoRecord::SCALE).to_i) + create(:tracepoint, :trace => trace, :trackid => 2, :latitude => (51.511 * GeoRecord::SCALE).to_i, :longitude => (-0.141 * GeoRecord::SCALE).to_i) + end minlon = point.longitude - 0.002 minlat = point.latitude - 0.002 maxlon = point.longitude + 0.002 @@ -170,7 +177,9 @@ class ApiControllerTest < ActionController::TestCase end def test_tracepoints_identifiable - point = gpx_files(:identifiable_trace_file) + point = create(:trace, :visibility => "identifiable", :latitude => 51.512, :longitude => 0.142) do |trace| + create(:tracepoint, :trace => trace, :latitude => (51.512 * GeoRecord::SCALE).to_i, :longitude => (0.142 * GeoRecord::SCALE).to_i) + end minlon = point.longitude - 0.002 minlat = point.latitude - 0.002 maxlon = point.longitude + 0.002 @@ -385,7 +394,7 @@ class ApiControllerTest < ActionController::TestCase end def test_permissions_oauth - @request.env["oauth.token"] = AccessToken.new do |token| + @request.env["oauth.token"] = AccessToken.new do |token| # Just to test a few token.allow_read_prefs = true token.allow_write_api = true diff --git a/test/controllers/browse_controller_test.rb b/test/controllers/browse_controller_test.rb index a1c94b457..c5f1eef5c 100644 --- a/test/controllers/browse_controller_test.rb +++ b/test/controllers/browse_controller_test.rb @@ -75,6 +75,9 @@ class BrowseControllerTest < ActionController::TestCase end def test_read_changeset_hidden_comments + create_list(:changeset_comment, 3) + create(:changeset_comment, :visible => false) + browse_check "changeset", changesets(:normal_user_closed_change).id, "browse/changeset" assert_select "div.changeset-comments ul li", :count => 3 @@ -85,7 +88,41 @@ class BrowseControllerTest < ActionController::TestCase end def test_read_note - browse_check "note", notes(:open_note).id, "browse/note" + open_note = create(:note_with_comments) + + browse_check "note", open_note.id, "browse/note" + end + + def test_read_hidden_note + hidden_note_with_comment = create(:note_with_comments, :status => "hidden") + + get :note, :id => hidden_note_with_comment.id + assert_response :not_found + assert_template "browse/not_found" + assert_template :layout => "map" + + xhr :get, :note, :id => hidden_note_with_comment.id + assert_response :not_found + assert_template "browse/not_found" + assert_template :layout => "xhr" + + session[:user] = users(:moderator_user).id + + browse_check "note", hidden_note_with_comment.id, "browse/note" + end + + def test_read_note_hidden_comments + note_with_hidden_comment = create(:note_with_comments, :comments_count => 2) do |note| + create(:note_comment, :note => note, :visible => false) + end + + browse_check "note", note_with_hidden_comment.id, "browse/note" + assert_select "div.note-comments ul li", :count => 1 + + session[:user] = users(:moderator_user).id + + browse_check "note", note_with_hidden_comment.id, "browse/note" + assert_select "div.note-comments ul li", :count => 2 end ## diff --git a/test/controllers/changeset_controller_test.rb b/test/controllers/changeset_controller_test.rb index a1667a533..ca2ff8e15 100644 --- a/test/controllers/changeset_controller_test.rb +++ b/test/controllers/changeset_controller_test.rb @@ -3,7 +3,6 @@ require "changeset_controller" class ChangesetControllerTest < ActionController::TestCase api_fixtures - fixtures :friends, :changeset_comments, :changesets_subscribers ## # test all routes which lead to this controller @@ -102,16 +101,16 @@ class ChangesetControllerTest < ActionController::TestCase basic_authorization users(:normal_user).email, "test" # Create the first user's changeset content "<osm><changeset>" + - "<tag k='created_by' v='osm test suite checking changesets'/>" + - "</changeset></osm>" + "<tag k='created_by' v='osm test suite checking changesets'/>" + + "</changeset></osm>" put :create assert_require_public_data basic_authorization users(:public_user).email, "test" # Create the first user's changeset content "<osm><changeset>" + - "<tag k='created_by' v='osm test suite checking changesets'/>" + - "</changeset></osm>" + "<tag k='created_by' v='osm test suite checking changesets'/>" + + "</changeset></osm>" put :create assert_response :success, "Creation of changeset did not return sucess status" @@ -197,6 +196,7 @@ class ChangesetControllerTest < ActionController::TestCase assert_select "osm>changeset>discussion>comment", 0 changeset_id = changesets(:normal_user_closed_change).id + create_list(:changeset_comment, 3, :changeset_id => changeset_id) get :read, :id => changeset_id, :include_discussion => true assert_response :success, "cannot get closed changeset with comments" @@ -527,8 +527,8 @@ EOF # create a temporary changeset content "<osm><changeset>" + - "<tag k='created_by' v='osm test suite checking changesets'/>" + - "</changeset></osm>" + "<tag k='created_by' v='osm test suite checking changesets'/>" + + "</changeset></osm>" assert_difference "Changeset.count", 1 do put :create end @@ -675,7 +675,7 @@ EOF <osmChange> <create> <node id='-1' lon='0' lat='0' changeset='#{cs_id}'> - <tag k='foo' v='#{"x" * 256}'/> + <tag k='foo' v='#{'x' * 256}'/> </node> </create> </osmChange> @@ -1102,8 +1102,8 @@ EOF basic_authorization users(:public_user).email, "test" content "<osm><changeset>" + - "<tag k='created_by' v='osm test suite checking changesets'/>" + - "</changeset></osm>" + "<tag k='created_by' v='osm test suite checking changesets'/>" + + "</changeset></osm>" put :create assert_response :success changeset_id = @response.body.to_i @@ -1114,8 +1114,8 @@ EOF diff.root = XML::Node.new "osmChange" modify = XML::Node.new "modify" xml_old_node = old_node.to_xml_node - xml_old_node["lat"] = (2.0).to_s - xml_old_node["lon"] = (2.0).to_s + xml_old_node["lat"] = 2.0.to_s + xml_old_node["lon"] = 2.0.to_s xml_old_node["changeset"] = changeset_id.to_s modify << xml_old_node diff.root << modify @@ -1140,8 +1140,8 @@ EOF basic_authorization users(:public_user).email, "test" content "<osm><changeset>" + - "<tag k='created_by' v='osm test suite checking changesets'/>" + - "</changeset></osm>" + "<tag k='created_by' v='osm test suite checking changesets'/>" + + "</changeset></osm>" put :create assert_response :success changeset_id = @response.body.to_i @@ -1181,8 +1181,7 @@ EOF ["<osmChange/>", "<osmChange></osmChange>", "<osmChange><modify/></osmChange>", - "<osmChange><modify></modify></osmChange>" - ].each do |diff| + "<osmChange><modify></modify></osmChange>"].each do |diff| # upload it content diff post :upload, :id => changesets(:public_user_first_change).id @@ -1225,8 +1224,8 @@ EOF # create a temporary changeset content "<osm><changeset>" + - "<tag k='created_by' v='osm test suite checking changesets'/>" + - "</changeset></osm>" + "<tag k='created_by' v='osm test suite checking changesets'/>" + + "</changeset></osm>" put :create assert_response :forbidden @@ -1235,8 +1234,8 @@ EOF # create a temporary changeset content "<osm><changeset>" + - "<tag k='created_by' v='osm test suite checking changesets'/>" + - "</changeset></osm>" + "<tag k='created_by' v='osm test suite checking changesets'/>" + + "</changeset></osm>" put :create assert_response :success changeset_id = @response.body.to_i @@ -1281,8 +1280,8 @@ EOF # create a temporary changeset content "<osm><changeset>" + - "<tag k='created_by' v='osm test suite checking changesets'/>" + - "</changeset></osm>" + "<tag k='created_by' v='osm test suite checking changesets'/>" + + "</changeset></osm>" put :create assert_response :success changeset_id = @response.body.to_i @@ -1340,8 +1339,8 @@ OSMFILE # create a temporary changeset content "<osm><changeset>" + - "<tag k='created_by' v='osm test suite checking changesets'/>" + - "</changeset></osm>" + "<tag k='created_by' v='osm test suite checking changesets'/>" + + "</changeset></osm>" put :create assert_response :success changeset_id = @response.body.to_i @@ -1389,7 +1388,10 @@ EOF end def test_changeset_download + tag = create(:old_node_tag, :old_node => nodes(:used_node_2)) + get :download, :id => changesets(:normal_user_first_change).id + assert_response :success assert_template nil # print @response.body @@ -1397,7 +1399,7 @@ EOF assert_select "osmChange[version='#{API_VERSION}'][generator='#{GENERATOR}']" do assert_select "create", :count => 5 assert_select "create>node[id='#{nodes(:used_node_2).node_id}'][visible='#{nodes(:used_node_2).visible?}'][version='#{nodes(:used_node_2).version}']" do - assert_select "tag[k='#{node_tags(:t3).k}'][v='#{node_tags(:t3).v}']" + assert_select "tag[k='#{tag.k}'][v='#{tag.v}']" end assert_select "create>node[id='#{nodes(:visible_node).node_id}']" end @@ -1477,12 +1479,12 @@ EOF # NOTE: the include method doesn't over-expand, like inserting # a real method does. this is because we expect the client to # know what it is doing! - check_after_include(changeset_id, 1, 1, [1, 1, 1, 1]) - check_after_include(changeset_id, 3, 3, [1, 1, 3, 3]) - check_after_include(changeset_id, 4, 2, [1, 1, 4, 3]) - check_after_include(changeset_id, 2, 2, [1, 1, 4, 3]) - check_after_include(changeset_id, -1, -1, [-1, -1, 4, 3]) - check_after_include(changeset_id, -2, 5, [-2, -1, 4, 5]) + check_after_include(changeset_id, 1, 1, [1, 1, 1, 1]) + check_after_include(changeset_id, 3, 3, [1, 1, 3, 3]) + check_after_include(changeset_id, 4, 2, [1, 1, 4, 3]) + check_after_include(changeset_id, 2, 2, [1, 1, 4, 3]) + check_after_include(changeset_id, -1, -1, [-1, -1, 4, 3]) + check_after_include(changeset_id, -2, 5, [-2, -1, 4, 5]) end ## @@ -1574,7 +1576,7 @@ EOF get :query, :closed => "true" assert_response :success, "can't get changesets by closed-ness" - assert_changesets [3, 5, 6, 7, 8] + assert_changesets [3, 5, 6, 7, 8, 9] get :query, :closed => "true", :user => users(:normal_user).id assert_response :success, "can't get changesets by closed-ness and user" @@ -1598,8 +1600,7 @@ EOF def test_query_invalid ["abracadabra!", "1,2,3,F", - ";drop table users;" - ].each do |bbox| + ";drop table users;"].each do |bbox| get :query, :bbox => bbox assert_response :bad_request, "'#{bbox}' isn't a bbox" end @@ -1608,8 +1609,7 @@ EOF "00-00-00", ";drop table users;", ",", - "-,-" - ].each do |time| + "-,-"].each do |time| get :query, :time => time assert_response :bad_request, "'#{time}' isn't a valid time range" end @@ -1617,8 +1617,7 @@ EOF ["me", "foobar", "-1", - "0" - ].each do |uid| + "0"].each do |uid| get :query, :user => uid assert_response :bad_request, "'#{uid}' isn't a valid user ID" end @@ -1652,6 +1651,7 @@ EOF ## Now try with the public user changeset = changesets(:public_user_first_change) + create(:changeset_tag, :changeset => changeset) new_changeset = changeset.to_xml new_tag = XML::Node.new "tag" new_tag["k"] = "tagtesting" @@ -1989,9 +1989,15 @@ EOF end assert_response :success + changeset = changesets(:normal_user_subscribed_change) + changeset.subscribers.push(users(:normal_user)) + changeset.subscribers.push(users(:public_user)) + changeset.subscribers.push(users(:suspended_user)) + changeset.subscribers.push(users(:deleted_user)) + assert_difference "ChangesetComment.count", 1 do assert_difference "ActionMailer::Base.deliveries.size", 1 do - post :comment, :id => changesets(:normal_user_subscribed_change).id, :text => "This is a comment" + post :comment, :id => changeset.id, :text => "This is a comment" end end assert_response :success @@ -2007,7 +2013,7 @@ EOF assert_difference "ChangesetComment.count", 1 do assert_difference "ActionMailer::Base.deliveries.size", 2 do - post :comment, :id => changesets(:normal_user_subscribed_change).id, :text => "This is a comment" + post :comment, :id => changeset.id, :text => "This is a comment" end end assert_response :success @@ -2098,6 +2104,7 @@ EOF # trying to subscribe when already subscribed changeset = changesets(:normal_user_subscribed_change) + changeset.subscribers.push(users(:public_user)) assert_no_difference "changeset.subscribers.count" do post :subscribe, :id => changeset.id end @@ -2109,6 +2116,7 @@ EOF def test_unsubscribe_success basic_authorization(users(:public_user).email, "test") changeset = changesets(:normal_user_subscribed_change) + changeset.subscribers.push(users(:public_user)) assert_difference "changeset.subscribers.count", -1 do post :unsubscribe, :id => changeset.id @@ -2153,7 +2161,7 @@ EOF # test hide comment fail def test_hide_comment_fail # unauthorized - comment = changeset_comments(:normal_comment_1) + comment = create(:changeset_comment) assert_equal true, comment.visible post :hide_comment, :id => comment.id @@ -2178,7 +2186,7 @@ EOF ## # test hide comment succes def test_hide_comment_success - comment = changeset_comments(:normal_comment_1) + comment = create(:changeset_comment) assert_equal true, comment.visible basic_authorization(users(:moderator_user).email, "test") @@ -2192,7 +2200,7 @@ EOF # test unhide comment fail def test_unhide_comment_fail # unauthorized - comment = changeset_comments(:hidden_comment) + comment = create(:changeset_comment, :visible => false) assert_equal false, comment.visible post :unhide_comment, :id => comment.id @@ -2217,7 +2225,7 @@ EOF ## # test unhide comment succes def test_unhide_comment_success - comment = changeset_comments(:hidden_comment) + comment = create(:changeset_comment, :visible => false) assert_equal false, comment.visible basic_authorization(users(:moderator_user).email, "test") @@ -2230,6 +2238,8 @@ EOF ## # test comments feed def test_comments_feed + create_list(:changeset_comment, 3, :changeset_id => changesets(:normal_user_closed_change).id) + get :comments_feed, :format => "rss" assert_response :success assert_equal "application/rss+xml", @response.content_type @@ -2317,8 +2327,8 @@ EOF # check the result of a list def check_list_result(changesets) changesets = changesets.where("num_changes > 0") - .order(:created_at => :desc) - .limit(20) + .order(:created_at => :desc) + .limit(20) assert changesets.size <= 20 assert_select "ol.changesets", :count => [changesets.size, 1].min do @@ -2334,15 +2344,16 @@ EOF # check the result of a feed def check_feed_result(changesets) changesets = changesets.where("num_changes > 0") - .order(:created_at => :desc) - .limit(20) + .order(:created_at => :desc) + .limit(20) assert changesets.size <= 20 assert_select "feed", :count => [changesets.size, 1].min do - assert_select "entry", :count => changesets.size + assert_select "> title", :count => 1, :text => /^Changesets/ + assert_select "> entry", :count => changesets.size changesets.each do |changeset| - assert_select "entry > id", changeset_url(:id => changeset.id) + assert_select "> entry > id", changeset_url(:id => changeset.id) end end end diff --git a/test/controllers/diary_entry_controller_test.rb b/test/controllers/diary_entry_controller_test.rb index f86321bc3..268834019 100644 --- a/test/controllers/diary_entry_controller_test.rb +++ b/test/controllers/diary_entry_controller_test.rb @@ -1,10 +1,18 @@ require "test_helper" class DiaryEntryControllerTest < ActionController::TestCase - fixtures :users, :user_roles, :diary_entries, :diary_comments, :languages, :friends + fixtures :users, :user_roles include ActionView::Helpers::NumberHelper + def setup + # Create the default language for diary entries + create(:language, :code => "en") + # Stub nominatim response for diary entry locations + stub_request(:get, %r{^http://nominatim\.openstreetmap\.org/reverse\?}) + .to_return(:status => 404) + end + ## # test all routes which lead to this controller def test_routes @@ -83,15 +91,25 @@ class DiaryEntryControllerTest < ActionController::TestCase { :path => "/user/username/diary/1/hidecomment/2", :method => :post }, { :controller => "diary_entry", :action => "hidecomment", :display_name => "username", :id => "1", :comment => "2" } ) + assert_routing( + { :path => "/user/username/diary/1/subscribe", :method => :post }, + { :controller => "diary_entry", :action => "subscribe", :display_name => "username", :id => "1" } + ) + assert_routing( + { :path => "/user/username/diary/1/unsubscribe", :method => :post }, + { :controller => "diary_entry", :action => "unsubscribe", :display_name => "username", :id => "1" } + ) end - def test_new + def test_new_no_login # Make sure that you are redirected to the login page when you # are not logged in get :new assert_response :redirect assert_redirected_to :controller => :user, :action => :login, :referer => "/diary/new" + end + def test_new_form # Now try again when logged in get :new, {}, { :user => users(:normal_user).id } assert_response :success @@ -106,70 +124,88 @@ class DiaryEntryControllerTest < ActionController::TestCase assert_select "select#diary_entry_language_code", :count => 1 assert_select "input#latitude[name='diary_entry[latitude]']", :count => 1 assert_select "input#longitude[name='diary_entry[longitude]']", :count => 1 - assert_select "input[name=commit][type=submit][value=Save]", :count => 1 + assert_select "input[name=commit][type=submit][value=Publish]", :count => 1 assert_select "input[name=commit][type=submit][value=Edit]", :count => 1 assert_select "input[name=commit][type=submit][value=Preview]", :count => 1 assert_select "input", :count => 7 end end + end - new_title = "New Title" - new_body = "This is a new body for the diary entry" - new_latitude = "1.1" - new_longitude = "2.2" - new_language_code = "en" + def test_new_get_with_params + # Now try creating a diary entry using get + assert_difference "DiaryEntry.count", 0 do + get :new, { :commit => "save", + :diary_entry => { :title => "New Title", :body => "This is a new body for the diary entry", :latitude => "1.1", + :longitude => "2.2", :language_code => "en" } }, + { :user => users(:normal_user).id } + end + assert_response :success + assert_template :edit + end + def test_new_no_body # Now try creating a invalid diary entry with an empty body assert_no_difference "DiaryEntry.count" do post :new, { :commit => "save", - :diary_entry => { :title => new_title, :body => "", :latitude => new_latitude, - :longitude => new_longitude, :language_code => new_language_code } }, + :diary_entry => { :title => "New Title", :body => "", :latitude => "1.1", + :longitude => "2.2", :language_code => "en" } }, { :user => users(:normal_user).id } end assert_response :success assert_template :edit assert_nil UserPreference.where(:user_id => users(:normal_user).id, :k => "diary.default_language").first + end + def test_new_post # Now try creating a diary entry assert_difference "DiaryEntry.count", 1 do post :new, { :commit => "save", - :diary_entry => { :title => new_title, :body => new_body, :latitude => new_latitude, - :longitude => new_longitude, :language_code => new_language_code } }, + :diary_entry => { :title => "New Title", :body => "This is a new body for the diary entry", :latitude => "1.1", + :longitude => "2.2", :language_code => "en" } }, { :user => users(:normal_user).id } end assert_response :redirect assert_redirected_to :action => :list, :display_name => users(:normal_user).display_name entry = DiaryEntry.order(:id).last assert_equal users(:normal_user).id, entry.user_id - assert_equal new_title, entry.title - assert_equal new_body, entry.body - assert_equal new_latitude.to_f, entry.latitude - assert_equal new_longitude.to_f, entry.longitude - assert_equal new_language_code, entry.language_code + assert_equal "New Title", entry.title + assert_equal "This is a new body for the diary entry", entry.body + assert_equal "1.1".to_f, entry.latitude + assert_equal "2.2".to_f, entry.longitude + assert_equal "en", entry.language_code - assert_equal new_language_code, UserPreference.where(:user_id => users(:normal_user).id, :k => "diary.default_language").first.v + # checks if user was subscribed + assert_equal 1, entry.subscribers.length + + assert_equal "en", UserPreference.where(:user_id => users(:normal_user).id, :k => "diary.default_language").first.v + end - new_language_code = "de" + def test_new_german + create(:language, :code => "de") # Now try creating a diary entry in a different language assert_difference "DiaryEntry.count", 1 do post :new, { :commit => "save", - :diary_entry => { :title => new_title, :body => new_body, :latitude => new_latitude, - :longitude => new_longitude, :language_code => new_language_code } }, + :diary_entry => { :title => "New Title", :body => "This is a new body for the diary entry", :latitude => "1.1", + :longitude => "2.2", :language_code => "de" } }, { :user => users(:normal_user).id } end assert_response :redirect assert_redirected_to :action => :list, :display_name => users(:normal_user).display_name entry = DiaryEntry.order(:id).last assert_equal users(:normal_user).id, entry.user_id - assert_equal new_title, entry.title - assert_equal new_body, entry.body - assert_equal new_latitude.to_f, entry.latitude - assert_equal new_longitude.to_f, entry.longitude - assert_equal new_language_code, entry.language_code + assert_equal "New Title", entry.title + assert_equal "This is a new body for the diary entry", entry.body + assert_equal "1.1".to_f, entry.latitude + assert_equal "2.2".to_f, entry.longitude + assert_equal "de", entry.language_code - assert_equal new_language_code, UserPreference.where(:user_id => users(:normal_user).id, :k => "diary.default_language").first.v + # checks if user was subscribed + assert_equal 1, entry.subscribers.length + + assert_equal "de", UserPreference.where(:user_id => users(:normal_user).id, :k => "diary.default_language").first.v end def test_new_spammy @@ -199,7 +235,7 @@ class DiaryEntryControllerTest < ActionController::TestCase end def test_edit - entry = diary_entries(:normal_user_entry_1) + entry = create(:diary_entry, :user => users(:normal_user)) # Make sure that you are redirected to the login page when you are # not logged in, without and with the id of the entry you want to edit @@ -296,13 +332,14 @@ class DiaryEntryControllerTest < ActionController::TestCase end def test_edit_i18n - get :edit, { :display_name => users(:normal_user).display_name, :id => diary_entries(:normal_user_entry_1).id }, { :user => users(:normal_user).id } + diary_entry = create(:diary_entry, :language_code => "en") + get :edit, { :display_name => users(:normal_user).display_name, :id => diary_entry.id }, { :user => users(:normal_user).id } assert_response :success assert_select "span[class=translation_missing]", false, "Missing translation in edit diary entry" end def test_comment - entry = diary_entries(:normal_user_entry_1) + entry = create(:diary_entry, :user => users(:normal_user)) # Make sure that you are denied when you are not logged in post :comment, :display_name => entry.user.display_name, :id => entry.id @@ -315,26 +352,32 @@ class DiaryEntryControllerTest < ActionController::TestCase assert_select "h2", :text => "No entry with the id: 9999", :count => 1 end + post :subscribe, { :id => entry.id, :display_name => entry.user.display_name }, { :user => users(:normal_user).id } + # Now try an invalid comment with an empty body assert_no_difference "ActionMailer::Base.deliveries.size" do assert_no_difference "DiaryComment.count" do - post :comment, { :display_name => entry.user.display_name, :id => entry.id, :diary_comment => { :body => "" } }, { :user => users(:public_user).id } + assert_no_difference "entry.subscribers.count" do + post :comment, { :display_name => entry.user.display_name, :id => entry.id, :diary_comment => { :body => "" } }, { :user => users(:public_user).id } + end end end assert_response :success assert_template :view # Now try again with the right id - assert_difference "ActionMailer::Base.deliveries.size", 1 do + assert_difference "ActionMailer::Base.deliveries.size", entry.subscribers.count do assert_difference "DiaryComment.count", 1 do - post :comment, { :display_name => entry.user.display_name, :id => entry.id, :diary_comment => { :body => "New comment" } }, { :user => users(:public_user).id } + assert_difference "entry.subscribers.count", 1 do + post :comment, { :display_name => entry.user.display_name, :id => entry.id, :diary_comment => { :body => "New comment" } }, { :user => users(:public_user).id } + end end end assert_response :redirect assert_redirected_to :action => :view, :display_name => entry.user.display_name, :id => entry.id email = ActionMailer::Base.deliveries.first assert_equal [users(:normal_user).email], email.to - assert_equal "[OpenStreetMap] #{users(:public_user).display_name} commented on your diary entry", email.subject + assert_equal "[OpenStreetMap] #{users(:public_user).display_name} commented on a diary entry", email.subject assert_match /New comment/, email.text_part.decoded assert_match /New comment/, email.html_part.decoded ActionMailer::Base.deliveries.clear @@ -356,7 +399,8 @@ class DiaryEntryControllerTest < ActionController::TestCase def test_comment_spammy # Find the entry to comment on - entry = diary_entries(:normal_user_entry_1) + entry = create(:diary_entry, :user => users(:normal_user)) + post :subscribe, { :id => entry.id, :display_name => entry.user.display_name }, { :user => users(:normal_user).id } # Generate some spammy content spammy_text = 1.upto(50).map { |n| "http://example.com/spam#{n}" }.join(" ") @@ -371,7 +415,7 @@ class DiaryEntryControllerTest < ActionController::TestCase assert_redirected_to :action => :view, :display_name => entry.user.display_name, :id => entry.id email = ActionMailer::Base.deliveries.first assert_equal [users(:normal_user).email], email.to - assert_equal "[OpenStreetMap] #{users(:public_user).display_name} commented on your diary entry", email.subject + assert_equal "[OpenStreetMap] #{users(:public_user).display_name} commented on a diary entry", email.subject assert_match %r{http://example.com/spam}, email.text_part.decoded assert_match %r{http://example.com/spam}, email.html_part.decoded ActionMailer::Base.deliveries.clear @@ -393,15 +437,23 @@ class DiaryEntryControllerTest < ActionController::TestCase end def test_list_all + diary_entry = create(:diary_entry) + geo_entry = create(:diary_entry, :latitude => 51.50763, :longitude => -0.10781) + public_entry = create(:diary_entry, :user => users(:public_user)) + # Try a list of all diary entries get :list - check_diary_list :normal_user_entry_1, :normal_user_geo_entry, :public_user_entry_1 + check_diary_list diary_entry, geo_entry, public_entry end def test_list_user + diary_entry = create(:diary_entry, :user => users(:normal_user)) + geo_entry = create(:diary_entry, :user => users(:normal_user), :latitude => 51.50763, :longitude => -0.10781) + _other_entry = create(:diary_entry, :user => users(:public_user)) + # Try a list of diary entries for a valid user get :list, :display_name => users(:normal_user).display_name - check_diary_list :normal_user_entry_1, :normal_user_geo_entry + check_diary_list diary_entry, geo_entry # Try a list of diary entries for an invalid user get :list, :display_name => "No Such User" @@ -410,6 +462,10 @@ class DiaryEntryControllerTest < ActionController::TestCase end def test_list_friends + friend = create(:friend, :befriender => users(:normal_user)) + diary_entry = create(:diary_entry, :user => friend.befriendee) + _other_entry = create(:diary_entry, :user => users(:second_public_user)) + # Try a list of diary entries for your friends when not logged in get :list, :friends => true assert_response :redirect @@ -417,12 +473,14 @@ class DiaryEntryControllerTest < ActionController::TestCase # Try a list of diary entries for your friends when logged in get :list, { :friends => true }, { :user => users(:normal_user).id } - check_diary_list :public_user_entry_1 + check_diary_list diary_entry get :list, { :friends => true }, { :user => users(:public_user).id } check_diary_list end def test_list_nearby + diary_entry = create(:diary_entry, :user => users(:public_user)) + # Try a list of diary entries for nearby users when not logged in get :list, :nearby => true assert_response :redirect @@ -430,19 +488,25 @@ class DiaryEntryControllerTest < ActionController::TestCase # Try a list of diary entries for nearby users when logged in get :list, { :nearby => true }, { :user => users(:german_user).id } - check_diary_list :public_user_entry_1 + check_diary_list diary_entry get :list, { :nearby => true }, { :user => users(:public_user).id } check_diary_list end def test_list_language + create(:language, :code => "de") + create(:language, :code => "sl") + diary_entry_en = create(:diary_entry, :language_code => "en") + diary_entry_en2 = create(:diary_entry, :language_code => "en") + diary_entry_de = create(:diary_entry, :language_code => "de") + # Try a list of diary entries in english get :list, :language => "en" - check_diary_list :normal_user_entry_1, :public_user_entry_1 + check_diary_list diary_entry_en, diary_entry_en2 # Try a list of diary entries in german get :list, :language => "de" - check_diary_list :normal_user_geo_entry + check_diary_list diary_entry_de # Try a list of diary entries in slovenian get :list, :language => "sl" @@ -450,6 +514,11 @@ class DiaryEntryControllerTest < ActionController::TestCase end def test_rss + create(:language, :code => "de") + create(:diary_entry, :language_code => "en") + create(:diary_entry, :language_code => "en") + create(:diary_entry, :language_code => "de") + get :rss, :format => :rss assert_response :success, "Should be able to get a diary RSS" assert_select "rss", :count => 1 do @@ -462,7 +531,12 @@ class DiaryEntryControllerTest < ActionController::TestCase end def test_rss_language - get :rss, :language => diary_entries(:normal_user_entry_1).language_code, :format => :rss + create(:language, :code => "de") + create(:diary_entry, :language_code => "en") + create(:diary_entry, :language_code => "en") + create(:diary_entry, :language_code => "de") + + get :rss, :language => "en", :format => :rss assert_response :success, "Should be able to get a specific language diary RSS" assert_select "rss>channel>item", :count => 2 # , "Diary entries should be filtered by language" end @@ -473,12 +547,19 @@ class DiaryEntryControllerTest < ActionController::TestCase # end def test_rss_language_with_no_entries + create(:language, :code => "sl") + create(:diary_entry, :language_code => "en") + get :rss, :language => "sl", :format => :rss assert_response :success, "Should be able to get a specific language diary RSS" assert_select "rss>channel>item", :count => 0 # , "Diary entries should be filtered by language" end def test_rss_user + create(:diary_entry, :user => users(:normal_user)) + create(:diary_entry, :user => users(:normal_user)) + create(:diary_entry, :user => users(:public_user)) + get :rss, :display_name => users(:normal_user).display_name, :format => :rss assert_response :success, "Should be able to get a specific users diary RSS" assert_select "rss>channel>item", :count => 2 # , "Diary entries should be filtered by user" @@ -498,74 +579,94 @@ class DiaryEntryControllerTest < ActionController::TestCase assert_response :not_found, "Should not be able to get a deleted users diary RSS" end + def test_rss_character_escaping + create(:diary_entry, :title => "<script>") + get :rss, :format => :rss + + assert_match "<title><script>", response.body + end + def test_view # Try a normal entry that should work - get :view, :display_name => users(:normal_user).display_name, :id => diary_entries(:normal_user_entry_1).id + diary_entry = create(:diary_entry, :user => users(:normal_user)) + get :view, :display_name => users(:normal_user).display_name, :id => diary_entry.id assert_response :success assert_template :view # Try a deleted entry - get :view, :display_name => users(:normal_user).display_name, :id => diary_entries(:deleted_entry).id + diary_entry_deleted = create(:diary_entry, :user => users(:normal_user), :visible => false) + get :view, :display_name => users(:normal_user).display_name, :id => diary_entry_deleted.id assert_response :not_found # Try an entry by a suspended user - get :view, :display_name => users(:suspended_user).display_name, :id => diary_entries(:entry_by_suspended_user).id + diary_entry_suspended = create(:diary_entry, :user => users(:suspended_user)) + get :view, :display_name => users(:suspended_user).display_name, :id => diary_entry_suspended.id assert_response :not_found # Try an entry by a deleted user - get :view, :display_name => users(:deleted_user).display_name, :id => diary_entries(:entry_by_deleted_user).id + diary_entry_deleted = create(:diary_entry, :user => users(:deleted_user)) + get :view, :display_name => users(:deleted_user).display_name, :id => diary_entry_deleted.id assert_response :not_found end def test_view_hidden_comments # Get a diary entry that has hidden comments - get :view, :display_name => users(:normal_user).display_name, :id => diary_entries(:normal_user_geo_entry).id + diary_entry = create(:diary_entry) + visible_comment = create(:diary_comment, :diary_entry => diary_entry) + suspended_user_comment = create(:diary_comment, :diary_entry => diary_entry, :user => users(:suspended_user)) + deleted_user_comment = create(:diary_comment, :diary_entry => diary_entry, :user => users(:deleted_user)) + hidden_comment = create(:diary_comment, :diary_entry => diary_entry, :visible => false) + + get :view, :display_name => users(:normal_user).display_name, :id => diary_entry.id assert_response :success assert_template :view assert_select "div.comments" do - assert_select "p#comment1", :count => 1 # visible comment - assert_select "p#comment2", :count => 0 # comment by suspended user - assert_select "p#comment3", :count => 0 # comment by deleted user - assert_select "p#comment4", :count => 0 # hidden comment + assert_select "p#comment#{visible_comment.id}", :count => 1 + assert_select "p#comment#{suspended_user_comment.id}", :count => 0 + assert_select "p#comment#{deleted_user_comment.id}", :count => 0 + assert_select "p#comment#{hidden_comment.id}", :count => 0 end end def test_hide # Try without logging in - post :hide, :display_name => users(:normal_user).display_name, :id => diary_entries(:normal_user_entry_1).id + diary_entry = create(:diary_entry) + post :hide, :display_name => users(:normal_user).display_name, :id => diary_entry.id assert_response :forbidden - assert_equal true, DiaryEntry.find(diary_entries(:normal_user_entry_1).id).visible + assert_equal true, DiaryEntry.find(diary_entry.id).visible # Now try as a normal user - post :hide, { :display_name => users(:normal_user).display_name, :id => diary_entries(:normal_user_entry_1).id }, { :user => users(:normal_user).id } + post :hide, { :display_name => users(:normal_user).display_name, :id => diary_entry.id }, { :user => users(:normal_user).id } assert_response :redirect - assert_redirected_to :action => :view, :display_name => users(:normal_user).display_name, :id => diary_entries(:normal_user_entry_1).id - assert_equal true, DiaryEntry.find(diary_entries(:normal_user_entry_1).id).visible + assert_redirected_to :action => :view, :display_name => users(:normal_user).display_name, :id => diary_entry.id + assert_equal true, DiaryEntry.find(diary_entry.id).visible # Finally try as an administrator - post :hide, { :display_name => users(:normal_user).display_name, :id => diary_entries(:normal_user_entry_1).id }, { :user => users(:administrator_user).id } + post :hide, { :display_name => users(:normal_user).display_name, :id => diary_entry.id }, { :user => users(:administrator_user).id } assert_response :redirect assert_redirected_to :action => :list, :display_name => users(:normal_user).display_name - assert_equal false, DiaryEntry.find(diary_entries(:normal_user_entry_1).id).visible + assert_equal false, DiaryEntry.find(diary_entry.id).visible end def test_hidecomment + diary_entry = create(:diary_entry, :user => users(:normal_user)) + diary_comment = create(:diary_comment, :diary_entry => diary_entry) # Try without logging in - post :hidecomment, :display_name => users(:normal_user).display_name, :id => diary_entries(:normal_user_geo_entry).id, :comment => diary_comments(:comment_for_geo_post).id + post :hidecomment, :display_name => users(:normal_user).display_name, :id => diary_entry.id, :comment => diary_comment.id assert_response :forbidden - assert_equal true, DiaryComment.find(diary_comments(:comment_for_geo_post).id).visible + assert_equal true, DiaryComment.find(diary_comment.id).visible # Now try as a normal user - post :hidecomment, { :display_name => users(:normal_user).display_name, :id => diary_entries(:normal_user_geo_entry).id, :comment => diary_comments(:comment_for_geo_post).id }, { :user => users(:normal_user).id } + post :hidecomment, { :display_name => users(:normal_user).display_name, :id => diary_entry.id, :comment => diary_comment.id }, { :user => users(:normal_user).id } assert_response :redirect - assert_redirected_to :action => :view, :display_name => users(:normal_user).display_name, :id => diary_entries(:normal_user_geo_entry).id - assert_equal true, DiaryComment.find(diary_comments(:comment_for_geo_post).id).visible + assert_redirected_to :action => :view, :display_name => users(:normal_user).display_name, :id => diary_entry.id + assert_equal true, DiaryComment.find(diary_comment.id).visible # Finally try as an administrator - post :hidecomment, { :display_name => users(:normal_user).display_name, :id => diary_entries(:normal_user_geo_entry).id, :comment => diary_comments(:comment_for_geo_post).id }, { :user => users(:administrator_user).id } + post :hidecomment, { :display_name => users(:normal_user).display_name, :id => diary_entry.id, :comment => diary_comment.id }, { :user => users(:administrator_user).id } assert_response :redirect - assert_redirected_to :action => :view, :display_name => users(:normal_user).display_name, :id => diary_entries(:normal_user_geo_entry).id - assert_equal false, DiaryComment.find(diary_comments(:comment_for_geo_post).id).visible + assert_redirected_to :action => :view, :display_name => users(:normal_user).display_name, :id => diary_entry.id + assert_equal false, DiaryComment.find(diary_comment.id).visible end def test_comments @@ -578,6 +679,8 @@ class DiaryEntryControllerTest < ActionController::TestCase end # Test a user with a comment + create(:diary_comment, :user => users(:public_user)) + get :comments, :display_name => users(:public_user).display_name assert_response :success assert_template :comments @@ -594,6 +697,64 @@ class DiaryEntryControllerTest < ActionController::TestCase assert_response :not_found end + def test_subscribe_success + diary_entry = create(:diary_entry, :user => users(:normal_user)) + + assert_difference "diary_entry.subscribers.count", 1 do + post :subscribe, { :id => diary_entry.id, :display_name => diary_entry.user.display_name }, { :user => users(:public_user).id } + end + assert_response :redirect + end + + def test_subscribe_fail + diary_entry = create(:diary_entry, :user => users(:normal_user)) + + # not signed in + assert_no_difference "diary_entry.subscribers.count" do + post :subscribe, :id => diary_entry.id, :display_name => diary_entry.user.display_name + end + assert_response :forbidden + + # bad diary id + post :subscribe, { :id => 999111, :display_name => "username" }, { :user => users(:public_user).id } + assert_response :not_found + + # trying to subscribe when already subscribed + post :subscribe, { :id => diary_entry.id, :display_name => diary_entry.user.display_name }, { :user => users(:public_user).id } + assert_no_difference "diary_entry.subscribers.count" do + post :subscribe, { :id => diary_entry.id, :display_name => diary_entry.user.display_name }, { :user => users(:public_user).id } + end + end + + def test_unsubscribe_success + diary_entry = create(:diary_entry, :user => users(:normal_user)) + + post :subscribe, { :id => diary_entry.id, :display_name => diary_entry.user.display_name }, { :user => users(:public_user).id } + assert_difference "diary_entry.subscribers.count", -1 do + post :unsubscribe, { :id => diary_entry.id, :display_name => diary_entry.user.display_name }, { :user => users(:public_user).id } + end + assert_response :redirect + end + + def test_unsubscribe_fail + diary_entry = create(:diary_entry, :user => users(:normal_user)) + + # not signed in + assert_no_difference "diary_entry.subscribers.count" do + post :unsubscribe, :id => diary_entry.id, :display_name => diary_entry.user.display_name + end + assert_response :forbidden + + # bad diary id + post :unsubscribe, { :id => 999111, :display_name => "username" }, { :user => users(:public_user).id } + assert_response :not_found + + # trying to unsubscribe when not subscribed + assert_no_difference "diary_entry.subscribers.count" do + post :unsubscribe, { :id => diary_entry.id, :display_name => diary_entry.user.display_name }, { :user => users(:public_user).id } + end + end + private def check_diary_list(*entries) @@ -603,7 +764,6 @@ class DiaryEntryControllerTest < ActionController::TestCase assert_select "div.diary_post", entries.count entries.each do |entry| - entry = diary_entries(entry) assert_select "a[href=?]", "/user/#{entry.user.display_name}/diary/#{entry.id}" end end diff --git a/test/controllers/geocoder_controller_test.rb b/test/controllers/geocoder_controller_test.rb index bc75a9bfb..57d5a10f1 100644 --- a/test/controllers/geocoder_controller_test.rb +++ b/test/controllers/geocoder_controller_test.rb @@ -387,7 +387,7 @@ class GeocoderControllerTest < ActionController::TestCase "min-lat" => 51.7265723, "max-lat" => 51.7665723, "min-lon" => -0.0390782, "max-lon" => 0.0009218, "type" => "node", "id" => 28825933 }, - { "prefix" => "City Boundary", + { "prefix" => "Village", "name" => "Broxbourne, Hertfordshire, East of England, England, United Kingdom", "min-lat" => 51.6808751, "max-lat" => 51.7806237, "min-lon" => -0.114204, "max-lon" => 0.0145267, @@ -446,7 +446,7 @@ class GeocoderControllerTest < ActionController::TestCase xhr :get, :search_osm_nominatim_reverse, :lat => 51.7632, :lon => -0.0076, :zoom => 17 results_check :name => "Dinant Link Road, Broxbourne, Hertfordshire, East of England, England, EN11 8HX, United Kingdom", :lat => 51.7634883, :lon => -0.0088373, - :type => "way", :id => 3489841, :zoom => 17 + :type => "way", :id => 3489841, :zoom => 17 end end diff --git a/test/controllers/message_controller_test.rb b/test/controllers/message_controller_test.rb index 427519c32..210a05288 100644 --- a/test/controllers/message_controller_test.rb +++ b/test/controllers/message_controller_test.rb @@ -1,7 +1,7 @@ require "test_helper" class MessageControllerTest < ActionController::TestCase - fixtures :users, :messages + fixtures :users ## # test all routes which lead to this controller @@ -45,12 +45,16 @@ class MessageControllerTest < ActionController::TestCase end ## - # test the new action - def test_new + # test fetching new message page when not logged in + def test_new_no_login # Check that the new message page requires us to login get :new, :display_name => users(:public_user).display_name assert_redirected_to login_path(:referer => new_message_path(:display_name => users(:public_user).display_name)) + end + ## + # test fetching new message page when logged in + def test_new_form # Login as a normal user session[:user] = users(:normal_user).id @@ -64,6 +68,39 @@ class MessageControllerTest < ActionController::TestCase assert_select "textarea#message_body", :count => 1 assert_select "input[type='submit'][value='Send']", :count => 1 end + end + + ## + # test fetching new message page with body and title + def test_new_get_with_params + # Login as a normal user + session[:user] = users(:normal_user).id + + # Check that we can't send a message from a GET request + assert_difference "ActionMailer::Base.deliveries.size", 0 do + assert_difference "Message.count", 0 do + get :new, + :display_name => users(:public_user).display_name, + :message => { :title => "Test Message", :body => "Test message body" } + end + end + assert_response :success + assert_template "new" + assert_select "title", "OpenStreetMap | Send message" + assert_select "form[action='#{new_message_path(:display_name => users(:public_user).display_name)}']", :count => 1 do + assert_select "input#message_title", :count => 1 do + assert_select "[value='Test Message']" + end + assert_select "textarea#message_body", :text => "Test message body", :count => 1 + assert_select "input[type='submit'][value='Send']", :count => 1 + end + end + + ## + # test posting new message page with no body + def test_new_post_no_body + # Login as a normal user + session[:user] = users(:normal_user).id # Check that the subject is preserved over errors assert_difference "ActionMailer::Base.deliveries.size", 0 do @@ -83,6 +120,13 @@ class MessageControllerTest < ActionController::TestCase assert_select "textarea#message_body", :text => "", :count => 1 assert_select "input[type='submit'][value='Send']", :count => 1 end + end + + ## + # test posting new message page with no title + def test_new_post_no_title + # Login as a normal user + session[:user] = users(:normal_user).id # Check that the body text is preserved over errors assert_difference "ActionMailer::Base.deliveries.size", 0 do @@ -102,6 +146,13 @@ class MessageControllerTest < ActionController::TestCase assert_select "textarea#message_body", :text => "Test message body", :count => 1 assert_select "input[type='submit'][value='Send']", :count => 1 end + end + + ## + # test posting new message page sends message + def test_new_post_send + # Login as a normal user + session[:user] = users(:normal_user).id # Check that sending a message works assert_difference "ActionMailer::Base.deliveries.size", 1 do @@ -119,7 +170,7 @@ class MessageControllerTest < ActionController::TestCase assert_match /Test message body/, e.text_part.decoded assert_match /Test message body/, e.html_part.decoded ActionMailer::Base.deliveries.clear - m = Message.find(3) + m = Message.last assert_equal users(:normal_user).id, m.from_user_id assert_equal users(:public_user).id, m.to_user_id assert_in_delta Time.now, m.sent_on, 2 @@ -158,32 +209,34 @@ class MessageControllerTest < ActionController::TestCase ## # test the reply action def test_reply + unread_message = create(:message, :unread, :sender => users(:normal_user), :recipient => users(:public_user)) + # Check that the message reply page requires us to login - get :reply, :message_id => messages(:unread_message).id - assert_redirected_to login_path(:referer => reply_message_path(:message_id => messages(:unread_message).id)) + get :reply, :message_id => unread_message.id + assert_redirected_to login_path(:referer => reply_message_path(:message_id => unread_message.id)) # Login as the wrong user session[:user] = users(:second_public_user).id # Check that we can't reply to somebody else's message - get :reply, :message_id => messages(:unread_message).id - assert_redirected_to login_path(:referer => reply_message_path(:message_id => messages(:unread_message).id)) + get :reply, :message_id => unread_message.id + assert_redirected_to login_path(:referer => reply_message_path(:message_id => unread_message.id)) assert_equal "You are logged in as `pulibc_test2' but the message you have asked to reply to was not sent to that user. Please login as the correct user in order to reply.", flash[:notice] # Login as the right user session[:user] = users(:public_user).id # Check that the message reply page loads - get :reply, :message_id => messages(:unread_message).id + get :reply, :message_id => unread_message.id assert_response :success assert_template "new" - assert_select "title", "OpenStreetMap | Re: test message 1" + assert_select "title", "OpenStreetMap | Re: #{unread_message.title}" assert_select "form[action='#{new_message_path(:display_name => users(:normal_user).display_name)}']", :count => 1 do - assert_select "input#message_title[value='Re: test message 1']", :count => 1 + assert_select "input#message_title[value='Re: #{unread_message.title}']", :count => 1 assert_select "textarea#message_body", :count => 1 assert_select "input[type='submit'][value='Send']", :count => 1 end - assert_equal true, Message.find(messages(:unread_message).id).message_read + assert_equal true, Message.find(unread_message.id).message_read # Asking to reply to a message with no ID should fail assert_raise ActionController::UrlGenerationError do @@ -199,35 +252,37 @@ class MessageControllerTest < ActionController::TestCase ## # test the read action def test_read + unread_message = create(:message, :unread, :sender => users(:normal_user), :recipient => users(:public_user)) + # Check that the read message page requires us to login - get :read, :message_id => messages(:unread_message).id - assert_redirected_to login_path(:referer => read_message_path(:message_id => messages(:unread_message).id)) + get :read, :message_id => unread_message.id + assert_redirected_to login_path(:referer => read_message_path(:message_id => unread_message.id)) # Login as the wrong user session[:user] = users(:second_public_user).id # Check that we can't read the message - get :read, :message_id => messages(:unread_message).id - assert_redirected_to login_path(:referer => read_message_path(:message_id => messages(:unread_message).id)) + get :read, :message_id => unread_message.id + assert_redirected_to login_path(:referer => read_message_path(:message_id => unread_message.id)) assert_equal "You are logged in as `pulibc_test2' but the message you have asked to read was not sent by or to that user. Please login as the correct user in order to read it.", flash[:notice] # Login as the message sender session[:user] = users(:normal_user).id # Check that the message sender can read the message - get :read, :message_id => messages(:unread_message).id + get :read, :message_id => unread_message.id assert_response :success assert_template "read" - assert_equal false, Message.find(messages(:unread_message).id).message_read + assert_equal false, Message.find(unread_message.id).message_read # Login as the message recipient session[:user] = users(:public_user).id # Check that the message recipient can read the message - get :read, :message_id => messages(:unread_message).id + get :read, :message_id => unread_message.id assert_response :success assert_template "read" - assert_equal true, Message.find(messages(:unread_message).id).message_read + assert_equal true, Message.find(unread_message.id).message_read # Asking to read a message with no ID should fail assert_raise ActionController::UrlGenerationError do @@ -243,6 +298,7 @@ class MessageControllerTest < ActionController::TestCase ## # test the inbox action def test_inbox + read_message = create(:message, :read, :recipient => users(:normal_user)) # Check that the inbox page requires us to login get :inbox, :display_name => users(:normal_user).display_name assert_redirected_to login_path(:referer => inbox_path(:display_name => users(:normal_user).display_name)) @@ -256,7 +312,7 @@ class MessageControllerTest < ActionController::TestCase assert_template "inbox" assert_select "table.messages", :count => 1 do assert_select "tr", :count => 2 - assert_select "tr#inbox-#{messages(:read_message).id}.inbox-row", :count => 1 + assert_select "tr#inbox-#{read_message.id}.inbox-row", :count => 1 end # Check that we can't view somebody else's inbox when logged in @@ -267,6 +323,8 @@ class MessageControllerTest < ActionController::TestCase ## # test the outbox action def test_outbox + create(:message, :sender => users(:normal_user)) + # Check that the outbox page requires us to login get :outbox, :display_name => users(:normal_user).display_name assert_redirected_to login_path(:referer => outbox_path(:display_name => users(:normal_user).display_name)) @@ -291,15 +349,17 @@ class MessageControllerTest < ActionController::TestCase ## # test the mark action def test_mark + unread_message = create(:message, :unread, :sender => users(:normal_user), :recipient => users(:public_user)) + # Check that the marking a message requires us to login - post :mark, :message_id => messages(:unread_message).id + post :mark, :message_id => unread_message.id assert_response :forbidden # Login as a user with no messages session[:user] = users(:second_public_user).id # Check that marking a message we didn't send or receive fails - post :mark, :message_id => messages(:read_message).id + post :mark, :message_id => unread_message.id assert_response :not_found assert_template "no_such_message" @@ -307,26 +367,26 @@ class MessageControllerTest < ActionController::TestCase session[:user] = users(:public_user).id # Check that the marking a message read works - post :mark, :message_id => messages(:unread_message).id, :mark => "read" + post :mark, :message_id => unread_message.id, :mark => "read" assert_redirected_to inbox_path(:display_name => users(:public_user).display_name) - assert_equal true, Message.find(messages(:unread_message).id).message_read + assert_equal true, Message.find(unread_message.id).message_read # Check that the marking a message unread works - post :mark, :message_id => messages(:unread_message).id, :mark => "unread" + post :mark, :message_id => unread_message.id, :mark => "unread" assert_redirected_to inbox_path(:display_name => users(:public_user).display_name) - assert_equal false, Message.find(messages(:unread_message).id).message_read + assert_equal false, Message.find(unread_message.id).message_read # Check that the marking a message read via XHR works - xhr :post, :mark, :message_id => messages(:unread_message).id, :mark => "read" + xhr :post, :mark, :message_id => unread_message.id, :mark => "read" assert_response :success assert_template "mark" - assert_equal true, Message.find(messages(:unread_message).id).message_read + assert_equal true, Message.find(unread_message.id).message_read # Check that the marking a message unread via XHR works - xhr :post, :mark, :message_id => messages(:unread_message).id, :mark => "unread" + xhr :post, :mark, :message_id => unread_message.id, :mark => "unread" assert_response :success assert_template "mark" - assert_equal false, Message.find(messages(:unread_message).id).message_read + assert_equal false, Message.find(unread_message.id).message_read # Asking to mark a message with no ID should fail assert_raise ActionController::UrlGenerationError do @@ -342,15 +402,18 @@ class MessageControllerTest < ActionController::TestCase ## # test the delete action def test_delete + read_message = create(:message, :read, :recipient => users(:normal_user), :sender => users(:public_user)) + sent_message = create(:message, :unread, :recipient => users(:public_user), :sender => users(:normal_user)) + # Check that the deleting a message requires us to login - post :delete, :message_id => messages(:read_message).id + post :delete, :message_id => read_message.id assert_response :forbidden # Login as a user with no messages session[:user] = users(:second_public_user).id # Check that deleting a message we didn't send or receive fails - post :delete, :message_id => messages(:read_message).id + post :delete, :message_id => read_message.id assert_response :not_found assert_template "no_such_message" @@ -358,18 +421,18 @@ class MessageControllerTest < ActionController::TestCase session[:user] = users(:normal_user).id # Check that the deleting a received message works - post :delete, :message_id => messages(:read_message).id + post :delete, :message_id => read_message.id assert_redirected_to inbox_path(:display_name => users(:normal_user).display_name) assert_equal "Message deleted", flash[:notice] - m = Message.find(messages(:read_message).id) + m = Message.find(read_message.id) assert_equal true, m.from_user_visible assert_equal false, m.to_user_visible # Check that the deleting a sent message works - post :delete, :message_id => messages(:unread_message).id, :referer => outbox_path(:display_name => users(:normal_user).display_name) + post :delete, :message_id => sent_message.id, :referer => outbox_path(:display_name => users(:normal_user).display_name) assert_redirected_to outbox_path(:display_name => users(:normal_user).display_name) assert_equal "Message deleted", flash[:notice] - m = Message.find(messages(:unread_message).id) + m = Message.find(sent_message.id) assert_equal false, m.from_user_visible assert_equal true, m.to_user_visible diff --git a/test/controllers/node_controller_test.rb b/test/controllers/node_controller_test.rb index 8952daade..ffc86b2f6 100644 --- a/test/controllers/node_controller_test.rb +++ b/test/controllers/node_controller_test.rb @@ -437,13 +437,14 @@ class NodeControllerTest < ActionController::TestCase ## # test adding tags to a node def test_duplicate_tags + existing = create(:node_tag, :node => current_nodes(:public_visible_node)) # setup auth basic_authorization(users(:public_user).email, "test") # add an identical tag to the node tag_xml = XML::Node.new("tag") - tag_xml["k"] = current_node_tags(:public_v_t1).k - tag_xml["v"] = current_node_tags(:public_v_t1).v + tag_xml["k"] = existing.k + tag_xml["v"] = existing.v # add the tag into the existing xml node_xml = current_nodes(:public_visible_node).to_xml @@ -454,7 +455,7 @@ class NodeControllerTest < ActionController::TestCase put :update, :id => current_nodes(:public_visible_node).id assert_response :bad_request, "adding duplicate tags to a node should fail with 'bad request'" - assert_equal "Element node/#{current_nodes(:public_visible_node).id} has duplicate tags with key #{current_node_tags(:t1).k}", @response.body + assert_equal "Element node/#{current_nodes(:public_visible_node).id} has duplicate tags with key #{existing.k}", @response.body end # test whether string injection is possible @@ -466,8 +467,8 @@ class NodeControllerTest < ActionController::TestCase # try and put something into a string that the API might # use unquoted and therefore allow code injection... content "" + - '' + - "" + '' + + "" put :create assert_require_public_data "Shouldn't be able to create with non-public user" @@ -478,8 +479,8 @@ class NodeControllerTest < ActionController::TestCase # try and put something into a string that the API might # use unquoted and therefore allow code injection... content "" + - '' + - "" + '' + + "" put :create assert_response :success nodeid = @response.body diff --git a/test/controllers/notes_controller_test.rb b/test/controllers/notes_controller_test.rb index b0fc3e1ee..ab63bbca2 100644 --- a/test/controllers/notes_controller_test.rb +++ b/test/controllers/notes_controller_test.rb @@ -1,7 +1,13 @@ require "test_helper" class NotesControllerTest < ActionController::TestCase - fixtures :users, :user_roles, :notes, :note_comments + fixtures :users, :user_roles + + def setup + # Stub nominatim response for note locations + stub_request(:get, %r{^http://nominatim\.openstreetmap\.org/reverse\?}) + .to_return(:status => 404) + end ## # test all routes which lead to this controller @@ -214,44 +220,50 @@ class NotesControllerTest < ActionController::TestCase end def test_comment_success + open_note_with_comment = create(:note_with_comments) assert_difference "NoteComment.count", 1 do assert_no_difference "ActionMailer::Base.deliveries.size" do - post :comment, :id => notes(:open_note_with_comment).id, :text => "This is an additional comment", :format => "json" + post :comment, :id => open_note_with_comment.id, :text => "This is an additional comment", :format => "json" end end assert_response :success js = ActiveSupport::JSON.decode(@response.body) assert_not_nil js assert_equal "Feature", js["type"] - assert_equal notes(:open_note_with_comment).id, js["properties"]["id"] + assert_equal open_note_with_comment.id, js["properties"]["id"] assert_equal "open", js["properties"]["status"] - assert_equal 3, js["properties"]["comments"].count + assert_equal 2, js["properties"]["comments"].count assert_equal "commented", js["properties"]["comments"].last["action"] assert_equal "This is an additional comment", js["properties"]["comments"].last["text"] assert_nil js["properties"]["comments"].last["user"] - get :show, :id => notes(:open_note_with_comment).id, :format => "json" + get :show, :id => open_note_with_comment.id, :format => "json" assert_response :success js = ActiveSupport::JSON.decode(@response.body) assert_not_nil js assert_equal "Feature", js["type"] - assert_equal notes(:open_note_with_comment).id, js["properties"]["id"] + assert_equal open_note_with_comment.id, js["properties"]["id"] assert_equal "open", js["properties"]["status"] - assert_equal 3, js["properties"]["comments"].count + assert_equal 2, js["properties"]["comments"].count assert_equal "commented", js["properties"]["comments"].last["action"] assert_equal "This is an additional comment", js["properties"]["comments"].last["text"] assert_nil js["properties"]["comments"].last["user"] + # Ensure that emails are sent to users + note_with_comments_by_users = create(:note) do |note| + create(:note_comment, :note => note, :author => users(:normal_user)) + create(:note_comment, :note => note, :author => users(:second_public_user)) + end assert_difference "NoteComment.count", 1 do assert_difference "ActionMailer::Base.deliveries.size", 2 do - post :comment, :id => notes(:note_with_comments_by_users).id, :text => "This is an additional comment", :format => "json" + post :comment, :id => note_with_comments_by_users.id, :text => "This is an additional comment", :format => "json" end end assert_response :success js = ActiveSupport::JSON.decode(@response.body) assert_not_nil js assert_equal "Feature", js["type"] - assert_equal notes(:note_with_comments_by_users).id, js["properties"]["id"] + assert_equal note_with_comments_by_users.id, js["properties"]["id"] assert_equal "open", js["properties"]["status"] assert_equal 3, js["properties"]["comments"].count assert_equal "commented", js["properties"]["comments"].last["action"] @@ -268,12 +280,12 @@ class NotesControllerTest < ActionController::TestCase assert_equal 1, email.to.length assert_equal "[OpenStreetMap] An anonymous user has commented on a note you are interested in", email.subject - get :show, :id => notes(:note_with_comments_by_users).id, :format => "json" + get :show, :id => note_with_comments_by_users.id, :format => "json" assert_response :success js = ActiveSupport::JSON.decode(@response.body) assert_not_nil js assert_equal "Feature", js["type"] - assert_equal notes(:note_with_comments_by_users).id, js["properties"]["id"] + assert_equal note_with_comments_by_users.id, js["properties"]["id"] assert_equal "open", js["properties"]["status"] assert_equal 3, js["properties"]["comments"].count assert_equal "commented", js["properties"]["comments"].last["action"] @@ -286,14 +298,14 @@ class NotesControllerTest < ActionController::TestCase assert_difference "NoteComment.count", 1 do assert_difference "ActionMailer::Base.deliveries.size", 2 do - post :comment, :id => notes(:note_with_comments_by_users).id, :text => "This is an additional comment", :format => "json" + post :comment, :id => note_with_comments_by_users.id, :text => "This is an additional comment", :format => "json" end end assert_response :success js = ActiveSupport::JSON.decode(@response.body) assert_not_nil js assert_equal "Feature", js["type"] - assert_equal notes(:note_with_comments_by_users).id, js["properties"]["id"] + assert_equal note_with_comments_by_users.id, js["properties"]["id"] assert_equal "open", js["properties"]["status"] assert_equal 4, js["properties"]["comments"].count assert_equal "commented", js["properties"]["comments"].last["action"] @@ -311,12 +323,12 @@ class NotesControllerTest < ActionController::TestCase assert_equal 1, email.to.length assert_equal "[OpenStreetMap] test2 has commented on a note you are interested in", email.subject - get :show, :id => notes(:note_with_comments_by_users).id, :format => "json" + get :show, :id => note_with_comments_by_users.id, :format => "json" assert_response :success js = ActiveSupport::JSON.decode(@response.body) assert_not_nil js assert_equal "Feature", js["type"] - assert_equal notes(:note_with_comments_by_users).id, js["properties"]["id"] + assert_equal note_with_comments_by_users.id, js["properties"]["id"] assert_equal "open", js["properties"]["status"] assert_equal 4, js["properties"]["comments"].count assert_equal "commented", js["properties"]["comments"].last["action"] @@ -327,18 +339,20 @@ class NotesControllerTest < ActionController::TestCase end def test_comment_fail + open_note_with_comment = create(:note_with_comments) + assert_no_difference "NoteComment.count" do post :comment, :text => "This is an additional comment" end assert_response :bad_request assert_no_difference "NoteComment.count" do - post :comment, :id => notes(:open_note_with_comment).id + post :comment, :id => open_note_with_comment.id end assert_response :bad_request assert_no_difference "NoteComment.count" do - post :comment, :id => notes(:open_note_with_comment).id, :text => "" + post :comment, :id => open_note_with_comment.id, :text => "" end assert_response :bad_request @@ -347,43 +361,49 @@ class NotesControllerTest < ActionController::TestCase end assert_response :not_found + hidden_note_with_comment = create(:note_with_comments, :status => "hidden") + assert_no_difference "NoteComment.count" do - post :comment, :id => notes(:hidden_note_with_comment).id, :text => "This is an additional comment" + post :comment, :id => hidden_note_with_comment.id, :text => "This is an additional comment" end assert_response :gone + closed_note_with_comment = create(:note_with_comments, :status => "closed", :closed_at => Time.now) + assert_no_difference "NoteComment.count" do - post :comment, :id => notes(:closed_note_with_comment).id, :text => "This is an additional comment" + post :comment, :id => closed_note_with_comment.id, :text => "This is an additional comment" end assert_response :conflict end def test_close_success - post :close, :id => notes(:open_note_with_comment).id, :text => "This is a close comment", :format => "json" + open_note_with_comment = create(:note_with_comments) + + post :close, :id => open_note_with_comment.id, :text => "This is a close comment", :format => "json" assert_response :unauthorized basic_authorization(users(:public_user).email, "test") - post :close, :id => notes(:open_note_with_comment).id, :text => "This is a close comment", :format => "json" + post :close, :id => open_note_with_comment.id, :text => "This is a close comment", :format => "json" assert_response :success js = ActiveSupport::JSON.decode(@response.body) assert_not_nil js assert_equal "Feature", js["type"] - assert_equal notes(:open_note_with_comment).id, js["properties"]["id"] + assert_equal open_note_with_comment.id, js["properties"]["id"] assert_equal "closed", js["properties"]["status"] - assert_equal 3, js["properties"]["comments"].count + assert_equal 2, js["properties"]["comments"].count assert_equal "closed", js["properties"]["comments"].last["action"] assert_equal "This is a close comment", js["properties"]["comments"].last["text"] assert_equal "test2", js["properties"]["comments"].last["user"] - get :show, :id => notes(:open_note_with_comment).id, :format => "json" + get :show, :id => open_note_with_comment.id, :format => "json" assert_response :success js = ActiveSupport::JSON.decode(@response.body) assert_not_nil js assert_equal "Feature", js["type"] - assert_equal notes(:open_note_with_comment).id, js["properties"]["id"] + assert_equal open_note_with_comment.id, js["properties"]["id"] assert_equal "closed", js["properties"]["status"] - assert_equal 3, js["properties"]["comments"].count + assert_equal 2, js["properties"]["comments"].count assert_equal "closed", js["properties"]["comments"].last["action"] assert_equal "This is a close comment", js["properties"]["comments"].last["text"] assert_equal "test2", js["properties"]["comments"].last["user"] @@ -401,37 +421,43 @@ class NotesControllerTest < ActionController::TestCase post :close, :id => 12345 assert_response :not_found - post :close, :id => notes(:hidden_note_with_comment).id + hidden_note_with_comment = create(:note_with_comments, :status => "hidden") + + post :close, :id => hidden_note_with_comment.id assert_response :gone - post :close, :id => notes(:closed_note_with_comment).id + closed_note_with_comment = create(:note_with_comments, :status => "closed", :closed_at => Time.now) + + post :close, :id => closed_note_with_comment.id assert_response :conflict end def test_reopen_success - post :reopen, :id => notes(:closed_note_with_comment).id, :text => "This is a reopen comment", :format => "json" + closed_note_with_comment = create(:note_with_comments, :status => "closed", :closed_at => Time.now) + + post :reopen, :id => closed_note_with_comment.id, :text => "This is a reopen comment", :format => "json" assert_response :unauthorized basic_authorization(users(:public_user).email, "test") - post :reopen, :id => notes(:closed_note_with_comment).id, :text => "This is a reopen comment", :format => "json" + post :reopen, :id => closed_note_with_comment.id, :text => "This is a reopen comment", :format => "json" assert_response :success js = ActiveSupport::JSON.decode(@response.body) assert_not_nil js assert_equal "Feature", js["type"] - assert_equal notes(:closed_note_with_comment).id, js["properties"]["id"] + assert_equal closed_note_with_comment.id, js["properties"]["id"] assert_equal "open", js["properties"]["status"] assert_equal 2, js["properties"]["comments"].count assert_equal "reopened", js["properties"]["comments"].last["action"] assert_equal "This is a reopen comment", js["properties"]["comments"].last["text"] assert_equal "test2", js["properties"]["comments"].last["user"] - get :show, :id => notes(:closed_note_with_comment).id, :format => "json" + get :show, :id => closed_note_with_comment.id, :format => "json" assert_response :success js = ActiveSupport::JSON.decode(@response.body) assert_not_nil js assert_equal "Feature", js["type"] - assert_equal notes(:closed_note_with_comment).id, js["properties"]["id"] + assert_equal closed_note_with_comment.id, js["properties"]["id"] assert_equal "open", js["properties"]["status"] assert_equal 2, js["properties"]["comments"].count assert_equal "reopened", js["properties"]["comments"].last["action"] @@ -440,7 +466,9 @@ class NotesControllerTest < ActionController::TestCase end def test_reopen_fail - post :reopen, :id => notes(:hidden_note_with_comment).id + hidden_note_with_comment = create(:note_with_comments, :status => "hidden") + + post :reopen, :id => hidden_note_with_comment.id assert_response :unauthorized basic_authorization(users(:public_user).email, "test") @@ -448,122 +476,138 @@ class NotesControllerTest < ActionController::TestCase post :reopen, :id => 12345 assert_response :not_found - post :reopen, :id => notes(:hidden_note_with_comment).id + post :reopen, :id => hidden_note_with_comment.id assert_response :gone - post :reopen, :id => notes(:open_note_with_comment).id + open_note_with_comment = create(:note_with_comments) + + post :reopen, :id => open_note_with_comment.id assert_response :conflict end def test_show_success - get :show, :id => notes(:open_note).id, :format => "xml" + open_note = create(:note_with_comments) + + get :show, :id => open_note.id, :format => "xml" assert_response :success assert_equal "application/xml", @response.content_type assert_select "osm", :count => 1 do - assert_select "note[lat='#{notes(:open_note).lat}'][lon='#{notes(:open_note).lon}']", :count => 1 do - assert_select "id", notes(:open_note).id - assert_select "url", note_url(notes(:open_note), :format => "xml") - assert_select "comment_url", comment_note_url(notes(:open_note), :format => "xml") - assert_select "close_url", close_note_url(notes(:open_note), :format => "xml") - assert_select "date_created", notes(:open_note).created_at.to_s - assert_select "status", notes(:open_note).status + assert_select "note[lat='#{open_note.lat}'][lon='#{open_note.lon}']", :count => 1 do + assert_select "id", open_note.id.to_s + assert_select "url", note_url(open_note, :format => "xml") + assert_select "comment_url", comment_note_url(open_note, :format => "xml") + assert_select "close_url", close_note_url(open_note, :format => "xml") + assert_select "date_created", open_note.created_at.to_s + assert_select "status", open_note.status assert_select "comments", :count => 1 do assert_select "comment", :count => 1 end end end - get :show, :id => notes(:open_note).id, :format => "rss" + get :show, :id => open_note.id, :format => "rss" assert_response :success assert_equal "application/rss+xml", @response.content_type assert_select "rss", :count => 1 do assert_select "channel", :count => 1 do assert_select "item", :count => 1 do - assert_select "link", browse_note_url(notes(:open_note)) - assert_select "guid", note_url(notes(:open_note)) - assert_select "pubDate", notes(:open_note).created_at.to_s(:rfc822) - # assert_select "geo:lat", notes(:open_note).lat.to_s - # assert_select "geo:long", notes(:open_note).lon - # assert_select "georss:point", "#{notes(:open_note).lon} #{notes(:open_note).lon}" + assert_select "link", browse_note_url(open_note) + assert_select "guid", note_url(open_note) + assert_select "pubDate", open_note.created_at.to_s(:rfc822) + # assert_select "geo:lat", open_note.lat.to_s + # assert_select "geo:long", open_note.lon + # assert_select "georss:point", "#{open_note.lon} #{open_note.lon}" end end end - get :show, :id => notes(:open_note).id, :format => "json" + get :show, :id => open_note.id, :format => "json" assert_response :success assert_equal "application/json", @response.content_type js = ActiveSupport::JSON.decode(@response.body) assert_not_nil js assert_equal "Feature", js["type"] assert_equal "Point", js["geometry"]["type"] - assert_equal notes(:open_note).lat, js["geometry"]["coordinates"][0] - assert_equal notes(:open_note).lon, js["geometry"]["coordinates"][1] - assert_equal notes(:open_note).id, js["properties"]["id"] - assert_equal note_url(notes(:open_note), :format => "json"), js["properties"]["url"] - assert_equal comment_note_url(notes(:open_note), :format => "json"), js["properties"]["comment_url"] - assert_equal close_note_url(notes(:open_note), :format => "json"), js["properties"]["close_url"] - assert_equal notes(:open_note).created_at, js["properties"]["date_created"] - assert_equal notes(:open_note).status, js["properties"]["status"] + assert_equal open_note.lat, js["geometry"]["coordinates"][0] + assert_equal open_note.lon, js["geometry"]["coordinates"][1] + assert_equal open_note.id, js["properties"]["id"] + assert_equal note_url(open_note, :format => "json"), js["properties"]["url"] + assert_equal comment_note_url(open_note, :format => "json"), js["properties"]["comment_url"] + assert_equal close_note_url(open_note, :format => "json"), js["properties"]["close_url"] + assert_equal open_note.created_at.to_s, js["properties"]["date_created"] + assert_equal open_note.status, js["properties"]["status"] - get :show, :id => notes(:open_note).id, :format => "gpx" + get :show, :id => open_note.id, :format => "gpx" assert_response :success assert_equal "application/gpx+xml", @response.content_type assert_select "gpx", :count => 1 do - assert_select "wpt[lat='#{notes(:open_note).lat}'][lon='#{notes(:open_note).lon}']", :count => 1 do - assert_select "extension", :count => 1 do - assert_select "id", notes(:open_note).id - assert_select "url", note_url(notes(:open_note), :format => "gpx") - assert_select "comment_url", comment_note_url(notes(:open_note), :format => "gpx") - assert_select "close_url", close_note_url(notes(:open_note), :format => "gpx") + assert_select "wpt[lat='#{open_note.lat}'][lon='#{open_note.lon}']", :count => 1 do + assert_select "time", :count => 1 + assert_select "name", "Note: #{open_note.id}" + assert_select "desc", :count => 1 + assert_select "link[href='http://test.host/note/#{open_note.id}']", :count => 1 + assert_select "extensions", :count => 1 do + assert_select "id", open_note.id.to_s + assert_select "url", note_url(open_note, :format => "gpx") + assert_select "comment_url", comment_note_url(open_note, :format => "gpx") + assert_select "close_url", close_note_url(open_note, :format => "gpx") end end end end def test_show_hidden_comment - get :show, :id => notes(:note_with_hidden_comment).id, :format => "json" + note_with_hidden_comment = create(:note) do |note| + create(:note_comment, :note => note, :body => "Valid comment for hidden note") + create(:note_comment, :note => note, :visible => false) + create(:note_comment, :note => note, :body => "Another valid comment for hidden note") + end + + get :show, :id => note_with_hidden_comment.id, :format => "json" assert_response :success js = ActiveSupport::JSON.decode(@response.body) assert_not_nil js assert_equal "Feature", js["type"] - assert_equal notes(:note_with_hidden_comment).id, js["properties"]["id"] + assert_equal note_with_hidden_comment.id, js["properties"]["id"] assert_equal 2, js["properties"]["comments"].count - assert_equal "Valid comment for note 5", js["properties"]["comments"][0]["text"] - assert_equal "Another valid comment for note 5", js["properties"]["comments"][1]["text"] + assert_equal "Valid comment for hidden note", js["properties"]["comments"][0]["text"] + assert_equal "Another valid comment for hidden note", js["properties"]["comments"][1]["text"] end def test_show_fail get :show, :id => 12345 assert_response :not_found - get :show, :id => notes(:hidden_note_with_comment).id + get :show, :id => create(:note, :status => "hidden").id assert_response :gone end def test_destroy_success - delete :destroy, :id => notes(:open_note_with_comment).id, :text => "This is a hide comment", :format => "json" + open_note_with_comment = create(:note_with_comments) + + delete :destroy, :id => open_note_with_comment.id, :text => "This is a hide comment", :format => "json" assert_response :unauthorized basic_authorization(users(:public_user).email, "test") - delete :destroy, :id => notes(:open_note_with_comment).id, :text => "This is a hide comment", :format => "json" + delete :destroy, :id => open_note_with_comment.id, :text => "This is a hide comment", :format => "json" assert_response :forbidden basic_authorization(users(:moderator_user).email, "test") - delete :destroy, :id => notes(:open_note_with_comment).id, :text => "This is a hide comment", :format => "json" + delete :destroy, :id => open_note_with_comment.id, :text => "This is a hide comment", :format => "json" assert_response :success js = ActiveSupport::JSON.decode(@response.body) assert_not_nil js assert_equal "Feature", js["type"] - assert_equal notes(:open_note_with_comment).id, js["properties"]["id"] + assert_equal open_note_with_comment.id, js["properties"]["id"] assert_equal "hidden", js["properties"]["status"] - assert_equal 3, js["properties"]["comments"].count + assert_equal 2, js["properties"]["comments"].count assert_equal "hidden", js["properties"]["comments"].last["action"] assert_equal "This is a hide comment", js["properties"]["comments"].last["text"] assert_equal "moderator", js["properties"]["comments"].last["user"] - get :show, :id => notes(:open_note_with_comment).id, :format => "json" + get :show, :id => open_note_with_comment.id, :format => "json" assert_response :gone end @@ -581,11 +625,17 @@ class NotesControllerTest < ActionController::TestCase delete :destroy, :id => 12345, :format => "json" assert_response :not_found - delete :destroy, :id => notes(:hidden_note_with_comment).id, :format => "json" + hidden_note_with_comment = create(:note_with_comments, :status => "hidden") + + delete :destroy, :id => hidden_note_with_comment.id, :format => "json" assert_response :gone end def test_index_success + position = (1.1 * GeoRecord::SCALE).to_i + create(:note_with_comments, :latitude => position, :longitude => position) + create(:note_with_comments, :latitude => position, :longitude => position) + get :index, :bbox => "1,1,1.2,1.2", :format => "rss" assert_response :success assert_equal "application/rss+xml", @response.content_type @@ -619,6 +669,10 @@ class NotesControllerTest < ActionController::TestCase end def test_index_limit + position = (1.1 * GeoRecord::SCALE).to_i + create(:note_with_comments, :latitude => position, :longitude => position) + create(:note_with_comments, :latitude => position, :longitude => position) + get :index, :bbox => "1,1,1.2,1.2", :limit => 1, :format => "rss" assert_response :success assert_equal "application/rss+xml", @response.content_type @@ -703,29 +757,37 @@ class NotesControllerTest < ActionController::TestCase end def test_index_closed + create(:note_with_comments, :status => "closed", :closed_at => Time.now - 5.days) + create(:note_with_comments, :status => "closed", :closed_at => Time.now - 100.days) + create(:note_with_comments, :status => "hidden") + create(:note_with_comments) + + # Open notes + closed in last 7 days get :index, :bbox => "1,1,1.7,1.7", :closed => "7", :format => "json" assert_response :success assert_equal "application/json", @response.content_type js = ActiveSupport::JSON.decode(@response.body) assert_not_nil js assert_equal "FeatureCollection", js["type"] - assert_equal 4, js["features"].count + assert_equal 2, js["features"].count + # Only open notes get :index, :bbox => "1,1,1.7,1.7", :closed => "0", :format => "json" assert_response :success assert_equal "application/json", @response.content_type js = ActiveSupport::JSON.decode(@response.body) assert_not_nil js assert_equal "FeatureCollection", js["type"] - assert_equal 4, js["features"].count + assert_equal 1, js["features"].count + # Open notes + all closed notes get :index, :bbox => "1,1,1.7,1.7", :closed => "-1", :format => "json" assert_response :success assert_equal "application/json", @response.content_type js = ActiveSupport::JSON.decode(@response.body) assert_not_nil js assert_equal "FeatureCollection", js["type"] - assert_equal 6, js["features"].count + assert_equal 3, js["features"].count end def test_index_bad_params @@ -755,14 +817,16 @@ class NotesControllerTest < ActionController::TestCase end def test_search_success - get :search, :q => "note 1", :format => "xml" + create(:note_with_comments) + + get :search, :q => "note comment", :format => "xml" assert_response :success assert_equal "application/xml", @response.content_type assert_select "osm", :count => 1 do assert_select "note", :count => 1 end - get :search, :q => "note 1", :format => "json" + get :search, :q => "note comment", :format => "json" assert_response :success assert_equal "application/json", @response.content_type js = ActiveSupport::JSON.decode(@response.body) @@ -770,7 +834,7 @@ class NotesControllerTest < ActionController::TestCase assert_equal "FeatureCollection", js["type"] assert_equal 1, js["features"].count - get :search, :q => "note 1", :format => "rss" + get :search, :q => "note comment", :format => "rss" assert_response :success assert_equal "application/rss+xml", @response.content_type assert_select "rss", :count => 1 do @@ -779,7 +843,7 @@ class NotesControllerTest < ActionController::TestCase end end - get :search, :q => "note 1", :format => "gpx" + get :search, :q => "note comment", :format => "gpx" assert_response :success assert_equal "application/gpx+xml", @response.content_type assert_select "gpx", :count => 1 do @@ -788,6 +852,8 @@ class NotesControllerTest < ActionController::TestCase end def test_search_no_match + create(:note_with_comments) + get :search, :q => "no match", :format => "xml" assert_response :success assert_equal "application/xml", @response.content_type @@ -832,12 +898,19 @@ class NotesControllerTest < ActionController::TestCase end def test_feed_success + position = (1.1 * GeoRecord::SCALE).to_i + create(:note_with_comments, :latitude => position, :longitude => position) + create(:note_with_comments, :latitude => position, :longitude => position) + position = (1.5 * GeoRecord::SCALE).to_i + create(:note_with_comments, :latitude => position, :longitude => position) + create(:note_with_comments, :latitude => position, :longitude => position) + get :feed, :format => "rss" assert_response :success assert_equal "application/rss+xml", @response.content_type assert_select "rss", :count => 1 do assert_select "channel", :count => 1 do - assert_select "item", :count => 8 + assert_select "item", :count => 4 end end @@ -846,7 +919,7 @@ class NotesControllerTest < ActionController::TestCase assert_equal "application/rss+xml", @response.content_type assert_select "rss", :count => 1 do assert_select "channel", :count => 1 do - assert_select "item", :count => 3 + assert_select "item", :count => 2 end end end @@ -866,11 +939,37 @@ class NotesControllerTest < ActionController::TestCase end def test_mine_success + create(:note) do |note| + create(:note_comment, :note => note, :author => users(:normal_user)) + end + create(:note) do |note| + create(:note_comment, :note => note, :author => users(:second_public_user)) + end + create(:note, :status => "hidden") do |note| + create(:note_comment, :note => note, :author => users(:second_public_user)) + end + + # Note that the table rows include a header row + get :mine, :display_name => "test" + assert_response :success + assert_select "table.note_list tr", :count => 2 + + get :mine, :display_name => "pulibc_test2" + assert_response :success + assert_select "table.note_list tr", :count => 2 + + get :mine, :display_name => "non-existent" + assert_response :not_found + + session[:user] = users(:moderator_user).id + get :mine, :display_name => "test" assert_response :success + assert_select "table.note_list tr", :count => 2 get :mine, :display_name => "pulibc_test2" assert_response :success + assert_select "table.note_list tr", :count => 3 get :mine, :display_name => "non-existent" assert_response :not_found diff --git a/test/controllers/oauth_clients_controller_test.rb b/test/controllers/oauth_clients_controller_test.rb index 1c3c14f86..020521bac 100644 --- a/test/controllers/oauth_clients_controller_test.rb +++ b/test/controllers/oauth_clients_controller_test.rb @@ -1,7 +1,7 @@ require "test_helper" class OauthClientsControllerTest < ActionController::TestCase - fixtures :users, :client_applications + fixtures :users ## # test all routes which lead to this controller @@ -38,6 +38,7 @@ class OauthClientsControllerTest < ActionController::TestCase def test_index user = users(:public_user) + create_list(:client_application, 2, :user => user) get :index, :display_name => user.display_name assert_response :redirect @@ -84,7 +85,7 @@ class OauthClientsControllerTest < ActionController::TestCase :client_application => { :name => "Test Application" } - }, { :user => user } + }, { :user => user } end assert_response :success assert_template "new" @@ -96,21 +97,22 @@ class OauthClientsControllerTest < ActionController::TestCase :name => "Test Application", :url => "http://test.example.com/" } - }, { :user => user } + }, { :user => user } end assert_response :redirect - assert_redirected_to oauth_client_path(:id => ClientApplication.find_by_name("Test Application").id) + assert_redirected_to oauth_client_path(:id => ClientApplication.find_by(:name => "Test Application").id) end def test_show user = users(:public_user) - client = client_applications(:oauth_web_app) + client = create(:client_application, :user => user) + other_client = create(:client_application) get :show, :display_name => user.display_name, :id => client.id assert_response :redirect assert_redirected_to login_path(:referer => oauth_client_path(:display_name => user.display_name, :id => client.id)) - get :show, { :display_name => user.display_name, :id => client_applications(:normal_user_app).id }, { :user => user } + get :show, { :display_name => user.display_name, :id => other_client.id }, { :user => user } assert_response :not_found assert_template "not_found" @@ -121,13 +123,14 @@ class OauthClientsControllerTest < ActionController::TestCase def test_edit user = users(:public_user) - client = client_applications(:oauth_web_app) + client = create(:client_application, :user => user) + other_client = create(:client_application) get :edit, :display_name => user.display_name, :id => client.id assert_response :redirect assert_redirected_to login_path(:referer => edit_oauth_client_path(:display_name => user.display_name, :id => client.id)) - get :edit, { :display_name => user.display_name, :id => client_applications(:normal_user_app).id }, { :user => user } + get :edit, { :display_name => user.display_name, :id => other_client.id }, { :user => user } assert_response :not_found assert_template "not_found" @@ -147,12 +150,13 @@ class OauthClientsControllerTest < ActionController::TestCase def test_update user = users(:public_user) - client = client_applications(:oauth_web_app) + client = create(:client_application, :user => user) + other_client = create(:client_application) put :update, :display_name => user.display_name, :id => client.id assert_response :forbidden - put :update, { :display_name => user.display_name, :id => client_applications(:normal_user_app).id }, { :user => user } + put :update, { :display_name => user.display_name, :id => other_client.id }, { :user => user } assert_response :not_found assert_template "not_found" @@ -163,7 +167,7 @@ class OauthClientsControllerTest < ActionController::TestCase :name => "New Name", :url => nil } - }, { :user => user } + }, { :user => user } assert_response :success assert_template "edit" @@ -174,14 +178,15 @@ class OauthClientsControllerTest < ActionController::TestCase :name => "New Name", :url => "http://new.example.com/url" } - }, { :user => user } + }, { :user => user } assert_response :redirect assert_redirected_to oauth_client_path(:id => client.id) end def test_destroy user = users(:public_user) - client = client_applications(:oauth_web_app) + client = create(:client_application, :user => user) + other_client = create(:client_application) assert_difference "ClientApplication.count", 0 do delete :destroy, :display_name => user.display_name, :id => client.id @@ -189,7 +194,7 @@ class OauthClientsControllerTest < ActionController::TestCase assert_response :forbidden assert_difference "ClientApplication.count", 0 do - delete :destroy, { :display_name => user.display_name, :id => client_applications(:normal_user_app).id }, { :user => user } + delete :destroy, { :display_name => user.display_name, :id => other_client.id }, { :user => user } end assert_response :not_found assert_template "not_found" diff --git a/test/controllers/old_node_controller_test.rb b/test/controllers/old_node_controller_test.rb index 067f6599c..181d13291 100644 --- a/test/controllers/old_node_controller_test.rb +++ b/test/controllers/old_node_controller_test.rb @@ -86,10 +86,14 @@ class OldNodeControllerTest < ActionController::TestCase basic_authorization(users(:public_user).email, "test") # setup a simple XML node + create_list(:node_tag, 2, :node => current_nodes(:node_with_versions)) xml_doc = current_nodes(:node_with_versions).to_xml xml_node = xml_doc.find("//osm/node").first nodeid = current_nodes(:node_with_versions).id + # Ensure that the current tags are propagated to the history too + propagate_tags(current_nodes(:node_with_versions), nodes(:node_with_versions_v4)) + # keep a hash of the versions => string, as we'll need something # to test against later versions = {} @@ -147,7 +151,7 @@ class OldNodeControllerTest < ActionController::TestCase check_not_found_id_version(70000, 312344) check_not_found_id_version(-1, -13) check_not_found_id_version(nodes(:visible_node).id, 24354) - check_not_found_id_version(24356, nodes(:visible_node).version) + check_not_found_id_version(24356, nodes(:visible_node).version) end def check_not_found_id_version(id, version) @@ -161,6 +165,17 @@ class OldNodeControllerTest < ActionController::TestCase # Test that getting the current version is identical to picking # that version with the version URI call. def test_current_version + create(:node_tag, :node => current_nodes(:visible_node)) + create(:node_tag, :node => current_nodes(:used_node_1)) + create(:node_tag, :node => current_nodes(:used_node_2)) + create(:node_tag, :node => current_nodes(:node_used_by_relationship)) + create(:node_tag, :node => current_nodes(:node_with_versions)) + propagate_tags(current_nodes(:visible_node), nodes(:visible_node)) + propagate_tags(current_nodes(:used_node_1), nodes(:used_node_1)) + propagate_tags(current_nodes(:used_node_2), nodes(:used_node_2)) + propagate_tags(current_nodes(:node_used_by_relationship), nodes(:node_used_by_relationship)) + propagate_tags(current_nodes(:node_with_versions), nodes(:node_with_versions_v4)) + check_current_version(current_nodes(:visible_node)) check_current_version(current_nodes(:used_node_1)) check_current_version(current_nodes(:used_node_2)) @@ -377,4 +392,10 @@ class OldNodeControllerTest < ActionController::TestCase def precision(f) (f * GeoRecord::SCALE).round.to_f / GeoRecord::SCALE end + + def propagate_tags(node, old_node) + node.tags.each do |k, v| + create(:old_node_tag, :old_node => old_node, :k => k, :v => v) + end + end end diff --git a/test/controllers/old_way_controller_test.rb b/test/controllers/old_way_controller_test.rb index 612b4a6a4..8d3bc6955 100644 --- a/test/controllers/old_way_controller_test.rb +++ b/test/controllers/old_way_controller_test.rb @@ -46,6 +46,13 @@ class OldWayControllerTest < ActionController::TestCase ## # check that we can retrieve versions of a way def test_version + create(:way_tag, :way => current_ways(:visible_way)) + create(:way_tag, :way => current_ways(:used_way)) + create(:way_tag, :way => current_ways(:way_with_versions)) + propagate_tags(current_ways(:visible_way), ways(:visible_way)) + propagate_tags(current_ways(:used_way), ways(:used_way)) + propagate_tags(current_ways(:way_with_versions), ways(:way_with_versions_v4)) + check_current_version(current_ways(:visible_way).id) check_current_version(current_ways(:used_way).id) check_current_version(current_ways(:way_with_versions).id) @@ -276,4 +283,10 @@ class OldWayControllerTest < ActionController::TestCase # now redact it post :redact, :id => way.way_id, :version => way.version, :redaction => redaction.id end + + def propagate_tags(way, old_way) + way.tags.each do |k, v| + create(:old_way_tag, :old_way => old_way, :k => k, :v => v) + end + end end diff --git a/test/controllers/redactions_controller_test.rb b/test/controllers/redactions_controller_test.rb index 1df2a6dff..3d71012b3 100644 --- a/test/controllers/redactions_controller_test.rb +++ b/test/controllers/redactions_controller_test.rb @@ -73,7 +73,7 @@ class RedactionsControllerTest < ActionController::TestCase post :create, :redaction => { :title => "Foo", :description => "Description here." } assert_response :redirect - assert_redirected_to(redaction_path(Redaction.find_by_title("Foo"))) + assert_redirected_to(redaction_path(Redaction.find_by(:title => "Foo"))) end def test_create_moderator_invalid diff --git a/test/controllers/relation_controller_test.rb b/test/controllers/relation_controller_test.rb index bb9286f1d..0366ceef0 100644 --- a/test/controllers/relation_controller_test.rb +++ b/test/controllers/relation_controller_test.rb @@ -165,8 +165,8 @@ class RelationControllerTest < ActionController::TestCase # This time try with a role attribute in the relation nid = current_nodes(:used_node_1).id content "" + - "" + - "" + "" + + "" put :create # hope for forbidden due to user assert_response :forbidden, @@ -177,7 +177,7 @@ class RelationControllerTest < ActionController::TestCase # need a role attribute to be included nid = current_nodes(:used_node_1).id content "" + - "" + "" + "" + "" put :create # hope for forbidden due to user assert_response :forbidden, @@ -188,9 +188,9 @@ class RelationControllerTest < ActionController::TestCase nid = current_nodes(:used_node_1).id wid = current_ways(:used_way).id content "" + - "" + - "" + - "" + "" + + "" + + "" put :create # hope for forbidden, due to user assert_response :forbidden, @@ -233,8 +233,8 @@ class RelationControllerTest < ActionController::TestCase # This time try with a role attribute in the relation nid = current_nodes(:used_node_1).id content "" + - "" + - "" + "" + + "" put :create # hope for success assert_response :success, @@ -265,7 +265,7 @@ class RelationControllerTest < ActionController::TestCase # need a role attribute to be included nid = current_nodes(:used_node_1).id content "" + - "" + "" + "" + "" put :create # hope for success assert_response :success, @@ -296,9 +296,9 @@ class RelationControllerTest < ActionController::TestCase nid = current_nodes(:used_node_1).id wid = current_ways(:used_way).id content "" + - "" + - "" + - "" + "" + + "" + + "" put :create # hope for success assert_response :success, @@ -337,6 +337,7 @@ class RelationControllerTest < ActionController::TestCase def test_update_relation_tags basic_authorization "test@example.com", "test" rel_id = current_relations(:multi_tag_relation).id + create_list(:relation_tag, 4, :relation => current_relations(:multi_tag_relation)) cs_id = changesets(:public_user_first_change).id with_relation(rel_id) do |rel| @@ -366,6 +367,7 @@ class RelationControllerTest < ActionController::TestCase def test_update_relation_tags_via_upload basic_authorization users(:public_user).email, "test" rel_id = current_relations(:multi_tag_relation).id + create_list(:relation_tag, 4, :relation => current_relations(:multi_tag_relation)) cs_id = changesets(:public_user_first_change).id with_relation(rel_id) do |rel| @@ -412,8 +414,8 @@ class RelationControllerTest < ActionController::TestCase # create a relation with non-existing node as member content "" + - "" + - "" + "" + + "" put :create # expect failure assert_response :precondition_failed, @@ -432,8 +434,8 @@ class RelationControllerTest < ActionController::TestCase # create some xml that should return an error content "" + - "" + - "" + "" + + "" put :create # expect failure assert_response :bad_request @@ -607,8 +609,7 @@ class RelationControllerTest < ActionController::TestCase [current_nodes(:used_node_1), current_nodes(:used_node_2), current_ways(:used_way), - current_ways(:way_with_versions) - ].each_with_index do |element, _version| + current_ways(:way_with_versions)].each_with_index do |element, _version| bbox = element.bbox.to_unscaled check_changeset_modify(bbox) do |changeset_id| relation_xml = Relation.find(relation_id).to_xml @@ -963,7 +964,7 @@ OSM a_tags.each do |k, v| assert_equal v, b_tags[k], "Tags which were not altered should be the same. " + - "#{a_tags.inspect} != #{b_tags.inspect}" + "#{a_tags.inspect} != #{b_tags.inspect}" end end diff --git a/test/controllers/search_controller_test.rb b/test/controllers/search_controller_test.rb index d3300452b..2e835a587 100644 --- a/test/controllers/search_controller_test.rb +++ b/test/controllers/search_controller_test.rb @@ -43,6 +43,11 @@ class SearchControllerTest < ActionController::TestCase ## # test searching ways def test_search_ways + [:visible_way, :invisible_way, :used_way].each do |way| + create(:way_tag, :way => current_ways(way), :k => "test", :v => "yes") + end + create(:way_tag, :way => current_ways(:used_way), :k => "name", :v => "Test Way") + get :search_ways, :type => "test" assert_response :service_unavailable assert_equal "Searching for a key without value is currently unavailable", response.headers["Error"] @@ -59,6 +64,11 @@ class SearchControllerTest < ActionController::TestCase ## # test searching relations def test_search_relations + [:visible_relation, :invisible_relation, :used_relation].each do |relation| + create(:relation_tag, :relation => current_relations(relation), :k => "test", :v => "yes") + end + create(:relation_tag, :relation => current_relations(:used_relation), :k => "name", :v => "Test Relation") + get :search_relations, :type => "test" assert_response :service_unavailable assert_equal "Searching for a key without value is currently unavailable", response.headers["Error"] diff --git a/test/controllers/site_controller_test.rb b/test/controllers/site_controller_test.rb index 6c66358a0..e1eeac294 100644 --- a/test/controllers/site_controller_test.rb +++ b/test/controllers/site_controller_test.rb @@ -6,8 +6,10 @@ class SiteControllerTest < ActionController::TestCase ## # setup oauth keys def setup - Object.const_set("ID_KEY", client_applications(:oauth_web_app).key) - Object.const_set("POTLATCH2_KEY", client_applications(:oauth_web_app).key) + Object.const_set("ID_KEY", create(:client_application).key) + Object.const_set("POTLATCH2_KEY", create(:client_application).key) + + stub_hostip_requests end ## @@ -236,33 +238,6 @@ class SiteControllerTest < ActionController::TestCase assert_template "index" end - # Test the right editor gets used when the browser is IE - def test_edit_with_ie - @request.env["HTTP_USER_AGENT"] = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)" - - get :edit, {}, { :user => users(:public_user).id } - assert_response :success - assert_template "edit" - assert_template :partial => "_potlatch2", :count => 1 - - get :edit, { :editor => "id" }, { :user => users(:public_user).id } - assert_response :success - assert_template "edit" - assert_template :partial => "_potlatch2", :count => 1 - - @request.env["HTTP_USER_AGENT"] = "Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko" - - get :edit, {}, { :user => users(:public_user).id } - assert_response :success - assert_template "edit" - assert_template :partial => "_potlatch2", :count => 1 - - get :edit, { :editor => "id" }, { :user => users(:public_user).id } - assert_response :success - assert_template "edit" - assert_template :partial => "_potlatch2", :count => 1 - end - # Test editing a specific node def test_edit_with_node user = users(:public_user) @@ -292,7 +267,9 @@ class SiteControllerTest < ActionController::TestCase # Test editing a specific note def test_edit_with_note user = users(:public_user) - note = notes(:open_note) + note = create(:note) do |n| + n.comments.create(:author_id => user.id) + end get :edit, { :note => note.id }, { :user => user.id } assert_response :success @@ -305,7 +282,7 @@ class SiteControllerTest < ActionController::TestCase # Test editing a specific GPX trace def test_edit_with_gpx user = users(:public_user) - gpx = gpx_files(:public_trace_file) + gpx = create(:trace, :latitude => 1, :longitude => 1) get :edit, { :gpx => gpx.id }, { :user => user.id } assert_response :success diff --git a/test/controllers/swf_controller_test.rb b/test/controllers/swf_controller_test.rb index 25ed41947..13322c6b5 100644 --- a/test/controllers/swf_controller_test.rb +++ b/test/controllers/swf_controller_test.rb @@ -15,6 +15,14 @@ class SwfControllerTest < ActionController::TestCase ## # basic test that trackpoints at least returns some sort of flash movie def test_trackpoints + create(:trace, :visibility => "trackable", :latitude => 51.51, :longitude => -0.14, :user => users(:public_user)) do |trace| + create(:tracepoint, :trace => trace, :trackid => 1, :latitude => (51.510 * GeoRecord::SCALE).to_i, :longitude => (-0.140 * GeoRecord::SCALE).to_i) + create(:tracepoint, :trace => trace, :trackid => 2, :latitude => (51.511 * GeoRecord::SCALE).to_i, :longitude => (-0.141 * GeoRecord::SCALE).to_i) + end + create(:trace, :visibility => "identifiable", :latitude => 51.512, :longitude => 0.142) do |trace| + create(:tracepoint, :trace => trace, :latitude => (51.512 * GeoRecord::SCALE).to_i, :longitude => (0.142 * GeoRecord::SCALE).to_i) + end + get :trackpoints, :xmin => -1, :xmax => 1, :ymin => 51, :ymax => 52, :baselong => 0, :basey => 0, :masterscale => 1 assert_response :success assert_equal "application/x-shockwave-flash", response.content_type diff --git a/test/controllers/trace_controller_test.rb b/test/controllers/trace_controller_test.rb index b2f7c01b0..f27129b42 100644 --- a/test/controllers/trace_controller_test.rb +++ b/test/controllers/trace_controller_test.rb @@ -1,18 +1,21 @@ require "test_helper" +require "minitest/mock" class TraceControllerTest < ActionController::TestCase - fixtures :users, :user_preferences, :gpx_files - set_fixture_class :gpx_files => Trace + fixtures :users def setup @gpx_trace_dir = Object.send("remove_const", "GPX_TRACE_DIR") - Object.const_set("GPX_TRACE_DIR", File.dirname(__FILE__) + "/../traces") + Object.const_set("GPX_TRACE_DIR", Rails.root.join("test", "gpx", "traces")) @gpx_image_dir = Object.send("remove_const", "GPX_IMAGE_DIR") - Object.const_set("GPX_IMAGE_DIR", File.dirname(__FILE__) + "/../traces") + Object.const_set("GPX_IMAGE_DIR", Rails.root.join("test", "gpx", "images")) end def teardown + File.unlink(*Dir.glob(File.join(GPX_TRACE_DIR, "*.gpx"))) + File.unlink(*Dir.glob(File.join(GPX_IMAGE_DIR, "*.gif"))) + Object.send("remove_const", "GPX_TRACE_DIR") Object.const_set("GPX_TRACE_DIR", @gpx_trace_dir) @@ -166,27 +169,48 @@ class TraceControllerTest < ActionController::TestCase ) end - # Check that the list of changesets is displayed + # Check that the list of traces is displayed def test_list + # The fourth test below is surpisingly sensitive to timestamp ordering when the timestamps are equal. + trace_a = create(:trace, :visibility => "public", :timestamp => 4.seconds.ago) do |trace| + create(:tracetag, :trace => trace, :tag => "London") + end + trace_b = create(:trace, :visibility => "public", :timestamp => 3.seconds.ago) do |trace| + create(:tracetag, :trace => trace, :tag => "Birmingham") + end + trace_c = create(:trace, :visibility => "private", :user => users(:public_user), :timestamp => 2.seconds.ago) do |trace| + create(:tracetag, :trace => trace, :tag => "London") + end + trace_d = create(:trace, :visibility => "private", :user => users(:public_user), :timestamp => 1.second.ago) do |trace| + create(:tracetag, :trace => trace, :tag => "Birmingham") + end + # First with the public list get :list - check_trace_list Trace.visible_to_all + check_trace_list [trace_b, trace_a] # Restrict traces to those with a given tag get :list, :tag => "London" - check_trace_list Trace.tagged("London").visible_to_all + check_trace_list [trace_a] # Should see more when we are logged in get :list, {}, { :user => users(:public_user).id } - check_trace_list Trace.visible_to(users(:public_user).id) + check_trace_list [trace_d, trace_c, trace_b, trace_a] # Again, we should see more when we are logged in get :list, { :tag => "London" }, { :user => users(:public_user).id } - check_trace_list Trace.tagged("London").visible_to(users(:public_user).id) + check_trace_list [trace_c, trace_a] end # Check that I can get mine def test_list_mine + create(:trace, :visibility => "public") do |trace| + create(:tracetag, :trace => trace, :tag => "Birmingham") + end + trace_b = create(:trace, :visibility => "private", :user => users(:public_user)) do |trace| + create(:tracetag, :trace => trace, :tag => "London") + end + # First try to get it when not logged in get :mine assert_redirected_to :controller => "user", :action => "login", :referer => "/traces/mine" @@ -197,30 +221,36 @@ class TraceControllerTest < ActionController::TestCase # Fetch the actual list get :list, { :display_name => users(:public_user).display_name }, { :user => users(:public_user).id } - check_trace_list users(:public_user).traces + check_trace_list [trace_b] end - # Check the list of changesets for a specific user + # Check the list of traces for a specific user def test_list_user + create(:trace) + trace_b = create(:trace, :visibility => "public", :user => users(:public_user)) + trace_c = create(:trace, :visibility => "private", :user => users(:public_user)) do |trace| + create(:tracetag, :trace => trace, :tag => "London") + end + # Test a user with no traces get :list, :display_name => users(:second_public_user).display_name - check_trace_list users(:second_public_user).traces.visible_to_all + check_trace_list [] # Test a user with some traces - should see only public ones get :list, :display_name => users(:public_user).display_name - check_trace_list users(:public_user).traces.visible_to_all + check_trace_list [trace_b] # Should still see only public ones when authenticated as another user get :list, { :display_name => users(:public_user).display_name }, { :user => users(:normal_user).id } - check_trace_list users(:public_user).traces.visible_to_all + check_trace_list [trace_b] # Should see all traces when authenticated as the target user get :list, { :display_name => users(:public_user).display_name }, { :user => users(:public_user).id } - check_trace_list users(:public_user).traces + check_trace_list [trace_c, trace_b] # Should only see traces with the correct tag when a tag is specified get :list, { :display_name => users(:public_user).display_name, :tag => "London" }, { :user => users(:public_user).id } - check_trace_list users(:public_user).traces.tagged("London") + check_trace_list [trace_c] # Should get an error if the user does not exist get :list, :display_name => "UnknownUser" @@ -249,101 +279,115 @@ class TraceControllerTest < ActionController::TestCase # Test viewing a trace def test_view + public_trace_file = create(:trace, :visibility => "public") + # First with no auth, which should work since the trace is public - get :view, :display_name => users(:normal_user).display_name, :id => gpx_files(:public_trace_file).id - check_trace_view gpx_files(:public_trace_file) + get :view, :display_name => users(:normal_user).display_name, :id => public_trace_file.id + check_trace_view public_trace_file # Now with some other user, which should work since the trace is public - get :view, { :display_name => users(:normal_user).display_name, :id => gpx_files(:public_trace_file).id }, { :user => users(:public_user).id } - check_trace_view gpx_files(:public_trace_file) + get :view, { :display_name => users(:normal_user).display_name, :id => public_trace_file.id }, { :user => users(:public_user).id } + check_trace_view public_trace_file # And finally we should be able to do it with the owner of the trace - get :view, { :display_name => users(:normal_user).display_name, :id => gpx_files(:public_trace_file).id }, { :user => users(:normal_user).id } - check_trace_view gpx_files(:public_trace_file) + get :view, { :display_name => users(:normal_user).display_name, :id => public_trace_file.id }, { :user => users(:normal_user).id } + check_trace_view public_trace_file end # Check an anonymous trace can't be viewed by another user def test_view_anon + anon_trace_file = create(:trace, :visibility => "private", :user => users(:public_user)) + # First with no auth - get :view, :display_name => users(:public_user).display_name, :id => gpx_files(:anon_trace_file).id + get :view, :display_name => users(:public_user).display_name, :id => anon_trace_file.id assert_response :redirect assert_redirected_to :action => :list - # Now with some other user, which should work since the trace is anon - get :view, { :display_name => users(:public_user).display_name, :id => gpx_files(:anon_trace_file).id }, { :user => users(:normal_user).id } + # Now with some other user, which should not work since the trace is anon + get :view, { :display_name => users(:public_user).display_name, :id => anon_trace_file.id }, { :user => users(:normal_user).id } assert_response :redirect assert_redirected_to :action => :list # And finally we should be able to do it with the owner of the trace - get :view, { :display_name => users(:public_user).display_name, :id => gpx_files(:anon_trace_file).id }, { :user => users(:public_user).id } - check_trace_view gpx_files(:anon_trace_file) + get :view, { :display_name => users(:public_user).display_name, :id => anon_trace_file.id }, { :user => users(:public_user).id } + check_trace_view anon_trace_file end # Test viewing a trace that doesn't exist def test_view_not_found - # First with no auth, which should work since the trace is public + deleted_trace_file = create(:trace, :deleted) + + # First with no auth get :view, :display_name => users(:public_user).display_name, :id => 0 assert_response :redirect assert_redirected_to :action => :list - # Now with some other user, which should work since the trace is public + # Now with some other user get :view, { :display_name => users(:public_user).display_name, :id => 0 }, { :user => users(:public_user).id } assert_response :redirect assert_redirected_to :action => :list - # And finally we should be able to do it with the owner of the trace - get :view, { :display_name => users(:public_user).display_name, :id => 5 }, { :user => users(:public_user).id } + # And finally we should not be able to view a deleted trace + get :view, { :display_name => users(:public_user).display_name, :id => deleted_trace_file.id }, { :user => users(:public_user).id } assert_response :redirect assert_redirected_to :action => :list end # Test downloading a trace def test_data + public_trace_file = create(:trace, :visibility => "public", :user => users(:normal_user), :fixture => "a") + # First with no auth, which should work since the trace is public - get :data, :display_name => users(:normal_user).display_name, :id => gpx_files(:public_trace_file).id - check_trace_data gpx_files(:public_trace_file) + get :data, :display_name => users(:normal_user).display_name, :id => public_trace_file.id + check_trace_data public_trace_file # Now with some other user, which should work since the trace is public - get :data, { :display_name => users(:normal_user).display_name, :id => gpx_files(:public_trace_file).id }, { :user => users(:public_user).id } - check_trace_data gpx_files(:public_trace_file) + get :data, { :display_name => users(:normal_user).display_name, :id => public_trace_file.id }, { :user => users(:public_user).id } + check_trace_data public_trace_file # And finally we should be able to do it with the owner of the trace - get :data, { :display_name => users(:normal_user).display_name, :id => gpx_files(:public_trace_file).id }, { :user => users(:normal_user).id } - check_trace_data gpx_files(:public_trace_file) + get :data, { :display_name => users(:normal_user).display_name, :id => public_trace_file.id }, { :user => users(:normal_user).id } + check_trace_data public_trace_file end # Test downloading a compressed trace def test_data_compressed + identifiable_trace_file = create(:trace, :visibility => "identifiable", :fixture => "d") + # First get the data as is - get :data, :display_name => users(:public_user).display_name, :id => gpx_files(:identifiable_trace_file).id - check_trace_data gpx_files(:identifiable_trace_file), "application/x-gzip", "gpx.gz" + get :data, :display_name => users(:public_user).display_name, :id => identifiable_trace_file.id + check_trace_data identifiable_trace_file, "application/x-gzip", "gpx.gz" # Now ask explicitly for XML format - get :data, :display_name => users(:public_user).display_name, :id => gpx_files(:identifiable_trace_file).id, :format => "xml" - check_trace_data gpx_files(:identifiable_trace_file), "application/xml", "xml" + get :data, :display_name => users(:public_user).display_name, :id => identifiable_trace_file.id, :format => "xml" + check_trace_data identifiable_trace_file, "application/xml", "xml" # Now ask explicitly for GPX format - get :data, :display_name => users(:public_user).display_name, :id => gpx_files(:identifiable_trace_file).id, :format => "gpx" - check_trace_data gpx_files(:identifiable_trace_file) + get :data, :display_name => users(:public_user).display_name, :id => identifiable_trace_file.id, :format => "gpx" + check_trace_data identifiable_trace_file end # Check an anonymous trace can't be downloaded by another user def test_data_anon + anon_trace_file = create(:trace, :visibility => "private", :user => users(:public_user), :fixture => "b") + # First with no auth - get :data, :display_name => users(:public_user).display_name, :id => gpx_files(:anon_trace_file).id + get :data, :display_name => users(:public_user).display_name, :id => anon_trace_file.id assert_response :not_found # Now with some other user, which shouldn't work since the trace is anon - get :data, { :display_name => users(:public_user).display_name, :id => gpx_files(:anon_trace_file).id }, { :user => users(:normal_user).id } + get :data, { :display_name => users(:public_user).display_name, :id => anon_trace_file.id }, { :user => users(:normal_user).id } assert_response :not_found # And finally we should be able to do it with the owner of the trace - get :data, { :display_name => users(:public_user).display_name, :id => gpx_files(:anon_trace_file).id }, { :user => users(:public_user).id } - check_trace_data gpx_files(:anon_trace_file) + get :data, { :display_name => users(:public_user).display_name, :id => anon_trace_file.id }, { :user => users(:public_user).id } + check_trace_data anon_trace_file end # Test downloading a trace that doesn't exist def test_data_not_found + deleted_trace_file = create(:trace, :deleted) + # First with no auth and a trace that has never existed get :data, :display_name => users(:public_user).display_name, :id => 0 assert_response :not_found @@ -353,38 +397,42 @@ class TraceControllerTest < ActionController::TestCase assert_response :not_found # Now with a trace that has been deleted - get :data, { :display_name => users(:public_user).display_name, :id => 5 }, { :user => users(:public_user).id } + get :data, { :display_name => users(:public_user).display_name, :id => deleted_trace_file.id }, { :user => users(:public_user).id } assert_response :not_found end # Test downloading the picture for a trace def test_picture + public_trace_file = create(:trace, :visibility => "public", :user => users(:normal_user), :fixture => "a") + # First with no auth, which should work since the trace is public - get :picture, :display_name => users(:normal_user).display_name, :id => gpx_files(:public_trace_file).id - check_trace_picture gpx_files(:public_trace_file) + get :picture, :display_name => users(:normal_user).display_name, :id => public_trace_file.id + check_trace_picture public_trace_file # Now with some other user, which should work since the trace is public - get :picture, { :display_name => users(:normal_user).display_name, :id => gpx_files(:public_trace_file).id }, { :user => users(:public_user).id } - check_trace_picture gpx_files(:public_trace_file) + get :picture, { :display_name => users(:normal_user).display_name, :id => public_trace_file.id }, { :user => users(:public_user).id } + check_trace_picture public_trace_file # And finally we should be able to do it with the owner of the trace - get :picture, { :display_name => users(:normal_user).display_name, :id => gpx_files(:public_trace_file).id }, { :user => users(:normal_user).id } - check_trace_picture gpx_files(:public_trace_file) + get :picture, { :display_name => users(:normal_user).display_name, :id => public_trace_file.id }, { :user => users(:normal_user).id } + check_trace_picture public_trace_file end # Check the picture for an anonymous trace can't be downloaded by another user def test_picture_anon + anon_trace_file = create(:trace, :visibility => "private", :user => users(:public_user), :fixture => "b") + # First with no auth - get :picture, :display_name => users(:public_user).display_name, :id => gpx_files(:anon_trace_file).id + get :picture, :display_name => users(:public_user).display_name, :id => anon_trace_file.id assert_response :forbidden # Now with some other user, which shouldn't work since the trace is anon - get :picture, { :display_name => users(:public_user).display_name, :id => gpx_files(:anon_trace_file).id }, { :user => users(:normal_user).id } + get :picture, { :display_name => users(:public_user).display_name, :id => anon_trace_file.id }, { :user => users(:normal_user).id } assert_response :forbidden # And finally we should be able to do it with the owner of the trace - get :picture, { :display_name => users(:public_user).display_name, :id => gpx_files(:anon_trace_file).id }, { :user => users(:public_user).id } - check_trace_picture gpx_files(:anon_trace_file) + get :picture, { :display_name => users(:public_user).display_name, :id => anon_trace_file.id }, { :user => users(:public_user).id } + check_trace_picture anon_trace_file end # Test downloading the picture for a trace that doesn't exist @@ -397,53 +445,59 @@ class TraceControllerTest < ActionController::TestCase get :picture, { :display_name => users(:public_user).display_name, :id => 0 }, { :user => users(:public_user).id } assert_response :not_found - # And finally we should be able to do it with the owner of the trace - get :picture, { :display_name => users(:public_user).display_name, :id => 5 }, { :user => users(:public_user).id } + # And finally we should not be able to do it with a deleted trace + deleted_trace_file = create(:trace, :deleted) + get :picture, { :display_name => users(:public_user).display_name, :id => deleted_trace_file.id }, { :user => users(:public_user).id } assert_response :not_found end # Test downloading the icon for a trace def test_icon + public_trace_file = create(:trace, :visibility => "public", :user => users(:normal_user), :fixture => "a") + # First with no auth, which should work since the trace is public - get :icon, :display_name => users(:normal_user).display_name, :id => gpx_files(:public_trace_file).id - check_trace_icon gpx_files(:public_trace_file) + get :icon, :display_name => users(:normal_user).display_name, :id => public_trace_file.id + check_trace_icon public_trace_file # Now with some other user, which should work since the trace is public - get :icon, { :display_name => users(:normal_user).display_name, :id => gpx_files(:public_trace_file).id }, { :user => users(:public_user).id } - check_trace_icon gpx_files(:public_trace_file) + get :icon, { :display_name => users(:normal_user).display_name, :id => public_trace_file.id }, { :user => users(:public_user).id } + check_trace_icon public_trace_file # And finally we should be able to do it with the owner of the trace - get :icon, { :display_name => users(:normal_user).display_name, :id => gpx_files(:public_trace_file).id }, { :user => users(:normal_user).id } - check_trace_icon gpx_files(:public_trace_file) + get :icon, { :display_name => users(:normal_user).display_name, :id => public_trace_file.id }, { :user => users(:normal_user).id } + check_trace_icon public_trace_file end # Check the icon for an anonymous trace can't be downloaded by another user def test_icon_anon + anon_trace_file = create(:trace, :visibility => "private", :user => users(:public_user), :fixture => "b") + # First with no auth - get :icon, :display_name => users(:public_user).display_name, :id => gpx_files(:anon_trace_file).id + get :icon, :display_name => users(:public_user).display_name, :id => anon_trace_file.id assert_response :forbidden # Now with some other user, which shouldn't work since the trace is anon - get :icon, { :display_name => users(:public_user).display_name, :id => gpx_files(:anon_trace_file).id }, { :user => users(:normal_user).id } + get :icon, { :display_name => users(:public_user).display_name, :id => anon_trace_file.id }, { :user => users(:normal_user).id } assert_response :forbidden # And finally we should be able to do it with the owner of the trace - get :icon, { :display_name => users(:public_user).display_name, :id => gpx_files(:anon_trace_file).id }, { :user => users(:public_user).id } - check_trace_icon gpx_files(:anon_trace_file) + get :icon, { :display_name => users(:public_user).display_name, :id => anon_trace_file.id }, { :user => users(:public_user).id } + check_trace_icon anon_trace_file end # Test downloading the icon for a trace that doesn't exist def test_icon_not_found - # First with no auth, which should work since the trace is public + # First with no auth get :icon, :display_name => users(:public_user).display_name, :id => 0 assert_response :not_found - # Now with some other user, which should work since the trace is public + # Now with some other user get :icon, { :display_name => users(:public_user).display_name, :id => 0 }, { :user => users(:public_user).id } assert_response :not_found - # And finally we should be able to do it with the owner of the trace - get :icon, { :display_name => users(:public_user).display_name, :id => 5 }, { :user => users(:public_user).id } + # And finally we should not be able to do it with a deleted trace + deleted_trace_file = create(:trace, :deleted) + get :icon, { :display_name => users(:public_user).display_name, :id => deleted_trace_file.id }, { :user => users(:public_user).id } assert_response :not_found end @@ -455,12 +509,14 @@ class TraceControllerTest < ActionController::TestCase assert_redirected_to :controller => :user, :action => :login, :referer => trace_create_path # Now authenticated as a user with gps.trace.visibility set + create(:user_preference, :user => users(:public_user), :k => "gps.trace.visibility", :v => "identifiable") get :create, {}, { :user => users(:public_user).id } assert_response :success assert_template :create assert_select "select#trace_visibility option[value=identifiable][selected]", 1 # Now authenticated as a user with gps.trace.public set + create(:user_preference, :user => users(:second_public_user), :k => "gps.trace.public", :v => "default") get :create, {}, { :user => users(:second_public_user).id } assert_response :success assert_template :create @@ -476,38 +532,43 @@ class TraceControllerTest < ActionController::TestCase # Test creating a trace def test_create_post # Get file to use - file = Rack::Test::UploadedFile.new(gpx_files(:public_trace_file).trace_name, "application/gpx+xml") + fixture = Rails.root.join("test", "gpx", "fixtures", "a.gpx") + file = Rack::Test::UploadedFile.new(fixture, "application/gpx+xml") # First with no auth post :create, :trace => { :gpx_file => file, :description => "New Trace", :tagstring => "new,trace", :visibility => "trackable" } assert_response :forbidden # Now authenticated + create(:user_preference, :user => users(:public_user), :k => "gps.trace.visibility", :v => "identifiable") assert_not_equal "trackable", users(:public_user).preferences.where(:k => "gps.trace.visibility").first.v post :create, { :trace => { :gpx_file => file, :description => "New Trace", :tagstring => "new,trace", :visibility => "trackable" } }, { :user => users(:public_user).id } assert_response :redirect assert_redirected_to :action => :list, :display_name => users(:public_user).display_name assert_match /file has been uploaded/, flash[:notice] trace = Trace.order(:id => :desc).first - assert_equal "1.gpx", trace.name + assert_equal "a.gpx", trace.name assert_equal "New Trace", trace.description - assert_equal "new, trace", trace.tagstring + assert_equal %w(new trace), trace.tags.order(:tag).collect(&:tag) assert_equal "trackable", trace.visibility assert_equal false, trace.inserted - assert_equal File.new(gpx_files(:public_trace_file).trace_name).read, File.new(trace.trace_name).read + assert_equal File.new(fixture).read, File.new(trace.trace_name).read trace.destroy assert_equal "trackable", users(:public_user).preferences.where(:k => "gps.trace.visibility").first.v end # Test fetching the edit page for a trace def test_edit_get + public_trace_file = create(:trace, :visibility => "public", :user => users(:normal_user)) + deleted_trace_file = create(:trace, :deleted, :user => users(:public_user)) + # First with no auth - get :edit, :display_name => users(:normal_user).display_name, :id => gpx_files(:public_trace_file).id + get :edit, :display_name => users(:normal_user).display_name, :id => public_trace_file.id assert_response :redirect - assert_redirected_to :controller => :user, :action => :login, :referer => trace_edit_path(:display_name => users(:normal_user).display_name, :id => gpx_files(:public_trace_file).id) + assert_redirected_to :controller => :user, :action => :login, :referer => trace_edit_path(:display_name => users(:normal_user).display_name, :id => public_trace_file.id) # Now with some other user, which should fail - get :edit, { :display_name => users(:normal_user).display_name, :id => gpx_files(:public_trace_file).id }, { :user => users(:public_user).id } + get :edit, { :display_name => users(:normal_user).display_name, :id => public_trace_file.id }, { :user => users(:public_user).id } assert_response :forbidden # Now with a trace which doesn't exist @@ -515,25 +576,27 @@ class TraceControllerTest < ActionController::TestCase assert_response :not_found # Now with a trace which has been deleted - get :edit, { :display_name => users(:public_user).display_name, :id => gpx_files(:deleted_trace_file).id }, { :user => users(:public_user).id } + get :edit, { :display_name => users(:public_user).display_name, :id => deleted_trace_file.id }, { :user => users(:public_user).id } assert_response :not_found # Finally with a trace that we are allowed to edit - get :edit, { :display_name => users(:normal_user).display_name, :id => gpx_files(:public_trace_file).id }, { :user => users(:normal_user).id } + get :edit, { :display_name => users(:normal_user).display_name, :id => public_trace_file.id }, { :user => users(:normal_user).id } assert_response :success end # Test saving edits to a trace def test_edit_post + public_trace_file = create(:trace, :visibility => "public", :user => users(:normal_user)) + deleted_trace_file = create(:trace, :deleted, :user => users(:public_user)) # New details new_details = { :description => "Changed description", :tagstring => "new_tag", :visibility => "private" } # First with no auth - post :edit, :display_name => users(:normal_user).display_name, :id => gpx_files(:public_trace_file).id, :trace => new_details + post :edit, :display_name => users(:normal_user).display_name, :id => public_trace_file.id, :trace => new_details assert_response :forbidden # Now with some other user, which should fail - post :edit, { :display_name => users(:normal_user).display_name, :id => gpx_files(:public_trace_file).id, :trace => new_details }, { :user => users(:public_user).id } + post :edit, { :display_name => users(:normal_user).display_name, :id => public_trace_file.id, :trace => new_details }, { :user => users(:public_user).id } assert_response :forbidden # Now with a trace which doesn't exist @@ -541,14 +604,14 @@ class TraceControllerTest < ActionController::TestCase assert_response :not_found # Now with a trace which has been deleted - post :edit, { :display_name => users(:public_user).display_name, :id => gpx_files(:deleted_trace_file).id, :trace => new_details }, { :user => users(:public_user).id } + post :edit, { :display_name => users(:public_user).display_name, :id => deleted_trace_file.id, :trace => new_details }, { :user => users(:public_user).id } assert_response :not_found # Finally with a trace that we are allowed to edit - post :edit, { :display_name => users(:normal_user).display_name, :id => gpx_files(:public_trace_file).id, :trace => new_details }, { :user => users(:normal_user).id } + post :edit, { :display_name => users(:normal_user).display_name, :id => public_trace_file.id, :trace => new_details }, { :user => users(:normal_user).id } assert_response :redirect assert_redirected_to :action => :view, :display_name => users(:normal_user).display_name - trace = Trace.find(gpx_files(:public_trace_file).id) + trace = Trace.find(public_trace_file.id) assert_equal new_details[:description], trace.description assert_equal new_details[:tagstring], trace.tagstring assert_equal new_details[:visibility], trace.visibility @@ -556,12 +619,15 @@ class TraceControllerTest < ActionController::TestCase # Test deleting a trace def test_delete + public_trace_file = create(:trace, :visibility => "public", :user => users(:normal_user)) + deleted_trace_file = create(:trace, :deleted, :user => users(:public_user)) + # First with no auth - post :delete, :display_name => users(:normal_user).display_name, :id => gpx_files(:public_trace_file).id + post :delete, :display_name => users(:normal_user).display_name, :id => public_trace_file.id assert_response :forbidden # Now with some other user, which should fail - post :delete, { :display_name => users(:normal_user).display_name, :id => gpx_files(:public_trace_file).id }, { :user => users(:public_user).id } + post :delete, { :display_name => users(:normal_user).display_name, :id => public_trace_file.id }, { :user => users(:public_user).id } assert_response :forbidden # Now with a trace which doesn't exist @@ -569,54 +635,60 @@ class TraceControllerTest < ActionController::TestCase assert_response :not_found # Now with a trace has already been deleted - post :delete, { :display_name => users(:public_user).display_name, :id => gpx_files(:deleted_trace_file).id }, { :user => users(:public_user).id } + post :delete, { :display_name => users(:public_user).display_name, :id => deleted_trace_file.id }, { :user => users(:public_user).id } assert_response :not_found # Finally with a trace that we are allowed to delete - post :delete, { :display_name => users(:normal_user).display_name, :id => gpx_files(:public_trace_file).id }, { :user => users(:normal_user).id } + post :delete, { :display_name => users(:normal_user).display_name, :id => public_trace_file.id }, { :user => users(:normal_user).id } assert_response :redirect assert_redirected_to :action => :list, :display_name => users(:normal_user).display_name - trace = Trace.find(gpx_files(:public_trace_file).id) + trace = Trace.find(public_trace_file.id) assert_equal false, trace.visible end # Check getting a specific trace through the api def test_api_read + public_trace_file = create(:trace, :visibility => "public", :user => users(:normal_user)) + # First with no auth - get :api_read, :id => gpx_files(:public_trace_file).id + get :api_read, :id => public_trace_file.id assert_response :unauthorized # Now with some other user, which should work since the trace is public basic_authorization(users(:public_user).display_name, "test") - get :api_read, :id => gpx_files(:public_trace_file).id + get :api_read, :id => public_trace_file.id assert_response :success # And finally we should be able to do it with the owner of the trace basic_authorization(users(:normal_user).display_name, "test") - get :api_read, :id => gpx_files(:public_trace_file).id + get :api_read, :id => public_trace_file.id assert_response :success end # Check an anoymous trace can't be specifically fetched by another user def test_api_read_anon - # Furst with no auth - get :api_read, :id => gpx_files(:anon_trace_file).id + anon_trace_file = create(:trace, :visibility => "private", :user => users(:public_user)) + + # First with no auth + get :api_read, :id => anon_trace_file.id assert_response :unauthorized # Now try with another user, which shouldn't work since the trace is anon basic_authorization(users(:normal_user).display_name, "test") - get :api_read, :id => gpx_files(:anon_trace_file).id + get :api_read, :id => anon_trace_file.id assert_response :forbidden # And finally we should be able to get the trace details with the trace owner basic_authorization(users(:public_user).display_name, "test") - get :api_read, :id => gpx_files(:anon_trace_file).id + get :api_read, :id => anon_trace_file.id assert_response :success end # Check the api details for a trace that doesn't exist def test_api_read_not_found - # Try first with no auth, as it should requure it + deleted_trace_file = create(:trace, :deleted, :user => users(:public_user)) + + # Try first with no auth, as it should require it get :api_read, :id => 0 assert_response :unauthorized @@ -627,60 +699,66 @@ class TraceControllerTest < ActionController::TestCase # Now try a trace which did exist but has been deleted basic_authorization(users(:public_user).display_name, "test") - get :api_read, :id => 5 + get :api_read, :id => deleted_trace_file.id assert_response :not_found end # Test downloading a trace through the api def test_api_data + public_trace_file = create(:trace, :visibility => "public", :user => users(:normal_user), :fixture => "a") + # First with no auth - get :api_data, :display_name => users(:normal_user).display_name, :id => gpx_files(:public_trace_file).id + get :api_data, :display_name => users(:normal_user).display_name, :id => public_trace_file.id assert_response :unauthorized # Now with some other user, which should work since the trace is public basic_authorization(users(:public_user).display_name, "test") - get :api_data, :display_name => users(:normal_user).display_name, :id => gpx_files(:public_trace_file).id - check_trace_data gpx_files(:public_trace_file) + get :api_data, :display_name => users(:normal_user).display_name, :id => public_trace_file.id + check_trace_data public_trace_file # And finally we should be able to do it with the owner of the trace basic_authorization(users(:normal_user).display_name, "test") - get :api_data, :display_name => users(:normal_user).display_name, :id => gpx_files(:public_trace_file).id - check_trace_data gpx_files(:public_trace_file) + get :api_data, :display_name => users(:normal_user).display_name, :id => public_trace_file.id + check_trace_data public_trace_file end # Test downloading a compressed trace through the api def test_api_data_compressed + identifiable_trace_file = create(:trace, :visibility => "identifiable", :user => users(:public_user), :fixture => "d") + # Authenticate as the owner of the trace we will be using basic_authorization(users(:public_user).display_name, "test") # First get the data as is - get :api_data, :display_name => users(:public_user).display_name, :id => gpx_files(:identifiable_trace_file).id - check_trace_data gpx_files(:identifiable_trace_file), "application/x-gzip", "gpx.gz" + get :api_data, :display_name => users(:public_user).display_name, :id => identifiable_trace_file.id + check_trace_data identifiable_trace_file, "application/x-gzip", "gpx.gz" # Now ask explicitly for XML format - get :api_data, :display_name => users(:public_user).display_name, :id => gpx_files(:identifiable_trace_file).id, :format => "xml" - check_trace_data gpx_files(:identifiable_trace_file), "application/xml", "xml" + get :api_data, :display_name => users(:public_user).display_name, :id => identifiable_trace_file.id, :format => "xml" + check_trace_data identifiable_trace_file, "application/xml", "xml" # Now ask explicitly for GPX format - get :api_data, :display_name => users(:public_user).display_name, :id => gpx_files(:identifiable_trace_file).id, :format => "gpx" - check_trace_data gpx_files(:identifiable_trace_file) + get :api_data, :display_name => users(:public_user).display_name, :id => identifiable_trace_file.id, :format => "gpx" + check_trace_data identifiable_trace_file end # Check an anonymous trace can't be downloaded by another user through the api def test_api_data_anon + anon_trace_file = create(:trace, :visibility => "private", :user => users(:public_user), :fixture => "b") + # First with no auth - get :api_data, :display_name => users(:public_user).display_name, :id => gpx_files(:anon_trace_file).id + get :api_data, :display_name => users(:public_user).display_name, :id => anon_trace_file.id assert_response :unauthorized # Now with some other user, which shouldn't work since the trace is anon basic_authorization(users(:normal_user).display_name, "test") - get :api_data, :display_name => users(:public_user).display_name, :id => gpx_files(:anon_trace_file).id + get :api_data, :display_name => users(:public_user).display_name, :id => anon_trace_file.id assert_response :forbidden # And finally we should be able to do it with the owner of the trace basic_authorization(users(:public_user).display_name, "test") - get :api_data, :display_name => users(:public_user).display_name, :id => gpx_files(:anon_trace_file).id - check_trace_data gpx_files(:anon_trace_file) + get :api_data, :display_name => users(:public_user).display_name, :id => anon_trace_file.id + check_trace_data anon_trace_file end # Test downloading a trace that doesn't exist through the api @@ -695,32 +773,35 @@ class TraceControllerTest < ActionController::TestCase assert_response :not_found # Now with a trace that has been deleted + deleted_trace_file = create(:trace, :deleted) basic_authorization(users(:public_user).display_name, "test") - get :api_data, :display_name => users(:public_user).display_name, :id => 5 + get :api_data, :display_name => users(:public_user).display_name, :id => deleted_trace_file.id assert_response :not_found end # Test creating a trace through the api def test_api_create # Get file to use - file = Rack::Test::UploadedFile.new(gpx_files(:public_trace_file).trace_name, "application/gpx+xml") + fixture = Rails.root.join("test", "gpx", "fixtures", "a.gpx") + file = Rack::Test::UploadedFile.new(fixture, "application/gpx+xml") # First with no auth post :api_create, :file => file, :description => "New Trace", :tags => "new,trace", :visibility => "trackable" assert_response :unauthorized # Now authenticated + create(:user_preference, :user => users(:public_user), :k => "gps.trace.visibility", :v => "identifiable") assert_not_equal "trackable", users(:public_user).preferences.where(:k => "gps.trace.visibility").first.v basic_authorization(users(:public_user).display_name, "test") post :api_create, :file => file, :description => "New Trace", :tags => "new,trace", :visibility => "trackable" assert_response :success trace = Trace.find(response.body.to_i) - assert_equal "1.gpx", trace.name + assert_equal "a.gpx", trace.name assert_equal "New Trace", trace.description - assert_equal "new, trace", trace.tagstring + assert_equal %w(new trace), trace.tags.order(:tag).collect(&:tag) assert_equal "trackable", trace.visibility assert_equal false, trace.inserted - assert_equal File.new(gpx_files(:public_trace_file).trace_name).read, File.new(trace.trace_name).read + assert_equal File.new(fixture).read, File.new(trace.trace_name).read trace.destroy assert_equal "trackable", users(:public_user).preferences.where(:k => "gps.trace.visibility").first.v @@ -733,12 +814,12 @@ class TraceControllerTest < ActionController::TestCase post :api_create, :file => file, :description => "New Trace", :tags => "new,trace", :public => 1 assert_response :success trace = Trace.find(response.body.to_i) - assert_equal "1.gpx", trace.name + assert_equal "a.gpx", trace.name assert_equal "New Trace", trace.description - assert_equal "new, trace", trace.tagstring + assert_equal %w(new trace), trace.tags.order(:tag).collect(&:tag) assert_equal "public", trace.visibility assert_equal false, trace.inserted - assert_equal File.new(gpx_files(:public_trace_file).trace_name).read, File.new(trace.trace_name).read + assert_equal File.new(fixture).read, File.new(trace.trace_name).read trace.destroy assert_equal "public", users(:public_user).preferences.where(:k => "gps.trace.visibility").first.v @@ -751,51 +832,55 @@ class TraceControllerTest < ActionController::TestCase post :api_create, :file => file, :description => "New Trace", :tags => "new,trace", :public => 0 assert_response :success trace = Trace.find(response.body.to_i) - assert_equal "1.gpx", trace.name + assert_equal "a.gpx", trace.name assert_equal "New Trace", trace.description - assert_equal "new, trace", trace.tagstring + assert_equal %w(new trace), trace.tags.order(:tag).collect(&:tag) assert_equal "private", trace.visibility assert_equal false, trace.inserted - assert_equal File.new(gpx_files(:public_trace_file).trace_name).read, File.new(trace.trace_name).read + assert_equal File.new(fixture).read, File.new(trace.trace_name).read trace.destroy assert_equal "private", users(:second_public_user).preferences.where(:k => "gps.trace.visibility").first.v end # Check updating a trace through the api def test_api_update + public_trace_file = create(:trace, :visibility => "public", :user => users(:normal_user), :fixture => "a") + deleted_trace_file = create(:trace, :deleted, :user => users(:public_user)) + anon_trace_file = create(:trace, :visibility => "private", :user => users(:public_user)) + # First with no auth - content gpx_files(:public_trace_file).to_xml - put :api_update, :id => gpx_files(:public_trace_file).id + content public_trace_file.to_xml + put :api_update, :id => public_trace_file.id assert_response :unauthorized # Now with some other user, which should fail basic_authorization(users(:public_user).display_name, "test") - content gpx_files(:public_trace_file).to_xml - put :api_update, :id => gpx_files(:public_trace_file).id + content public_trace_file.to_xml + put :api_update, :id => public_trace_file.id assert_response :forbidden # Now with a trace which doesn't exist basic_authorization(users(:public_user).display_name, "test") - content gpx_files(:public_trace_file).to_xml + content public_trace_file.to_xml put :api_update, :id => 0 assert_response :not_found # Now with a trace which did exist but has been deleted basic_authorization(users(:public_user).display_name, "test") - content gpx_files(:deleted_trace_file).to_xml - put :api_update, :id => gpx_files(:deleted_trace_file).id + content deleted_trace_file.to_xml + put :api_update, :id => deleted_trace_file.id assert_response :not_found # Now try an update with the wrong ID basic_authorization(users(:normal_user).display_name, "test") - content gpx_files(:anon_trace_file).to_xml - put :api_update, :id => gpx_files(:public_trace_file).id + content anon_trace_file.to_xml + put :api_update, :id => public_trace_file.id assert_response :bad_request, "should not be able to update a trace with a different ID from the XML" # And finally try an update that should work basic_authorization(users(:normal_user).display_name, "test") - t = gpx_files(:public_trace_file) + t = public_trace_file t.description = "Changed description" t.visibility = "private" content t.to_xml @@ -808,13 +893,15 @@ class TraceControllerTest < ActionController::TestCase # Check deleting a trace through the api def test_api_delete + public_trace_file = create(:trace, :visibility => "public", :user => users(:normal_user)) + # First with no auth - delete :api_delete, :id => gpx_files(:public_trace_file).id + delete :api_delete, :id => public_trace_file.id assert_response :unauthorized # Now with some other user, which should fail basic_authorization(users(:public_user).display_name, "test") - delete :api_delete, :id => gpx_files(:public_trace_file).id + delete :api_delete, :id => public_trace_file.id assert_response :forbidden # Now with a trace which doesn't exist @@ -824,12 +911,12 @@ class TraceControllerTest < ActionController::TestCase # And finally we should be able to do it with the owner of the trace basic_authorization(users(:normal_user).display_name, "test") - delete :api_delete, :id => gpx_files(:public_trace_file).id + delete :api_delete, :id => public_trace_file.id assert_response :success # Try it a second time, which should fail basic_authorization(users(:normal_user).display_name, "test") - delete :api_delete, :id => gpx_files(:public_trace_file).id + delete :api_delete, :id => public_trace_file.id assert_response :not_found end @@ -863,10 +950,10 @@ class TraceControllerTest < ActionController::TestCase assert_response :success assert_template "list" - if traces.count > 0 + if !traces.empty? assert_select "table#trace_list tbody", :count => 1 do - assert_select "tr", :count => traces.visible.count do |rows| - traces.visible.order("timestamp DESC").zip(rows).each do |trace, row| + assert_select "tr", :count => traces.length do |rows| + traces.zip(rows).each do |trace, row| assert_select row, "a", Regexp.new(Regexp.escape(trace.name)) assert_select row, "span.trace_summary", Regexp.new(Regexp.escape("(#{trace.size} points)")) if trace.inserted? assert_select row, "td", Regexp.new(Regexp.escape(trace.description)) diff --git a/test/controllers/user_blocks_controller_test.rb b/test/controllers/user_blocks_controller_test.rb index ebf57488c..b7dcf755b 100644 --- a/test/controllers/user_blocks_controller_test.rb +++ b/test/controllers/user_blocks_controller_test.rb @@ -1,7 +1,7 @@ require "test_helper" class UserBlocksControllerTest < ActionController::TestCase - fixtures :users, :user_roles, :user_blocks + fixtures :users, :user_roles ## # test all routes which lead to this controller @@ -61,20 +61,27 @@ class UserBlocksControllerTest < ActionController::TestCase ## # test the index action def test_index - # The list of blocks should load + active_block = create(:user_block) + expired_block = create(:user_block, :expired) + revoked_block = create(:user_block, :revoked) + get :index assert_response :success assert_select "table#block_list", :count => 1 do assert_select "tr", 4 - assert_select "a[href='#{user_block_path(user_blocks(:active_block))}']", 1 - assert_select "a[href='#{user_block_path(user_blocks(:expired_block))}']", 1 - assert_select "a[href='#{user_block_path(user_blocks(:revoked_block))}']", 1 + assert_select "a[href='#{user_block_path(active_block)}']", 1 + assert_select "a[href='#{user_block_path(expired_block)}']", 1 + assert_select "a[href='#{user_block_path(revoked_block)}']", 1 end end ## # test the show action def test_show + active_block = create(:user_block, :needs_view) + expired_block = create(:user_block, :expired) + revoked_block = create(:user_block, :revoked) + # Viewing a block should fail when no ID is given assert_raise ActionController::UrlGenerationError do get :show @@ -87,25 +94,25 @@ class UserBlocksControllerTest < ActionController::TestCase assert_select "p", "Sorry, the user block with ID 99999 could not be found." # Viewing an expired block should work - get :show, :id => user_blocks(:expired_block) + get :show, :id => expired_block.id assert_response :success # Viewing a revoked block should work - get :show, :id => user_blocks(:revoked_block) + get :show, :id => revoked_block.id assert_response :success # Viewing an active block should work, but shouldn't mark it as seen - get :show, :id => user_blocks(:active_block) + get :show, :id => active_block.id assert_response :success - assert_equal true, UserBlock.find(user_blocks(:active_block).id).needs_view + assert_equal true, UserBlock.find(active_block.id).needs_view # Login as the blocked user - session[:user] = users(:blocked_user).id + session[:user] = active_block.user.id # Now viewing it should mark it as seen - get :show, :id => user_blocks(:active_block) + get :show, :id => active_block.id assert_response :success - assert_equal false, UserBlock.find(user_blocks(:active_block).id).needs_view + assert_equal false, UserBlock.find(active_block.id).needs_view end ## @@ -153,15 +160,17 @@ class UserBlocksControllerTest < ActionController::TestCase ## # test the edit action def test_edit + active_block = create(:user_block) + # Check that the block edit page requires us to login - get :edit, :id => user_blocks(:active_block).id - assert_redirected_to login_path(:referer => edit_user_block_path(:id => user_blocks(:active_block).id)) + get :edit, :id => active_block.id + assert_redirected_to login_path(:referer => edit_user_block_path(:id => active_block.id)) # Login as a normal user session[:user] = users(:public_user).id # Check that normal users can't load the block edit page - get :edit, :id => user_blocks(:active_block).id + get :edit, :id => active_block.id assert_redirected_to user_blocks_path assert_equal "You need to be a moderator to perform that action.", flash[:error] @@ -169,9 +178,9 @@ class UserBlocksControllerTest < ActionController::TestCase session[:user] = users(:moderator_user).id # Check that the block edit page loads for moderators - get :edit, :id => user_blocks(:active_block).id + get :edit, :id => active_block.id assert_response :success - assert_select "form#edit_user_block_#{user_blocks(:active_block).id}", :count => 1 do + assert_select "form#edit_user_block_#{active_block.id}", :count => 1 do assert_select "textarea#user_block_reason", :count => 1 assert_select "select#user_block_period", :count => 1 assert_select "input#user_block_needs_view[type='checkbox']", :count => 1 @@ -229,7 +238,7 @@ class UserBlocksControllerTest < ActionController::TestCase b = UserBlock.find(id) assert_in_delta Time.now, b.created_at, 1 assert_in_delta Time.now, b.updated_at, 1 - assert_in_delta Time.now + 12.hour, b.ends_at, 1 + assert_in_delta Time.now + 12.hours, b.ends_at, 1 assert_equal false, b.needs_view assert_equal "Vandalism", b.reason assert_equal "markdown", b.reason_format @@ -251,15 +260,17 @@ class UserBlocksControllerTest < ActionController::TestCase ## # test the update action def test_update + active_block = create(:user_block, :creator => users(:moderator_user)) + # Not logged in yet, so updating a block should fail - put :update, :id => user_blocks(:active_block).id + put :update, :id => active_block.id assert_response :forbidden # Login as a normal user session[:user] = users(:public_user).id # Check that normal users can't update blocks - put :update, :id => user_blocks(:active_block).id + put :update, :id => active_block.id assert_response :forbidden # Login as the wrong moderator @@ -268,11 +279,11 @@ class UserBlocksControllerTest < ActionController::TestCase # Check that only the person who created a block can update it assert_no_difference "UserBlock.count" do put :update, - :id => user_blocks(:active_block).id, + :id => active_block.id, :user_block_period => "12", :user_block => { :needs_view => true, :reason => "Vandalism" } end - assert_redirected_to edit_user_block_path(:id => user_blocks(:active_block).id) + assert_redirected_to edit_user_block_path(:id => active_block.id) assert_equal "Only the moderator who created this block can edit it.", flash[:error] # Login as the correct moderator @@ -281,22 +292,22 @@ class UserBlocksControllerTest < ActionController::TestCase # A bogus block period should result in an error assert_no_difference "UserBlock.count" do put :update, - :id => user_blocks(:active_block).id, + :id => active_block.id, :user_block_period => "99" end - assert_redirected_to edit_user_block_path(:id => user_blocks(:active_block).id) + assert_redirected_to edit_user_block_path(:id => active_block.id) assert_equal "The blocking period must be one of the values selectable in the drop-down list.", flash[:error] # Check that updating a block works assert_no_difference "UserBlock.count" do put :update, - :id => user_blocks(:active_block).id, + :id => active_block.id, :user_block_period => "12", :user_block => { :needs_view => true, :reason => "Vandalism" } end - assert_redirected_to user_block_path(:id => user_blocks(:active_block).id) + assert_redirected_to user_block_path(:id => active_block.id) assert_equal "Block updated.", flash[:notice] - b = UserBlock.find(user_blocks(:active_block).id) + b = UserBlock.find(active_block.id) assert_in_delta Time.now, b.updated_at, 1 assert_equal true, b.needs_view assert_equal "Vandalism", b.reason @@ -316,15 +327,17 @@ class UserBlocksControllerTest < ActionController::TestCase ## # test the revoke action def test_revoke + active_block = create(:user_block) + # Check that the block revoke page requires us to login - get :revoke, :id => user_blocks(:active_block).id - assert_redirected_to login_path(:referer => revoke_user_block_path(:id => user_blocks(:active_block).id)) + get :revoke, :id => active_block.id + assert_redirected_to login_path(:referer => revoke_user_block_path(:id => active_block.id)) # Login as a normal user session[:user] = users(:public_user).id # Check that normal users can't load the block revoke page - get :revoke, :id => user_blocks(:active_block).id + get :revoke, :id => active_block.id assert_redirected_to user_blocks_path assert_equal "You need to be a moderator to perform that action.", flash[:error] @@ -332,7 +345,7 @@ class UserBlocksControllerTest < ActionController::TestCase session[:user] = users(:moderator_user).id # Check that the block revoke page loads for moderators - get :revoke, :id => user_blocks(:active_block).id + get :revoke, :id => active_block.id assert_response :success assert_template "revoke" assert_select "form", :count => 1 do @@ -341,9 +354,9 @@ class UserBlocksControllerTest < ActionController::TestCase end # Check that revoking a block works - post :revoke, :id => user_blocks(:active_block).id, :confirm => true - assert_redirected_to user_block_path(:id => user_blocks(:active_block).id) - b = UserBlock.find(user_blocks(:active_block).id) + post :revoke, :id => active_block.id, :confirm => true + assert_redirected_to user_block_path(:id => active_block.id) + b = UserBlock.find(active_block.id) assert_in_delta Time.now, b.ends_at, 1 # We should get an error if no block ID is specified @@ -361,6 +374,10 @@ class UserBlocksControllerTest < ActionController::TestCase ## # test the blocks_on action def test_blocks_on + active_block = create(:user_block, :user => users(:blocked_user)) + revoked_block = create(:user_block, :revoked, :user => users(:blocked_user)) + expired_block = create(:user_block, :expired, :user => users(:unblocked_user)) + # Asking for a list of blocks with no user name should fail assert_raise ActionController::UrlGenerationError do get :blocks_on @@ -383,8 +400,8 @@ class UserBlocksControllerTest < ActionController::TestCase assert_response :success assert_select "table#block_list", :count => 1 do assert_select "tr", 3 - assert_select "a[href='#{user_block_path(user_blocks(:active_block))}']", 1 - assert_select "a[href='#{user_block_path(user_blocks(:revoked_block))}']", 1 + assert_select "a[href='#{user_block_path(active_block)}']", 1 + assert_select "a[href='#{user_block_path(revoked_block)}']", 1 end # Check the list of blocks for a user that has previously been blocked @@ -392,13 +409,17 @@ class UserBlocksControllerTest < ActionController::TestCase assert_response :success assert_select "table#block_list", :count => 1 do assert_select "tr", 2 - assert_select "a[href='#{user_block_path(user_blocks(:expired_block))}']", 1 + assert_select "a[href='#{user_block_path(expired_block)}']", 1 end end ## # test the blocks_by action def test_blocks_by + active_block = create(:user_block, :creator => users(:moderator_user)) + expired_block = create(:user_block, :expired, :creator => users(:second_moderator_user)) + revoked_block = create(:user_block, :revoked, :creator => users(:second_moderator_user)) + # Asking for a list of blocks with no user name should fail assert_raise ActionController::UrlGenerationError do get :blocks_by @@ -415,7 +436,7 @@ class UserBlocksControllerTest < ActionController::TestCase assert_response :success assert_select "table#block_list", :count => 1 do assert_select "tr", 2 - assert_select "a[href='#{user_block_path(user_blocks(:active_block))}']", 1 + assert_select "a[href='#{user_block_path(active_block)}']", 1 end # Check the list of blocks given by a different moderator @@ -423,8 +444,8 @@ class UserBlocksControllerTest < ActionController::TestCase assert_response :success assert_select "table#block_list", :count => 1 do assert_select "tr", 3 - assert_select "a[href='#{user_block_path(user_blocks(:expired_block))}']", 1 - assert_select "a[href='#{user_block_path(user_blocks(:revoked_block))}']", 1 + assert_select "a[href='#{user_block_path(expired_block)}']", 1 + assert_select "a[href='#{user_block_path(revoked_block)}']", 1 end # Check the list of blocks (not) given by a normal user diff --git a/test/controllers/user_controller_test.rb b/test/controllers/user_controller_test.rb index 37b8a7f30..027618631 100644 --- a/test/controllers/user_controller_test.rb +++ b/test/controllers/user_controller_test.rb @@ -2,7 +2,10 @@ require "test_helper" class UserControllerTest < ActionController::TestCase api_fixtures - fixtures :messages, :friends + + def setup + stub_hostip_requests + end ## # test all routes which lead to this controller @@ -393,6 +396,7 @@ class UserControllerTest < ActionController::TestCase def test_confirm_success_no_token_no_referer user = users(:inactive_user) + stub_gravatar_request(user.email) confirm_string = user.tokens.create.token @request.cookies["_osm_session"] = user.display_name @@ -403,6 +407,7 @@ class UserControllerTest < ActionController::TestCase def test_confirm_success_good_token_no_referer user = users(:inactive_user) + stub_gravatar_request(user.email) confirm_string = user.tokens.create.token token = user.tokens.create.token @@ -413,6 +418,7 @@ class UserControllerTest < ActionController::TestCase def test_confirm_success_bad_token_no_referer user = users(:inactive_user) + stub_gravatar_request(user.email) confirm_string = user.tokens.create.token token = users(:normal_user).tokens.create.token @@ -424,6 +430,7 @@ class UserControllerTest < ActionController::TestCase def test_confirm_success_no_token_with_referer user = users(:inactive_user) + stub_gravatar_request(user.email) confirm_string = user.tokens.create(:referer => diary_new_path).token @request.cookies["_osm_session"] = user.display_name @@ -434,6 +441,7 @@ class UserControllerTest < ActionController::TestCase def test_confirm_success_good_token_with_referer user = users(:inactive_user) + stub_gravatar_request(user.email) confirm_string = user.tokens.create(:referer => diary_new_path).token token = user.tokens.create.token @@ -444,6 +452,7 @@ class UserControllerTest < ActionController::TestCase def test_confirm_success_bad_token_with_referer user = users(:inactive_user) + stub_gravatar_request(user.email) confirm_string = user.tokens.create(:referer => diary_new_path).token token = users(:normal_user).tokens.create.token @@ -522,6 +531,7 @@ class UserControllerTest < ActionController::TestCase def test_confirm_email_success user = users(:second_public_user) + stub_gravatar_request(user.new_email) confirm_string = user.tokens.create.token post :confirm_email, :confirm_string => confirm_string @@ -547,6 +557,40 @@ class UserControllerTest < ActionController::TestCase assert_match /confirmation code has expired or does not exist/, flash[:error] end + ## + # test if testing for a gravatar works + # this happens when the email is actually changed + # which is triggered by the confirmation mail + def test_gravatar_auto_enable + # switch to email that has a gravatar + user = users(:first_gravatar_user) + stub_gravatar_request(user.new_email, 200) + confirm_string = user.tokens.create.token + # precondition gravatar should be turned off + assert !user.image_use_gravatar + post :confirm_email, :confirm_string => confirm_string + assert_response :redirect + assert_redirected_to :action => :account, :display_name => user.display_name + assert_match /Confirmed your change of email address/, flash[:notice] + # gravatar use should now be enabled + assert User.find(users(:first_gravatar_user).id).image_use_gravatar + end + + def test_gravatar_auto_disable + # switch to email without a gravatar + user = users(:second_gravatar_user) + stub_gravatar_request(user.new_email, 404) + confirm_string = user.tokens.create.token + # precondition gravatar should be turned on + assert user.image_use_gravatar + post :confirm_email, :confirm_string => confirm_string + assert_response :redirect + assert_redirected_to :action => :account, :display_name => user.display_name + assert_match /Confirmed your change of email address/, flash[:notice] + # gravatar use should now be disabled + assert !User.find(users(:second_gravatar_user).id).image_use_gravatar + end + def test_terms_new_user get :terms, {}, { :new_user => User.new } assert_response :success @@ -702,7 +746,8 @@ class UserControllerTest < ActionController::TestCase # Test setting a new password post :reset_password, :token => token.token, :user => { :pass_crypt => "new_password", :pass_crypt_confirmation => "new_password" } assert_response :redirect - assert_redirected_to :action => :login + assert_redirected_to root_path + assert_equal users(:inactive_user).id, session[:user] user = User.find(users(:inactive_user).id) assert_equal "active", user.status assert_equal true, user.email_valid @@ -768,7 +813,7 @@ class UserControllerTest < ActionController::TestCase assert_select "form#accountForm > fieldset > div.form-row > select#user_preferred_editor > option[selected]", false # Changing to an uploaded image should work - image = Rack::Test::UploadedFile.new("test/traces/1.gif", "image/gif") + image = Rack::Test::UploadedFile.new("test/gpx/fixtures/a.gif", "image/gif") post :account, { :display_name => user.display_name, :image_action => "new", :user => user.attributes.merge(:image => image) }, { :user => user.id } assert_response :success assert_template :account @@ -887,6 +932,7 @@ class UserControllerTest < ActionController::TestCase end # Test a user who has been blocked + create(:user_block, :user => users(:blocked_user)) get :view, :display_name => "blocked" assert_response :success assert_select "div#userinformation" do @@ -901,6 +947,7 @@ class UserControllerTest < ActionController::TestCase end # Test a moderator who has applied blocks + create(:user_block, :creator => users(:moderator_user)) get :view, :display_name => "moderator" assert_response :success assert_select "div#userinformation" do @@ -960,7 +1007,7 @@ class UserControllerTest < ActionController::TestCase assert_select "contributor-terms", :count => 1 do assert_select "[agreed='true']" end - assert_select "img", :count => 1 + assert_select "img", :count => 0 assert_select "roles", :count => 1 do assert_select "role", :count => 0 end @@ -997,6 +1044,8 @@ class UserControllerTest < ActionController::TestCase end def test_api_details + create(:message, :read, :recipient => users(:normal_user)) + # check that nothing is returned when not logged in get :api_details assert_response :unauthorized @@ -1012,7 +1061,7 @@ class UserControllerTest < ActionController::TestCase assert_select "contributor-terms", :count => 1 do assert_select "[agreed='true'][pd='false']" end - assert_select "img", :count => 1 + assert_select "img", :count => 0 assert_select "roles", :count => 1 do assert_select "role", :count => 0 end @@ -1045,6 +1094,12 @@ class UserControllerTest < ActionController::TestCase end def test_api_gpx_files + trace1 = create(:trace, :user => users(:normal_user)) do |trace| + create(:tracetag, :trace => trace, :tag => "London") + end + trace2 = create(:trace, :user => users(:normal_user)) do |trace| + create(:tracetag, :trace => trace, :tag => "Birmingham") + end # check that nothing is returned when not logged in get :api_gpx_files assert_response :unauthorized @@ -1056,10 +1111,10 @@ class UserControllerTest < ActionController::TestCase assert_equal "text/xml", response.content_type # check the data that is returned - assert_select "gpx_file[id='1']", 1 do + assert_select "gpx_file[id='#{trace1.id}']", 1 do assert_select "tag", "London" end - assert_select "gpx_file[id='4']", 1 do + assert_select "gpx_file[id='#{trace2.id}']", 1 do assert_select "tag", "Birmingham" end end @@ -1154,6 +1209,7 @@ class UserControllerTest < ActionController::TestCase # Get users to work with user = users(:normal_user) friend = users(:public_user) + create(:friend, :befriender => user, :befriendee => friend) # Check that the users are friends assert Friend.where(:user_id => user.id, :friend_user_id => friend.id).first @@ -1194,6 +1250,7 @@ class UserControllerTest < ActionController::TestCase # Get users to work with user = users(:normal_user) friend = users(:public_user) + create(:friend, :user_id => user.id, :friend_user_id => friend.id) # Check that the users are friends assert Friend.where(:user_id => user.id, :friend_user_id => friend.id).first @@ -1333,7 +1390,7 @@ class UserControllerTest < ActionController::TestCase get :list, :page => 3 assert_response :success assert_template :list - assert_select "table#user_list tr", :count => 22 + assert_select "table#user_list tr", :count => 26 end def test_list_post_confirm diff --git a/test/controllers/user_preference_controller_test.rb b/test/controllers/user_preference_controller_test.rb index 752ec56cb..96ba4375c 100644 --- a/test/controllers/user_preference_controller_test.rb +++ b/test/controllers/user_preference_controller_test.rb @@ -1,7 +1,7 @@ require "test_helper" class UserPreferenceControllerTest < ActionController::TestCase - fixtures :users, :user_preferences + fixtures :users ## # test all routes which lead to this controller @@ -47,6 +47,8 @@ class UserPreferenceControllerTest < ActionController::TestCase end # authenticate as a user with preferences + user_preference = create(:user_preference, :user => users(:normal_user)) + user_preference2 = create(:user_preference, :user => users(:normal_user)) basic_authorization("test@openstreetmap.org", "test") # try the read again @@ -56,8 +58,8 @@ class UserPreferenceControllerTest < ActionController::TestCase assert_select "osm" do assert_select "preferences", :count => 1 do assert_select "preference", :count => 2 - assert_select "preference[k=\"#{user_preferences(:a).k}\"][v=\"#{user_preferences(:a).v}\"]", :count => 1 - assert_select "preference[k=\"#{user_preferences(:two).k}\"][v=\"#{user_preferences(:two).v}\"]", :count => 1 + assert_select "preference[k=\"#{user_preference.k}\"][v=\"#{user_preference.v}\"]", :count => 1 + assert_select "preference[k=\"#{user_preference2.k}\"][v=\"#{user_preference2.v}\"]", :count => 1 end end end @@ -65,6 +67,8 @@ class UserPreferenceControllerTest < ActionController::TestCase ## # test read_one action def test_read_one + create(:user_preference, :user => users(:normal_user), :k => "key", :v => "value") + # try a read without auth get :read_one, :preference_key => "key" assert_response :unauthorized, "should be authenticated" @@ -86,16 +90,19 @@ class UserPreferenceControllerTest < ActionController::TestCase ## # test update action def test_update + create(:user_preference, :user => users(:normal_user), :k => "key", :v => "value") + create(:user_preference, :user => users(:normal_user), :k => "some_key", :v => "some_value") + # try a put without auth assert_no_difference "UserPreference.count" do content "" put :update end assert_response :unauthorized, "should be authenticated" - assert_equal "value", UserPreference.find([1, "key"]).v - assert_equal "some_value", UserPreference.find([1, "some_key"]).v + assert_equal "value", UserPreference.find([users(:normal_user).id, "key"]).v + assert_equal "some_value", UserPreference.find([users(:normal_user).id, "some_key"]).v assert_raises ActiveRecord::RecordNotFound do - UserPreference.find([1, "new_key"]) + UserPreference.find([users(:normal_user).id, "new_key"]) end # authenticate as a user with preferences @@ -109,10 +116,10 @@ class UserPreferenceControllerTest < ActionController::TestCase assert_response :success assert_equal "text/plain", @response.content_type assert_equal "", @response.body - assert_equal "new_value", UserPreference.find([1, "key"]).v - assert_equal "value", UserPreference.find([1, "new_key"]).v + assert_equal "new_value", UserPreference.find([users(:normal_user).id, "key"]).v + assert_equal "value", UserPreference.find([users(:normal_user).id, "new_key"]).v assert_raises ActiveRecord::RecordNotFound do - UserPreference.find([1, "some_key"]) + UserPreference.find([users(:normal_user).id, "some_key"]) end # try a put with duplicate keys @@ -123,7 +130,7 @@ class UserPreferenceControllerTest < ActionController::TestCase assert_response :bad_request assert_equal "text/plain", @response.content_type assert_equal "Duplicate preferences with key key", @response.body - assert_equal "new_value", UserPreference.find([1, "key"]).v + assert_equal "new_value", UserPreference.find([users(:normal_user).id, "key"]).v # try a put with invalid content assert_no_difference "UserPreference.count" do @@ -143,7 +150,7 @@ class UserPreferenceControllerTest < ActionController::TestCase end assert_response :unauthorized, "should be authenticated" assert_raises ActiveRecord::RecordNotFound do - UserPreference.find([1, "new_key"]) + UserPreference.find([users(:normal_user).id, "new_key"]) end # authenticate as a user with preferences @@ -157,7 +164,7 @@ class UserPreferenceControllerTest < ActionController::TestCase assert_response :success assert_equal "text/plain", @response.content_type assert_equal "", @response.body - assert_equal "new_value", UserPreference.find([1, "new_key"]).v + assert_equal "new_value", UserPreference.find([users(:normal_user).id, "new_key"]).v # try changing the value of a preference assert_no_difference "UserPreference.count" do @@ -167,18 +174,20 @@ class UserPreferenceControllerTest < ActionController::TestCase assert_response :success assert_equal "text/plain", @response.content_type assert_equal "", @response.body - assert_equal "newer_value", UserPreference.find([1, "new_key"]).v + assert_equal "newer_value", UserPreference.find([users(:normal_user).id, "new_key"]).v end ## # test delete_one action def test_delete_one + create(:user_preference, :user => users(:normal_user), :k => "key", :v => "value") + # try a delete without auth assert_no_difference "UserPreference.count" do delete :delete_one, :preference_key => "key" end assert_response :unauthorized, "should be authenticated" - assert_equal "value", UserPreference.find([1, "key"]).v + assert_equal "value", UserPreference.find([users(:normal_user).id, "key"]).v # authenticate as a user with preferences basic_authorization("test@openstreetmap.org", "test") @@ -191,7 +200,7 @@ class UserPreferenceControllerTest < ActionController::TestCase assert_equal "text/plain", @response.content_type assert_equal "", @response.body assert_raises ActiveRecord::RecordNotFound do - UserPreference.find([1, "key"]) + UserPreference.find([users(:normal_user).id, "key"]) end # try the delete again for the same key @@ -200,7 +209,7 @@ class UserPreferenceControllerTest < ActionController::TestCase end assert_response :not_found assert_raises ActiveRecord::RecordNotFound do - UserPreference.find([1, "key"]) + UserPreference.find([users(:normal_user).id, "key"]) end end end diff --git a/test/controllers/way_controller_test.rb b/test/controllers/way_controller_test.rb index 8226f435c..650977078 100644 --- a/test/controllers/way_controller_test.rb +++ b/test/controllers/way_controller_test.rb @@ -121,8 +121,8 @@ class WayControllerTest < ActionController::TestCase # create a way with pre-existing nodes content "" + - "" + - "" + "" + + "" put :create # hope for failure assert_response :forbidden, @@ -138,8 +138,8 @@ class WayControllerTest < ActionController::TestCase # create a way with pre-existing nodes content "" + - "" + - "" + "" + + "" put :create # hope for success assert_response :success, @@ -179,7 +179,7 @@ class WayControllerTest < ActionController::TestCase # create a way with non-existing node content "" + - "" + "" put :create # expect failure assert_response :forbidden, @@ -187,7 +187,7 @@ class WayControllerTest < ActionController::TestCase # create a way with no nodes content "" + - "" + "" put :create # expect failure assert_response :forbidden, @@ -195,7 +195,7 @@ class WayControllerTest < ActionController::TestCase # create a way inside a closed changeset content "" + - "" + "" put :create # expect failure assert_response :forbidden, @@ -211,7 +211,7 @@ class WayControllerTest < ActionController::TestCase # create a way with non-existing node content "" + - "" + "" put :create # expect failure assert_response :precondition_failed, @@ -220,7 +220,7 @@ class WayControllerTest < ActionController::TestCase # create a way with no nodes content "" + - "" + "" put :create # expect failure assert_response :precondition_failed, @@ -229,7 +229,7 @@ class WayControllerTest < ActionController::TestCase # create a way inside a closed changeset content "" + - "" + "" put :create # expect failure assert_response :conflict, @@ -237,9 +237,9 @@ class WayControllerTest < ActionController::TestCase # create a way with a tag which is too long content "" + - "" + - "" + - "" + "" + + "" + + "" put :create # expect failure assert_response :bad_request, @@ -538,10 +538,12 @@ class WayControllerTest < ActionController::TestCase # setup auth basic_authorization(users(:normal_user).email, "test") + existing = create(:way_tag, :way => current_ways(:visible_way)) + # add an identical tag to the way tag_xml = XML::Node.new("tag") - tag_xml["k"] = current_way_tags(:t1).k - tag_xml["v"] = current_way_tags(:t1).v + tag_xml["k"] = existing.k + tag_xml["v"] = existing.v # add the tag into the existing xml way_xml = current_ways(:visible_way).to_xml @@ -559,8 +561,8 @@ class WayControllerTest < ActionController::TestCase # add an identical tag to the way tag_xml = XML::Node.new("tag") - tag_xml["k"] = current_way_tags(:t1).k - tag_xml["v"] = current_way_tags(:t1).v + tag_xml["k"] = existing.k + tag_xml["v"] = existing.v # add the tag into the existing xml way_xml = current_ways(:visible_way).to_xml @@ -571,7 +573,7 @@ class WayControllerTest < ActionController::TestCase put :update, :id => current_ways(:visible_way).id assert_response :bad_request, "adding a duplicate tag to a way should fail with 'bad request'" - assert_equal "Element way/#{current_ways(:visible_way).id} has duplicate tags with key #{current_way_tags(:t1).k}", @response.body + assert_equal "Element way/#{current_ways(:visible_way).id} has duplicate tags with key #{existing.k}", @response.body end ## @@ -673,8 +675,7 @@ class WayControllerTest < ActionController::TestCase # check that the set of IDs match expectations expected_way_ids = [current_ways(:visible_way).id, - current_ways(:used_way).id - ] + current_ways(:used_way).id] found_way_ids = ways_xml.find("//osm/way").collect { |w| w["id"].to_i } assert_equal expected_way_ids.sort, found_way_ids.sort, "expected ways for node #{current_nodes(:used_node_1).id} did not match found" diff --git a/test/factories/acls.rb b/test/factories/acls.rb new file mode 100644 index 000000000..3f91df3ab --- /dev/null +++ b/test/factories/acls.rb @@ -0,0 +1,5 @@ +FactoryGirl.define do + factory :acl do + sequence(:k) { |n| "Key #{n}" } + end +end diff --git a/test/factories/changeset_comments.rb b/test/factories/changeset_comments.rb new file mode 100644 index 000000000..5fb262184 --- /dev/null +++ b/test/factories/changeset_comments.rb @@ -0,0 +1,12 @@ +FactoryGirl.define do + factory :changeset_comment do + sequence(:body) { |n| "Changeset comment #{n}" } + visible true + + # FIXME: needs changeset factory + changeset_id 3 + + # FIXME: needs user factory + author_id 1 + end +end diff --git a/test/factories/changeset_tags.rb b/test/factories/changeset_tags.rb new file mode 100644 index 000000000..fa728f085 --- /dev/null +++ b/test/factories/changeset_tags.rb @@ -0,0 +1,9 @@ +FactoryGirl.define do + factory :changeset_tag do + sequence(:k) { |n| "Key #{n}" } + sequence(:v) { |n| "Value #{n}" } + + # Fixme requires changeset factory + changeset_id 1 + end +end diff --git a/test/factories/client_applications.rb b/test/factories/client_applications.rb new file mode 100644 index 000000000..413dc57c9 --- /dev/null +++ b/test/factories/client_applications.rb @@ -0,0 +1,6 @@ +FactoryGirl.define do + factory :client_application do + sequence(:name) { |n| "Client application #{n}" } + sequence(:url) { |n| "http://example.com/app/#{n}" } + end +end diff --git a/test/factories/diary_comments.rb b/test/factories/diary_comments.rb new file mode 100644 index 000000000..810bd2f7a --- /dev/null +++ b/test/factories/diary_comments.rb @@ -0,0 +1,10 @@ +FactoryGirl.define do + factory :diary_comment do + sequence(:body) { |n| "This is diary comment #{n}" } + + diary_entry + + # Fixme requires User Factory + user_id 1 + end +end diff --git a/test/factories/diary_entries.rb b/test/factories/diary_entries.rb new file mode 100644 index 000000000..d00a97dc5 --- /dev/null +++ b/test/factories/diary_entries.rb @@ -0,0 +1,9 @@ +FactoryGirl.define do + factory :diary_entry do + sequence(:title) { |n| "Diary entry #{n}" } + sequence(:body) { |n| "This is diary entry #{n}" } + + # Fixme requires User Factory + user_id 1 + end +end diff --git a/test/factories/friends.rb b/test/factories/friends.rb new file mode 100644 index 000000000..46b14a39d --- /dev/null +++ b/test/factories/friends.rb @@ -0,0 +1,7 @@ +FactoryGirl.define do + factory :friend do + # Fixme requires User Factory + user_id 1 + friend_user_id 2 + end +end diff --git a/test/factories/languages.rb b/test/factories/languages.rb new file mode 100644 index 000000000..0887c9129 --- /dev/null +++ b/test/factories/languages.rb @@ -0,0 +1,7 @@ +FactoryGirl.define do + factory :language do + code "en" + english_name "English" + native_name "English" + end +end diff --git a/test/factories/messages.rb b/test/factories/messages.rb new file mode 100644 index 000000000..75e65cdbf --- /dev/null +++ b/test/factories/messages.rb @@ -0,0 +1,21 @@ +FactoryGirl.define do + factory :message do + sequence(:title) { |n| "Message #{n}" } + sequence(:body) { |n| "Body text for message #{n}" } + sent_on Time.now + + # FIXME: needs user factory + from_user_id 1 + + # FIXME: needs user factory + to_user_id 2 + + trait :unread do + message_read false + end + + trait :read do + message_read true + end + end +end diff --git a/test/factories/node_tags.rb b/test/factories/node_tags.rb new file mode 100644 index 000000000..267309e90 --- /dev/null +++ b/test/factories/node_tags.rb @@ -0,0 +1,9 @@ +FactoryGirl.define do + factory :node_tag do + sequence(:k) { |n| "Key #{n}" } + sequence(:v) { |n| "Value #{n}" } + + # Fixme requires node factory + node_id 1 + end +end diff --git a/test/factories/note_comments.rb b/test/factories/note_comments.rb new file mode 100644 index 000000000..b06dc378a --- /dev/null +++ b/test/factories/note_comments.rb @@ -0,0 +1,8 @@ +FactoryGirl.define do + factory :note_comment do + sequence(:body) { |n| "This is note comment #{n}" } + visible true + event "opened" + note + end +end diff --git a/test/factories/notes.rb b/test/factories/notes.rb new file mode 100644 index 000000000..9dbcdf58c --- /dev/null +++ b/test/factories/notes.rb @@ -0,0 +1,17 @@ +FactoryGirl.define do + factory :note do + latitude 1 * GeoRecord::SCALE + longitude 1 * GeoRecord::SCALE + # tile QuadTile.tile_for_point(1,1) + + factory :note_with_comments do + transient do + comments_count 1 + end + + after(:create) do |note, evaluator| + create_list(:note_comment, evaluator.comments_count, :note => note) + end + end + end +end diff --git a/test/factories/old_node_tags.rb b/test/factories/old_node_tags.rb new file mode 100644 index 000000000..5c63f3242 --- /dev/null +++ b/test/factories/old_node_tags.rb @@ -0,0 +1,10 @@ +FactoryGirl.define do + factory :old_node_tag do + sequence(:k) { |n| "Key #{n}" } + sequence(:v) { |n| "Value #{n}" } + + # Fixme requires old_node factory + node_id 1 + version 1 + end +end diff --git a/test/factories/old_relation_tags.rb b/test/factories/old_relation_tags.rb new file mode 100644 index 000000000..08e417187 --- /dev/null +++ b/test/factories/old_relation_tags.rb @@ -0,0 +1,10 @@ +FactoryGirl.define do + factory :old_relation_tag do + sequence(:k) { |n| "Key #{n}" } + sequence(:v) { |n| "Value #{n}" } + + # Fixme requires old_relation factory + relation_id 1 + version 1 + end +end diff --git a/test/factories/old_way_tags.rb b/test/factories/old_way_tags.rb new file mode 100644 index 000000000..c639c06db --- /dev/null +++ b/test/factories/old_way_tags.rb @@ -0,0 +1,10 @@ +FactoryGirl.define do + factory :old_way_tag do + sequence(:k) { |n| "Key #{n}" } + sequence(:v) { |n| "Value #{n}" } + + # Fixme requires old_way factory + way_id 1 + version 1 + end +end diff --git a/test/factories/relation_tags.rb b/test/factories/relation_tags.rb new file mode 100644 index 000000000..00ad4dbdc --- /dev/null +++ b/test/factories/relation_tags.rb @@ -0,0 +1,9 @@ +FactoryGirl.define do + factory :relation_tag do + sequence(:k) { |n| "Key #{n}" } + sequence(:v) { |n| "Value #{n}" } + + # Fixme requires relation factory + relation_id 1 + end +end diff --git a/test/factories/tracepoints.rb b/test/factories/tracepoints.rb new file mode 100644 index 000000000..c47b7932d --- /dev/null +++ b/test/factories/tracepoints.rb @@ -0,0 +1,11 @@ +FactoryGirl.define do + factory :tracepoint do + trackid 1 + latitude 1 * GeoRecord::SCALE + longitude 1 * GeoRecord::SCALE + # tile QuadTile.tile_for_point(1,1) + timestamp Time.now + + trace + end +end diff --git a/test/factories/traces.rb b/test/factories/traces.rb new file mode 100644 index 000000000..66f810468 --- /dev/null +++ b/test/factories/traces.rb @@ -0,0 +1,31 @@ +FactoryGirl.define do + factory :trace do + sequence(:name) { |n| "Trace #{n}.gpx" } + sequence(:description) { |n| "This is trace #{n}" } + + # Fixme requires User Factory + user_id 1 + + timestamp Time.now + inserted true + + trait :deleted do + visible false + end + + transient do + fixture nil + end + + after(:create) do |trace, evaluator| + if evaluator.fixture + File.symlink(Rails.root.join("test", "gpx", "fixtures", "#{evaluator.fixture}.gpx"), + Rails.root.join("test", "gpx", "traces", "#{trace.id}.gpx")) + File.symlink(Rails.root.join("test", "gpx", "fixtures", "#{evaluator.fixture}.gif"), + Rails.root.join("test", "gpx", "images", "#{trace.id}.gif")) + File.symlink(Rails.root.join("test", "gpx", "fixtures", "#{evaluator.fixture}_icon.gif"), + Rails.root.join("test", "gpx", "images", "#{trace.id}_icon.gif")) + end + end + end +end diff --git a/test/factories/tracetags.rb b/test/factories/tracetags.rb new file mode 100644 index 000000000..3dbeeb877 --- /dev/null +++ b/test/factories/tracetags.rb @@ -0,0 +1,7 @@ +FactoryGirl.define do + factory :tracetag do + sequence(:tag) { |n| "Tag #{n}" } + + trace + end +end diff --git a/test/factories/user.rb b/test/factories/user.rb new file mode 100644 index 000000000..9ec4e2030 --- /dev/null +++ b/test/factories/user.rb @@ -0,0 +1,44 @@ +FactoryGirl.define do + factory :user do + sequence(:email) { |n| "user#{n}@example.com" } + sequence(:display_name) { |n| "User #{n}" } + pass_crypt Digest::MD5.hexdigest("test") + + trait :with_home_location do + home_lat { rand(-90.0...90.0) } + home_lon { rand(-180.0...180.0) } + end + + trait :pending do + status "pending" + end + + trait :active do + status "active" + end + + trait :confirmed do + status "confirmed" + end + + trait :suspended do + status "suspended" + end + + trait :deleted do + status "deleted" + end + + factory :moderator_user do + after(:create) do |user, _evaluator| + create(:user_role, :role => "moderator", :user => user) + end + end + + factory :administrator_user do + after(:create) do |user, _evaluator| + create(:user_role, :role => "administrator", :user => user) + end + end + end +end diff --git a/test/factories/user_blocks.rb b/test/factories/user_blocks.rb new file mode 100644 index 000000000..b73e599b8 --- /dev/null +++ b/test/factories/user_blocks.rb @@ -0,0 +1,25 @@ +FactoryGirl.define do + factory :user_block do + sequence(:reason) { |n| "User Block #{n}" } + ends_at Time.now + 1.day + + # FIXME: requires User factory + user_id 13 + + # FIXME: requires User factory + creator_id 15 + + trait :needs_view do + needs_view true + end + + trait :expired do + ends_at Time.now - 1.day + end + + trait :revoked do + # FIXME: requires User factory + revoker_id 5 + end + end +end diff --git a/test/factories/user_preferences.rb b/test/factories/user_preferences.rb new file mode 100644 index 000000000..552cfcd75 --- /dev/null +++ b/test/factories/user_preferences.rb @@ -0,0 +1,9 @@ +FactoryGirl.define do + factory :user_preference do + sequence(:k) { |n| "Key #{n}" } + sequence(:v) { |n| "Value #{n}" } + + # FIXME: needs user factory + user_id 1 + end +end diff --git a/test/factories/user_role.rb b/test/factories/user_role.rb new file mode 100644 index 000000000..0eea25cee --- /dev/null +++ b/test/factories/user_role.rb @@ -0,0 +1,6 @@ +FactoryGirl.define do + factory :user_role do + user + association :granter, :factory => :user + end +end diff --git a/test/factories/way_tags.rb b/test/factories/way_tags.rb new file mode 100644 index 000000000..3bc3192f5 --- /dev/null +++ b/test/factories/way_tags.rb @@ -0,0 +1,9 @@ +FactoryGirl.define do + factory :way_tag do + sequence(:k) { |n| "Key #{n}" } + sequence(:v) { |n| "Value #{n}" } + + # Fixme requires way factory + way_id 1 + end +end diff --git a/test/fixtures/acls.yml b/test/fixtures/acls.yml deleted file mode 100644 index 399e08808..000000000 --- a/test/fixtures/acls.yml +++ /dev/null @@ -1,13 +0,0 @@ -# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html - -one: - address: 1 - netmask: 1 - k: MyText - v: MyText - -two: - address: 1 - netmask: 1 - k: MyText - v: MyText diff --git a/test/fixtures/changeset_comments.yml b/test/fixtures/changeset_comments.yml deleted file mode 100644 index cd7076fdc..000000000 --- a/test/fixtures/changeset_comments.yml +++ /dev/null @@ -1,31 +0,0 @@ -normal_comment_1: - id: 1 - changeset_id: 3 - created_at: 2007-01-01 00:00:00 - author_id: 1 - body: 'A comment from a logged-in user' - visible: true - -normal_comment_2: - id: 2 - changeset_id: 3 - created_at: 2007-02-01 00:00:00 - author_id: 4 - body: 'A comment from another logged-in user' - visible: true - -normal_comment_3: - id: 4 - changeset_id: 3 - created_at: 2007-02-01 00:00:00 - author_id: 4 - body: 'A comment from another logged-in user' - visible: true - -hidden_comment: - id: 3 - changeset_id: 3 - created_at: 2007-02-01 00:00:00 - author_id: 4 - body: 'A non-visible comment' - visible: false \ No newline at end of file diff --git a/test/fixtures/changeset_tags.yml b/test/fixtures/changeset_tags.yml deleted file mode 100644 index ab5968b87..000000000 --- a/test/fixtures/changeset_tags.yml +++ /dev/null @@ -1,9 +0,0 @@ -changeset_1_tag_1: - changeset_id: 1 - k: created_by - v: test suite yml - -changeset_2_tag_1: - changeset_id: 2 - k: created_by - v: test suite yml 2 diff --git a/test/fixtures/changesets.yml b/test/fixtures/changesets.yml index 3cfec5bbb..2d5ce4e2a 100644 --- a/test/fixtures/changesets.yml +++ b/test/fixtures/changesets.yml @@ -21,6 +21,13 @@ public_user_first_change: closed_at: <%= Time.now.utc + 86400 %> num_changes: 0 +deleted_user_first_change: + id: 9 + user_id: 11 + created_at: "2007-01-01 00:00:00" + closed_at: "2007-01-02 00:00:00" + num_changes: 0 + normal_user_closed_change: id: 3 user_id: 1 diff --git a/test/fixtures/changesets_subscribers.yml b/test/fixtures/changesets_subscribers.yml deleted file mode 100644 index d8bd5be96..000000000 --- a/test/fixtures/changesets_subscribers.yml +++ /dev/null @@ -1,7 +0,0 @@ -t1: - changeset_id: 8 - subscriber_id: 2 - -t2: - changeset_id: 8 - subscriber_id: 1 diff --git a/test/fixtures/client_applications.yml b/test/fixtures/client_applications.yml deleted file mode 100644 index 13f9c086a..000000000 --- a/test/fixtures/client_applications.yml +++ /dev/null @@ -1,50 +0,0 @@ -# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html - -oauth_web_app: - name: Some OAuth Web App - created_at: "2009-04-21 00:00:00" - support_url: http://some.web.app.org/support - updated_at: "2009-04-21 00:00:00" - callback_url: http://some.web.app.org/callback - url: http://some.web.app.org/ - user_id: 2 - secret: Ur1s9LWWJJuYBiV9cDi3za3OV8TGCoRgUvVXJ5zp7pc - key: ewvENqsaTXFnZbMWmGDX2g - allow_read_prefs: true - allow_write_prefs: false - allow_write_diary: false - allow_write_api: true - allow_read_gpx: true - allow_write_gpx: false - -oauth_desktop_app: - name: Some OAuth Desktop App - created_at: "2009-04-21 00:00:00" - url: http://some.desktop.app.org/ - support_url: http://some.desktop.app.org/support - updated_at: "2009-04-21 00:00:00" - user_id: 2 - secret: V9DOm1H5qSdIG9IeCTiOkAcCx15bK8bkGxf7XEpF - key: rlEdPM6Tp8lpLwvSyNJQ4w - allow_read_prefs: true - allow_write_prefs: false - allow_write_diary: false - allow_write_api: true - allow_read_gpx: true - allow_write_gpx: false - -normal_user_app: - name: Some OAuth Desktop App - created_at: "2009-05-21 00:00:00" - url: http://some.desktop.app.org/ - support_url: http://some.desktop.app.org/support - updated_at: "2009-05-21 00:00:00" - user_id: 1 - secret: jgYx43yx1FAMQbG6T0qZhvvFsKEf6Pgd5XfHr5kFgv4 - key: N6KVhfeaT626fhBt9aCMeA - allow_read_prefs: true - allow_write_prefs: false - allow_write_diary: false - allow_write_api: true - allow_read_gpx: true - allow_write_gpx: false diff --git a/test/fixtures/countries.yml b/test/fixtures/countries.yml deleted file mode 100644 index fec13e296..000000000 --- a/test/fixtures/countries.yml +++ /dev/null @@ -1,15 +0,0 @@ -# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html - -gb: - code: gb - min_lat: 49.9061889648438 - max_lat: 60.8458099365234 - min_lon: -8.62355613708496 - max_lon: 1.75900018215179 - -de: - code: de - min_lat: 47.2757720947266 - max_lat: 55.0556411743164 - min_lon: 5.865638256073 - max_lon: 15.0398902893066 diff --git a/test/fixtures/current_node_tags.yml b/test/fixtures/current_node_tags.yml deleted file mode 100644 index 38b941e3c..000000000 --- a/test/fixtures/current_node_tags.yml +++ /dev/null @@ -1,59 +0,0 @@ -t1: - node_id: 1 - k: 'testvisible' - v: 'yes' - -t2: - node_id: 2 - k: 'testused' - v: 'yes' - -t3: - node_id: 3 - k: 'test' - v: 'yes' - -t4: - node_id: 4 - k: 'test' - v: 'yes' - -nv_t1: - node_id: 15 - k: 'testing' - v: 'added in node version 3' - -nv_t2: - node_id: 15 - k: 'testing two' - v: 'modified in node version 4' - -public_v_t1: - node_id: 16 - k: 'testvisible' - v: 'yes' - -nwn_name: - node_id: 18 - k: 'name' - v: 'Test Node' - -nwn_name_pt: - node_id: 18 - k: 'name:pt' - v: 'Nó teste' - -nwn_building: - node_id: 18 - k: 'building' - v: 'yes' - -nwn_tourism: - node_id: 18 - k: 'tourism' - v: 'museum' - -nwn_shop: - node_id: 18 - k: 'shop' - v: 'gift' diff --git a/test/fixtures/current_nodes.yml b/test/fixtures/current_nodes.yml index af6ea01d5..8389f67bb 100644 --- a/test/fixtures/current_nodes.yml +++ b/test/fixtures/current_nodes.yml @@ -180,3 +180,13 @@ node_with_name: version: 2 tile: <%= QuadTile.tile_for_point(1,1) %> timestamp: 2007-01-01 00:00:00 + +node_with_ref_without_name: + id: 19 + latitude: <%= 1*SCALE %> + longitude: <%= 1*SCALE %> + changeset_id: 2 + visible: true + version: 1 + tile: <%= QuadTile.tile_for_point(1,1) %> + timestamp: 2007-01-01 00:00:00 diff --git a/test/fixtures/current_relation_tags.yml b/test/fixtures/current_relation_tags.yml deleted file mode 100644 index 505a76130..000000000 --- a/test/fixtures/current_relation_tags.yml +++ /dev/null @@ -1,49 +0,0 @@ -t1: - relation_id: 1 - k: 'test' - v: 'yes' - -t2: - relation_id: 2 - k: 'test' - v: 'yes' - -t3: - relation_id: 3 - k: 'test' - v: 'yes' - -t3_2: - relation_id: 3 - k: 'name' - v: 'Test Relation' - -mt_1: - relation_id: 4 - k: 'tag1' - v: 'val1' - -mt_2: - relation_id: 4 - k: 'tag2' - v: 'val2' - -mt_3: - relation_id: 4 - k: 'tag3' - v: 'val3' - -mt_4: - relation_id: 4 - k: 'tag4' - v: 'val4' - -rv_t1: - relation_id: 8 - k: 'testing' - v: 'added in relation version 3' - -rv_t2: - relation_id: 8 - k: 'testing two' - v: 'modified in relation version 4' diff --git a/test/fixtures/current_way_tags.yml b/test/fixtures/current_way_tags.yml deleted file mode 100644 index 2566c5484..000000000 --- a/test/fixtures/current_way_tags.yml +++ /dev/null @@ -1,29 +0,0 @@ -t1: - way_id: 1 - k: 'test' - v: 'yes' - -t2: - way_id: 2 - k: 'test' - v: 'yes' - -t3: - way_id: 3 - k: 'test' - v: 'yes' - -t3_t2: - way_id: 3 - k: 'name' - v: 'Test Way' - -wv_t1: - way_id: 4 - k: 'testing' - v: 'added in way version 3' - -wv_t2: - way_id: 4 - k: 'testing two' - v: 'modified in way version 4' diff --git a/test/fixtures/diary_comments.yml b/test/fixtures/diary_comments.yml deleted file mode 100644 index 247fc3abd..000000000 --- a/test/fixtures/diary_comments.yml +++ /dev/null @@ -1,35 +0,0 @@ -comment_for_geo_post: - id: 1 - diary_entry_id: 2 - user_id: 2 - body: Some comment text - created_at: "2008-11-08 09:45:34" - updated_at: "2008-11-08 10:34:34" - visible: true - -comment_by_suspended_user: - id: 2 - diary_entry_id: 2 - user_id: 10 - body: Some comment text - created_at: "2008-11-08 09:45:34" - updated_at: "2008-11-08 10:34:34" - visible: true - -comment_by_deleted_user: - id: 3 - diary_entry_id: 2 - user_id: 11 - body: Some comment text - created_at: "2008-11-08 09:45:34" - updated_at: "2008-11-08 10:34:34" - visible: true - -hidden_comment: - id: 4 - diary_entry_id: 2 - user_id: 2 - body: Some comment text - created_at: "2008-11-08 09:45:34" - updated_at: "2008-11-08 10:34:34" - visible: false diff --git a/test/fixtures/diary_entries.yml b/test/fixtures/diary_entries.yml deleted file mode 100644 index 6c5c1927d..000000000 --- a/test/fixtures/diary_entries.yml +++ /dev/null @@ -1,71 +0,0 @@ -normal_user_entry_1: - id: 1 - user_id: 1 - title: Diary Entry 1 - body: This is the body of diary entry 1. - created_at: "2008-11-07 17:43:34" - updated_at: "2008-11-07 17:43:34" - latitude: - longitude: - language_code: en - visible: true - -normal_user_geo_entry: - id: 2 - user_id: 1 - title: Geo Entry 1 - body: This is the body of a geo diary entry in London. - created_at: "2008-11-07 17:47:34" - updated_at: "2008-11-07 17:47:34" - latitude: 51.50763 - longitude: -0.10781 - language_code: de - visible: true - -deleted_entry: - id: 3 - user_id: 1 - title: Deleted Entry 1 - body: This is the body of a deleted diary entry. - created_at: "2008-11-07 17:43:34" - updated_at: "2008-11-07 17:43:34" - latitude: - longitude: - language_code: en - visible: false - -entry_by_suspended_user: - id: 4 - user_id: 10 - title: Entry by suspended user - body: This is the body of a diary entry by a suspended user. - created_at: "2008-11-07 17:43:34" - updated_at: "2008-11-07 17:43:34" - latitude: - longitude: - language_code: en - visible: true - -entry_by_deleted_user: - id: 5 - user_id: 11 - title: Entry by deleted user - body: This is the body of a diary entry by a deleted user. - created_at: "2008-11-07 17:43:34" - updated_at: "2008-11-07 17:43:34" - latitude: - longitude: - language_code: en - visible: true - -public_user_entry_1: - id: 6 - user_id: 2 - title: Public User Diary Entry 1 - body: This is the body of diary entry 1. - created_at: "2008-11-07 17:43:34" - updated_at: "2008-11-07 17:43:34" - latitude: - longitude: - language_code: en - visible: true diff --git a/test/fixtures/friends.yml b/test/fixtures/friends.yml deleted file mode 100644 index 782f1e3d2..000000000 --- a/test/fixtures/friends.yml +++ /dev/null @@ -1,4 +0,0 @@ -normal_user_with_second_user: - id: 1 - user_id: 1 - friend_user_id: 2 diff --git a/test/fixtures/gps_points.yml b/test/fixtures/gps_points.yml deleted file mode 100644 index b3171ac45..000000000 --- a/test/fixtures/gps_points.yml +++ /dev/null @@ -1,35 +0,0 @@ -<% SCALE = 10000000 unless defined?(SCALE) %> - -first_trace_1: - altitude: 134 - trackid: 1 - latitude: <%= 1 * SCALE %> - longitude: <%= 1 * SCALE %> - gpx_id: 1 - timestamp: "2008-10-01 10:10:10" - tile: <%= QuadTile.tile_for_point(1, 1) %> - -trackable_trace_1: - trackid: 1 - latitude: <%= (51.510 * SCALE).to_i %> - longitude: <%= (-0.140 * SCALE).to_i %> - gpx_id: 3 - timestamp: "2009-07-30 17:46:00" - tile: <%= QuadTile.tile_for_point(51.510, -0.140) %> - -trackable_trace_2: - trackid: 2 - latitude: <%= (51.511 * SCALE).to_i %> - longitude: <%= (-0.141 * SCALE).to_i %> - gpx_id: 3 - timestamp: "2009-07-30 17:47:00" - tile: <%= QuadTile.tile_for_point(51.511, -0.141) %> - -identifiable_trace_1: - trackid: 1 - latitude: <%= (51.512 * SCALE).to_i %> - longitude: <%= (0.142 * SCALE).to_i %> - gpx_id: 4 - timestamp: "2009-07-30 17:46:00" - tile: <%= QuadTile.tile_for_point(51.512, 0.142) %> - diff --git a/test/fixtures/gpx_file_tags.yml b/test/fixtures/gpx_file_tags.yml deleted file mode 100644 index 1dac0f26d..000000000 --- a/test/fixtures/gpx_file_tags.yml +++ /dev/null @@ -1,19 +0,0 @@ -first_trace_1: - gpx_id: 1 - tag: London - id: 1 - -second_trace_1: - gpx_id: 2 - tag: London - id: 2 - -second_trace_2: - gpx_id: 2 - tag: Birmingham - id: 3 - -third_trace_1: - gpx_id: 4 - tag: Birmingham - id: 4 diff --git a/test/fixtures/gpx_files.yml b/test/fixtures/gpx_files.yml deleted file mode 100644 index 4af266cf2..000000000 --- a/test/fixtures/gpx_files.yml +++ /dev/null @@ -1,129 +0,0 @@ -public_trace_file: - id: 1 - user_id: 1 - visible: true - name: Fist Trace.gpx - size: - latitude: 1 - longitude: 1 - timestamp: "2008-10-29 10:10:10" - visibility: "public" - description: This is a trace - inserted: true - -anon_trace_file: - id: 2 - user_id: 2 - visible: true - name: Private Trace.gpx - size: 123 - latitude: 51.3 - longitude: -0.56 - timestamp: "2009-05-06 13:34:34" - visibility: "private" - description: This is an anonymous trace - inserted: true - -trackable_trace_file: - id: 3 - user_id: 2 - visible: true - name: Trackable Trace.gpx - size: 123 - latitude: 51.51 - longitude: -0.14 - timestamp: "2009-07-30 17:48:34" - visibility: "trackable" - description: This trace shows trksegs and timestamps, but no user details. - inserted: true - -identifiable_trace_file: - id: 4 - user_id: 1 - visible: true - name: Identifiable Trace.gpx - size: 123 - latitude: 51.512 - longitude: 0.142 - timestamp: "2009-07-30 17:48:34" - visibility: "identifiable" - description: This trace shows trksegs, timestamps and user details. - inserted: true - -deleted_trace_file: - id: 5 - user_id: 2 - visible: false - name: Deleted Trace.gpx - size: 123 - latitude: 51.512 - longitude: 0.142 - timestamp: "2009-07-30 17:48:34" - visibility: "public" - description: This is a trace that has been deleted. - inserted: true - -zipped_trace_file: - id: 6 - user_id: 4 - visible: true - name: Zipped Trace.gpx - size: - latitude: 1 - longitude: 1 - timestamp: "2008-10-29 10:10:10" - visibility: "private" - description: This is a zipped trace - inserted: true - -tar_trace_file: - id: 7 - user_id: 4 - visible: true - name: Tarred Trace.gpx - size: - latitude: 1 - longitude: 1 - timestamp: "2008-10-29 10:10:10" - visibility: "private" - description: This is a tarred trace - inserted: true - -tar_gzip_trace_file: - id: 8 - user_id: 4 - visible: true - name: Gzipped Tarred Trace.gpx - size: - latitude: 1 - longitude: 1 - timestamp: "2008-10-29 10:10:10" - visibility: "private" - description: This is a gzipped tarred trace - inserted: true - -tar_bzip_trace_file: - id: 9 - user_id: 4 - visible: true - name: Bzipped Tarred Trace.gpx - size: - latitude: 1 - longitude: 1 - timestamp: "2008-10-29 10:10:10" - visibility: "private" - description: This is a bzipped tarred trace - inserted: true - -pending_trace_file: - id: 10 - user_id: 2 - visible: true - name: Pending Trace.gpx - size: 123 - latitude: 51.3 - longitude: -0.56 - timestamp: "2009-05-06 13:34:34" - visibility: "public" - description: This is a pending trace - inserted: false diff --git a/test/fixtures/languages.yml b/test/fixtures/languages.yml deleted file mode 100644 index 7f4a18af6..000000000 --- a/test/fixtures/languages.yml +++ /dev/null @@ -1,16 +0,0 @@ -# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html - -en: - code: en - english_name: English - native_name: English - -de: - code: de - english_name: German - native_name: Deutsch - -sl: - code: sl - english_name: Slovenian - native_name: slovenščina diff --git a/test/fixtures/messages.yml b/test/fixtures/messages.yml deleted file mode 100644 index 0a54cce87..000000000 --- a/test/fixtures/messages.yml +++ /dev/null @@ -1,21 +0,0 @@ -unread_message: - id: 1 - from_user_id: 1 - title: test message 1 - body: some body text - sent_on: "2008-05-01 12:34:56" - message_read: false - to_user_id: 2 - from_user_visible: true - to_user_visible: true - -read_message: - id: 2 - from_user_id: 2 - title: test message 2 - body: some body test - sent_on: "2008-05-02 12:45:23" - message_read: true - to_user_id: 1 - from_user_visible: true - to_user_visible: true diff --git a/test/fixtures/node_tags.yml b/test/fixtures/node_tags.yml deleted file mode 100644 index d9001b720..000000000 --- a/test/fixtures/node_tags.yml +++ /dev/null @@ -1,113 +0,0 @@ -t1: - node_id: 1 - k: 'testvisible' - v: 'yes' - version: 1 - -t2: - node_id: 3 - k: 'test' - v: 'yes' - version: 1 - -t3: - node_id: 4 - k: 'test' - v: 'yes' - version: 1 - -nv3_t1: - node_id: 15 - k: 'testing' - v: 'added in node version 3' - version: 3 - -nv3_t2: - node_id: 15 - k: 'testing two' - v: 'added in node version 3' - version: 3 - -nv3_t3: - node_id: 15 - k: 'testing three' - v: 'added in node version 3' - version: 3 - -nv4_t1: - node_id: 15 - k: 'testing' - v: 'added in node version 3' - version: 4 - -nv4_t2: - node_id: 15 - k: 'testing two' - v: 'modified in node version 4' - version: 4 - -public_v_t1: - node_id: 16 - k: 'testvisible' - v: 'yes' - version: 1 - -nwnv1_name: - node_id: 18 - k: 'name' - v: 'Test Node' - version: 1 - -nwnv1_name_pt: - node_id: 18 - k: 'name:pt' - v: 'Nó teste' - version: 1 - -nwnv1_building: - node_id: 18 - k: 'building' - v: 'yes' - version: 1 - -nwnv1_tourism: - node_id: 18 - k: 'tourism' - v: 'museum' - version: 1 - -nwnv1_shop: - node_id: 18 - k: 'shop' - v: 'gift' - version: 1 - -nwnv2_name: - node_id: 18 - k: 'name' - v: 'Test Node' - version: 2 - -nwnv2_name_pt: - node_id: 18 - k: 'name:pt' - v: 'Nó teste' - version: 2 - -nwnv2_building: - node_id: 18 - k: 'building' - v: 'yes' - version: 2 - -nwnv2_tourism: - node_id: 18 - k: 'tourism' - v: 'museum' - version: 2 - -nwnv2_shop: - node_id: 18 - k: 'shop' - v: 'gift' - version: 2 diff --git a/test/fixtures/note_comments.yml b/test/fixtures/note_comments.yml deleted file mode 100644 index bf9f9a4bf..000000000 --- a/test/fixtures/note_comments.yml +++ /dev/null @@ -1,115 +0,0 @@ -t1: - id: 1 - note_id: 1 - visible: true - event: opened - created_at: 2007-01-01 00:00:00 - author_ip: '192.168.1.1' - body: 'This is the initial description of the note 1' - -t2: - id: 2 - note_id: 2 - visible: true - event: opened - created_at: 2007-01-01 00:00:00 - author_ip: '192.168.1.1' - body: 'This is the initial description of the note 2' - -t3: - id: 3 - note_id: 2 - visible: true - event: opened - created_at: 2007-02-01 00:00:00 - author_ip: '192.168.1.1' - body: 'This is an additional comment for note 2' - -t4: - id: 4 - note_id: 3 - visible: true - event: opened - created_at: 2007-01-01 00:00:00 - author_ip: '192.168.1.1' - body: 'This is the initial comment for note 3' - -t5: - id: 5 - note_id: 4 - visible: true - event: opened - created_at: 2007-01-01 00:00:00 - author_ip: '192.168.1.1' - body: 'Spam for note 4' - -t6: - id: 6 - note_id: 5 - visible: true - event: opened - created_at: 2007-01-01 00:00:00 - author_ip: '192.168.1.1' - body: 'Valid comment for note 5' - -t7: - id: 7 - note_id: 5 - visible: false - event: commented - created_at: 2007-02-01 00:00:00 - author_ip: '192.168.1.1' - body: 'Spam for note 5' - -t8: - id: 8 - note_id: 5 - visible: true - event: commented - created_at: 2007-02-01 00:00:00 - author_ip: '192.168.1.1' - body: 'Another valid comment for note 5' - -t9: - id: 9 - note_id: 6 - visible: true - event: opened - created_at: 2007-01-01 00:00:00 - author_id: 1 - body: 'This is a note with from a logged-in user' - -t10: - id: 10 - note_id: 6 - visible: true - event: commented - created_at: 2007-02-01 00:00:00 - author_id: 4 - body: 'A comment from another logged-in user' - -t11: - id: 11 - note_id: 7 - visible: true - event: opened - created_at: 2007-01-01 00:00:00 - author_ip: '192.168.1.1' - body: 'Initial note description' - -t12: - id: 12 - note_id: 7 - visible: true - event: commented - created_at: 2007-02-01 00:00:00 - author_ip: '192.168.1.1' - body: 'A comment description' - -t13: - id: 13 - note_id: 7 - visible: true - event: closed - created_at: 2007-03-01 00:00:00 - author_id: 4 diff --git a/test/fixtures/notes.yml b/test/fixtures/notes.yml deleted file mode 100644 index ffecba869..000000000 --- a/test/fixtures/notes.yml +++ /dev/null @@ -1,67 +0,0 @@ -# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html -<% SCALE = 10000000 unless defined?(SCALE) %> - -open_note: - id: 1 - latitude: <%= 1*SCALE %> - longitude: <%= 1*SCALE %> - status: open - tile: <%= QuadTile.tile_for_point(1,1) %> - created_at: 2007-01-01 00:00:00 - updated_at: 2007-01-01 00:00:00 - -open_note_with_comment: - id: 2 - latitude: <%= 1.1*SCALE %> - longitude: <%= 1.1*SCALE %> - status: open - tile: <%= QuadTile.tile_for_point(1.1,1.1) %> - created_at: 2007-01-01 00:00:00 - updated_at: 2007-02-01 00:00:00 - -closed_note_with_comment: - id: 3 - latitude: <%= 1.2*SCALE %> - longitude: <%= 1.2*SCALE %> - status: closed - tile: <%= QuadTile.tile_for_point(1.2,1.2) %> - created_at: 2007-01-01 00:00:00 - updated_at: 2007-03-01 00:00:00 - closed_at: 2007-03-01 00:00:00 - -hidden_note_with_comment: - id: 4 - latitude: <%= 1.3*SCALE %> - longitude: <%= 1.3*SCALE %> - status: hidden - tile: <%= QuadTile.tile_for_point(1.3,1.3) %> - created_at: 2007-01-01 00:00:00 - updated_at: 2007-03-01 00:00:00 - -note_with_hidden_comment: - id: 5 - latitude: <%= 1.4*SCALE %> - longitude: <%= 1.4*SCALE %> - status: open - tile: <%= QuadTile.tile_for_point(1.4,1.4) %> - created_at: 2007-01-01 00:00:00 - updated_at: 2007-03-01 00:00:00 - -note_with_comments_by_users: - id: 6 - latitude: <%= 1.5*SCALE %> - longitude: <%= 1.5*SCALE %> - status: open - tile: <%= QuadTile.tile_for_point(1.5,1.5) %> - created_at: 2007-01-01 00:00:00 - updated_at: 2007-03-01 00:00:00 - -note_closed_by_user: - id: 7 - latitude: <%= 1.6*SCALE %> - longitude: <%= 1.6*SCALE %> - status: closed - tile: <%= QuadTile.tile_for_point(1.6,1.6) %> - created_at: 2007-01-01 00:00:00 - updated_at: 2007-03-01 00:00:00 - closed_at: 2007-03-01 00:00:00 diff --git a/test/fixtures/relation_tags.yml b/test/fixtures/relation_tags.yml deleted file mode 100644 index daf3c6d0a..000000000 --- a/test/fixtures/relation_tags.yml +++ /dev/null @@ -1,77 +0,0 @@ -t1: - relation_id: 1 - k: 'test' - v: 'yes' - version: 1 - -t2: - relation_id: 2 - k: 'test' - v: 'yes' - version: 1 - -t3: - relation_id: 3 - k: 'test' - v: 'yes' - version: 1 - -t3_2: - relation_id: 3 - k: 'name' - v: 'Test Relation' - version: 1 - -mt_1: - relation_id: 4 - k: 'tag1' - v: 'val1' - version: 1 - -mt_2: - relation_id: 4 - k: 'tag2' - v: 'val2' - version: 1 - -mt_3: - relation_id: 4 - k: 'tag3' - v: 'val3' - version: 1 - -mt_4: - relation_id: 4 - k: 'tag4' - v: 'val4' - version: 1 - -rv3_t1: - relation_id: 8 - k: 'testing' - v: 'added in relation version 3' - version: 3 - -rv3_t2: - relation_id: 8 - k: 'testing two' - v: 'added in relation version 3' - version: 3 - -rv3_t3: - relation_id: 8 - k: 'testing three' - v: 'added in relation version 3' - version: 3 - -rv4_t1: - relation_id: 8 - k: 'testing' - v: 'added in relation version 3' - version: 4 - -rv4_t2: - relation_id: 8 - k: 'testing two' - v: 'modified in relation version 4' - version: 4 diff --git a/test/fixtures/user_blocks.yml b/test/fixtures/user_blocks.yml deleted file mode 100644 index 0566d3085..000000000 --- a/test/fixtures/user_blocks.yml +++ /dev/null @@ -1,29 +0,0 @@ -active_block: - id: 1 - user_id: 13 - creator_id: 5 - reason: "Active block" - reason_format: "markdown" - ends_at: "2032-05-01 11:22:33" - needs_view: true - revoker_id: - -expired_block: - id: 2 - user_id: 14 - creator_id: 15 - reason: "Expired block" - reason_format: "markdown" - ends_at: "2012-05-01 11:22:33" - needs_view: false - revoker_id: - -revoked_block: - id: 3 - user_id: 13 - creator_id: 15 - reason: "Revoked block" - reason_format: "markdown" - ends_at: "2012-05-01 11:22:33" - needs_view: false - revoker_id: 1 diff --git a/test/fixtures/user_preferences.yml b/test/fixtures/user_preferences.yml deleted file mode 100644 index 03065a9eb..000000000 --- a/test/fixtures/user_preferences.yml +++ /dev/null @@ -1,21 +0,0 @@ -# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html - -a: - user_id: 1 - k: "key" - v: "value" - -two: - user_id: 1 - k: "some_key" - v: "some_value" - -u2_trace: - user_id: 2 - k: "gps.trace.visibility" - v: "identifiable" - -u3_trace: - user_id: 4 - k: "gps.trace.public" - v: "default" diff --git a/test/fixtures/users.yml b/test/fixtures/users.yml index cb861ab93..18b33f6bf 100644 --- a/test/fixtures/users.yml +++ b/test/fixtures/users.yml @@ -136,7 +136,7 @@ suspended_user: status: suspended pass_crypt: <%= Digest::MD5.hexdigest('test') %> creation_time: "2007-01-01 00:00:00" - display_name: suspended + display_name: suspended user data_public: true description: test terms_agreed: "2010-01-01 11:22:33" @@ -290,3 +290,60 @@ windowslive_user: terms_agreed: "2010-01-01 11:22:33" terms_seen: true languages: en + +github_user: + id: 22 + email: github-user@example.com + status: active + pass_crypt: <%= Digest::MD5.hexdigest('test') %> + creation_time: "2008-05-01 01:23:45" + display_name: githubuser + data_public: true + auth_provider: github + auth_uid: 123456789 + terms_agreed: "2010-01-01 11:22:33" + terms_seen: true + languages: en + +first_gravatar_user: + id: 23 + email: g1@OpenStreetMap.org + new_email: new_g1@OpenStreetMap.org + status: active + pass_crypt: <%= Digest::MD5.hexdigest('test') %> + creation_time: "2008-05-01 01:23:45" + display_name: gravatar1 + data_public: true + description: some test description + terms_agreed: "2010-01-01 11:22:33" + terms_seen: true + creation_ip: "1.2.3.4" + +second_gravatar_user: + id: 24 + email: g2@OpenStreetMap.org + new_email: new_g2@OpenStreetMap.org + image_use_gravatar: true + status: active + pass_crypt: <%= Digest::MD5.hexdigest('test') %> + creation_time: "2008-05-01 01:23:45" + display_name: gravatar2 + data_public: true + description: some test description + terms_agreed: "2010-01-01 11:22:33" + terms_seen: true + creation_ip: "1.2.3.4" + +wikipedia_user: + id: 25 + email: wikipedia-user@example.com + status: active + pass_crypt: <%= Digest::MD5.hexdigest('test') %> + creation_time: "2008-05-01 01:23:45" + display_name: wikipediauser + data_public: true + auth_provider: wikipedia + auth_uid: 123456789 + terms_agreed: "2010-01-01 11:22:33" + terms_seen: true + languages: en diff --git a/test/fixtures/way_tags.yml b/test/fixtures/way_tags.yml deleted file mode 100644 index 3361f74cb..000000000 --- a/test/fixtures/way_tags.yml +++ /dev/null @@ -1,77 +0,0 @@ -t1: - way_id: 1 - k: 'test' - v: 'yes' - version: 1 - -t2: - way_id: 2 - k: 'test' - v: 'yes' - version: 1 - -t3: - way_id: 3 - k: 'test' - v: 'yes' - version: 1 - -t3_t2: - way_id: 3 - k: 'name' - v: 'Test Way' - version: 1 - -wv3_t1: - way_id: 4 - k: 'testing' - v: 'added in way version 3' - version: 3 - -wv3_t2: - way_id: 4 - k: 'testing two' - v: 'added in way version 3' - version: 3 - -wv3_t3: - way_id: 4 - k: 'testing three' - v: 'added in way version 3' - version: 3 - -wv4_t1: - way_id: 4 - k: 'testing' - v: 'added in way version 3' - version: 4 - -wv4_t2: - way_id: 4 - k: 'testing two' - v: 'modified in way version 4' - version: 4 - -t6_v1: - way_id: 6 - k: 'test' - v: 'yes' - version: 1 - -t6_v2: - way_id: 6 - k: 'test' - v: 'yes' - version: 2 - -t6_v3: - way_id: 6 - k: 'test' - v: 'yes' - version: 3 - -t6_v4: - way_id: 6 - k: 'test' - v: 'yes' - version: 4 diff --git a/test/traces/1.gif b/test/gpx/fixtures/a.gif similarity index 100% rename from test/traces/1.gif rename to test/gpx/fixtures/a.gif diff --git a/test/traces/1.gpx b/test/gpx/fixtures/a.gpx similarity index 100% rename from test/traces/1.gpx rename to test/gpx/fixtures/a.gpx diff --git a/test/traces/1_icon.gif b/test/gpx/fixtures/a_icon.gif similarity index 100% rename from test/traces/1_icon.gif rename to test/gpx/fixtures/a_icon.gif diff --git a/test/traces/2.gif b/test/gpx/fixtures/b.gif similarity index 100% rename from test/traces/2.gif rename to test/gpx/fixtures/b.gif diff --git a/test/traces/10.gpx b/test/gpx/fixtures/b.gpx similarity index 100% rename from test/traces/10.gpx rename to test/gpx/fixtures/b.gpx diff --git a/test/traces/2_icon.gif b/test/gpx/fixtures/b_icon.gif similarity index 100% rename from test/traces/2_icon.gif rename to test/gpx/fixtures/b_icon.gif diff --git a/test/traces/3.gif b/test/gpx/fixtures/c.gif similarity index 100% rename from test/traces/3.gif rename to test/gpx/fixtures/c.gif diff --git a/test/traces/3.gpx b/test/gpx/fixtures/c.gpx similarity index 100% rename from test/traces/3.gpx rename to test/gpx/fixtures/c.gpx diff --git a/test/traces/3_icon.gif b/test/gpx/fixtures/c_icon.gif similarity index 100% rename from test/traces/3_icon.gif rename to test/gpx/fixtures/c_icon.gif diff --git a/test/traces/4.gif b/test/gpx/fixtures/d.gif similarity index 100% rename from test/traces/4.gif rename to test/gpx/fixtures/d.gif diff --git a/test/traces/4.gpx b/test/gpx/fixtures/d.gpx similarity index 100% rename from test/traces/4.gpx rename to test/gpx/fixtures/d.gpx diff --git a/test/traces/4_icon.gif b/test/gpx/fixtures/d_icon.gif similarity index 100% rename from test/traces/4_icon.gif rename to test/gpx/fixtures/d_icon.gif diff --git a/test/traces/6.gif b/test/gpx/fixtures/f.gif similarity index 100% rename from test/traces/6.gif rename to test/gpx/fixtures/f.gif diff --git a/test/traces/6.gpx b/test/gpx/fixtures/f.gpx similarity index 100% rename from test/traces/6.gpx rename to test/gpx/fixtures/f.gpx diff --git a/test/traces/6_icon.gif b/test/gpx/fixtures/f_icon.gif similarity index 100% rename from test/traces/6_icon.gif rename to test/gpx/fixtures/f_icon.gif diff --git a/test/traces/7.gif b/test/gpx/fixtures/g.gif similarity index 100% rename from test/traces/7.gif rename to test/gpx/fixtures/g.gif diff --git a/test/traces/7.gpx b/test/gpx/fixtures/g.gpx similarity index 100% rename from test/traces/7.gpx rename to test/gpx/fixtures/g.gpx diff --git a/test/traces/7_icon.gif b/test/gpx/fixtures/g_icon.gif similarity index 100% rename from test/traces/7_icon.gif rename to test/gpx/fixtures/g_icon.gif diff --git a/test/traces/8.gif b/test/gpx/fixtures/h.gif similarity index 100% rename from test/traces/8.gif rename to test/gpx/fixtures/h.gif diff --git a/test/traces/8.gpx b/test/gpx/fixtures/h.gpx similarity index 100% rename from test/traces/8.gpx rename to test/gpx/fixtures/h.gpx diff --git a/test/traces/8_icon.gif b/test/gpx/fixtures/h_icon.gif similarity index 100% rename from test/traces/8_icon.gif rename to test/gpx/fixtures/h_icon.gif diff --git a/test/traces/9.gif b/test/gpx/fixtures/i.gif similarity index 100% rename from test/traces/9.gif rename to test/gpx/fixtures/i.gif diff --git a/test/traces/9.gpx b/test/gpx/fixtures/i.gpx similarity index 100% rename from test/traces/9.gpx rename to test/gpx/fixtures/i.gpx diff --git a/test/traces/9_icon.gif b/test/gpx/fixtures/i_icon.gif similarity index 100% rename from test/traces/9_icon.gif rename to test/gpx/fixtures/i_icon.gif diff --git a/test/traces/2.gpx b/test/gpx/fixtures/j.gpx similarity index 100% rename from test/traces/2.gpx rename to test/gpx/fixtures/j.gpx diff --git a/test/fixtures/user_tokens.yml b/test/gpx/images/.gitkeep similarity index 100% rename from test/fixtures/user_tokens.yml rename to test/gpx/images/.gitkeep diff --git a/test/gpx/traces/.gitkeep b/test/gpx/traces/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/test/helpers/application_helper_test.rb b/test/helpers/application_helper_test.rb index 97b35467b..a25bae99d 100644 --- a/test/helpers/application_helper_test.rb +++ b/test/helpers/application_helper_test.rb @@ -183,9 +183,7 @@ class ApplicationHelperTest < ActionView::TestCase assert_match %r{^4 months$}, date end - def test_body_class - end + def test_body_class; end - def test_current_page_class - end + def test_current_page_class; end end diff --git a/test/helpers/browse_helper_test.rb b/test/helpers/browse_helper_test.rb index 7878d10e0..32cf96c6b 100644 --- a/test/helpers/browse_helper_test.rb +++ b/test/helpers/browse_helper_test.rb @@ -17,12 +17,19 @@ class BrowseHelperTest < ActionView::TestCase end def test_printable_name + add_tags_selection(current_nodes(:node_with_name)) + create(:node_tag, :node => current_nodes(:node_with_ref_without_name), :k => "ref", :v => "3.1415926") + add_old_tags_selection(nodes(:node_with_name_current_version)) + add_old_tags_selection(nodes(:node_with_name_redacted_version)) + + # current_nodes(:redacted_node) is deleted, so has no tags. assert_dom_equal "17", printable_name(current_nodes(:redacted_node)) assert_dom_equal "Test Node (18)", printable_name(current_nodes(:node_with_name)) assert_dom_equal "Test Node (18)", printable_name(nodes(:node_with_name_current_version)) assert_dom_equal "18", printable_name(nodes(:node_with_name_redacted_version)) assert_dom_equal "Test Node (18, v2)", printable_name(nodes(:node_with_name_current_version), true) assert_dom_equal "18, v1", printable_name(nodes(:node_with_name_redacted_version), true) + assert_dom_equal "3.1415926 (19)", printable_name(current_nodes(:node_with_ref_without_name)) I18n.locale = "pt" @@ -32,6 +39,7 @@ class BrowseHelperTest < ActionView::TestCase assert_dom_equal "18", printable_name(nodes(:node_with_name_redacted_version)) assert_dom_equal "Nó teste (18, v2)", printable_name(nodes(:node_with_name_current_version), true) assert_dom_equal "18, v1", printable_name(nodes(:node_with_name_redacted_version), true) + assert_dom_equal "3.1415926 (19)", printable_name(current_nodes(:node_with_ref_without_name)) I18n.locale = "pt-BR" @@ -41,6 +49,7 @@ class BrowseHelperTest < ActionView::TestCase assert_dom_equal "18", printable_name(nodes(:node_with_name_redacted_version)) assert_dom_equal "Nó teste (18, v2)", printable_name(nodes(:node_with_name_current_version), true) assert_dom_equal "18, v1", printable_name(nodes(:node_with_name_redacted_version), true) + assert_dom_equal "3.1415926 (19)", printable_name(current_nodes(:node_with_ref_without_name)) I18n.locale = "de" @@ -50,22 +59,33 @@ class BrowseHelperTest < ActionView::TestCase assert_dom_equal "18", printable_name(nodes(:node_with_name_redacted_version)) assert_dom_equal "Test Node (18, v2)", printable_name(nodes(:node_with_name_current_version), true) assert_dom_equal "18, v1", printable_name(nodes(:node_with_name_redacted_version), true) + assert_dom_equal "3.1415926 (19)", printable_name(current_nodes(:node_with_ref_without_name)) end def test_link_class + add_tags_selection(current_nodes(:node_with_name)) + assert_equal "node", link_class("node", current_nodes(:visible_node)) assert_equal "node deleted", link_class("node", current_nodes(:invisible_node)) assert_equal "node deleted", link_class("node", current_nodes(:redacted_node)) assert_equal "node building yes shop gift tourism museum", link_class("node", current_nodes(:node_with_name)) + + add_old_tags_selection(nodes(:node_with_name_current_version)) + add_old_tags_selection(nodes(:node_with_name_redacted_version)) assert_equal "node building yes shop gift tourism museum", link_class("node", nodes(:node_with_name_current_version)) assert_equal "node deleted", link_class("node", nodes(:node_with_name_redacted_version)) end def test_link_title + add_tags_selection(current_nodes(:node_with_name)) + assert_equal "", link_title(current_nodes(:visible_node)) assert_equal "", link_title(current_nodes(:invisible_node)) assert_equal "", link_title(current_nodes(:redacted_node)) assert_equal "building=yes, shop=gift, and tourism=museum", link_title(current_nodes(:node_with_name)) + + add_old_tags_selection(nodes(:node_with_name_current_version)) + add_old_tags_selection(nodes(:node_with_name_redacted_version)) assert_equal "building=yes, shop=gift, and tourism=museum", link_title(nodes(:node_with_name_current_version)) assert_equal "", link_title(nodes(:node_with_name_redacted_version)) end @@ -96,15 +116,23 @@ class BrowseHelperTest < ActionView::TestCase html = format_value("wikidata", "Q42") assert_dom_equal "Q42", html + + html = format_value("operator:wikidata", "Q12;Q98") + assert_dom_equal "Q12;Q98", html end def test_icon_tags + add_tags_selection(current_nodes(:node_with_name)) + tags = icon_tags(current_nodes(:node_with_name)) assert_equal 3, tags.count assert tags.include?(%w(building yes)) assert tags.include?(%w(tourism museum)) assert tags.include?(%w(shop gift)) + add_old_tags_selection(nodes(:node_with_name_current_version)) + add_old_tags_selection(nodes(:node_with_name_redacted_version)) + tags = icon_tags(nodes(:node_with_name_current_version)) assert_equal 3, tags.count assert tags.include?(%w(building yes)) @@ -142,31 +170,77 @@ class BrowseHelperTest < ActionView::TestCase assert_equal "http://wiki.openstreetmap.org/wiki/Tag:highway=primary?uselang=tr", link end - def test_wikidata_link - link = wikidata_link("foo", "Test") - assert_nil link + def test_wikidata_links + ### Non-prefixed wikidata-tag (only one value allowed) - link = wikidata_link("wikidata", "http://www.wikidata.org/wiki/Q1") - assert_nil link + # Non-wikidata tag + links = wikidata_links("foo", "Test") + assert_nil links - link = wikidata_link("wikidata", "en:Q1") - assert_nil link + # No URLs allowed + links = wikidata_links("wikidata", "http://www.wikidata.org/wiki/Q1") + assert_nil links - link = wikidata_link("wikidata", "1") - assert_nil link + # No language-prefixes (as wikidata is multilanguage) + links = wikidata_links("wikidata", "en:Q1") + assert_nil links - link = wikidata_link("wikidata", "Q0123") - assert_nil link + # Needs a leading Q + links = wikidata_links("wikidata", "1") + assert_nil links + + # No leading zeros allowed + links = wikidata_links("wikidata", "Q0123") + assert_nil links - link = wikidata_link("wikidata", "Q42") - assert_equal "//www.wikidata.org/wiki/Q42?uselang=en", link[:url] - assert_equal "Q42", link[:title] + # A valid value + links = wikidata_links("wikidata", "Q42") + assert_equal 1, links.length + assert_equal "//www.wikidata.org/wiki/Q42?uselang=en", links[0][:url] + assert_equal "Q42", links[0][:title] + # the language of the wikidata-page should match the current locale I18n.locale = "zh-CN" + links = wikidata_links("wikidata", "Q1234") + assert_equal 1, links.length + assert_equal "//www.wikidata.org/wiki/Q1234?uselang=zh-CN", links[0][:url] + assert_equal "Q1234", links[0][:title] + I18n.locale = "en" + + ### Prefixed wikidata-tags + + # Not anything is accepted as prefix (only limited set) + links = wikidata_links("anything:wikidata", "Q13") + assert_nil links + + # This for example is an allowed key + links = wikidata_links("operator:wikidata", "Q24") + assert_equal "//www.wikidata.org/wiki/Q24?uselang=en", links[0][:url] + assert_equal "Q24", links[0][:title] + + # Another allowed key, this time with multiple values and I18n + I18n.locale = "dsb" + links = wikidata_links("brand:wikidata", "Q936;Q2013;Q1568346") + assert_equal 3, links.length + assert_equal "//www.wikidata.org/wiki/Q936?uselang=dsb", links[0][:url] + assert_equal "Q936", links[0][:title] + assert_equal "//www.wikidata.org/wiki/Q2013?uselang=dsb", links[1][:url] + assert_equal "Q2013", links[1][:title] + assert_equal "//www.wikidata.org/wiki/Q1568346?uselang=dsb", links[2][:url] + assert_equal "Q1568346", links[2][:title] + I18n.locale = "en" - link = wikidata_link("wikidata", "Q1234") - assert_equal "//www.wikidata.org/wiki/Q1234?uselang=zh-CN", link[:url] - assert_equal "Q1234", link[:title] + # and now with whitespaces... + links = wikidata_links("subject:wikidata", "Q6542248 ;\tQ180\n ;\rQ364\t\n\r ;\nQ4006") + assert_equal 4, links.length + assert_equal "//www.wikidata.org/wiki/Q6542248?uselang=en", links[0][:url] + assert_equal "Q6542248 ", links[0][:title] + assert_equal "//www.wikidata.org/wiki/Q180?uselang=en", links[1][:url] + assert_equal "\tQ180\n ", links[1][:title] + assert_equal "//www.wikidata.org/wiki/Q364?uselang=en", links[2][:url] + assert_equal "\rQ364\t\n\r ", links[2][:title] + assert_equal "//www.wikidata.org/wiki/Q4006?uselang=en", links[3][:url] + assert_equal "\nQ4006", links[3][:title] end def test_wikipedia_link @@ -253,4 +327,24 @@ class BrowseHelperTest < ActionView::TestCase link = telephone_link("phone", "+1 (234) 567-890") assert_equal "tel:+1(234)567-890", link end + + def add_old_tags_selection(old_node) + { "building" => "yes", + "shop" => "gift", + "tourism" => "museum", + "name" => "Test Node", + "name:pt" => "Nó teste" }.each do |key, value| + create(:old_node_tag, :old_node => old_node, :k => key, :v => value) + end + end + + def add_tags_selection(node) + { "building" => "yes", + "shop" => "gift", + "tourism" => "museum", + "name" => "Test Node", + "name:pt" => "Nó teste" }.each do |key, value| + create(:node_tag, :node => node, :k => key, :v => value) + end + end end diff --git a/test/helpers/changeset_helper_test.rb b/test/helpers/changeset_helper_test.rb index bf3de4525..8342f99d2 100644 --- a/test/helpers/changeset_helper_test.rb +++ b/test/helpers/changeset_helper_test.rb @@ -6,6 +6,7 @@ class ChangesetHelperTest < ActionView::TestCase def test_changeset_user_link assert_equal "test2", changeset_user_link(changesets(:public_user_first_change)) assert_equal "anonymous", changeset_user_link(changesets(:normal_user_first_change)) + assert_equal "deleted", changeset_user_link(changesets(:deleted_user_first_change)) end def test_changeset_details diff --git a/test/helpers/note_helper_test.rb b/test/helpers/note_helper_test.rb index eb7b99938..8495e21a9 100644 --- a/test/helpers/note_helper_test.rb +++ b/test/helpers/note_helper_test.rb @@ -15,6 +15,7 @@ class NoteHelperTest < ActionView::TestCase def test_note_author assert_equal "", note_author(nil) + assert_equal "deleted", note_author(users(:deleted_user)) assert_equal "test2", note_author(users(:public_user)) assert_equal "test2", note_author(users(:public_user), :only_path => false) end diff --git a/test/helpers/title_helper_test.rb b/test/helpers/title_helper_test.rb index d07a5bd07..523313eaf 100644 --- a/test/helpers/title_helper_test.rb +++ b/test/helpers/title_helper_test.rb @@ -3,6 +3,10 @@ require "test_helper" class TitleHelperTest < ActionView::TestCase def test_set_title + set_title + assert_equal "OpenStreetMap", response.header["X-Page-Title"] + assert_nil @title + set_title(nil) assert_equal "OpenStreetMap", response.header["X-Page-Title"] assert_nil @title diff --git a/test/helpers/user_roles_helper_test.rb b/test/helpers/user_roles_helper_test.rb index 8216a5b56..53169b75a 100644 --- a/test/helpers/user_roles_helper_test.rb +++ b/test/helpers/user_roles_helper_test.rb @@ -10,17 +10,17 @@ class UserRolesHelperTest < ActionView::TestCase assert_dom_equal "", icon icon = role_icon(users(:moderator_user), "moderator") - assert_dom_equal 'This user is a moderator', icon + assert_dom_equal 'This user is a moderator', icon end def test_role_icon_administrator @user = users(:administrator_user) icon = role_icon(users(:normal_user), "moderator") - assert_dom_equal 'Grant moderator access', icon + assert_dom_equal 'Grant moderator access', icon icon = role_icon(users(:moderator_user), "moderator") - assert_dom_equal 'Revoke moderator access', icon + assert_dom_equal 'Revoke moderator access', icon end def test_role_icons_normal @@ -30,22 +30,22 @@ class UserRolesHelperTest < ActionView::TestCase assert_dom_equal " ", icons icons = role_icons(users(:moderator_user)) - assert_dom_equal ' This user is a moderator', icons + assert_dom_equal ' This user is a moderator', icons icons = role_icons(users(:super_user)) - assert_dom_equal ' This user is an administrator This user is a moderator', icons + assert_dom_equal ' This user is an administrator This user is a moderator', icons end def test_role_icons_administrator @user = users(:administrator_user) icons = role_icons(users(:normal_user)) - assert_dom_equal ' Grant administrator access Grant moderator access', icons + assert_dom_equal ' Grant administrator access Grant moderator access', icons icons = role_icons(users(:moderator_user)) - assert_dom_equal ' Grant administrator access Revoke moderator access', icons + assert_dom_equal ' Grant administrator access Revoke moderator access', icons icons = role_icons(users(:super_user)) - assert_dom_equal ' Revoke administrator access Revoke moderator access', icons + assert_dom_equal ' Revoke administrator access Revoke moderator access', icons end end diff --git a/test/http/geocoder_ca.yml b/test/http/geocoder_ca.yml index 754885a5b..0fbaa105d 100644 --- a/test/http/geocoder_ca.yml +++ b/test/http/geocoder_ca.yml @@ -1,48 +1,54 @@ -/?geoit=XML&postal=A1B+2C3: | - - - 47.172520 - -55.440515 - A1B2C3 - - 1 - - ST. JOHN&'S - NL - 0.9 - - +/?geoit=XML&postal=A1B%202C3: + code: 200 + body: | + + + 47.172520 + -55.440515 + A1B2C3 + + 1 + + ST. JOHN&'S + NL + 0.9 + + -/?geoit=XML&postal=k1a+0b1: | - - - 45.375437 - -75.691041 - K1A0B1 - - 1 - - OTTAWA - ON - 0.9 - - +/?geoit=XML&postal=k1a%200b1: + code: 200 + body: | + + + 45.375437 + -75.691041 + K1A0B1 + + 1 + + OTTAWA + ON + 0.9 + + -/?geoit=XML&postal=Q0Q+0Q0: | - - - - 008 - Your request did not produce any results. Check your spelling and try again. - - - - - Q0Q0Q0 - - 1 - - - - 0.9 - - +/?geoit=XML&postal=Q0Q%200Q0: + code: 200 + body: | + + + + 008 + Your request did not produce any results. Check your spelling and try again. + + + - + Q0Q0Q0 + + 1 + + + + 0.9 + + diff --git a/test/http/geocoder_us.yml b/test/http/geocoder_us.yml index 1e451d60a..de54aa306 100644 --- a/test/http/geocoder_us.yml +++ b/test/http/geocoder_us.yml @@ -1,2 +1,6 @@ -/service/csv?zip=90210: "34.088808, -118.40612, Beverly Hills, CA, 90210" -/service/csv?zip=00000: "1: couldn't find this zip code: 00000! sorry" +/service/csv?zip=90210: + code: 200 + body: "34.088808, -118.40612, Beverly Hills, CA, 90210" +/service/csv?zip=00000: + code: 200 + body: "1: couldn't find this zip code: 00000! sorry" diff --git a/test/http/geonames.yml b/test/http/geonames.yml index 3527e3ced..65356c807 100644 --- a/test/http/geonames.yml +++ b/test/http/geonames.yml @@ -1,222 +1,228 @@ -/search?lang=en&maxRows=20&q=Hoddesdon&username=dummy: | - - - 1 - - Hoddesdon - Hoddesdon - 51.76148 - -0.01144 - 2646807 - GB - United Kingdom - P - PPL - - - -/search?lang=en&maxRows=20&q=Broxbourne&username=dummy: | - - - 17 - - Broxbourne - Broxbourne - 51.74712 - -0.01923 - 2654481 - GB - United Kingdom - P - PPL - - - Broxbourne District - Broxbourne District - 51.73026 - -0.04821 - 7290563 - GB - United Kingdom - A - ADM3 - - - Cheshunt - Cheshunt - 51.70791 - -0.03739 - 2653232 - GB - United Kingdom - P - PPL - - - Hoddesdon - Hoddesdon - 51.76148 - -0.01144 - 2646807 - GB - United Kingdom - P - PPL - - - Waltham Cross - Waltham Cross - 51.68905 - -0.0333 - 2634842 - GB - United Kingdom - P - PPL - - - Goffs Oak - Goffs Oak - 51.71015 - -0.0872 - 2648362 - GB - United Kingdom - P - PPL - - - Wormley - Wormley - 51.7324 - -0.0242 - 2633535 - GB - United Kingdom - P - PPL - - - Broxbourne - Broxbourne - -27.50314 - 151.378 - 8792801 - AU - Australia - S - HMSD - - - Lee Valley White Water Centre - Lee Valley White Water Centre - 51.68814 - -0.01682 - 7670551 - GB - United Kingdom - S - FCL - - - Cheshunt Railway Station - Cheshunt Railway Station - 51.703 - -0.024 - 6952282 - GB - United Kingdom - S - RSTN - - - Theobalds Grove Railway Station - Theobalds Grove Railway Station - 51.692 - -0.035 - 6953715 - GB - United Kingdom - S - RSTN - - - Waltham Cross Railway Station - Waltham Cross Railway Station - 51.685 - -0.027 - 6953801 - GB - United Kingdom - S - RSTN - - - Rye House Station - Rye House Station - 51.76938 - 0.00562 - 6691700 - GB - United Kingdom - S - RSTN - - - Broxbourne Station - Broxbourne Station - 51.74697 - -0.01105 - 6691701 - GB - United Kingdom - S - RSTN - - - Broxbornebury Park - Broxbornebury Park - 51.75252 - -0.03839 - 6286417 - GB - United Kingdom - S - CSTL - - - Marriott Cheshunt - Marriott Cheshunt - 51.7208 - -0.0324 - 6512481 - GB - United Kingdom - S - HTL - - - Cheshunt Community Hospital - Cheshunt Community Hospital - 51.68396 - -0.03951 - 6289233 - GB - United Kingdom - S - HSP - - - -/countrySubdivision?lang=en&lat=51.7632&lng=-0.0076&username=dummy: | - - - - GB - United Kingdom - ENG - England - ENG - 0.0 - - +/search?lang=en&maxRows=20&q=Hoddesdon&username=dummy: + code: 200 + body: | + + + 1 + + Hoddesdon + Hoddesdon + 51.76148 + -0.01144 + 2646807 + GB + United Kingdom + P + PPL + + + +/search?lang=en&maxRows=20&q=Broxbourne&username=dummy: + code: 200 + body: | + + + 17 + + Broxbourne + Broxbourne + 51.74712 + -0.01923 + 2654481 + GB + United Kingdom + P + PPL + + + Broxbourne District + Broxbourne District + 51.73026 + -0.04821 + 7290563 + GB + United Kingdom + A + ADM3 + + + Cheshunt + Cheshunt + 51.70791 + -0.03739 + 2653232 + GB + United Kingdom + P + PPL + + + Hoddesdon + Hoddesdon + 51.76148 + -0.01144 + 2646807 + GB + United Kingdom + P + PPL + + + Waltham Cross + Waltham Cross + 51.68905 + -0.0333 + 2634842 + GB + United Kingdom + P + PPL + + + Goffs Oak + Goffs Oak + 51.71015 + -0.0872 + 2648362 + GB + United Kingdom + P + PPL + + + Wormley + Wormley + 51.7324 + -0.0242 + 2633535 + GB + United Kingdom + P + PPL + + + Broxbourne + Broxbourne + -27.50314 + 151.378 + 8792801 + AU + Australia + S + HMSD + + + Lee Valley White Water Centre + Lee Valley White Water Centre + 51.68814 + -0.01682 + 7670551 + GB + United Kingdom + S + FCL + + + Cheshunt Railway Station + Cheshunt Railway Station + 51.703 + -0.024 + 6952282 + GB + United Kingdom + S + RSTN + + + Theobalds Grove Railway Station + Theobalds Grove Railway Station + 51.692 + -0.035 + 6953715 + GB + United Kingdom + S + RSTN + + + Waltham Cross Railway Station + Waltham Cross Railway Station + 51.685 + -0.027 + 6953801 + GB + United Kingdom + S + RSTN + + + Rye House Station + Rye House Station + 51.76938 + 0.00562 + 6691700 + GB + United Kingdom + S + RSTN + + + Broxbourne Station + Broxbourne Station + 51.74697 + -0.01105 + 6691701 + GB + United Kingdom + S + RSTN + + + Broxbornebury Park + Broxbornebury Park + 51.75252 + -0.03839 + 6286417 + GB + United Kingdom + S + CSTL + + + Marriott Cheshunt + Marriott Cheshunt + 51.7208 + -0.0324 + 6512481 + GB + United Kingdom + S + HTL + + + Cheshunt Community Hospital + Cheshunt Community Hospital + 51.68396 + -0.03951 + 6289233 + GB + United Kingdom + S + HSP + + + +/countrySubdivision?lang=en&lat=51.7632&lng=-0.0076&username=dummy: + code: 200 + body: | + + + + GB + United Kingdom + ENG + England + ENG + 0.0 + + diff --git a/test/http/nominatim.yml b/test/http/nominatim.yml index 443149346..accaebf33 100644 --- a/test/http/nominatim.yml +++ b/test/http/nominatim.yml @@ -1,45 +1,53 @@ -/search?accept-language=&format=xml&q=Hoddesdon&viewbox=-0.559%2C51.766%2C0.836%2C51.217: | - - - - +/search?accept-language=&extratags=1&format=xml&q=Hoddesdon&viewbox=-0.559,51.766,0.836,51.217: + code: 200 + body: | + + + + -/search?accept-language=&format=xml&q=Broxbourne&viewbox=-0.559%2C51.766%2C0.836%2C51.217: | - - - - - - +/search?accept-language=&extratags=1&format=xml&q=Broxbourne&viewbox=-0.559,51.766,0.836,51.217: + code: 200 + body: | + + + + + + -/reverse?accept-language=&lat=51.7632&lon=-0.0076&zoom=15: | - - - Broxbourne, Hertfordshire, East of England, England, United Kingdom - - Broxbourne - Broxbourne - Hertfordshire - East of England - England - United Kingdom - gb - - +/reverse?accept-language=&lat=51.7632&lon=-0.0076&zoom=15: + code: 200 + body: | + + + Broxbourne, Hertfordshire, East of England, England, United Kingdom + + Broxbourne + Broxbourne + Hertfordshire + East of England + England + United Kingdom + gb + + -/reverse?accept-language=&lat=51.7632&lon=-0.0076&zoom=17: | - - - Dinant Link Road, Broxbourne, Hertfordshire, East of England, England, EN11 8HX, United Kingdom - - Dinant Link Road - Broxbourne - Broxbourne - Hertfordshire - East of England - England - EN11 8HX - United Kingdom - gb - - +/reverse?accept-language=&lat=51.7632&lon=-0.0076&zoom=17: + code: 200 + body: | + + + Dinant Link Road, Broxbourne, Hertfordshire, East of England, England, EN11 8HX, United Kingdom + + Dinant Link Road + Broxbourne + Broxbourne + Hertfordshire + East of England + England + EN11 8HX + United Kingdom + gb + + diff --git a/test/http/npemap.yml b/test/http/npemap.yml index 39c585a13..28074d089 100644 --- a/test/http/npemap.yml +++ b/test/http/npemap.yml @@ -1,6 +1,10 @@ -/cgi/geocoder.fcgi?format=text&postcode=CV4+7AL: | - # Easting,Northing,Matched Postcode,Latitude,Longitude - 429926,276058,'CV4 7AL',52.381748701968,-1.56176420939232 +/cgi/geocoder.fcgi?format=text&postcode=CV4%207AL: + code: 200 + body: | + # Easting,Northing,Matched Postcode,Latitude,Longitude + 429926,276058,'CV4 7AL',52.381748701968,-1.56176420939232 -/cgi/geocoder.fcgi?format=text&postcode=XX9+9XX: | - Error: Postcode area 'XX' not found, postcode probably invalid +/cgi/geocoder.fcgi?format=text&postcode=XX9%209XX: + code: 200 + body: | + Error: Postcode area 'XX' not found, postcode probably invalid diff --git a/test/integration/client_applications_test.rb b/test/integration/client_applications_test.rb index 2cc15bd56..f5d235d95 100644 --- a/test/integration/client_applications_test.rb +++ b/test/integration/client_applications_test.rb @@ -1,7 +1,7 @@ require "test_helper" class ClientApplicationsTest < ActionDispatch::IntegrationTest - fixtures :users, :client_applications + fixtures :users ## # run through the procedure of creating a client application and checking diff --git a/test/integration/oauth_test.rb b/test/integration/oauth_test.rb index b52f55ea5..8971b7a2b 100644 --- a/test/integration/oauth_test.rb +++ b/test/integration/oauth_test.rb @@ -1,24 +1,27 @@ require "test_helper" class OAuthTest < ActionDispatch::IntegrationTest - fixtures :users, :client_applications, :gpx_files - set_fixture_class :gpx_files => Trace + fixtures :users include OAuth::Helper + def setup + stub_hostip_requests + end + def test_oauth10_web_app - client = client_applications(:oauth_web_app) + client = create(:client_application, :callback_url => "http://some.web.app.example.org/callback", :user => users(:public_user), :allow_read_prefs => true, :allow_write_api => true, :allow_read_gpx => true) post_via_redirect "/login", :username => client.user.email, :password => "test" assert_response :success oauth10_without_callback(client) - oauth10_with_callback(client, "http://another.web.app.org/callback") + oauth10_with_callback(client, "http://another.web.app.example.org/callback") oauth10_refused(client) end def test_oauth10_desktop_app - client = client_applications(:oauth_desktop_app) + client = create(:client_application, :user => users(:public_user), :allow_read_prefs => true, :allow_write_api => true, :allow_read_gpx => true) post_via_redirect "/login", :username => client.user.email, :password => "test" assert_response :success @@ -28,18 +31,18 @@ class OAuthTest < ActionDispatch::IntegrationTest end def test_oauth10a_web_app - client = client_applications(:oauth_web_app) + client = create(:client_application, :callback_url => "http://some.web.app.example.org/callback", :user => users(:public_user), :allow_read_prefs => true, :allow_write_api => true, :allow_read_gpx => true) post_via_redirect "/login", :username => client.user.email, :password => "test" assert_response :success oauth10a_without_callback(client) - oauth10a_with_callback(client, "http://another.web.app.org/callback") + oauth10a_with_callback(client, "http://another.web.app.example.org/callback") oauth10a_refused(client) end def test_oauth10a_desktop_app - client = client_applications(:oauth_desktop_app) + client = create(:client_application, :user => users(:public_user), :allow_read_prefs => true, :allow_write_api => true, :allow_read_gpx => true) post_via_redirect "/login", :username => client.user.email, :password => "test" assert_response :success @@ -53,6 +56,10 @@ class OAuthTest < ActionDispatch::IntegrationTest def oauth10_without_callback(client) token = get_request_token(client) + get "/oauth/authorize", :oauth_token => token.token + assert_response :success + assert_template :authorize + post "/oauth/authorize", :oauth_token => token.token, :allow_read_prefs => true, :allow_write_prefs => true @@ -90,7 +97,7 @@ class OAuthTest < ActionDispatch::IntegrationTest post "/oauth/revoke", :token => token.token assert_redirected_to oauth_clients_url(token.user.display_name) - token = OauthToken.find_by_token(token.token) + token = OauthToken.find_by(:token => token.token) assert_not_nil token.invalidated_at signed_get "/api/0.6/user/preferences", :consumer => client, :token => token @@ -100,6 +107,10 @@ class OAuthTest < ActionDispatch::IntegrationTest def oauth10_refused(client) token = get_request_token(client) + get "/oauth/authorize", :oauth_token => token.token + assert_response :success + assert_template :authorize + post "/oauth/authorize", :oauth_token => token.token assert_response :success assert_template :authorize_failure @@ -108,6 +119,14 @@ class OAuthTest < ActionDispatch::IntegrationTest assert_nil token.authorized_at assert_not_nil token.invalidated_at + get "/oauth/authorize", :oauth_token => token.token + assert_response :success + assert_template :authorize_failure + assert_select "p", "The authorization token is not valid." + token.reload + assert_nil token.authorized_at + assert_not_nil token.invalidated_at + post "/oauth/authorize", :oauth_token => token.token assert_response :success assert_template :authorize_failure @@ -120,6 +139,10 @@ class OAuthTest < ActionDispatch::IntegrationTest def oauth10_with_callback(client, callback_url) token = get_request_token(client) + get "/oauth/authorize", :oauth_token => token.token + assert_response :success + assert_template :authorize + post "/oauth/authorize", :oauth_token => token.token, :oauth_callback => callback_url, :allow_write_api => true, :allow_read_gpx => true @@ -144,7 +167,8 @@ class OAuthTest < ActionDispatch::IntegrationTest assert_nil token.invalidated_at assert_allowed token, [:allow_write_api, :allow_read_gpx] - signed_get "/api/0.6/gpx/2", :consumer => client, :token => token + trace = create(:trace, :user => users(:public_user)) + signed_get "/api/0.6/gpx/#{trace.id}", :consumer => client, :token => token assert_response :success signed_get "/api/0.6/user/details", :consumer => client, :token => token @@ -152,7 +176,7 @@ class OAuthTest < ActionDispatch::IntegrationTest post "/oauth/revoke", :token => token.token assert_redirected_to oauth_clients_url(token.user.display_name) - token = OauthToken.find_by_token(token.token) + token = OauthToken.find_by(:token => token.token) assert_not_nil token.invalidated_at signed_get "/api/0.6/gpx/2", :consumer => client, :token => token @@ -162,13 +186,17 @@ class OAuthTest < ActionDispatch::IntegrationTest def oauth10a_without_callback(client) token = get_request_token(client, :oauth_callback => "oob") + get "/oauth/authorize", :oauth_token => token.token + assert_response :success + assert_template :authorize + post "/oauth/authorize", :oauth_token => token.token, :allow_read_prefs => true, :allow_write_prefs => true if client.callback_url assert_response :redirect verifier = parse_verifier(response) - assert_redirected_to "http://some.web.app.org/callback?oauth_token=#{token.token}&oauth_verifier=#{verifier}" + assert_redirected_to "http://some.web.app.example.org/callback?oauth_token=#{token.token}&oauth_verifier=#{verifier}" else assert_response :success assert_template :authorize_success @@ -202,12 +230,13 @@ class OAuthTest < ActionDispatch::IntegrationTest signed_get "/api/0.6/user/preferences", :consumer => client, :token => token assert_response :success - signed_get "/api/0.6/gpx/2", :consumer => client, :token => token + trace = create(:trace, :user => users(:public_user)) + signed_get "/api/0.6/gpx/#{trace.id}", :consumer => client, :token => token assert_response :forbidden post "/oauth/revoke", :token => token.token assert_redirected_to oauth_clients_url(token.user.display_name) - token = OauthToken.find_by_token(token.token) + token = OauthToken.find_by(:token => token.token) assert_not_nil token.invalidated_at signed_get "/api/0.6/user/preferences", :consumer => client, :token => token @@ -217,6 +246,10 @@ class OAuthTest < ActionDispatch::IntegrationTest def oauth10a_with_callback(client, callback_url) token = get_request_token(client, :oauth_callback => callback_url) + get "/oauth/authorize", :oauth_token => token.token + assert_response :success + assert_template :authorize + post "/oauth/authorize", :oauth_token => token.token, :allow_write_api => true, :allow_read_gpx => true @@ -246,7 +279,8 @@ class OAuthTest < ActionDispatch::IntegrationTest assert_nil token.invalidated_at assert_allowed token, [:allow_write_api, :allow_read_gpx] - signed_get "/api/0.6/gpx/2", :consumer => client, :token => token + trace = create(:trace, :user => users(:public_user)) + signed_get "/api/0.6/gpx/#{trace.id}", :consumer => client, :token => token assert_response :success signed_get "/api/0.6/user/details", :consumer => client, :token => token @@ -254,7 +288,7 @@ class OAuthTest < ActionDispatch::IntegrationTest post "/oauth/revoke", :token => token.token assert_redirected_to oauth_clients_url(token.user.display_name) - token = OauthToken.find_by_token(token.token) + token = OauthToken.find_by(:token => token.token) assert_not_nil token.invalidated_at signed_get "/api/0.6/gpx/2", :consumer => client, :token => token @@ -264,6 +298,10 @@ class OAuthTest < ActionDispatch::IntegrationTest def oauth10a_refused(client) token = get_request_token(client, :oauth_callback => "oob") + get "/oauth/authorize", :oauth_token => token.token + assert_response :success + assert_template :authorize + post "/oauth/authorize", :oauth_token => token.token assert_response :success assert_template :authorize_failure @@ -272,6 +310,14 @@ class OAuthTest < ActionDispatch::IntegrationTest assert_nil token.authorized_at assert_not_nil token.invalidated_at + get "/oauth/authorize", :oauth_token => token.token + assert_response :success + assert_template :authorize_failure + assert_select "p", "The authorization token is not valid." + token.reload + assert_nil token.authorized_at + assert_not_nil token.invalidated_at + post "/oauth/authorize", :oauth_token => token.token assert_response :success assert_template :authorize_failure @@ -289,6 +335,7 @@ class OAuthTest < ActionDispatch::IntegrationTest assert_not_nil token.created_at assert_nil token.authorized_at assert_nil token.invalidated_at + assert_equal_allowing_nil options[:oauth_callback], token.callback_url assert_allowed token, client.permissions token @@ -315,7 +362,7 @@ class OAuthTest < ActionDispatch::IntegrationTest def parse_token(response) params = CGI.parse(response.body) - token = OauthToken.find_by_token(params["oauth_token"].first) + token = OauthToken.find_by(:token => params["oauth_token"].first) assert_equal token.secret, params["oauth_token_secret"].first token diff --git a/test/integration/locale_test.rb b/test/integration/page_locale_test.rb similarity index 85% rename from test/integration/locale_test.rb rename to test/integration/page_locale_test.rb index 94007cd3c..c95af86ab 100644 --- a/test/integration/locale_test.rb +++ b/test/integration/page_locale_test.rb @@ -1,10 +1,11 @@ require "test_helper" -class LocaleTest < ActionDispatch::IntegrationTest +class PageLocaleTest < ActionDispatch::IntegrationTest fixtures :users def setup I18n.locale = "en" + stub_hostip_requests end def teardown @@ -20,7 +21,7 @@ class LocaleTest < ActionDispatch::IntegrationTest assert_equal [], User.find(user.id).languages assert_select "html[lang=?]", "en" - get "/diary/new", {}, { "HTTP_ACCEPT_LANGUAGE" => "fr, en" } + get "/diary/new", {}, { "HTTP_ACCEPT_LANGUAGE" => "fr, en" } assert_equal %w(fr en), User.find(user.id).languages assert_select "html[lang=?]", "fr" end diff --git a/test/integration/user_blocks_test.rb b/test/integration/user_blocks_test.rb index fcf008c07..9425c690f 100644 --- a/test/integration/user_blocks_test.rb +++ b/test/integration/user_blocks_test.rb @@ -1,7 +1,7 @@ require "test_helper" class UserBlocksTest < ActionDispatch::IntegrationTest - fixtures :users, :user_blocks, :user_roles + fixtures :users, :user_roles def auth_header(user, pass) { "HTTP_AUTHORIZATION" => format("Basic %s", Base64.encode64("#{user}:#{pass}")) } diff --git a/test/integration/user_changeset_comments_test.rb b/test/integration/user_changeset_comments_test.rb index d183e4d56..5dbcaa0b4 100644 --- a/test/integration/user_changeset_comments_test.rb +++ b/test/integration/user_changeset_comments_test.rb @@ -1,7 +1,7 @@ require "test_helper" class UserChangesetCommentsTest < ActionDispatch::IntegrationTest - fixtures :users, :changesets, :changeset_comments + fixtures :users, :changesets # Test 'log in to comment' message for nonlogged in user def test_log_in_message diff --git a/test/integration/user_creation_test.rb b/test/integration/user_creation_test.rb index 1ff8f9a65..e0a51e4d3 100644 --- a/test/integration/user_creation_test.rb +++ b/test/integration/user_creation_test.rb @@ -7,6 +7,8 @@ class UserCreationTest < ActionDispatch::IntegrationTest I18n.locale = "en" OmniAuth.config.test_mode = true + + stub_request(:get, /.*gravatar.com.*d=404/).to_return(:status => 404) end def teardown @@ -16,6 +18,8 @@ class UserCreationTest < ActionDispatch::IntegrationTest OmniAuth.config.mock_auth[:google] = nil OmniAuth.config.mock_auth[:facebook] = nil OmniAuth.config.mock_auth[:windowslive] = nil + OmniAuth.config.mock_auth[:github] = nil + OmniAuth.config.mock_auth[:wikipedia] = nil OmniAuth.config.test_mode = false end @@ -40,7 +44,7 @@ class UserCreationTest < ActionDispatch::IntegrationTest end assert_response :success assert_template "user/new" - assert_equal response.headers["Content-Language"][0..1], locale.to_s[0..1] unless locale == :root + assert_equal locale.to_s, response.headers["Content-Language"] unless locale == :root assert_select "form > fieldset > div.form-row > input.field_with_errors#user_email" assert_no_missing_translations end @@ -81,14 +85,14 @@ class UserCreationTest < ActionDispatch::IntegrationTest assert_difference("User.count") do assert_difference("ActionMailer::Base.deliveries.size", 1) do post_via_redirect "/user/save", {}, - { "HTTP_ACCEPT_LANGUAGE" => "#{locale}" } + { "HTTP_ACCEPT_LANGUAGE" => locale.to_s } end end # Check the e-mail register_email = ActionMailer::Base.deliveries.first - assert_equal register_email.to[0], new_email + assert_equal register_email.to.first, new_email # Check that the confirm account url is correct assert_match /#{@url}/, register_email.body.to_s @@ -128,13 +132,13 @@ class UserCreationTest < ActionDispatch::IntegrationTest # Check the e-mail register_email = ActionMailer::Base.deliveries.first - assert_equal register_email.to[0], new_email + assert_equal register_email.to.first, new_email # Check that the confirm account url is correct confirm_regex = Regexp.new("/user/redirect_tester/confirm\\?confirm_string=([a-zA-Z0-9]*)") - register_email.parts.each do |part| + email_text_parts(register_email).each do |part| assert_match confirm_regex, part.body.to_s end - confirm_string = register_email.parts[0].body.match(confirm_regex)[1] + confirm_string = email_text_parts(register_email).first.body.match(confirm_regex)[1] # Check the page assert_response :success @@ -241,13 +245,13 @@ class UserCreationTest < ActionDispatch::IntegrationTest # Check the e-mail register_email = ActionMailer::Base.deliveries.first - assert_equal register_email.to[0], new_email + assert_equal register_email.to.first, new_email # Check that the confirm account url is correct confirm_regex = Regexp.new("/user/redirect_tester_openid/confirm\\?confirm_string=([a-zA-Z0-9]*)") - register_email.parts.each do |part| + email_text_parts(register_email).each do |part| assert_match confirm_regex, part.body.to_s end - confirm_string = register_email.parts[0].body.match(confirm_regex)[1] + confirm_string = email_text_parts(register_email).first.body.match(confirm_regex)[1] # Check the page assert_response :success @@ -358,13 +362,13 @@ class UserCreationTest < ActionDispatch::IntegrationTest # Check the e-mail register_email = ActionMailer::Base.deliveries.first - assert_equal register_email.to[0], new_email + assert_equal register_email.to.first, new_email # Check that the confirm account url is correct confirm_regex = Regexp.new("/user/redirect_tester_google/confirm\\?confirm_string=([a-zA-Z0-9]*)") - register_email.parts.each do |part| + email_text_parts(register_email).each do |part| assert_match confirm_regex, part.body.to_s end - confirm_string = register_email.parts[0].body.match(confirm_regex)[1] + confirm_string = email_text_parts(register_email).first.body.match(confirm_regex)[1] # Check the page assert_response :success @@ -471,13 +475,13 @@ class UserCreationTest < ActionDispatch::IntegrationTest # Check the e-mail register_email = ActionMailer::Base.deliveries.first - assert_equal register_email.to[0], new_email + assert_equal register_email.to.first, new_email # Check that the confirm account url is correct confirm_regex = Regexp.new("/user/redirect_tester_facebook/confirm\\?confirm_string=([a-zA-Z0-9]*)") - register_email.parts.each do |part| + email_text_parts(register_email).each do |part| assert_match confirm_regex, part.body.to_s end - confirm_string = register_email.parts[0].body.match(confirm_regex)[1] + confirm_string = email_text_parts(register_email).first.body.match(confirm_regex)[1] # Check the page assert_response :success @@ -511,7 +515,7 @@ class UserCreationTest < ActionDispatch::IntegrationTest assert_redirected_to auth_path(:provider => "windowslive", :origin => "/user/new") follow_redirect! assert_response :redirect - assert_redirected_to auth_success_path(:provider => "windowslive") + assert_redirected_to auth_success_path(:provider => "windowslive", :origin => "/user/new") follow_redirect! assert_response :redirect assert_redirected_to "/user/terms" @@ -542,7 +546,7 @@ class UserCreationTest < ActionDispatch::IntegrationTest assert_redirected_to auth_path(:provider => "windowslive", :origin => "/user/new") follow_redirect! assert_response :redirect - assert_redirected_to auth_success_path(:provider => "windowslive") + assert_redirected_to auth_success_path(:provider => "windowslive", :origin => "/user/new") follow_redirect! assert_response :redirect assert_redirected_to auth_failure_path(:strategy => "windowslive", :message => "connection_failed", :origin => "/user/new") @@ -572,7 +576,7 @@ class UserCreationTest < ActionDispatch::IntegrationTest assert_redirected_to auth_path(:provider => "windowslive", :origin => "/user/new") follow_redirect! assert_response :redirect - assert_redirected_to auth_success_path(:provider => "windowslive") + assert_redirected_to auth_success_path(:provider => "windowslive", :origin => "/user/new") follow_redirect! assert_response :redirect assert_redirected_to "/user/terms" @@ -584,13 +588,239 @@ class UserCreationTest < ActionDispatch::IntegrationTest # Check the e-mail register_email = ActionMailer::Base.deliveries.first - assert_equal register_email.to[0], new_email + assert_equal register_email.to.first, new_email # Check that the confirm account url is correct confirm_regex = Regexp.new("/user/redirect_tester_windowslive/confirm\\?confirm_string=([a-zA-Z0-9]*)") - register_email.parts.each do |part| + email_text_parts(register_email).each do |part| + assert_match confirm_regex, part.body.to_s + end + confirm_string = email_text_parts(register_email).first.body.match(confirm_regex)[1] + + # Check the page + assert_response :success + assert_template "user/confirm" + + ActionMailer::Base.deliveries.clear + + # Go to the confirmation page + get "/user/#{display_name}/confirm", :confirm_string => confirm_string + assert_response :success + assert_template "user/confirm" + + post "/user/#{display_name}/confirm", :confirm_string => confirm_string + assert_response :redirect + follow_redirect! + assert_response :success + assert_template "site/welcome" + end + + def test_user_create_github_success + OmniAuth.config.add_mock(:github, :uid => "123454321") + + new_email = "newtester-github@osm.org" + display_name = "new_tester-github" + password = "testtest" + assert_difference("User.count") do + assert_difference("ActionMailer::Base.deliveries.size", 1) do + post "/user/new", + :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "github", :pass_crypt => "", :pass_crypt_confirmation => "" } + assert_response :redirect + assert_redirected_to auth_path(:provider => "github", :origin => "/user/new") + follow_redirect! + assert_response :redirect + assert_redirected_to auth_success_path(:provider => "github", :origin => "/user/new") + follow_redirect! + assert_response :redirect + assert_redirected_to "/user/terms" + post "/user/save", + :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "github", :auth_uid => "123454321", :pass_crypt => password, :pass_crypt_confirmation => password } + assert_response :redirect + follow_redirect! + end + end + + # Check the page + assert_response :success + assert_template "user/confirm" + + ActionMailer::Base.deliveries.clear + end + + def test_user_create_github_failure + OmniAuth.config.mock_auth[:github] = :connection_failed + + new_email = "newtester-github2@osm.org" + display_name = "new_tester-github2" + assert_difference("User.count", 0) do + assert_difference("ActionMailer::Base.deliveries.size", 0) do + post "/user/new", + :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "github", :pass_crypt => "", :pass_crypt_confirmation => "" } + assert_response :redirect + assert_redirected_to auth_path(:provider => "github", :origin => "/user/new") + follow_redirect! + assert_response :redirect + assert_redirected_to auth_success_path(:provider => "github", :origin => "/user/new") + follow_redirect! + assert_response :redirect + assert_redirected_to auth_failure_path(:strategy => "github", :message => "connection_failed", :origin => "/user/new") + follow_redirect! + assert_response :redirect + follow_redirect! + assert_response :success + assert_template "user/new" + end + end + + ActionMailer::Base.deliveries.clear + end + + def test_user_create_github_redirect + OmniAuth.config.add_mock(:github, :uid => "123454321") + + new_email = "redirect_tester_github@osm.org" + display_name = "redirect_tester_github" + # nothing special about this page, just need a protected page to redirect back to. + referer = "/traces/mine" + assert_difference("User.count") do + assert_difference("ActionMailer::Base.deliveries.size", 1) do + post "/user/new", + :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "github", :pass_crypt => "", :pass_crypt_confirmation => "" }, :referer => referer + assert_response :redirect + assert_redirected_to auth_path(:provider => "github", :origin => "/user/new") + follow_redirect! + assert_response :redirect + assert_redirected_to auth_success_path(:provider => "github", :origin => "/user/new") + follow_redirect! + assert_response :redirect + assert_redirected_to "/user/terms" + post_via_redirect "/user/save", + :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "github", :auth_uid => "http://localhost:1123/new.tester", :pass_crypt => "testtest", :pass_crypt_confirmation => "testtest" } + end + end + + # Check the e-mail + register_email = ActionMailer::Base.deliveries.first + + assert_equal register_email.to.first, new_email + # Check that the confirm account url is correct + confirm_regex = Regexp.new("/user/redirect_tester_github/confirm\\?confirm_string=([a-zA-Z0-9]*)") + email_text_parts(register_email).each do |part| + assert_match confirm_regex, part.body.to_s + end + confirm_string = email_text_parts(register_email).first.body.match(confirm_regex)[1] + + # Check the page + assert_response :success + assert_template "user/confirm" + + ActionMailer::Base.deliveries.clear + + # Go to the confirmation page + get "/user/#{display_name}/confirm", :confirm_string => confirm_string + assert_response :success + assert_template "user/confirm" + + post "/user/#{display_name}/confirm", :confirm_string => confirm_string + assert_response :redirect + follow_redirect! + assert_response :success + assert_template "site/welcome" + end + + def test_user_create_wikipedia_success + OmniAuth.config.add_mock(:wikipedia, :uid => "123454321") + + new_email = "newtester-wikipedia@osm.org" + display_name = "new_tester-wikipedia" + password = "testtest" + assert_difference("User.count") do + assert_difference("ActionMailer::Base.deliveries.size", 1) do + post "/user/new", + :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "wikipedia", :pass_crypt => "", :pass_crypt_confirmation => "" } + assert_response :redirect + assert_redirected_to auth_path(:provider => "wikipedia", :origin => "/user/new") + follow_redirect! + assert_response :redirect + assert_redirected_to auth_success_path(:provider => "wikipedia", :origin => "/user/new") + follow_redirect! + assert_response :redirect + assert_redirected_to "/user/terms" + post "/user/save", + :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "wikipedia", :auth_uid => "123454321", :pass_crypt => password, :pass_crypt_confirmation => password } + assert_response :redirect + follow_redirect! + end + end + + # Check the page + assert_response :success + assert_template "user/confirm" + + ActionMailer::Base.deliveries.clear + end + + def test_user_create_wikipedia_failure + OmniAuth.config.mock_auth[:wikipedia] = :connection_failed + + new_email = "newtester-wikipedia2@osm.org" + display_name = "new_tester-wikipedia2" + assert_difference("User.count", 0) do + assert_difference("ActionMailer::Base.deliveries.size", 0) do + post "/user/new", + :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "wikipedia", :pass_crypt => "", :pass_crypt_confirmation => "" } + assert_response :redirect + assert_redirected_to auth_path(:provider => "wikipedia", :origin => "/user/new") + follow_redirect! + assert_response :redirect + assert_redirected_to auth_success_path(:provider => "wikipedia", :origin => "/user/new") + follow_redirect! + assert_response :redirect + assert_redirected_to auth_failure_path(:strategy => "wikipedia", :message => "connection_failed", :origin => "/user/new") + follow_redirect! + assert_response :redirect + follow_redirect! + assert_response :success + assert_template "user/new" + end + end + + ActionMailer::Base.deliveries.clear + end + + def test_user_create_wikipedia_redirect + OmniAuth.config.add_mock(:wikipedia, :uid => "123454321") + + new_email = "redirect_tester_wikipedia@osm.org" + display_name = "redirect_tester_wikipedia" + # nothing special about this page, just need a protected page to redirect back to. + referer = "/traces/mine" + assert_difference("User.count") do + assert_difference("ActionMailer::Base.deliveries.size", 1) do + post "/user/new", + :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "wikipedia", :pass_crypt => "", :pass_crypt_confirmation => "" }, :referer => referer + assert_response :redirect + assert_redirected_to auth_path(:provider => "wikipedia", :origin => "/user/new") + follow_redirect! + assert_response :redirect + assert_redirected_to auth_success_path(:provider => "wikipedia", :origin => "/user/new") + follow_redirect! + assert_response :redirect + assert_redirected_to "/user/terms" + post_via_redirect "/user/save", + :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "wikipedia", :auth_uid => "http://localhost:1123/new.tester", :pass_crypt => "testtest", :pass_crypt_confirmation => "testtest" } + end + end + + # Check the e-mail + register_email = ActionMailer::Base.deliveries.first + + assert_equal register_email.to.first, new_email + # Check that the confirm account url is correct + confirm_regex = Regexp.new("/user/redirect_tester_wikipedia/confirm\\?confirm_string=([a-zA-Z0-9]*)") + email_text_parts(register_email).each do |part| assert_match confirm_regex, part.body.to_s end - confirm_string = register_email.parts[0].body.match(confirm_regex)[1] + confirm_string = email_text_parts(register_email).first.body.match(confirm_regex)[1] # Check the page assert_response :success diff --git a/test/integration/user_diaries_test.rb b/test/integration/user_diaries_test.rb index a0b084f92..55e3bce01 100644 --- a/test/integration/user_diaries_test.rb +++ b/test/integration/user_diaries_test.rb @@ -1,7 +1,7 @@ require "test_helper" class UserDiariesTest < ActionDispatch::IntegrationTest - fixtures :users, :diary_entries + fixtures :users # Test the creation of a diary entry, making sure that you are redirected to # login page when not logged in diff --git a/test/integration/user_login_test.rb b/test/integration/user_login_test.rb index a48933cf4..e442eba68 100644 --- a/test/integration/user_login_test.rb +++ b/test/integration/user_login_test.rb @@ -1,7 +1,7 @@ require "test_helper" class UserLoginTest < ActionDispatch::IntegrationTest - fixtures :users, :user_blocks + fixtures :users, :user_roles def setup OmniAuth.config.test_mode = true @@ -12,28 +12,16 @@ class UserLoginTest < ActionDispatch::IntegrationTest OmniAuth.config.mock_auth[:google] = nil OmniAuth.config.mock_auth[:facebook] = nil OmniAuth.config.mock_auth[:windowslive] = nil + OmniAuth.config.mock_auth[:github] = nil + OmniAuth.config.mock_auth[:wikipedia] = nil OmniAuth.config.test_mode = false end def test_login_email_password_normal user = users(:normal_user) - get "/login" - assert_response :redirect - assert_redirected_to :controller => :user, :action => :login, :cookie_test => true - follow_redirect! - assert_response :success + try_password_login user.email, "test" - post "/login", :username => user.email, :password => "wrong", :referer => "/history" - assert_response :redirect - follow_redirect! - assert_response :success - assert_template "login" - - post "/login", :username => user.email, :password => "test", :referer => "/history" - assert_response :redirect - follow_redirect! - assert_response :success assert_template "changeset/history" assert_select "span.username", "test" end @@ -41,22 +29,8 @@ class UserLoginTest < ActionDispatch::IntegrationTest def test_login_email_password_normal_upcase user = users(:normal_user) - get "/login" - assert_response :redirect - assert_redirected_to :controller => :user, :action => :login, :cookie_test => true - follow_redirect! - assert_response :success + try_password_login user.email.upcase, "test" - post "/login", :username => user.email.upcase, :password => "wrong", :referer => "/history" - assert_response :redirect - follow_redirect! - assert_response :success - assert_template "login" - - post "/login", :username => user.email.upcase, :password => "test", :referer => "/history" - assert_response :redirect - follow_redirect! - assert_response :success assert_template "changeset/history" assert_select "span.username", "TEST" end @@ -64,22 +38,8 @@ class UserLoginTest < ActionDispatch::IntegrationTest def test_login_email_password_normal_titlecase user = users(:normal_user) - get "/login" - assert_response :redirect - assert_redirected_to :controller => :user, :action => :login, :cookie_test => true - follow_redirect! - assert_response :success - - post "/login", :username => user.email.titlecase, :password => "wrong", :referer => "/history" - assert_response :redirect - follow_redirect! - assert_response :success - assert_template "login" + try_password_login user.email.titlecase, "test" - post "/login", :username => user.email.titlecase, :password => "test", :referer => "/history" - assert_response :redirect - follow_redirect! - assert_response :success assert_template "login" assert_select "span.username", false end @@ -87,22 +47,8 @@ class UserLoginTest < ActionDispatch::IntegrationTest def test_login_email_password_public user = users(:public_user) - get "/login" - assert_response :redirect - assert_redirected_to :controller => :user, :action => :login, :cookie_test => true - follow_redirect! - assert_response :success - - post "/login", :username => user.email, :password => "wrong", :referer => "/history" - assert_response :redirect - follow_redirect! - assert_response :success - assert_template "login" + try_password_login user.email, "test" - post "/login", :username => user.email, :password => "test", :referer => "/history" - assert_response :redirect - follow_redirect! - assert_response :success assert_template "changeset/history" assert_select "span.username", "test2" end @@ -110,22 +56,8 @@ class UserLoginTest < ActionDispatch::IntegrationTest def test_login_email_password_public_upcase user = users(:public_user) - get "/login" - assert_response :redirect - assert_redirected_to :controller => :user, :action => :login, :cookie_test => true - follow_redirect! - assert_response :success - - post "/login", :username => user.email.upcase, :password => "wrong", :referer => "/history" - assert_response :redirect - follow_redirect! - assert_response :success - assert_template "login" + try_password_login user.email.upcase, "test" - post "/login", :username => user.email.upcase, :password => "test", :referer => "/history" - assert_response :redirect - follow_redirect! - assert_response :success assert_template "changeset/history" assert_select "span.username", "test2" end @@ -133,22 +65,8 @@ class UserLoginTest < ActionDispatch::IntegrationTest def test_login_email_password_public_titlecase user = users(:public_user) - get "/login" - assert_response :redirect - assert_redirected_to :controller => :user, :action => :login, :cookie_test => true - follow_redirect! - assert_response :success - - post "/login", :username => user.email.titlecase, :password => "wrong", :referer => "/history" - assert_response :redirect - follow_redirect! - assert_response :success - assert_template "login" + try_password_login user.email.titlecase, "test" - post "/login", :username => user.email.titlecase, :password => "test", :referer => "/history" - assert_response :redirect - follow_redirect! - assert_response :success assert_template "changeset/history" assert_select "span.username", "test2" end @@ -156,223 +74,95 @@ class UserLoginTest < ActionDispatch::IntegrationTest def test_login_email_password_inactive user = users(:inactive_user) - get "/login" - assert_response :redirect - assert_redirected_to :controller => :user, :action => :login, :cookie_test => true - follow_redirect! - assert_response :success - - post "/login", :username => user.email, :password => "wrong", :referer => "/history" - assert_response :redirect - follow_redirect! - assert_response :success - assert_template "login" + try_password_login user.email, "test2" - post "/login", :username => user.email, :password => "test2", :referer => "/history" - assert_response :redirect - follow_redirect! - assert_response :success assert_template "confirm" + assert_select "span.username", false end def test_login_email_password_inactive_upcase user = users(:inactive_user) - get "/login" - assert_response :redirect - assert_redirected_to :controller => :user, :action => :login, :cookie_test => true - follow_redirect! - assert_response :success - - post "/login", :username => user.email.upcase, :password => "wrong", :referer => "/history" - assert_response :redirect - follow_redirect! - assert_response :success - assert_template "login" + try_password_login user.email.upcase, "test2" - post "/login", :username => user.email.upcase, :password => "test2", :referer => "/history" - assert_response :redirect - follow_redirect! - assert_response :success assert_template "confirm" + assert_select "span.username", false end def test_login_email_password_inactive_titlecase user = users(:inactive_user) - get "/login" - assert_response :redirect - assert_redirected_to :controller => :user, :action => :login, :cookie_test => true - follow_redirect! - assert_response :success - - post "/login", :username => user.email.titlecase, :password => "wrong", :referer => "/history" - assert_response :redirect - follow_redirect! - assert_response :success - assert_template "login" + try_password_login user.email.titlecase, "test2" - post "/login", :username => user.email.titlecase, :password => "test2", :referer => "/history" - assert_response :redirect - follow_redirect! - assert_response :success assert_template "confirm" + assert_select "span.username", false end def test_login_email_password_suspended user = users(:suspended_user) - get "/login" - assert_response :redirect - assert_redirected_to :controller => :user, :action => :login, :cookie_test => true - follow_redirect! - assert_response :success - - post "/login", :username => user.email, :password => "wrong", :referer => "/history" - assert_response :redirect - follow_redirect! - assert_response :success - assert_template "login" + try_password_login user.email, "test" - post "/login", :username => user.email, :password => "test", :referer => "/history" - assert_response :redirect - follow_redirect! - assert_response :success assert_template "login" + assert_select "span.username", false assert_select "div.flash.error", /your account has been suspended/ end def test_login_email_password_suspended_upcase user = users(:suspended_user) - get "/login" - assert_response :redirect - assert_redirected_to :controller => :user, :action => :login, :cookie_test => true - follow_redirect! - assert_response :success - - post "/login", :username => user.email.upcase, :password => "wrong", :referer => "/history" - assert_response :redirect - follow_redirect! - assert_response :success - assert_template "login" + try_password_login user.email.upcase, "test" - post "/login", :username => user.email.upcase, :password => "test", :referer => "/history" - assert_response :redirect - follow_redirect! - assert_response :success assert_template "login" + assert_select "span.username", false assert_select "div.flash.error", /your account has been suspended/ end def test_login_email_password_suspended_titlecase user = users(:suspended_user) - get "/login" - assert_response :redirect - assert_redirected_to :controller => :user, :action => :login, :cookie_test => true - follow_redirect! - assert_response :success - - post "/login", :username => user.email.titlecase, :password => "wrong", :referer => "/history" - assert_response :redirect - follow_redirect! - assert_response :success - assert_template "login" + try_password_login user.email.titlecase, "test" - post "/login", :username => user.email.titlecase, :password => "test", :referer => "/history" - assert_response :redirect - follow_redirect! - assert_response :success assert_template "login" + assert_select "span.username", false assert_select "div.flash.error", /your account has been suspended/ end def test_login_email_password_blocked user = users(:blocked_user) + create(:user_block, :needs_view, :user => user) - get "/login" - assert_response :redirect - assert_redirected_to :controller => :user, :action => :login, :cookie_test => true - follow_redirect! - assert_response :success - - post "/login", :username => user.email, :password => "wrong", :referer => "/history" - assert_response :redirect - follow_redirect! - assert_response :success - assert_template "login" + try_password_login user.email, "test" - post "/login", :username => user.email, :password => "test", :referer => "/history" - assert_response :redirect - follow_redirect! - assert_response :success assert_template "user_blocks/show" + assert_select "span.username", "blocked" end def test_login_email_password_blocked_upcase user = users(:blocked_user) + create(:user_block, :needs_view, :user => user) - get "/login" - assert_response :redirect - assert_redirected_to :controller => :user, :action => :login, :cookie_test => true - follow_redirect! - assert_response :success + try_password_login user.email.upcase, "test" - post "/login", :username => user.email.upcase, :password => "wrong", :referer => "/history" - assert_response :redirect - follow_redirect! - assert_response :success - assert_template "login" - - post "/login", :username => user.email.upcase, :password => "test", :referer => "/history" - assert_response :redirect - follow_redirect! - assert_response :success assert_template "user_blocks/show" + assert_select "span.username", "blocked" end def test_login_email_password_blocked_titlecase user = users(:blocked_user) + create(:user_block, :needs_view, :user => user) - get "/login" - assert_response :redirect - assert_redirected_to :controller => :user, :action => :login, :cookie_test => true - follow_redirect! - assert_response :success - - post "/login", :username => user.email.titlecase, :password => "wrong", :referer => "/history" - assert_response :redirect - follow_redirect! - assert_response :success - assert_template "login" + try_password_login user.email.titlecase, "test" - post "/login", :username => user.email.titlecase, :password => "test", :referer => "/history" - assert_response :redirect - follow_redirect! - assert_response :success assert_template "user_blocks/show" + assert_select "span.username", "blocked" end def test_login_username_password_normal user = users(:normal_user) - get "/login" - assert_response :redirect - assert_redirected_to :controller => :user, :action => :login, :cookie_test => true - follow_redirect! - assert_response :success - - post "/login", :username => user.display_name, :password => "wrong", :referer => "/history" - assert_response :redirect - follow_redirect! - assert_response :success - assert_template "login" + try_password_login user.display_name, "test" - post "/login", :username => user.display_name, :password => "test", :referer => "/history" - assert_response :redirect - follow_redirect! - assert_response :success assert_template "changeset/history" assert_select "span.username", "test" end @@ -380,22 +170,8 @@ class UserLoginTest < ActionDispatch::IntegrationTest def test_login_username_password_normal_upcase user = users(:normal_user) - get "/login" - assert_response :redirect - assert_redirected_to :controller => :user, :action => :login, :cookie_test => true - follow_redirect! - assert_response :success - - post "/login", :username => user.display_name.upcase, :password => "wrong", :referer => "/history" - assert_response :redirect - follow_redirect! - assert_response :success - assert_template "login" + try_password_login user.display_name.upcase, "test" - post "/login", :username => user.display_name.upcase, :password => "test", :referer => "/history" - assert_response :redirect - follow_redirect! - assert_response :success assert_template "changeset/history" assert_select "span.username", "TEST" end @@ -403,22 +179,8 @@ class UserLoginTest < ActionDispatch::IntegrationTest def test_login_username_password_normal_titlecase user = users(:normal_user) - get "/login" - assert_response :redirect - assert_redirected_to :controller => :user, :action => :login, :cookie_test => true - follow_redirect! - assert_response :success - - post "/login", :username => user.display_name.titlecase, :password => "wrong", :referer => "/history" - assert_response :redirect - follow_redirect! - assert_response :success - assert_template "login" + try_password_login user.display_name.titlecase, "test" - post "/login", :username => user.display_name.titlecase, :password => "test", :referer => "/history" - assert_response :redirect - follow_redirect! - assert_response :success assert_template "login" assert_select "span.username", false end @@ -426,22 +188,8 @@ class UserLoginTest < ActionDispatch::IntegrationTest def test_login_username_password_public user = users(:public_user) - get "/login" - assert_response :redirect - assert_redirected_to :controller => :user, :action => :login, :cookie_test => true - follow_redirect! - assert_response :success - - post "/login", :username => user.display_name, :password => "wrong", :referer => "/history" - assert_response :redirect - follow_redirect! - assert_response :success - assert_template "login" + try_password_login user.display_name, "test" - post "/login", :username => user.display_name, :password => "test", :referer => "/history" - assert_response :redirect - follow_redirect! - assert_response :success assert_template "changeset/history" assert_select "span.username", "test2" end @@ -449,22 +197,8 @@ class UserLoginTest < ActionDispatch::IntegrationTest def test_login_username_password_public_upcase user = users(:public_user) - get "/login" - assert_response :redirect - assert_redirected_to :controller => :user, :action => :login, :cookie_test => true - follow_redirect! - assert_response :success - - post "/login", :username => user.display_name.upcase, :password => "wrong", :referer => "/history" - assert_response :redirect - follow_redirect! - assert_response :success - assert_template "login" + try_password_login user.display_name.upcase, "test" - post "/login", :username => user.display_name.upcase, :password => "test", :referer => "/history" - assert_response :redirect - follow_redirect! - assert_response :success assert_template "changeset/history" assert_select "span.username", "test2" end @@ -472,22 +206,8 @@ class UserLoginTest < ActionDispatch::IntegrationTest def test_login_username_password_public_titlecase user = users(:public_user) - get "/login" - assert_response :redirect - assert_redirected_to :controller => :user, :action => :login, :cookie_test => true - follow_redirect! - assert_response :success - - post "/login", :username => user.display_name.titlecase, :password => "wrong", :referer => "/history" - assert_response :redirect - follow_redirect! - assert_response :success - assert_template "login" + try_password_login user.display_name.titlecase, "test" - post "/login", :username => user.display_name.titlecase, :password => "test", :referer => "/history" - assert_response :redirect - follow_redirect! - assert_response :success assert_template "changeset/history" assert_select "span.username", "test2" end @@ -495,217 +215,95 @@ class UserLoginTest < ActionDispatch::IntegrationTest def test_login_username_password_inactive user = users(:inactive_user) - get "/login" - assert_response :redirect - assert_redirected_to :controller => :user, :action => :login, :cookie_test => true - follow_redirect! - assert_response :success - - post "/login", :username => user.display_name, :password => "wrong", :referer => "/history" - assert_response :redirect - follow_redirect! - assert_response :success - assert_template "login" + try_password_login user.display_name, "test2" - post "/login", :username => user.display_name, :password => "test2", :referer => "/history" - assert_response :redirect - follow_redirect! - assert_response :success assert_template "confirm" + assert_select "span.username", false end def test_login_username_password_inactive_upcase user = users(:inactive_user) - get "/login" - assert_response :redirect - assert_redirected_to :controller => :user, :action => :login, :cookie_test => true - follow_redirect! - assert_response :success - - post "/login", :username => user.display_name.upcase, :password => "wrong", :referer => "/history" - assert_response :redirect - follow_redirect! - assert_response :success - assert_template "login" + try_password_login user.display_name.upcase, "test2" - post "/login", :username => user.display_name.upcase, :password => "test2", :referer => "/history" - assert_response :redirect - follow_redirect! - assert_response :success assert_template "confirm" + assert_select "span.username", false end def test_login_username_password_inactive_titlecase user = users(:inactive_user) - - get "/login" - assert_response :redirect - assert_redirected_to :controller => :user, :action => :login, :cookie_test => true - follow_redirect! - assert_response :success - - post "/login", :username => user.display_name.titlecase, :password => "wrong", :referer => "/history" - assert_response :redirect - follow_redirect! - assert_response :success - assert_template "login" - - post "/login", :username => user.display_name.titlecase, :password => "test2", :referer => "/history" - assert_response :redirect - follow_redirect! - assert_response :success + + try_password_login user.display_name.titlecase, "test2" + assert_template "confirm" + assert_select "span.username", false end def test_login_username_password_suspended user = users(:suspended_user) - get "/login" - assert_response :redirect - assert_redirected_to :controller => :user, :action => :login, :cookie_test => true - follow_redirect! - assert_response :success - - post "/login", :username => user.display_name, :password => "wrong", :referer => "/history" - assert_response :redirect - follow_redirect! - assert_response :success - assert_template "login" + try_password_login user.display_name, "test" - post "/login", :username => user.display_name, :password => "test", :referer => "/history" - assert_response :redirect - follow_redirect! - assert_response :success assert_template "login" + assert_select "span.username", false assert_select "div.flash.error", /your account has been suspended/ end def test_login_username_password_suspended_upcase user = users(:suspended_user) - get "/login" - assert_response :redirect - assert_redirected_to :controller => :user, :action => :login, :cookie_test => true - follow_redirect! - assert_response :success - - post "/login", :username => user.display_name.upcase, :password => "wrong", :referer => "/history" - assert_response :redirect - follow_redirect! - assert_response :success - assert_template "login" + try_password_login user.display_name.upcase, "test" - post "/login", :username => user.display_name.upcase, :password => "test", :referer => "/history" - assert_response :redirect - follow_redirect! - assert_response :success assert_template "login" + assert_select "span.username", false assert_select "div.flash.error", /your account has been suspended/ end def test_login_username_password_suspended_titlecase user = users(:suspended_user) - get "/login" - assert_response :redirect - assert_redirected_to :controller => :user, :action => :login, :cookie_test => true - follow_redirect! - assert_response :success - - post "/login", :username => user.display_name.titlecase, :password => "wrong", :referer => "/history" - assert_response :redirect - follow_redirect! - assert_response :success - assert_template "login" + try_password_login user.display_name.titlecase, "test" - post "/login", :username => user.display_name.titlecase, :password => "test", :referer => "/history" - assert_response :redirect - follow_redirect! - assert_response :success assert_template "login" + assert_select "span.username", false assert_select "div.flash.error", /your account has been suspended/ end def test_login_username_password_blocked user = users(:blocked_user) + create(:user_block, :needs_view, :user => user) - get "/login" - assert_response :redirect - assert_redirected_to :controller => :user, :action => :login, :cookie_test => true - follow_redirect! - assert_response :success - - post "/login", :username => user.display_name, :password => "wrong", :referer => "/history" - assert_response :redirect - follow_redirect! - assert_response :success - assert_template "login" + try_password_login user.display_name.upcase, "test" - post "/login", :username => user.display_name, :password => "test", :referer => "/history" - assert_response :redirect - follow_redirect! - assert_response :success assert_template "user_blocks/show" + assert_select "span.username", "blocked" end def test_login_username_password_blocked_upcase user = users(:blocked_user) + create(:user_block, :needs_view, :user => user) - get "/login" - assert_response :redirect - assert_redirected_to :controller => :user, :action => :login, :cookie_test => true - follow_redirect! - assert_response :success - - post "/login", :username => user.display_name.upcase, :password => "wrong", :referer => "/history" - assert_response :redirect - follow_redirect! - assert_response :success - assert_template "login" + try_password_login user.display_name, "test" - post "/login", :username => user.display_name.upcase, :password => "test", :referer => "/history" - assert_response :redirect - follow_redirect! - assert_response :success assert_template "user_blocks/show" + assert_select "span.username", "blocked" end def test_login_username_password_blocked_titlecase user = users(:blocked_user) + create(:user_block, :needs_view, :user => user) - get "/login" - assert_response :redirect - assert_redirected_to :controller => :user, :action => :login, :cookie_test => true - follow_redirect! - assert_response :success - - post "/login", :username => user.display_name.titlecase, :password => "wrong", :referer => "/history" - assert_response :redirect - follow_redirect! - assert_response :success - assert_template "login" + try_password_login user.display_name.titlecase, "test" - post "/login", :username => user.display_name.titlecase, :password => "test", :referer => "/history" - assert_response :redirect - follow_redirect! - assert_response :success assert_template "user_blocks/show" + assert_select "span.username", "blocked" end def test_login_email_password_remember_me user = users(:normal_user) - get "/login" - assert_response :redirect - assert_redirected_to :controller => :user, :action => :login, :cookie_test => true - follow_redirect! - assert_response :success + try_password_login user.email, "test", "yes" - post "/login", :username => user.email, :password => "test", :remember_me => true, :referer => "/history" - assert_response :redirect - follow_redirect! - assert_response :success assert_template "changeset/history" assert_select "span.username", "test" assert session.key?(:_remember_for) @@ -714,16 +312,8 @@ class UserLoginTest < ActionDispatch::IntegrationTest def test_login_username_password_remember_me user = users(:normal_user) - get "/login" - assert_response :redirect - assert_redirected_to :controller => :user, :action => :login, :cookie_test => true - follow_redirect! - assert_response :success + try_password_login user.display_name, "test", "yes" - post "/login", :username => user.display_name, :password => "test", :remember_me => true, :referer => "/history" - assert_response :redirect - follow_redirect! - assert_response :success assert_template "changeset/history" assert_select "span.username", "test" assert session.key?(:_remember_for) @@ -740,10 +330,10 @@ class UserLoginTest < ActionDispatch::IntegrationTest assert_template "user/login" post "/login", :openid_url => "http://localhost:1123/john.doe", :referer => "/history" assert_response :redirect - assert_redirected_to auth_path(:provider => "openid", :openid_url => "http://localhost:1123/john.doe", :origin => "/login") + assert_redirected_to auth_path(:provider => "openid", :openid_url => "http://localhost:1123/john.doe", :origin => "/login?referer=%2Fhistory", :referer => "/history") follow_redirect! assert_response :redirect - assert_redirected_to auth_success_path(:provider => "openid", :openid_url => "http://localhost:1123/john.doe", :origin => "/login") + assert_redirected_to auth_success_path(:provider => "openid", :openid_url => "http://localhost:1123/john.doe", :origin => "/login?referer=%2Fhistory", :referer => "/history") follow_redirect! assert_response :redirect follow_redirect! @@ -763,10 +353,10 @@ class UserLoginTest < ActionDispatch::IntegrationTest assert_template "user/login" post "/login", :openid_url => "http://localhost:1123/john.doe", :remember_me_openid => true, :referer => "/history" assert_response :redirect - assert_redirected_to auth_path(:provider => "openid", :openid_url => "http://localhost:1123/john.doe", :origin => "/login") + assert_redirected_to auth_path(:provider => "openid", :openid_url => "http://localhost:1123/john.doe", :origin => "/login?referer=%2Fhistory", :referer => "/history") follow_redirect! assert_response :redirect - assert_redirected_to auth_success_path(:provider => "openid", :openid_url => "http://localhost:1123/john.doe", :origin => "/login") + assert_redirected_to auth_success_path(:provider => "openid", :openid_url => "http://localhost:1123/john.doe", :origin => "/login?referer=%2Fhistory", :referer => "/history") follow_redirect! assert_response :redirect follow_redirect! @@ -787,13 +377,13 @@ class UserLoginTest < ActionDispatch::IntegrationTest assert_template "user/login" post "/login", :openid_url => "http://localhost:1123/john.doe", :referer => "/history" assert_response :redirect - assert_redirected_to auth_path(:provider => "openid", :openid_url => "http://localhost:1123/john.doe", :origin => "/login") + assert_redirected_to auth_path(:provider => "openid", :openid_url => "http://localhost:1123/john.doe", :origin => "/login?referer=%2Fhistory", :referer => "/history") follow_redirect! assert_response :redirect - assert_redirected_to auth_success_path(:provider => "openid", :openid_url => "http://localhost:1123/john.doe", :origin => "/login") + assert_redirected_to auth_success_path(:provider => "openid", :openid_url => "http://localhost:1123/john.doe", :origin => "/login?referer=%2Fhistory", :referer => "/history") follow_redirect! assert_response :redirect - assert_redirected_to auth_failure_path(:strategy => "openid", :message => "connection_failed", :origin => "/login") + assert_redirected_to auth_failure_path(:strategy => "openid", :message => "connection_failed", :origin => "/login?referer=%2Fhistory") follow_redirect! assert_response :redirect follow_redirect! @@ -814,13 +404,13 @@ class UserLoginTest < ActionDispatch::IntegrationTest assert_template "user/login" post "/login", :openid_url => "http://localhost:1123/john.doe", :referer => "/history" assert_response :redirect - assert_redirected_to auth_path(:provider => "openid", :openid_url => "http://localhost:1123/john.doe", :origin => "/login") + assert_redirected_to auth_path(:provider => "openid", :openid_url => "http://localhost:1123/john.doe", :origin => "/login?referer=%2Fhistory", :referer => "/history") follow_redirect! assert_response :redirect - assert_redirected_to auth_success_path(:provider => "openid", :openid_url => "http://localhost:1123/john.doe", :origin => "/login") + assert_redirected_to auth_success_path(:provider => "openid", :openid_url => "http://localhost:1123/john.doe", :origin => "/login?referer=%2Fhistory", :referer => "/history") follow_redirect! assert_response :redirect - assert_redirected_to auth_failure_path(:strategy => "openid", :message => "invalid_credentials", :origin => "/login") + assert_redirected_to auth_failure_path(:strategy => "openid", :message => "invalid_credentials", :origin => "/login?referer=%2Fhistory") follow_redirect! assert_response :redirect follow_redirect! @@ -841,10 +431,10 @@ class UserLoginTest < ActionDispatch::IntegrationTest assert_template "user/login" post "/login", :openid_url => "http://localhost:1123/fred.bloggs", :referer => "/history" assert_response :redirect - assert_redirected_to auth_path(:provider => "openid", :openid_url => "http://localhost:1123/fred.bloggs", :origin => "/login") + assert_redirected_to auth_path(:provider => "openid", :openid_url => "http://localhost:1123/fred.bloggs", :origin => "/login?referer=%2Fhistory", :referer => "/history") follow_redirect! assert_response :redirect - assert_redirected_to auth_success_path(:provider => "openid", :openid_url => "http://localhost:1123/fred.bloggs", :origin => "/login") + assert_redirected_to auth_success_path(:provider => "openid", :openid_url => "http://localhost:1123/fred.bloggs", :origin => "/login?referer=%2Fhistory", :referer => "/history") follow_redirect! assert_response :redirect follow_redirect! @@ -864,7 +454,7 @@ class UserLoginTest < ActionDispatch::IntegrationTest follow_redirect! assert_response :success assert_template "user/login" - get auth_path(:provider => "google", :origin => "/login") + get auth_path(:provider => "google", :origin => "/login?referer=%2Fhistory", :referer => "/history") assert_response :redirect assert_redirected_to auth_success_path(:provider => "google") follow_redirect! @@ -884,12 +474,12 @@ class UserLoginTest < ActionDispatch::IntegrationTest follow_redirect! assert_response :success assert_template "user/login" - get auth_path(:provider => "google", :origin => "/login") + get auth_path(:provider => "google", :origin => "/login?referer=%2Fhistory", :referer => "/history") assert_response :redirect assert_redirected_to auth_success_path(:provider => "google") follow_redirect! assert_response :redirect - assert_redirected_to auth_failure_path(:strategy => "google", :message => "connection_failed", :origin => "/login") + assert_redirected_to auth_failure_path(:strategy => "google", :message => "connection_failed", :origin => "/login?referer=%2Fhistory") follow_redirect! assert_response :redirect follow_redirect! @@ -908,12 +498,12 @@ class UserLoginTest < ActionDispatch::IntegrationTest follow_redirect! assert_response :success assert_template "user/login" - get auth_path(:provider => "google", :origin => "/login") + get auth_path(:provider => "google", :origin => "/login?referer=%2Fhistory", :referer => "/history") assert_response :redirect assert_redirected_to auth_success_path(:provider => "google") follow_redirect! assert_response :redirect - assert_redirected_to auth_failure_path(:strategy => "google", :message => "invalid_credentials", :origin => "/login") + assert_redirected_to auth_failure_path(:strategy => "google", :message => "invalid_credentials", :origin => "/login?referer=%2Fhistory") follow_redirect! assert_response :redirect follow_redirect! @@ -934,7 +524,7 @@ class UserLoginTest < ActionDispatch::IntegrationTest follow_redirect! assert_response :success assert_template "user/login" - get auth_path(:provider => "google", :origin => "/login") + get auth_path(:provider => "google", :origin => "/login?referer=%2Fhistory", :referer => "/history") assert_response :redirect assert_redirected_to auth_success_path(:provider => "google") follow_redirect! @@ -956,7 +546,7 @@ class UserLoginTest < ActionDispatch::IntegrationTest follow_redirect! assert_response :success assert_template "user/login" - get auth_path(:provider => "google", :origin => "/login") + get auth_path(:provider => "google", :origin => "/login?referer=%2Fhistory", :referer => "/history") assert_response :redirect assert_redirected_to auth_success_path(:provider => "google") follow_redirect! @@ -966,7 +556,7 @@ class UserLoginTest < ActionDispatch::IntegrationTest assert_template "changeset/history" assert_select "span.username", "openIDuser" - user = User.find_by_display_name("openIDuser") + user = User.find_by(:display_name => "openIDuser") assert_equal "google", user.auth_provider assert_equal "987654321", user.auth_uid end @@ -980,7 +570,7 @@ class UserLoginTest < ActionDispatch::IntegrationTest follow_redirect! assert_response :success assert_template "user/login" - get auth_path(:provider => "facebook", :origin => "/login") + get auth_path(:provider => "facebook", :origin => "/login?referer=%2Fhistory", :referer => "/history") assert_response :redirect assert_redirected_to auth_success_path(:provider => "facebook") follow_redirect! @@ -1000,12 +590,12 @@ class UserLoginTest < ActionDispatch::IntegrationTest follow_redirect! assert_response :success assert_template "user/login" - get auth_path(:provider => "facebook", :origin => "/login") + get auth_path(:provider => "facebook", :origin => "/login?referer=%2Fhistory", :referer => "/history") assert_response :redirect assert_redirected_to auth_success_path(:provider => "facebook") follow_redirect! assert_response :redirect - assert_redirected_to auth_failure_path(:strategy => "facebook", :message => "connection_failed", :origin => "/login") + assert_redirected_to auth_failure_path(:strategy => "facebook", :message => "connection_failed", :origin => "/login?referer=%2Fhistory") follow_redirect! assert_response :redirect follow_redirect! @@ -1024,12 +614,12 @@ class UserLoginTest < ActionDispatch::IntegrationTest follow_redirect! assert_response :success assert_template "user/login" - get auth_path(:provider => "facebook", :origin => "/login") + get auth_path(:provider => "facebook", :origin => "/login?referer=%2Fhistory", :referer => "/history") assert_response :redirect assert_redirected_to auth_success_path(:provider => "facebook") follow_redirect! assert_response :redirect - assert_redirected_to auth_failure_path(:strategy => "facebook", :message => "invalid_credentials", :origin => "/login") + assert_redirected_to auth_failure_path(:strategy => "facebook", :message => "invalid_credentials", :origin => "/login?referer=%2Fhistory") follow_redirect! assert_response :redirect follow_redirect! @@ -1048,7 +638,7 @@ class UserLoginTest < ActionDispatch::IntegrationTest follow_redirect! assert_response :success assert_template "user/login" - get auth_path(:provider => "facebook", :origin => "/login") + get auth_path(:provider => "facebook", :origin => "/login?referer=%2Fhistory", :referer => "/history") assert_response :redirect assert_redirected_to auth_success_path(:provider => "facebook") follow_redirect! @@ -1068,9 +658,9 @@ class UserLoginTest < ActionDispatch::IntegrationTest follow_redirect! assert_response :success assert_template "user/login" - get auth_path(:provider => "windowslive", :origin => "/login") + get auth_path(:provider => "windowslive", :origin => "/login?referer=%2Fhistory", :referer => "/history") assert_response :redirect - assert_redirected_to auth_success_path(:provider => "windowslive") + assert_redirected_to auth_success_path(:provider => "windowslive", :origin => "/login?referer=%2Fhistory", :referer => "/history") follow_redirect! assert_response :redirect follow_redirect! @@ -1088,12 +678,12 @@ class UserLoginTest < ActionDispatch::IntegrationTest follow_redirect! assert_response :success assert_template "user/login" - get auth_path(:provider => "windowslive", :origin => "/login") + get auth_path(:provider => "windowslive", :origin => "/login?referer=%2Fhistory", :referer => "/history") assert_response :redirect - assert_redirected_to auth_success_path(:provider => "windowslive") + assert_redirected_to auth_success_path(:provider => "windowslive", :origin => "/login?referer=%2Fhistory", :referer => "/history") follow_redirect! assert_response :redirect - assert_redirected_to auth_failure_path(:strategy => "windowslive", :message => "connection_failed", :origin => "/login") + assert_redirected_to auth_failure_path(:strategy => "windowslive", :message => "connection_failed", :origin => "/login?referer=%2Fhistory") follow_redirect! assert_response :redirect follow_redirect! @@ -1112,12 +702,12 @@ class UserLoginTest < ActionDispatch::IntegrationTest follow_redirect! assert_response :success assert_template "user/login" - get auth_path(:provider => "windowslive", :origin => "/login") + get auth_path(:provider => "windowslive", :origin => "/login?referer=%2Fhistory", :referer => "/history") assert_response :redirect - assert_redirected_to auth_success_path(:provider => "windowslive") + assert_redirected_to auth_success_path(:provider => "windowslive", :origin => "/login?referer=%2Fhistory", :referer => "/history") follow_redirect! assert_response :redirect - assert_redirected_to auth_failure_path(:strategy => "windowslive", :message => "invalid_credentials", :origin => "/login") + assert_redirected_to auth_failure_path(:strategy => "windowslive", :message => "invalid_credentials", :origin => "/login?referer=%2Fhistory") follow_redirect! assert_response :redirect follow_redirect! @@ -1136,9 +726,185 @@ class UserLoginTest < ActionDispatch::IntegrationTest follow_redirect! assert_response :success assert_template "user/login" - get auth_path(:provider => "windowslive", :origin => "/login") + get auth_path(:provider => "windowslive", :origin => "/login?referer=%2Fhistory", :referer => "/history") + assert_response :redirect + assert_redirected_to auth_success_path(:provider => "windowslive", :origin => "/login?referer=%2Fhistory", :referer => "/history") + follow_redirect! + assert_response :redirect + follow_redirect! + assert_response :success + assert_template "user/new" + assert_select "span.username", false + end + + def test_login_github_success + OmniAuth.config.add_mock(:github, :uid => "123456789") + + get "/login", :referer => "/history" + assert_response :redirect + assert_redirected_to "controller" => "user", "action" => "login", "cookie_test" => "true", "referer" => "/history" + follow_redirect! + assert_response :success + assert_template "user/login" + get auth_path(:provider => "github", :origin => "/login?referer=%2Fhistory", :referer => "/history") + assert_response :redirect + assert_redirected_to auth_success_path(:provider => "github", :origin => "/login?referer=%2Fhistory", :referer => "/history") + follow_redirect! + assert_response :redirect + follow_redirect! + assert_response :success + assert_template "changeset/history" + assert_select "span.username", "githubuser" + end + + def test_login_github_connection_failed + OmniAuth.config.mock_auth[:github] = :connection_failed + + get "/login", :referer => "/history" + assert_response :redirect + assert_redirected_to "controller" => "user", "action" => "login", "cookie_test" => "true", "referer" => "/history" + follow_redirect! + assert_response :success + assert_template "user/login" + get auth_path(:provider => "github", :origin => "/login?referer=%2Fhistory", :referer => "/history") + assert_response :redirect + assert_redirected_to auth_success_path(:provider => "github", :origin => "/login?referer=%2Fhistory", :referer => "/history") + follow_redirect! + assert_response :redirect + assert_redirected_to auth_failure_path(:strategy => "github", :message => "connection_failed", :origin => "/login?referer=%2Fhistory") + follow_redirect! + assert_response :redirect + follow_redirect! + assert_response :success + assert_template "login" + assert_select "div.flash.error", "Connection to authentication provider failed" + assert_select "span.username", false + end + + def test_login_github_invalid_credentials + OmniAuth.config.mock_auth[:github] = :invalid_credentials + + get "/login", :referer => "/history" + assert_response :redirect + assert_redirected_to "controller" => "user", "action" => "login", "cookie_test" => "true", "referer" => "/history" + follow_redirect! + assert_response :success + assert_template "user/login" + get auth_path(:provider => "github", :origin => "/login?referer=%2Fhistory", :referer => "/history") + assert_response :redirect + assert_redirected_to auth_success_path(:provider => "github", :origin => "/login?referer=%2Fhistory", :referer => "/history") + follow_redirect! + assert_response :redirect + assert_redirected_to auth_failure_path(:strategy => "github", :message => "invalid_credentials", :origin => "/login?referer=%2Fhistory") + follow_redirect! + assert_response :redirect + follow_redirect! + assert_response :success + assert_template "login" + assert_select "div.flash.error", "Invalid authentication credentials" + assert_select "span.username", false + end + + def test_login_github_unknown + OmniAuth.config.add_mock(:github, :uid => "987654321") + + get "/login", :referer => "/history" + assert_response :redirect + assert_redirected_to "controller" => "user", "action" => "login", "cookie_test" => "true", "referer" => "/history" + follow_redirect! + assert_response :success + assert_template "user/login" + get auth_path(:provider => "github", :origin => "/login?referer=%2Fhistory", :referer => "/history") + assert_response :redirect + assert_redirected_to auth_success_path(:provider => "github", :origin => "/login?referer=%2Fhistory", :referer => "/history") + follow_redirect! + assert_response :redirect + follow_redirect! + assert_response :success + assert_template "user/new" + assert_select "span.username", false + end + + def test_login_wikipedia_success + OmniAuth.config.add_mock(:wikipedia, :uid => "123456789") + + get "/login", :referer => "/history" + assert_response :redirect + assert_redirected_to "controller" => "user", "action" => "login", "cookie_test" => "true", "referer" => "/history" + follow_redirect! + assert_response :success + assert_template "user/login" + get auth_path(:provider => "wikipedia", :origin => "/login?referer=%2Fhistory", :referer => "/history") + assert_response :redirect + assert_redirected_to auth_success_path(:provider => "wikipedia", :origin => "/login?referer=%2Fhistory", :referer => "/history") + follow_redirect! + assert_response :redirect + follow_redirect! + assert_response :success + assert_template "changeset/history" + assert_select "span.username", "wikipediauser" + end + + def test_login_wikipedia_connection_failed + OmniAuth.config.mock_auth[:wikipedia] = :connection_failed + + get "/login", :referer => "/history" + assert_response :redirect + assert_redirected_to "controller" => "user", "action" => "login", "cookie_test" => "true", "referer" => "/history" + follow_redirect! + assert_response :success + assert_template "user/login" + get auth_path(:provider => "wikipedia", :origin => "/login?referer=%2Fhistory", :referer => "/history") + assert_response :redirect + assert_redirected_to auth_success_path(:provider => "wikipedia", :origin => "/login?referer=%2Fhistory", :referer => "/history") + follow_redirect! + assert_response :redirect + assert_redirected_to auth_failure_path(:strategy => "wikipedia", :message => "connection_failed", :origin => "/login?referer=%2Fhistory") + follow_redirect! + assert_response :redirect + follow_redirect! + assert_response :success + assert_template "login" + assert_select "div.flash.error", "Connection to authentication provider failed" + assert_select "span.username", false + end + + def test_login_wikipedia_invalid_credentials + OmniAuth.config.mock_auth[:wikipedia] = :invalid_credentials + + get "/login", :referer => "/history" + assert_response :redirect + assert_redirected_to "controller" => "user", "action" => "login", "cookie_test" => "true", "referer" => "/history" + follow_redirect! + assert_response :success + assert_template "user/login" + get auth_path(:provider => "wikipedia", :origin => "/login?referer=%2Fhistory", :referer => "/history") + assert_response :redirect + assert_redirected_to auth_success_path(:provider => "wikipedia", :origin => "/login?referer=%2Fhistory", :referer => "/history") + follow_redirect! + assert_response :redirect + assert_redirected_to auth_failure_path(:strategy => "wikipedia", :message => "invalid_credentials", :origin => "/login?referer=%2Fhistory") + follow_redirect! + assert_response :redirect + follow_redirect! + assert_response :success + assert_template "login" + assert_select "div.flash.error", "Invalid authentication credentials" + assert_select "span.username", false + end + + def test_login_wikipedia_unknown + OmniAuth.config.add_mock(:wikipedia, :uid => "987654321") + + get "/login", :referer => "/history" + assert_response :redirect + assert_redirected_to "controller" => "user", "action" => "login", "cookie_test" => "true", "referer" => "/history" + follow_redirect! + assert_response :success + assert_template "user/login" + get auth_path(:provider => "wikipedia", :origin => "/login?referer=%2Fhistory", :referer => "/history") assert_response :redirect - assert_redirected_to auth_success_path(:provider => "windowslive") + assert_redirected_to auth_success_path(:provider => "wikipedia", :origin => "/login?referer=%2Fhistory", :referer => "/history") follow_redirect! assert_response :redirect follow_redirect! @@ -1146,4 +912,44 @@ class UserLoginTest < ActionDispatch::IntegrationTest assert_template "user/new" assert_select "span.username", false end + + private + + def try_password_login(username, password, remember_me = nil) + get "/login" + assert_response :redirect + assert_redirected_to :controller => :user, :action => :login, :cookie_test => true + follow_redirect! + assert_response :success + assert_template "login" + assert_select "input#username", 1 do + assert_select "[value]", false + end + assert_select "input#password", 1 do + assert_select "[value=?]", "" + end + assert_select "input#remember_me", 1 do + assert_select "[checked]", false + end + + post "/login", :username => username, :password => "wrong", :remember_me => remember_me, :referer => "/history" + assert_response :redirect + follow_redirect! + assert_response :success + assert_template "login" + assert_select "input#username", 1 do + assert_select "[value=?]", username + end + assert_select "input#password", 1 do + assert_select "[value=?]", "" + end + assert_select "input#remember_me", 1 do + assert_select "[checked]", remember_me == "yes" + end + + post "/login", :username => username, :password => password, :remember_me => remember_me, :referer => "/history" + assert_response :redirect + follow_redirect! + assert_response :success + end end diff --git a/test/integration/user_roles_test.rb b/test/integration/user_roles_test.rb index 573243025..edf1c7c4a 100644 --- a/test/integration/user_roles_test.rb +++ b/test/integration/user_roles_test.rb @@ -3,6 +3,10 @@ require "test_helper" class UserRolesTest < ActionDispatch::IntegrationTest fixtures :users, :user_roles + def setup + stub_hostip_requests + end + test "grant" do check_fail(:grant, :public_user, :moderator) check_fail(:grant, :moderator_user, :moderator) diff --git a/test/integration/user_terms_seen_test.rb b/test/integration/user_terms_seen_test.rb index a664feeb0..e8d3df07a 100644 --- a/test/integration/user_terms_seen_test.rb +++ b/test/integration/user_terms_seen_test.rb @@ -3,6 +3,10 @@ require "test_helper" class UserTermsSeenTest < ActionDispatch::IntegrationTest fixtures :users + def setup + stub_hostip_requests + end + def test_api_blocked with_terms_seen(true) do user = users(:terms_not_seen_user) diff --git a/test/lib/bounding_box_test.rb b/test/lib/bounding_box_test.rb index 834d217cb..dc62531f5 100644 --- a/test/lib/bounding_box_test.rb +++ b/test/lib/bounding_box_test.rb @@ -21,13 +21,13 @@ class BoundingBoxTest < ActiveSupport::TestCase @bad_positive_boundary_bbox = %w(181,91,0,0 0,0,181,91) @bad_negative_boundary_bbox = %w(-181,-91,0,0 0,0,-181,-91) - @bad_big_bbox = %w(-0.1,-0.1,1.1,1.1 10,10,11,11) - @bad_malformed_bbox = %w(-0.1 hello 10N2W10.1N2.1W) - @bad_lat_mixed_bbox = %w(0,0.1,0.1,0 -0.1,80,0.1,70 0.24,54.34,0.25,54.33) - @bad_lon_mixed_bbox = %w(80,-0.1,70,0.1 54.34,0.24,54.33,0.25) + @bad_big_bbox = %w(-0.1,-0.1,1.1,1.1 10,10,11,11) + @bad_malformed_bbox = %w(-0.1 hello 10N2W10.1N2.1W) + @bad_lat_mixed_bbox = %w(0,0.1,0.1,0 -0.1,80,0.1,70 0.24,54.34,0.25,54.33) + @bad_lon_mixed_bbox = %w(80,-0.1,70,0.1 54.34,0.24,54.33,0.25) @bad_limit_bbox = %w(-180.1,-90,180,90 -180,-90.1,180,90 -180,-90,180.1,90 -180,-90,180,90.1) - @good_bbox = %w(-0.1,-0.1,0.1,0.1 51.1,-0.1,51.2,0 -0.1,%20-0.1,%200.1,%200.1 - -0.1edcd,-0.1d,0.1,0.1 -0.1E,-0.1E,0.1S,0.1N S0.1,W0.1,N0.1,E0.1) + @good_bbox = %w(-0.1,-0.1,0.1,0.1 51.1,-0.1,51.2,0 -0.1,%20-0.1,%200.1,%200.1 + -0.1edcd,-0.1d,0.1,0.1 -0.1E,-0.1E,0.1S,0.1N S0.1,W0.1,N0.1,E0.1) @expand_min_lon_array = %w(2,10,10,10 1,10,10,10 0,10,10,10 -1,10,10,10 -2,10,10,10 -8,10,10,10) @expand_min_lat_array = %w(10,2,10,10 10,1,10,10 10,0,10,10 10,-1,10,10 10,-2,10,10 10,-8,10,10) @@ -312,9 +312,9 @@ class BoundingBoxTest < ActiveSupport::TestCase end def check_bbox(bbox, result) - assert_equal result[0], bbox.min_lon, "min_lon" - assert_equal result[1], bbox.min_lat, "min_lat" - assert_equal result[2], bbox.max_lon, "max_lon" - assert_equal result[3], bbox.max_lat, "max_lat" + assert_equal_allowing_nil result[0], bbox.min_lon, "min_lon" + assert_equal_allowing_nil result[1], bbox.min_lat, "min_lat" + assert_equal_allowing_nil result[2], bbox.max_lon, "max_lon" + assert_equal_allowing_nil result[3], bbox.max_lat, "max_lat" end end diff --git a/test/lib/country_test.rb b/test/lib/country_test.rb index cc726e6f7..0e21a9ed8 100644 --- a/test/lib/country_test.rb +++ b/test/lib/country_test.rb @@ -2,7 +2,7 @@ require "test_helper" class CountryTest < ActiveSupport::TestCase def test_gb - gb = Country.find_by_code("GB") + gb = Country.find("GB") assert_not_nil gb assert_equal "GB", gb.code assert_equal -8.623555, gb.min_lon @@ -12,7 +12,7 @@ class CountryTest < ActiveSupport::TestCase end def test_au - au = Country.find_by_code("AU") + au = Country.find("AU") assert_not_nil au assert_equal "AU", au.code assert_equal 112.911057, au.min_lon @@ -22,7 +22,7 @@ class CountryTest < ActiveSupport::TestCase end def test_xx - xx = Country.find_by_code("XX") + xx = Country.find("XX") assert_nil xx end end diff --git a/test/lib/i18n_test.rb b/test/lib/i18n_test.rb index 09965e950..c18c2f346 100644 --- a/test/lib/i18n_test.rb +++ b/test/lib/i18n_test.rb @@ -15,12 +15,12 @@ class I18nTest < ActiveSupport::TestCase default_value.each do |_subkey, subvalue| subvalue.scan(/%\{(\w+)\}/) do - variables.push($1) + variables.push(Regexp.last_match(1)) end end else default_value.scan(/%\{(\w+)\}/) do - variables.push($1) + variables.push(Regexp.last_match(1)) end end @@ -37,14 +37,14 @@ class I18nTest < ActiveSupport::TestCase next if subvalue.nil? subvalue.scan(/%\{(\w+)\}/) do - assert variables.include?($1), "#{key}.#{subkey} uses unknown interpolation variable #{$1}" + assert variables.include?(Regexp.last_match(1)), "#{key}.#{subkey} uses unknown interpolation variable #{Regexp.last_match(1)}" end end else assert value.is_a?(String), "#{key} is not a string" value.scan(/%\{(\w+)\}/) do - assert variables.include?($1), "#{key} uses unknown interpolation variable #{$1}" + assert variables.include?(Regexp.last_match(1)), "#{key} uses unknown interpolation variable #{Regexp.last_match(1)}" end end end diff --git a/test/lib/locale_test.rb b/test/lib/locale_test.rb new file mode 100644 index 000000000..65c7ea398 --- /dev/null +++ b/test/lib/locale_test.rb @@ -0,0 +1,99 @@ +require "test_helper" + +class LocaleTest < ActiveSupport::TestCase + EN = Locale.new("en") + EN_GB = Locale.new("en", nil, "GB") + FR = Locale.new("fr") + ZH_HANS = Locale.new("zh", "Hans") + ZH_HANT_TW = Locale.new("zh", "Hant", "TW") + ZH_YUE = Locale.new("zh-yue") + BE_TARASK = Locale.new("be", nil, nil, "tarask") + + def test_tag + assert_equal EN, Locale.tag("en") + assert_equal EN_GB, Locale.tag("en-GB") + assert_equal FR, Locale.tag("fr") + assert_equal ZH_HANS, Locale.tag("zh-Hans") + assert_equal ZH_HANT_TW, Locale.tag("zh-Hant-TW") + assert_equal ZH_YUE, Locale.tag("zh-yue") + assert_equal BE_TARASK, Locale.tag("be-tarask") + end + + def test_language + assert_equal EN.language, Locale.tag("en").language + assert_equal EN_GB.language, Locale.tag("en-GB").language + assert_equal FR.language, Locale.tag("fr").language + assert_equal ZH_HANS.language, Locale.tag("zh-Hans").language + assert_equal ZH_HANT_TW.language, Locale.tag("zh-Hant-TW").language + assert_equal ZH_YUE.language, Locale.tag("zh-yue").language + assert_equal ZH_YUE.language, Locale.tag("zh-YUE").language + assert_equal BE_TARASK.language, Locale.tag("be-tarask").language + assert_equal BE_TARASK.language, Locale.tag("be-Tarask").language + end + + def test_script + assert_equal_allowing_nil EN.script, Locale.tag("en").script + assert_equal_allowing_nil EN_GB.script, Locale.tag("en-GB").script + assert_equal_allowing_nil FR.script, Locale.tag("fr").script + assert_equal_allowing_nil ZH_HANS.script, Locale.tag("zh-Hans").script + assert_equal_allowing_nil ZH_HANT_TW.script, Locale.tag("zh-Hant-TW").script + assert_equal_allowing_nil ZH_YUE.script, Locale.tag("zh-yue").script + assert_equal_allowing_nil ZH_YUE.script, Locale.tag("zh-YUE").script + assert_equal_allowing_nil BE_TARASK.script, Locale.tag("be-tarask").script + assert_equal_allowing_nil BE_TARASK.script, Locale.tag("be-Tarask").script + end + + def test_region + assert_equal_allowing_nil EN.region, Locale.tag("en").region + assert_equal_allowing_nil EN_GB.region, Locale.tag("en-GB").region + assert_equal_allowing_nil FR.region, Locale.tag("fr").region + assert_equal_allowing_nil ZH_HANS.region, Locale.tag("zh-Hans").region + assert_equal_allowing_nil ZH_HANT_TW.region, Locale.tag("zh-Hant-TW").region + assert_equal_allowing_nil ZH_YUE.region, Locale.tag("zh-yue").region + assert_equal_allowing_nil ZH_YUE.region, Locale.tag("zh-YUE").region + assert_equal_allowing_nil BE_TARASK.region, Locale.tag("be-tarask").region + assert_equal_allowing_nil BE_TARASK.region, Locale.tag("be-Tarask").region + end + + def test_variant + assert_equal_allowing_nil EN.variant, Locale.tag("en").variant + assert_equal_allowing_nil EN_GB.variant, Locale.tag("en-GB").variant + assert_equal_allowing_nil FR.variant, Locale.tag("fr").variant + assert_equal_allowing_nil ZH_HANS.variant, Locale.tag("zh-Hans").variant + assert_equal_allowing_nil ZH_HANT_TW.variant, Locale.tag("zh-Hant-TW").variant + assert_equal_allowing_nil ZH_YUE.variant, Locale.tag("zh-yue").variant + assert_equal_allowing_nil ZH_YUE.variant, Locale.tag("zh-YUE").variant + assert_equal_allowing_nil BE_TARASK.variant, Locale.tag("be-tarask").variant + assert_equal_allowing_nil BE_TARASK.variant, Locale.tag("be-Tarask").variant + end + + def test_list + assert_equal [], Locale.list + assert_equal [EN], Locale.list("en") + assert_equal [EN, ZH_YUE, ZH_HANT_TW], Locale.list("en", "zh-yue", "zh-Hant-TW") + assert_equal [ZH_YUE, ZH_HANT_TW], Locale.list("en;de", "zh-yue", "zh-Hant-TW") + assert_equal [ZH_YUE, ZH_HANT_TW], Locale.list(["en;de", "zh-yue", "zh-Hant-TW"]) + end + + def test_default + assert_equal EN, Locale.default + end + + def test_available + assert_equal I18n.available_locales.count, Locale.available.count + end + + def test_preferred + assert_equal "en-GB", Locale.available.preferred(Locale.list("en-GB", "en")).to_s + assert_equal "en", Locale.available.preferred(Locale.list("en")).to_s + assert_equal "fr", Locale.available.preferred(Locale.list("fr-GB", "fr", "en")).to_s + assert_equal "fr", Locale.available.preferred(Locale.list("fr", "en")).to_s + assert_equal "de", Locale.available.preferred(Locale.list("zh-Hant", "de")).to_s + assert_equal "zh-TW", Locale.available.preferred(Locale.list("zh-Hant-TW", "de")).to_s + assert_equal "zh-TW", Locale.available.preferred(Locale.list("zh-TW", "de")).to_s + assert_equal "zh-HK", Locale.available.preferred(Locale.list("yue", "zh-HK", "de")).to_s + assert_equal "zh-yue", Locale.available. preferred(Locale.list("yue", "zh-yue", "zh-HK", "de")).to_s + assert_equal "zh-yue", Locale.available. preferred(Locale.list("yue", "zh-YUE", "zh-HK", "de")).to_s + assert_equal "en", Locale.available.preferred(Locale.list("yue")).to_s + end +end diff --git a/test/lib/password_hash_test.rb b/test/lib/password_hash_test.rb index c481cc767..6f54a0d7a 100644 --- a/test/lib/password_hash_test.rb +++ b/test/lib/password_hash_test.rb @@ -14,6 +14,20 @@ class PasswordHashTest < ActiveSupport::TestCase assert_equal true, PasswordHash.upgrade?("67a1e09bb1f83f5007dc119c14d663aa", "salt") end + def test_pbkdf2_1000_32_sha512 + assert_equal true, PasswordHash.check("ApT/28+FsTBLa/J8paWfgU84SoRiTfeY8HjKWhgHy08=", "sha512!1000!HR4z+hAvKV2ra1gpbRybtoNzm/CNKe4cf7bPKwdUNrk=", "password") + assert_equal false, PasswordHash.check("ApT/28+FsTBLa/J8paWfgU84SoRiTfeY8HjKWhgHy08=", "sha512!1000!HR4z+hAvKV2ra1gpbRybtoNzm/CNKe4cf7bPKwdUNrk=", "wrong") + assert_equal false, PasswordHash.check("ApT/28+FsTBLa/J8paWfgU84SoRiTfeY8HjKWhgHy08=", "sha512!1000!HR4z+hAvKV2ra1gwrongtoNzm/CNKe4cf7bPKwdUNrk=", "password") + assert_equal true, PasswordHash.upgrade?("ApT/28+FsTBLa/J8paWfgU84SoRiTfeY8HjKWhgHy08=", "sha512!1000!HR4z+hAvKV2ra1gpbRybtoNzm/CNKe4cf7bPKwdUNrk=") + end + + def test_pbkdf2_10000_32_sha512 + assert_equal true, PasswordHash.check("3wYbPiOxk/tU0eeIDjUhdvi8aDP3AbFtwYKKxF1IhGg=", "sha512!10000!OUQLgtM7eD8huvanFT5/WtWaCwdOdrir8QOtFwxhO0A=", "password") + assert_equal false, PasswordHash.check("3wYbPiOxk/tU0eeIDjUhdvi8aDP3AbFtwYKKxF1IhGg=", "sha512!10000!OUQLgtM7eD8huvanFT5/WtWaCwdOdrir8QOtFwxhO0A=", "wrong") + assert_equal false, PasswordHash.check("3wYbPiOxk/tU0eeIDjUhdvi8aDP3AbFtwYKKxF1IhGg=", "sha512!10000!OUQLgtMwronguvanFT5/WtWaCwdOdrir8QOtFwxhO0A=", "password") + assert_equal false, PasswordHash.upgrade?("3wYbPiOxk/tU0eeIDjUhdvi8aDP3AbFtwYKKxF1IhGg=", "sha512!10000!OUQLgtM7eD8huvanFT5/WtWaCwdOdrir8QOtFwxhO0A=") + end + def test_default hash1, salt1 = PasswordHash.create("password") hash2, salt2 = PasswordHash.create("password") diff --git a/test/models/acl_test.rb b/test/models/acl_test.rb index 4022b8adb..189f92677 100644 --- a/test/models/acl_test.rb +++ b/test/models/acl_test.rb @@ -1,8 +1,22 @@ require "test_helper" class AclTest < ActiveSupport::TestCase - # Replace this with your real tests. - def test_truth - assert true + def test_k_required + acl = create(:acl) + assert acl.valid? + acl.k = nil + assert !acl.valid? + end + + def test_no_account_creation_by_subnet + assert !Acl.no_account_creation("192.168.1.1") + create(:acl, :address => "192.168.0.0/16", :k => "no_account_creation") + assert Acl.no_account_creation("192.168.1.1") + end + + def test_no_account_creation_by_domain + assert !Acl.no_account_creation("192.168.1.1", "example.com") + create(:acl, :domain => "example.com", :k => "no_account_creation") + assert Acl.no_account_creation("192.168.1.1", "example.com") end end diff --git a/test/models/changeset_comment_test.rb b/test/models/changeset_comment_test.rb index 2e09bb884..64fbb3663 100644 --- a/test/models/changeset_comment_test.rb +++ b/test/models/changeset_comment_test.rb @@ -1,15 +1,12 @@ +# -*- coding: utf-8 -*- require "test_helper" class ChangesetCommentTest < ActiveSupport::TestCase - fixtures :changesets, :changeset_comments - - def test_changeset_comment_count - assert_equal 4, ChangesetComment.count - end + fixtures :changesets, :users # validations def test_does_not_accept_invalid_author - comment = changeset_comments(:normal_comment_1) + comment = create(:changeset_comment) comment.author = nil assert !comment.valid? @@ -19,7 +16,7 @@ class ChangesetCommentTest < ActiveSupport::TestCase end def test_does_not_accept_invalid_changeset - comment = changeset_comments(:normal_comment_1) + comment = create(:changeset_comment) comment.changeset = nil assert !comment.valid? @@ -29,13 +26,33 @@ class ChangesetCommentTest < ActiveSupport::TestCase end def test_does_not_accept_empty_visible - comment = changeset_comments(:normal_comment_1) + comment = create(:changeset_comment) comment.visible = nil assert !comment.valid? end def test_comments_of_changeset_count + create_list(:changeset_comment, 3, :changeset_id => changesets(:normal_user_closed_change).id) assert_equal 3, Changeset.find(changesets(:normal_user_closed_change).id).comments.count end + + def test_body_valid + ok = %W(Name vergrößern foo\nbar + ルシステムにも対応します 輕觸搖晃的遊戲) + bad = ["foo\x00bar", "foo\x08bar", "foo\x1fbar", "foo\x7fbar", + "foo\ufffebar", "foo\uffffbar"] + + ok.each do |body| + changeset_comment = create(:changeset_comment) + changeset_comment.body = body + assert changeset_comment.valid?, "#{body} is invalid, when it should be" + end + + bad.each do |body| + changeset_comment = create(:changeset_comment) + changeset_comment.body = body + assert !changeset_comment.valid?, "#{body} is valid when it shouldn't be" + end + end end diff --git a/test/models/changeset_tag_test.rb b/test/models/changeset_tag_test.rb index e62808b6e..90a8518b4 100644 --- a/test/models/changeset_tag_test.rb +++ b/test/models/changeset_tag_test.rb @@ -3,10 +3,6 @@ require "test_helper" class ChangesetTagTest < ActiveSupport::TestCase api_fixtures - def test_changeset_tag_count - assert_equal 2, ChangesetTag.count - end - def test_length_key_valid key = "k" (0..255).each do |i| @@ -58,10 +54,11 @@ class ChangesetTagTest < ActiveSupport::TestCase end def test_uniqueness + existing = create(:changeset_tag) tag = ChangesetTag.new - tag.changeset_id = changeset_tags(:changeset_1_tag_1).changeset_id - tag.k = changeset_tags(:changeset_1_tag_1).k - tag.v = changeset_tags(:changeset_1_tag_1).v + tag.changeset_id = existing.changeset_id + tag.k = existing.k + tag.v = existing.v assert tag.new_record? assert !tag.valid? assert_raise(ActiveRecord::RecordInvalid) { tag.save! } diff --git a/test/models/changeset_test.rb b/test/models/changeset_test.rb index b4229b203..89200c9b5 100644 --- a/test/models/changeset_test.rb +++ b/test/models/changeset_test.rb @@ -4,7 +4,7 @@ class ChangesetTest < ActiveSupport::TestCase api_fixtures def test_changeset_count - assert_equal 8, Changeset.count + assert_equal 9, Changeset.count end def test_from_xml_no_text diff --git a/test/models/client_application_test.rb b/test/models/client_application_test.rb index 604a5de33..9684513c4 100644 --- a/test/models/client_application_test.rb +++ b/test/models/client_application_test.rb @@ -1,20 +1,18 @@ require "test_helper" class ClientApplicationTest < ActiveSupport::TestCase - fixtures :client_applications - def test_url_valid ok = ["http://example.com/test", "https://example.com/test"] bad = ["", "ftp://example.com/test", "myapp://somewhere"] ok.each do |url| - app = client_applications(:normal_user_app).dup + app = build(:client_application) app.url = url assert app.valid?, "#{url} is invalid, when it should be" end bad.each do |url| - app = client_applications(:normal_user_app) + app = build(:client_application) app.url = url assert !app.valid?, "#{url} is valid when it shouldn't be" end @@ -25,13 +23,13 @@ class ClientApplicationTest < ActiveSupport::TestCase bad = ["ftp://example.com/test", "myapp://somewhere", "gibberish"] ok.each do |url| - app = client_applications(:normal_user_app) + app = build(:client_application) app.support_url = url assert app.valid?, "#{url} is invalid, when it should be" end bad.each do |url| - app = client_applications(:normal_user_app) + app = build(:client_application) app.support_url = url assert !app.valid?, "#{url} is valid when it shouldn't be" end @@ -42,13 +40,13 @@ class ClientApplicationTest < ActiveSupport::TestCase bad = ["gibberish"] ok.each do |url| - app = client_applications(:normal_user_app) + app = build(:client_application) app.callback_url = url assert app.valid?, "#{url} is invalid, when it should be" end bad.each do |url| - app = client_applications(:normal_user_app) + app = build(:client_application) app.callback_url = url assert !app.valid?, "#{url} is valid when it shouldn't be" end diff --git a/test/models/diary_comment_test.rb b/test/models/diary_comment_test.rb index a32c153f9..162cfa833 100644 --- a/test/models/diary_comment_test.rb +++ b/test/models/diary_comment_test.rb @@ -1,10 +1,16 @@ require "test_helper" class DiaryCommentTest < ActiveSupport::TestCase - api_fixtures - fixtures :diary_comments + fixtures :users - def test_diary_comment_count - assert_equal 4, DiaryComment.count + def setup + # Create the default language for diary entries + create(:language, :code => "en") + end + + test "body must be present" do + comment = build(:diary_comment, :body => "") + assert_not comment.valid? + assert_not_nil comment.errors[:body], "no validation error for missing body" end end diff --git a/test/models/diary_entry_test.rb b/test/models/diary_entry_test.rb index 58e6513a6..6c9a75443 100644 --- a/test/models/diary_entry_test.rb +++ b/test/models/diary_entry_test.rb @@ -1,11 +1,11 @@ require "test_helper" class DiaryEntryTest < ActiveSupport::TestCase - api_fixtures - fixtures :diary_entries, :diary_comments, :languages + fixtures :users - def test_diary_entry_count - assert_equal 6, DiaryEntry.count + def setup + # Create the default language for diary entries + create(:language, :code => "en") end def test_diary_entry_validations @@ -25,27 +25,33 @@ class DiaryEntryTest < ActiveSupport::TestCase end def test_diary_entry_visible - assert_equal 5, DiaryEntry.visible.count + visible = create(:diary_entry) + hidden = create(:diary_entry, :visible => false) + assert_includes DiaryEntry.visible, visible assert_raise ActiveRecord::RecordNotFound do - DiaryEntry.visible.find(diary_entries(:deleted_entry).id) + DiaryEntry.visible.find(hidden.id) end end def test_diary_entry_comments - assert_equal 0, diary_entries(:normal_user_entry_1).comments.count - assert_equal 4, diary_entries(:normal_user_geo_entry).comments.count + diary = create(:diary_entry) + assert_equal(0, diary.comments.count) + create(:diary_comment, :diary_entry => diary) + assert_equal(1, diary.comments.count) end def test_diary_entry_visible_comments - assert_equal 0, diary_entries(:normal_user_entry_1).visible_comments.count - assert_equal 1, diary_entries(:normal_user_geo_entry).visible_comments.count + diary = create(:diary_entry) + create(:diary_comment, :diary_entry => diary) + create(:diary_comment, :diary_entry => diary, :visible => false) + assert_equal 1, diary.visible_comments.count + assert_equal 2, diary.comments.count end private def diary_entry_valid(attrs, result = true) - entry = DiaryEntry.new(diary_entries(:normal_user_entry_1).attributes) - entry.assign_attributes(attrs) + entry = build(:diary_entry, attrs) assert_equal result, entry.valid?, "Expected #{attrs.inspect} to be #{result}" end end diff --git a/test/models/friend_test.rb b/test/models/friend_test.rb index a13f67470..08eeeeb17 100644 --- a/test/models/friend_test.rb +++ b/test/models/friend_test.rb @@ -2,9 +2,9 @@ require "test_helper" class FriendTest < ActiveSupport::TestCase api_fixtures - fixtures :friends def test_friend_count + create(:friend) assert_equal 1, Friend.count end end diff --git a/test/models/language_test.rb b/test/models/language_test.rb index cb4c8c631..9b2ef72c1 100644 --- a/test/models/language_test.rb +++ b/test/models/language_test.rb @@ -2,20 +2,13 @@ require "test_helper" class LanguageTest < ActiveSupport::TestCase - fixtures :languages - - def test_language_count - assert_equal 3, Language.count - end - def test_name - assert_equal "English (English)", languages(:en).name - assert_equal "German (Deutsch)", languages(:de).name - assert_equal "Slovenian (slovenščina)", languages(:sl).name + create(:language, :code => "sl", :english_name => "Slovenian", :native_name => "slovenščina") + assert_equal "Slovenian (slovenščina)", Language.find("sl").name end def test_load - assert_equal 3, Language.count + assert_equal 0, Language.count assert_raise ActiveRecord::RecordNotFound do Language.find("zh") end diff --git a/test/models/message_test.rb b/test/models/message_test.rb index 81290a14a..4f8c4b8e2 100644 --- a/test/models/message_test.rb +++ b/test/models/message_test.rb @@ -3,15 +3,8 @@ require "test_helper" class MessageTest < ActiveSupport::TestCase api_fixtures - fixtures :messages - EURO = "\xe2\x82\xac" # euro symbol - - # This needs to be updated when new fixtures are added - # or removed. - def test_check_message_count - assert_equal 2, Message.count - end + EURO = "\xe2\x82\xac".freeze # euro symbol def test_check_empty_message_fails message = Message.new @@ -23,14 +16,14 @@ class MessageTest < ActiveSupport::TestCase end def test_validating_msgs - message = messages(:unread_message) + message = create(:message, :unread) assert message.valid? - message = messages(:read_message) + message = create(:message, :read) assert message.valid? end def test_invalid_send_recipient - message = messages(:unread_message) + message = create(:message, :unread) message.sender = nil message.recipient = nil assert !message.valid? @@ -61,8 +54,7 @@ class MessageTest < ActiveSupport::TestCase "\xC2\xC2", # 2-byte multibyte identifier, followed by another one "\x4a\x82", # plain ASCII, followed by multibyte continuation "\x82\x82", # multibyte continuations without multibyte identifier - "\xe1\x82\x4a", # three-byte identifier, contination and (incorrectly) plain ASCII - ] + "\xe1\x82\x4a"] # three-byte identifier, contination and (incorrectly) plain ASCII invalid_sequences.each do |char| begin # create a message and save to the database @@ -185,7 +177,7 @@ class MessageTest < ActiveSupport::TestCase private def make_message(char, count) - message = messages(:unread_message) + message = build(:message, :unread) message.title = char * count message end diff --git a/test/models/node_tag_test.rb b/test/models/node_tag_test.rb index d9bce8552..f1d8750a0 100644 --- a/test/models/node_tag_test.rb +++ b/test/models/node_tag_test.rb @@ -3,62 +3,34 @@ require "test_helper" class NodeTagTest < ActiveSupport::TestCase api_fixtures - def test_tag_count - assert_equal 12, NodeTag.count - node_tag_count(:visible_node, 1) - node_tag_count(:invisible_node, 1) - node_tag_count(:used_node_1, 1) - node_tag_count(:used_node_2, 1) - node_tag_count(:node_with_versions, 2) - end - - def node_tag_count(node, count) - nod = current_nodes(node) - assert_equal count, nod.node_tags.count - end - def test_length_key_valid - key = "k" + tag = create(:node_tag) (0..255).each do |i| - tag = NodeTag.new - tag.node_id = current_node_tags(:t1).node_id - tag.k = key * i - tag.v = "v" + tag.k = "k" * i assert tag.valid? end end def test_length_value_valid - val = "v" + tag = create(:node_tag) (0..255).each do |i| - tag = NodeTag.new - tag.node_id = current_node_tags(:t1).node_id - tag.k = "k" - tag.v = val * i + tag.v = "v" * i assert tag.valid? end end def test_length_key_invalid - ["k" * 256].each do |i| - tag = NodeTag.new - tag.node_id = current_node_tags(:t1).node_id - tag.k = i - tag.v = "v" - assert !tag.valid?, "Key should be too long" - assert tag.errors[:k].any? - end + tag = create(:node_tag) + tag.k = "k" * 256 + assert !tag.valid?, "Key should be too long" + assert tag.errors[:k].any? end def test_length_value_invalid - ["k" * 256].each do |i| - tag = NodeTag.new - tag.node_id = current_node_tags(:t1).node_id - tag.k = "k" - tag.v = i - assert !tag.valid?, "Value should be too long" - assert tag.errors[:v].any? - end + tag = create(:node_tag) + tag.v = "v" * 256 + assert !tag.valid?, "Value should be too long" + assert tag.errors[:v].any? end def test_empty_node_tag_invalid @@ -68,10 +40,11 @@ class NodeTagTest < ActiveSupport::TestCase end def test_uniqueness + existing = create(:node_tag) tag = NodeTag.new - tag.node_id = current_node_tags(:t1).node_id - tag.k = current_node_tags(:t1).k - tag.v = current_node_tags(:t1).v + tag.node_id = existing.node_id + tag.k = existing.k + tag.v = existing.v assert tag.new_record? assert !tag.valid? assert_raise(ActiveRecord::RecordInvalid) { tag.save! } diff --git a/test/models/node_test.rb b/test/models/node_test.rb index c9a897796..7d43362d2 100644 --- a/test/models/node_test.rb +++ b/test/models/node_test.rb @@ -4,7 +4,7 @@ class NodeTest < ActiveSupport::TestCase api_fixtures def test_node_count - assert_equal 18, Node.count + assert_equal 19, Node.count end def test_node_too_far_north @@ -316,20 +316,23 @@ class NodeTest < ActiveSupport::TestCase def test_node_tags node = current_nodes(:node_with_versions) + taglist = create_list(:node_tag, 2, :node => node) tags = Node.find(node.id).node_tags.order(:k) - assert_equal 2, tags.count - assert_equal "testing", tags[0].k - assert_equal "added in node version 3", tags[0].v - assert_equal "testing two", tags[1].k - assert_equal "modified in node version 4", tags[1].v + assert_equal taglist.count, tags.count + taglist.sort_by!(&:k).each_index do |i| + assert_equal taglist[i].k, tags[i].k + assert_equal taglist[i].v, tags[i].v + end end def test_tags node = current_nodes(:node_with_versions) + taglist = create_list(:node_tag, 2, :node => node) tags = Node.find(node.id).tags - assert_equal 2, tags.size - assert_equal "added in node version 3", tags["testing"] - assert_equal "modified in node version 4", tags["testing two"] + assert_equal taglist.count, tags.count + taglist.each do |tag| + assert_equal tag.v, tags[tag.k] + end end def test_containing_relation_members diff --git a/test/models/note_comment_test.rb b/test/models/note_comment_test.rb index e61732904..2375ba9d4 100644 --- a/test/models/note_comment_test.rb +++ b/test/models/note_comment_test.rb @@ -2,39 +2,39 @@ require "test_helper" class NoteCommentTest < ActiveSupport::TestCase - fixtures :users, :notes, :note_comments + fixtures :users def test_event_valid ok = %w(opened closed reopened commented hidden) bad = %w(expropriated fubared) ok.each do |event| - note_comment = note_comments(:t1) + note_comment = create(:note_comment) note_comment.event = event assert note_comment.valid?, "#{event} is invalid, when it should be" end bad.each do |event| - note_comment = note_comments(:t1) + note_comment = create(:note_comment) note_comment.event = event assert !note_comment.valid?, "#{event} is valid when it shouldn't be" end end def test_body_valid - ok = ["Name", "vergrößern", "foo\x0abar", - "ルシステムにも対応します", "輕觸搖晃的遊戲"] + ok = %W(Name vergrößern foo\nbar + ルシステムにも対応します 輕觸搖晃的遊戲) bad = ["foo\x00bar", "foo\x08bar", "foo\x1fbar", "foo\x7fbar", "foo\ufffebar", "foo\uffffbar"] ok.each do |body| - note_comment = note_comments(:t1) + note_comment = create(:note_comment) note_comment.body = body assert note_comment.valid?, "#{body} is invalid, when it should be" end bad.each do |body| - note_comment = note_comments(:t1) + note_comment = create(:note_comment) note_comment.body = body assert !note_comment.valid?, "#{body} is valid when it shouldn't be" end diff --git a/test/models/note_test.rb b/test/models/note_test.rb index 4adbef4b8..d4bd36e74 100644 --- a/test/models/note_test.rb +++ b/test/models/note_test.rb @@ -2,27 +2,27 @@ require "test_helper" class NoteTest < ActiveSupport::TestCase - fixtures :users, :notes, :note_comments + fixtures :users def test_status_valid ok = %w(open closed hidden) bad = %w(expropriated fubared) ok.each do |status| - note = notes(:open_note) + note = create(:note) note.status = status assert note.valid?, "#{status} is invalid, when it should be" end bad.each do |status| - note = notes(:open_note) + note = create(:note) note.status = status assert !note.valid?, "#{status} is valid when it shouldn't be" end end def test_close - note = notes(:open_note) + note = create(:note) assert_equal "open", note.status assert_nil note.closed_at note.close @@ -31,7 +31,7 @@ class NoteTest < ActiveSupport::TestCase end def test_reopen - note = notes(:closed_note_with_comment) + note = create(:note, :status => "closed", :closed_at => Time.now) assert_equal "closed", note.status assert_not_nil note.closed_at note.reopen @@ -40,23 +40,29 @@ class NoteTest < ActiveSupport::TestCase end def test_visible? - assert_equal true, notes(:open_note).visible? - assert_equal true, notes(:note_with_hidden_comment).visible? - assert_equal false, notes(:hidden_note_with_comment).visible? + assert_equal true, create(:note, :status => "open").visible? + assert_equal true, create(:note, :status => "closed").visible? + assert_equal false, create(:note, :status => "hidden").visible? end def test_closed? - assert_equal true, notes(:closed_note_with_comment).closed? - assert_equal false, notes(:open_note).closed? + assert_equal true, create(:note, :status => "closed", :closed_at => Time.now).closed? + assert_equal false, create(:note, :status => "open", :closed_at => nil).closed? end def test_author - assert_nil notes(:open_note).author - assert_equal users(:normal_user), notes(:note_with_comments_by_users).author + comment = create(:note_comment) + assert_nil comment.note.author + + comment = create(:note_comment, :author => users(:normal_user)) + assert_equal users(:normal_user), comment.note.author end def test_author_ip - assert_equal IPAddr.new("192.168.1.1"), notes(:open_note).author_ip - assert_nil notes(:note_with_comments_by_users).author_ip + comment = create(:note_comment) + assert_nil comment.note.author_ip + + comment = create(:note_comment, :author_ip => IPAddr.new("192.168.1.1")) + assert_equal IPAddr.new("192.168.1.1"), comment.note.author_ip end end diff --git a/test/models/oauth_nonce_test.rb b/test/models/oauth_nonce_test.rb index f170bc69d..341019cca 100644 --- a/test/models/oauth_nonce_test.rb +++ b/test/models/oauth_nonce_test.rb @@ -8,7 +8,7 @@ class OauthNonceTest < ActiveSupport::TestCase # string and timestamp. def test_nonce_uniqueness string = "0123456789ABCDEF" - timestamp = Time.now + timestamp = Time.now.to_i nonce1 = OauthNonce.remember(string, timestamp) assert_not_equal false, nonce1, "First nonce should be unique. Check your test database is empty." @@ -16,4 +16,16 @@ class OauthNonceTest < ActiveSupport::TestCase nonce2 = OauthNonce.remember(string, timestamp) assert_equal false, nonce2, "Shouldn't be able to remember the same nonce twice." end + + ## + # nonces that are not current should be rejected + def test_nonce_not_current + string = "0123456789ABCDEF" + + nonce1 = OauthNonce.remember(string, Time.now.to_i - 86430) + assert_equal false, nonce1, "Nonces over a day in the past should be rejected" + + nonce2 = OauthNonce.remember(string, Time.now.to_i - 86370) + assert_not_equal false, nonce2, "Nonces under a day in the past should be rejected" + end end diff --git a/test/models/oauth_token_test.rb b/test/models/oauth_token_test.rb index ac10bf7fe..c2df0d131 100644 --- a/test/models/oauth_token_test.rb +++ b/test/models/oauth_token_test.rb @@ -15,7 +15,7 @@ class OauthTokenTest < ActiveSupport::TestCase ## # check that an authorized token is authorised and can be invalidated def test_token_authorisation - tok = RequestToken.create(:client_application => client_applications(:oauth_web_app)) + tok = RequestToken.create(:client_application => create(:client_application)) assert_equal false, tok.authorized?, "Token should be created unauthorised." tok.authorize!(users(:public_user)) assert_equal true, tok.authorized?, "Token should now be authorised." diff --git a/test/models/old_node_tag_test.rb b/test/models/old_node_tag_test.rb index 2ac60ab42..f49be9256 100644 --- a/test/models/old_node_tag_test.rb +++ b/test/models/old_node_tag_test.rb @@ -3,56 +3,34 @@ require "test_helper" class OldNodeTagTest < ActiveSupport::TestCase api_fixtures - def test_old_node_tag_count - assert_equal 19, OldNodeTag.count, "Unexpected number of fixtures loaded." - end - def test_length_key_valid - key = "k" + tag = create(:old_node_tag) (0..255).each do |i| - tag = OldNodeTag.new - tag.node_id = node_tags(:t1).node_id - tag.version = node_tags(:t1).version - tag.k = key * i - tag.v = "v" + tag.k = "k" * i assert tag.valid? end end def test_length_value_valid - val = "v" + tag = create(:old_node_tag) (0..255).each do |i| - tag = OldNodeTag.new - tag.node_id = node_tags(:t1).node_id - tag.version = node_tags(:t1).version - tag.k = "k" - tag.v = val * i + tag.v = "v" * i assert tag.valid? end end def test_length_key_invalid - ["k" * 256].each do |i| - tag = OldNodeTag.new - tag.node_id = node_tags(:t1).node_id - tag.version = node_tags(:t1).version - tag.k = i - tag.v = "v", "Key should be too long" - assert !tag.valid? - assert tag.errors[:k].any? - end + tag = create(:old_node_tag) + tag.k = "k" * 256 + assert !tag.valid? + assert tag.errors[:k].any? end def test_length_value_invalid - ["k" * 256].each do |i| - tag = OldNodeTag.new - tag.node_id = node_tags(:t1).node_id - tag.version = node_tags(:t1).version - tag.k = "k" - tag.v = i - assert !tag.valid?, "Value should be too long" - assert tag.errors[:v].any? - end + tag = create(:old_node_tag) + tag.v = "v" * 256 + assert !tag.valid?, "Value should be too long" + assert tag.errors[:v].any? end def test_empty_tag_invalid @@ -62,11 +40,12 @@ class OldNodeTagTest < ActiveSupport::TestCase end def test_uniqueness + existing = create(:old_node_tag) tag = OldNodeTag.new - tag.node_id = node_tags(:t1).node_id - tag.version = node_tags(:t1).version - tag.k = node_tags(:t1).k - tag.v = node_tags(:t1).v + tag.node_id = existing.node_id + tag.version = existing.version + tag.k = existing.k + tag.v = existing.v assert tag.new_record? assert !tag.valid? assert_raise(ActiveRecord::RecordInvalid) { tag.save! } diff --git a/test/models/old_node_test.rb b/test/models/old_node_test.rb index 03aead2e9..d7e363edb 100644 --- a/test/models/old_node_test.rb +++ b/test/models/old_node_test.rb @@ -76,6 +76,9 @@ class OldNodeTest < ActiveSupport::TestCase end def test_node_tags + taglist_v3 = create_list(:old_node_tag, 3, :old_node => nodes(:node_with_versions_v3)) + taglist_v4 = create_list(:old_node_tag, 2, :old_node => nodes(:node_with_versions_v4)) + node = nodes(:node_with_versions_v1) tags = OldNode.find(node.id).old_tags.order(:k) assert_equal 0, tags.count @@ -86,24 +89,25 @@ class OldNodeTest < ActiveSupport::TestCase node = nodes(:node_with_versions_v3) tags = OldNode.find(node.id).old_tags.order(:k) - assert_equal 3, tags.count - assert_equal "testing", tags[0].k - assert_equal "added in node version 3", tags[0].v - assert_equal "testing three", tags[1].k - assert_equal "added in node version 3", tags[1].v - assert_equal "testing two", tags[2].k - assert_equal "added in node version 3", tags[2].v + assert_equal taglist_v3.count, tags.count + taglist_v3.sort_by!(&:k).each_index do |i| + assert_equal taglist_v3[i].k, tags[i].k + assert_equal taglist_v3[i].v, tags[i].v + end node = nodes(:node_with_versions_v4) tags = OldNode.find(node.id).old_tags.order(:k) - assert_equal 2, tags.count - assert_equal "testing", tags[0].k - assert_equal "added in node version 3", tags[0].v - assert_equal "testing two", tags[1].k - assert_equal "modified in node version 4", tags[1].v + assert_equal taglist_v4.count, tags.count + taglist_v4.sort_by!(&:k).each_index do |i| + assert_equal taglist_v4[i].k, tags[i].k + assert_equal taglist_v4[i].v, tags[i].v + end end def test_tags + taglist_v3 = create_list(:old_node_tag, 3, :old_node => nodes(:node_with_versions_v3)) + taglist_v4 = create_list(:old_node_tag, 2, :old_node => nodes(:node_with_versions_v4)) + node = nodes(:node_with_versions_v1) tags = OldNode.find(node.id).tags assert_equal 0, tags.size @@ -114,15 +118,16 @@ class OldNodeTest < ActiveSupport::TestCase node = nodes(:node_with_versions_v3) tags = OldNode.find(node.id).tags - assert_equal 3, tags.size - assert_equal "added in node version 3", tags["testing"] - assert_equal "added in node version 3", tags["testing two"] - assert_equal "added in node version 3", tags["testing three"] + assert_equal taglist_v3.count, tags.count + taglist_v3.each do |tag| + assert_equal tag.v, tags[tag.k] + end node = nodes(:node_with_versions_v4) tags = OldNode.find(node.id).tags - assert_equal 2, tags.size - assert_equal "added in node version 3", tags["testing"] - assert_equal "modified in node version 4", tags["testing two"] + assert_equal taglist_v4.count, tags.count + taglist_v4.each do |tag| + assert_equal tag.v, tags[tag.k] + end end end diff --git a/test/models/old_relation_tag_test.rb b/test/models/old_relation_tag_test.rb index 2c9638a2d..5c27ef3ea 100644 --- a/test/models/old_relation_tag_test.rb +++ b/test/models/old_relation_tag_test.rb @@ -3,56 +3,34 @@ require "test_helper" class OldRelationTagTest < ActiveSupport::TestCase api_fixtures - def test_tag_count - assert_equal 13, OldRelationTag.count - end - def test_length_key_valid - key = "k" + tag = create(:old_relation_tag) (0..255).each do |i| - tag = OldRelationTag.new - tag.relation_id = relation_tags(:t1).relation_id - tag.version = 1 - tag.k = key * i - tag.v = "v" + tag.k = "k" * i assert tag.valid? end end def test_length_value_valid - val = "v" + tag = create(:old_relation_tag) (0..255).each do |i| - tag = OldRelationTag.new - tag.relation_id = relation_tags(:t1).relation_id - tag.version = 1 - tag.k = "k" - tag.v = val * i + tag.v = "v" * i assert tag.valid? end end def test_length_key_invalid - ["k" * 256].each do |i| - tag = OldRelationTag.new - tag.relation_id = relation_tags(:t1).relation_id - tag.version = 1 - tag.k = i - tag.v = "v" - assert !tag.valid?, "Key should be too long" - assert tag.errors[:k].any? - end + tag = create(:old_relation_tag) + tag.k = "k" * 256 + assert !tag.valid?, "Key should be too long" + assert tag.errors[:k].any? end def test_length_value_invalid - ["k" * 256].each do |i| - tag = OldRelationTag.new - tag.relation_id = relation_tags(:t1).relation_id - tag.version = 1 - tag.k = "k" - tag.v = i - assert !tag.valid?, "Value should be too long" - assert tag.errors[:v].any? - end + tag = create(:old_relation_tag) + tag.v = "v" * 256 + assert !tag.valid?, "Value should be too long" + assert tag.errors[:v].any? end def test_empty_tag_invalid @@ -62,11 +40,12 @@ class OldRelationTagTest < ActiveSupport::TestCase end def test_uniqueness + existing = create(:old_relation_tag) tag = OldRelationTag.new - tag.relation_id = relation_tags(:t1).relation_id - tag.version = relation_tags(:t1).version - tag.k = relation_tags(:t1).k - tag.v = relation_tags(:t1).v + tag.relation_id = existing.relation_id + tag.version = existing.version + tag.k = existing.k + tag.v = existing.v assert tag.new_record? assert !tag.valid? assert_raise(ActiveRecord::RecordInvalid) { tag.save! } diff --git a/test/models/old_relation_test.rb b/test/models/old_relation_test.rb index c11cdcf72..d2aa4b6b6 100644 --- a/test/models/old_relation_test.rb +++ b/test/models/old_relation_test.rb @@ -8,6 +8,9 @@ class OldRelationTest < ActiveSupport::TestCase end def test_relation_tags + taglist_v3 = create_list(:old_relation_tag, 3, :old_relation => relations(:relation_with_versions_v3)) + taglist_v4 = create_list(:old_relation_tag, 2, :old_relation => relations(:relation_with_versions_v4)) + relation = relations(:relation_with_versions_v1) tags = OldRelation.find(relation.id).old_tags.order(:k) assert_equal 0, tags.count @@ -18,21 +21,19 @@ class OldRelationTest < ActiveSupport::TestCase relation = relations(:relation_with_versions_v3) tags = OldRelation.find(relation.id).old_tags.order(:k) - assert_equal 3, tags.count - assert_equal "testing", tags[0].k - assert_equal "added in relation version 3", tags[0].v - assert_equal "testing three", tags[1].k - assert_equal "added in relation version 3", tags[1].v - assert_equal "testing two", tags[2].k - assert_equal "added in relation version 3", tags[2].v + assert_equal taglist_v3.count, tags.count + taglist_v3.sort_by!(&:k).each_index do |i| + assert_equal taglist_v3[i].k, tags[i].k + assert_equal taglist_v3[i].v, tags[i].v + end relation = relations(:relation_with_versions_v4) tags = OldRelation.find(relation.id).old_tags.order(:k) - assert_equal 2, tags.count - assert_equal "testing", tags[0].k - assert_equal "added in relation version 3", tags[0].v - assert_equal "testing two", tags[1].k - assert_equal "modified in relation version 4", tags[1].v + assert_equal taglist_v4.count, tags.count + taglist_v4.sort_by!(&:k).each_index do |i| + assert_equal taglist_v4[i].k, tags[i].k + assert_equal taglist_v4[i].v, tags[i].v + end end def test_relation_members @@ -100,6 +101,9 @@ class OldRelationTest < ActiveSupport::TestCase end def test_tags + taglist_v3 = create_list(:old_relation_tag, 3, :old_relation => relations(:relation_with_versions_v3)) + taglist_v4 = create_list(:old_relation_tag, 2, :old_relation => relations(:relation_with_versions_v4)) + relation = relations(:relation_with_versions_v1) tags = OldRelation.find(relation.id).tags assert_equal 0, tags.size @@ -110,15 +114,16 @@ class OldRelationTest < ActiveSupport::TestCase relation = relations(:relation_with_versions_v3) tags = OldRelation.find(relation.id).tags - assert_equal 3, tags.size - assert_equal "added in relation version 3", tags["testing"] - assert_equal "added in relation version 3", tags["testing two"] - assert_equal "added in relation version 3", tags["testing three"] + assert_equal taglist_v3.count, tags.count + taglist_v3.each do |tag| + assert_equal tag.v, tags[tag.k] + end relation = relations(:relation_with_versions_v4) tags = OldRelation.find(relation.id).tags - assert_equal 2, tags.size - assert_equal "added in relation version 3", tags["testing"] - assert_equal "modified in relation version 4", tags["testing two"] + assert_equal taglist_v4.count, tags.count + taglist_v4.each do |tag| + assert_equal tag.v, tags[tag.k] + end end end diff --git a/test/models/old_way_tag_test.rb b/test/models/old_way_tag_test.rb index b8757d572..9a258ffb9 100644 --- a/test/models/old_way_tag_test.rb +++ b/test/models/old_way_tag_test.rb @@ -3,56 +3,34 @@ require "test_helper" class OldWayTagTest < ActiveSupport::TestCase api_fixtures - def test_tag_count - assert_equal 13, OldWayTag.count - end - def test_length_key_valid - key = "k" + tag = create(:old_way_tag) (0..255).each do |i| - tag = OldWayTag.new - tag.way_id = way_tags(:t1).way_id - tag.version = 1 - tag.k = key * i - tag.v = "v" + tag.k = "k" * i assert tag.valid? end end def test_length_value_valid - val = "v" + tag = create(:old_way_tag) (0..255).each do |i| - tag = OldWayTag.new - tag.way_id = way_tags(:t1).way_id - tag.version = 1 - tag.k = "k" - tag.v = val * i + tag.v = "v" * i assert tag.valid? end end def test_length_key_invalid - ["k" * 256].each do |i| - tag = OldWayTag.new - tag.way_id = way_tags(:t1).way_id - tag.version = 1 - tag.k = i - tag.v = "v" - assert !tag.valid?, "Key should be too long" - assert tag.errors[:k].any? - end + tag = create(:old_way_tag) + tag.k = "k" * 256 + assert !tag.valid?, "Key should be too long" + assert tag.errors[:k].any? end def test_length_value_invalid - ["k" * 256].each do |i| - tag = OldWayTag.new - tag.way_id = way_tags(:t1).way_id - tag.version = 1 - tag.k = "k" - tag.v = i - assert !tag.valid?, "Value should be too long" - assert tag.errors[:v].any? - end + tag = create(:old_way_tag) + tag.v = "v" * 256 + assert !tag.valid?, "Value should be too long" + assert tag.errors[:v].any? end def test_empty_tag_invalid @@ -62,11 +40,12 @@ class OldWayTagTest < ActiveSupport::TestCase end def test_uniqueness + existing = create(:old_way_tag) tag = OldWayTag.new - tag.way_id = way_tags(:t1).way_id - tag.version = way_tags(:t1).version - tag.k = way_tags(:t1).k - tag.v = way_tags(:t1).v + tag.way_id = existing.way_id + tag.version = existing.version + tag.k = existing.k + tag.v = existing.v assert tag.new_record? assert !tag.valid? assert_raise(ActiveRecord::RecordInvalid) { tag.save! } diff --git a/test/models/old_way_test.rb b/test/models/old_way_test.rb index 37dfccad3..84255c880 100644 --- a/test/models/old_way_test.rb +++ b/test/models/old_way_test.rb @@ -38,6 +38,9 @@ class OldWayTest < ActiveSupport::TestCase end def test_way_tags + taglist_v3 = create_list(:old_way_tag, 3, :old_way => ways(:way_with_versions_v3)) + taglist_v4 = create_list(:old_way_tag, 2, :old_way => ways(:way_with_versions_v4)) + way = ways(:way_with_versions_v1) tags = OldWay.find(way.id).old_tags.order(:k) assert_equal 0, tags.count @@ -48,24 +51,25 @@ class OldWayTest < ActiveSupport::TestCase way = ways(:way_with_versions_v3) tags = OldWay.find(way.id).old_tags.order(:k) - assert_equal 3, tags.count - assert_equal "testing", tags[0].k - assert_equal "added in way version 3", tags[0].v - assert_equal "testing three", tags[1].k - assert_equal "added in way version 3", tags[1].v - assert_equal "testing two", tags[2].k - assert_equal "added in way version 3", tags[2].v + assert_equal taglist_v3.count, tags.count + taglist_v3.sort_by!(&:k).each_index do |i| + assert_equal taglist_v3[i].k, tags[i].k + assert_equal taglist_v3[i].v, tags[i].v + end way = ways(:way_with_versions_v4) tags = OldWay.find(way.id).old_tags.order(:k) - assert_equal 2, tags.count - assert_equal "testing", tags[0].k - assert_equal "added in way version 3", tags[0].v - assert_equal "testing two", tags[1].k - assert_equal "modified in way version 4", tags[1].v + assert_equal taglist_v4.count, tags.count + taglist_v4.sort_by!(&:k).each_index do |i| + assert_equal taglist_v4[i].k, tags[i].k + assert_equal taglist_v4[i].v, tags[i].v + end end def test_tags + taglist_v3 = create_list(:old_way_tag, 3, :old_way => ways(:way_with_versions_v3)) + taglist_v4 = create_list(:old_way_tag, 2, :old_way => ways(:way_with_versions_v4)) + way = ways(:way_with_versions_v1) tags = OldWay.find(way.id).tags assert_equal 0, tags.size @@ -76,29 +80,33 @@ class OldWayTest < ActiveSupport::TestCase way = ways(:way_with_versions_v3) tags = OldWay.find(way.id).tags - assert_equal 3, tags.size - assert_equal "added in way version 3", tags["testing"] - assert_equal "added in way version 3", tags["testing two"] - assert_equal "added in way version 3", tags["testing three"] + assert_equal taglist_v3.count, tags.count + taglist_v3.each do |tag| + assert_equal tag.v, tags[tag.k] + end way = ways(:way_with_versions_v4) tags = OldWay.find(way.id).tags - assert_equal 2, tags.size - assert_equal "added in way version 3", tags["testing"] - assert_equal "modified in way version 4", tags["testing two"] + assert_equal taglist_v4.count, tags.count + taglist_v4.each do |tag| + assert_equal tag.v, tags[tag.k] + end end def test_get_nodes_undelete way = ways(:way_with_versions_v3) + node_tag = create(:node_tag, :node => current_nodes(:node_with_versions)) + node_tag2 = create(:node_tag, :node => current_nodes(:used_node_1)) nodes = OldWay.find(way.id).get_nodes_undelete assert_equal 2, nodes.size - assert_equal [1.0, 1.0, 15, 4, { "testing" => "added in node version 3", "testing two" => "modified in node version 4" }, true], nodes[0] - assert_equal [3.0, 3.0, 3, 1, { "test" => "yes" }, true], nodes[1] + assert_equal [1.0, 1.0, 15, 4, { node_tag.k => node_tag.v }, true], nodes[0] + assert_equal [3.0, 3.0, 3, 1, { node_tag2.k => node_tag2.v }, true], nodes[1] way = ways(:way_with_redacted_versions_v2) + node_tag3 = create(:node_tag, :node => current_nodes(:invisible_node)) nodes = OldWay.find(way.id).get_nodes_undelete assert_equal 2, nodes.size - assert_equal [3.0, 3.0, 3, 1, { "test" => "yes" }, true], nodes[0] - assert_equal [2.0, 2.0, 2, 1, { "testused" => "yes" }, false], nodes[1] + assert_equal [3.0, 3.0, 3, 1, { node_tag2.k => node_tag2.v }, true], nodes[0] + assert_equal [2.0, 2.0, 2, 1, { node_tag3.k => node_tag3.v }, false], nodes[1] end end diff --git a/test/models/relation_tag_test.rb b/test/models/relation_tag_test.rb index ef635cc94..f221f78cc 100644 --- a/test/models/relation_tag_test.rb +++ b/test/models/relation_tag_test.rb @@ -3,52 +3,34 @@ require "test_helper" class RelationTagTest < ActiveSupport::TestCase api_fixtures - def test_relation_tag_count - assert_equal 10, RelationTag.count - end - def test_length_key_valid - key = "k" + tag = create(:relation_tag) (0..255).each do |i| - tag = RelationTag.new - tag.relation_id = 1 - tag.k = key * i - tag.v = "v" + tag.k = "k" * i assert tag.valid? end end def test_length_value_valid - val = "v" + tag = create(:relation_tag) (0..255).each do |i| - tag = RelationTag.new - tag.relation_id = 1 - tag.k = "k" - tag.v = val * i + tag.v = "v" * i assert tag.valid? end end def test_length_key_invalid - ["k" * 256].each do |i| - tag = RelationTag.new - tag.relation_id = 1 - tag.k = i - tag.v = "v" - assert !tag.valid?, "Key #{i} should be too long" - assert tag.errors[:k].any? - end + tag = create(:relation_tag) + tag.k = "k" * 256 + assert !tag.valid?, "Key should be too long" + assert tag.errors[:k].any? end def test_length_value_invalid - ["v" * 256].each do |i| - tag = RelationTag.new - tag.relation_id = 1 - tag.k = "k" - tag.v = i - assert !tag.valid?, "Value #{i} should be too long" - assert tag.errors[:v].any? - end + tag = create(:relation_tag) + tag.v = "v" * 256 + assert !tag.valid?, "Value should be too long" + assert tag.errors[:v].any? end def test_empty_tag_invalid @@ -58,10 +40,11 @@ class RelationTagTest < ActiveSupport::TestCase end def test_uniquness + existing = create(:relation_tag) tag = RelationTag.new - tag.relation_id = current_relation_tags(:t1).relation_id - tag.k = current_relation_tags(:t1).k - tag.v = current_relation_tags(:t1).v + tag.relation_id = existing.relation_id + tag.k = existing.k + tag.v = existing.v assert tag.new_record? assert !tag.valid? assert_raise(ActiveRecord::RecordInvalid) { tag.save! } diff --git a/test/models/relation_test.rb b/test/models/relation_test.rb index 028cd7d48..b095024a6 100644 --- a/test/models/relation_test.rb +++ b/test/models/relation_test.rb @@ -129,20 +129,25 @@ class RelationTest < ActiveSupport::TestCase def test_relation_tags relation = current_relations(:relation_with_versions) + taglist = create_list(:relation_tag, 2, :relation => relation) + tags = Relation.find(relation.id).relation_tags.order(:k) - assert_equal 2, tags.count - assert_equal "testing", tags[0].k - assert_equal "added in relation version 3", tags[0].v - assert_equal "testing two", tags[1].k - assert_equal "modified in relation version 4", tags[1].v + assert_equal taglist.count, tags.count + taglist.sort_by!(&:k).each_index do |i| + assert_equal taglist[i].k, tags[i].k + assert_equal taglist[i].v, tags[i].v + end end def test_tags relation = current_relations(:relation_with_versions) + taglist = create_list(:relation_tag, 2, :relation => relation) + tags = Relation.find(relation.id).tags - assert_equal 2, tags.size - assert_equal "added in relation version 3", tags["testing"] - assert_equal "modified in relation version 4", tags["testing two"] + assert_equal taglist.count, tags.count + taglist.each do |tag| + assert_equal tag.v, tags[tag.k] + end end def test_containing_relation_members diff --git a/test/models/request_token_test.rb b/test/models/request_token_test.rb new file mode 100644 index 000000000..24ad419fa --- /dev/null +++ b/test/models/request_token_test.rb @@ -0,0 +1,12 @@ +require "test_helper" + +class RequestTokenTest < ActiveSupport::TestCase + api_fixtures + + def test_oob + assert_equal true, RequestToken.new.oob? + assert_equal true, RequestToken.new(:callback_url => "oob").oob? + assert_equal true, RequestToken.new(:callback_url => "OOB").oob? + assert_equal false, RequestToken.new(:callback_url => "http://test.host/").oob? + end +end diff --git a/test/models/trace_test.rb b/test/models/trace_test.rb index 524ec637a..bc5122c13 100644 --- a/test/models/trace_test.rb +++ b/test/models/trace_test.rb @@ -1,18 +1,22 @@ require "test_helper" require "digest" +require "minitest/mock" class TraceTest < ActiveSupport::TestCase - api_fixtures + fixtures :users def setup @gpx_trace_dir = Object.send("remove_const", "GPX_TRACE_DIR") - Object.const_set("GPX_TRACE_DIR", File.dirname(__FILE__) + "/../traces") + Object.const_set("GPX_TRACE_DIR", Rails.root.join("test", "gpx", "traces")) @gpx_image_dir = Object.send("remove_const", "GPX_IMAGE_DIR") - Object.const_set("GPX_IMAGE_DIR", File.dirname(__FILE__) + "/../traces") + Object.const_set("GPX_IMAGE_DIR", Rails.root.join("test", "gpx", "images")) end def teardown + File.unlink(*Dir.glob(File.join(GPX_TRACE_DIR, "*.gpx"))) + File.unlink(*Dir.glob(File.join(GPX_IMAGE_DIR, "*.gif"))) + Object.send("remove_const", "GPX_TRACE_DIR") Object.const_set("GPX_TRACE_DIR", @gpx_trace_dir) @@ -20,41 +24,55 @@ class TraceTest < ActiveSupport::TestCase Object.const_set("GPX_IMAGE_DIR", @gpx_image_dir) end - def test_trace_count - assert_equal 10, Trace.count - end - def test_visible - check_query(Trace.visible, [ - :public_trace_file, :anon_trace_file, :trackable_trace_file, - :identifiable_trace_file, :zipped_trace_file, :tar_trace_file, - :tar_gzip_trace_file, :tar_bzip_trace_file, :pending_trace_file - ]) + public_trace_file = create(:trace) + create(:trace, :deleted) + check_query(Trace.visible, [public_trace_file]) end def test_visible_to - check_query(Trace.visible_to(1), [ - :public_trace_file, :identifiable_trace_file, :pending_trace_file - ]) - check_query(Trace.visible_to(2), [ - :public_trace_file, :anon_trace_file, :trackable_trace_file, - :identifiable_trace_file, :pending_trace_file - ]) - check_query(Trace.visible_to(3), [ - :public_trace_file, :identifiable_trace_file, :pending_trace_file - ]) + public_trace_file = create(:trace, :visibility => "public", :user => users(:normal_user)) + anon_trace_file = create(:trace, :visibility => "private", :user => users(:public_user)) + identifiable_trace_file = create(:trace, :visibility => "identifiable", :user => users(:normal_user)) + pending_trace_file = create(:trace, :visibility => "public", :user => users(:public_user), :inserted => false) + trackable_trace_file = create(:trace, :visibility => "trackable", :user => users(:public_user)) + _other_trace_file = create(:trace, :visibility => "private", :user => users(:second_public_user)) + + check_query(Trace.visible_to(users(:normal_user).id), [ + public_trace_file, identifiable_trace_file, pending_trace_file + ]) + check_query(Trace.visible_to(users(:public_user)), [ + public_trace_file, anon_trace_file, trackable_trace_file, + identifiable_trace_file, pending_trace_file + ]) + check_query(Trace.visible_to(users(:inactive_user)), [ + public_trace_file, identifiable_trace_file, pending_trace_file + ]) end def test_visible_to_all + public_trace_file = create(:trace, :visibility => "public") + _private_trace_file = create(:trace, :visibility => "private") + identifiable_trace_file = create(:trace, :visibility => "identifiable") + _trackable_trace_file = create(:trace, :visibility => "trackable") + deleted_trace_file = create(:trace, :deleted, :visibility => "public") + pending_trace_file = create(:trace, :visibility => "public", :inserted => false) + check_query(Trace.visible_to_all, [ - :public_trace_file, :identifiable_trace_file, - :deleted_trace_file, :pending_trace_file - ]) + public_trace_file, identifiable_trace_file, + deleted_trace_file, pending_trace_file + ]) end def test_tagged - check_query(Trace.tagged("London"), [:public_trace_file, :anon_trace_file]) - check_query(Trace.tagged("Birmingham"), [:anon_trace_file, :identifiable_trace_file]) + london_trace_file = create(:trace) do |trace| + create(:tracetag, :trace => trace, :tag => "London") + end + birmingham_trace_file = create(:trace) do |trace| + create(:tracetag, :trace => trace, :tag => "Birmingham") + end + check_query(Trace.tagged("London"), [london_trace_file]) + check_query(Trace.tagged("Birmingham"), [birmingham_trace_file]) check_query(Trace.tagged("Unknown"), []) end @@ -74,7 +92,7 @@ class TraceTest < ActiveSupport::TestCase end def test_tagstring - trace = Trace.new(gpx_files(:public_trace_file).attributes) + trace = build(:trace) trace.tagstring = "foo bar baz" assert trace.valid? assert_equal 3, trace.tags.length @@ -92,66 +110,68 @@ class TraceTest < ActiveSupport::TestCase end def test_public? - assert_equal true, gpx_files(:public_trace_file).public? - assert_equal false, gpx_files(:anon_trace_file).public? - assert_equal false, gpx_files(:trackable_trace_file).public? - assert_equal true, gpx_files(:identifiable_trace_file).public? - assert_equal true, gpx_files(:deleted_trace_file).public? + assert_equal true, build(:trace, :visibility => "public").public? + assert_equal false, build(:trace, :visibility => "private").public? + assert_equal false, build(:trace, :visibility => "trackable").public? + assert_equal true, build(:trace, :visibility => "identifiable").public? + assert_equal true, build(:trace, :deleted, :visibility => "public").public? end def test_trackable? - assert_equal false, gpx_files(:public_trace_file).trackable? - assert_equal false, gpx_files(:anon_trace_file).trackable? - assert_equal true, gpx_files(:trackable_trace_file).trackable? - assert_equal true, gpx_files(:identifiable_trace_file).trackable? - assert_equal false, gpx_files(:deleted_trace_file).trackable? + assert_equal false, build(:trace, :visibility => "public").trackable? + assert_equal false, build(:trace, :visibility => "private").trackable? + assert_equal true, build(:trace, :visibility => "trackable").trackable? + assert_equal true, build(:trace, :visibility => "identifiable").trackable? + assert_equal false, build(:trace, :deleted, :visibility => "public").trackable? end def test_identifiable? - assert_equal false, gpx_files(:public_trace_file).identifiable? - assert_equal false, gpx_files(:anon_trace_file).identifiable? - assert_equal false, gpx_files(:trackable_trace_file).identifiable? - assert_equal true, gpx_files(:identifiable_trace_file).identifiable? - assert_equal false, gpx_files(:deleted_trace_file).identifiable? + assert_equal false, build(:trace, :visibility => "public").identifiable? + assert_equal false, build(:trace, :visibility => "private").identifiable? + assert_equal false, build(:trace, :visibility => "trackable").identifiable? + assert_equal true, build(:trace, :visibility => "identifiable").identifiable? + assert_equal false, build(:trace, :deleted, :visibility => "public").identifiable? end def test_mime_type - assert_equal "application/gpx+xml", gpx_files(:public_trace_file).mime_type - assert_equal "application/gpx+xml", gpx_files(:anon_trace_file).mime_type - assert_equal "application/x-bzip2", gpx_files(:trackable_trace_file).mime_type - assert_equal "application/x-gzip", gpx_files(:identifiable_trace_file).mime_type - assert_equal "application/x-zip", gpx_files(:zipped_trace_file).mime_type - assert_equal "application/x-tar", gpx_files(:tar_trace_file).mime_type - assert_equal "application/x-gzip", gpx_files(:tar_gzip_trace_file).mime_type - assert_equal "application/x-bzip2", gpx_files(:tar_bzip_trace_file).mime_type + # The ids refer to the .gpx fixtures in test/traces + check_mime_type("a", "application/gpx+xml") + check_mime_type("b", "application/gpx+xml") + check_mime_type("c", "application/x-bzip2") + check_mime_type("d", "application/x-gzip") + check_mime_type("f", "application/x-zip") + check_mime_type("g", "application/x-tar") + check_mime_type("h", "application/x-gzip") + check_mime_type("i", "application/x-bzip2") end def test_extension_name - assert_equal ".gpx", gpx_files(:public_trace_file).extension_name - assert_equal ".gpx", gpx_files(:anon_trace_file).extension_name - assert_equal ".gpx.bz2", gpx_files(:trackable_trace_file).extension_name - assert_equal ".gpx.gz", gpx_files(:identifiable_trace_file).extension_name - assert_equal ".zip", gpx_files(:zipped_trace_file).extension_name - assert_equal ".tar", gpx_files(:tar_trace_file).extension_name - assert_equal ".tar.gz", gpx_files(:tar_gzip_trace_file).extension_name - assert_equal ".tar.bz2", gpx_files(:tar_bzip_trace_file).extension_name + # The ids refer to the .gpx fixtures in test/traces + check_extension_name("a", ".gpx") + check_extension_name("b", ".gpx") + check_extension_name("c", ".gpx.bz2") + check_extension_name("d", ".gpx.gz") + check_extension_name("f", ".zip") + check_extension_name("g", ".tar") + check_extension_name("h", ".tar.gz") + check_extension_name("i", ".tar.bz2") end def test_xml_file - assert_equal "848caa72f2f456d1bd6a0fdf228aa1b9", md5sum(gpx_files(:public_trace_file).xml_file) - assert_equal "66179ca44f1e93d8df62e2b88cbea732", md5sum(gpx_files(:anon_trace_file).xml_file) - assert_equal "848caa72f2f456d1bd6a0fdf228aa1b9", md5sum(gpx_files(:trackable_trace_file).xml_file) - assert_equal "abd6675fdf3024a84fc0a1deac147c0d", md5sum(gpx_files(:identifiable_trace_file).xml_file) - assert_equal "848caa72f2f456d1bd6a0fdf228aa1b9", md5sum(gpx_files(:zipped_trace_file).xml_file) - assert_equal "848caa72f2f456d1bd6a0fdf228aa1b9", md5sum(gpx_files(:tar_trace_file).xml_file) - assert_equal "848caa72f2f456d1bd6a0fdf228aa1b9", md5sum(gpx_files(:tar_gzip_trace_file).xml_file) - assert_equal "848caa72f2f456d1bd6a0fdf228aa1b9", md5sum(gpx_files(:tar_bzip_trace_file).xml_file) + check_xml_file("a", "848caa72f2f456d1bd6a0fdf228aa1b9") + check_xml_file("b", "66179ca44f1e93d8df62e2b88cbea732") + check_xml_file("c", "848caa72f2f456d1bd6a0fdf228aa1b9") + check_xml_file("d", "abd6675fdf3024a84fc0a1deac147c0d") + check_xml_file("f", "848caa72f2f456d1bd6a0fdf228aa1b9") + check_xml_file("g", "848caa72f2f456d1bd6a0fdf228aa1b9") + check_xml_file("h", "848caa72f2f456d1bd6a0fdf228aa1b9") + check_xml_file("i", "848caa72f2f456d1bd6a0fdf228aa1b9") end def test_large_picture - picture = gpx_files(:public_trace_file).large_picture - trace = Trace.create + picture = File.read(Rails.root.join("test", "gpx", "fixtures", "a.gif"), :mode => "rb") + trace = Trace.create trace.large_picture = picture assert_equal "7c841749e084ee4a5d13f12cd3bef456", md5sum(File.new(trace.large_picture_name)) assert_equal picture, trace.large_picture @@ -160,9 +180,9 @@ class TraceTest < ActiveSupport::TestCase end def test_icon_picture - picture = gpx_files(:public_trace_file).icon_picture - trace = Trace.create + picture = File.read(Rails.root.join("test", "gpx", "fixtures", "a_icon.gif"), :mode => "rb") + trace = Trace.create trace.icon_picture = picture assert_equal "b47baf22ed0e85d77e808694fad0ee27", md5sum(File.new(trace.icon_picture_name)) assert_equal picture, trace.icon_picture @@ -173,12 +193,24 @@ class TraceTest < ActiveSupport::TestCase private def check_query(query, traces) - traces = traces.map { |t| gpx_files(t).id }.sort + traces = traces.map(&:id).sort assert_equal traces, query.order(:id).ids end + def check_mime_type(id, mime_type) + assert_equal mime_type, create(:trace, :fixture => id).mime_type + end + + def check_extension_name(id, extension_name) + assert_equal extension_name, create(:trace, :fixture => id).extension_name + end + + def check_xml_file(id, md5sum) + assert_equal md5sum, md5sum(create(:trace, :fixture => id).xml_file) + end + def trace_valid(attrs, result = true) - entry = Trace.new(gpx_files(:public_trace_file).attributes) + entry = build(:trace) entry.assign_attributes(attrs) assert_equal result, entry.valid?, "Expected #{attrs.inspect} to be #{result}" end diff --git a/test/models/tracepoint_test.rb b/test/models/tracepoint_test.rb index e24a833cf..45dd7496f 100644 --- a/test/models/tracepoint_test.rb +++ b/test/models/tracepoint_test.rb @@ -1,9 +1,10 @@ require "test_helper" class TracepointTest < ActiveSupport::TestCase - api_fixtures - - def test_tracepoint_count - assert_equal 4, Tracepoint.count + def test_timestamp_required + tracepoint = create(:tracepoint) + assert tracepoint.valid? + tracepoint.timestamp = nil + assert !tracepoint.valid? end end diff --git a/test/models/tracetag_test.rb b/test/models/tracetag_test.rb index a13d41e4a..04263dbb7 100644 --- a/test/models/tracetag_test.rb +++ b/test/models/tracetag_test.rb @@ -1,12 +1,6 @@ require "test_helper" class TracetagTest < ActiveSupport::TestCase - api_fixtures - - def test_tracetag_count - assert_equal 4, Tracetag.count - end - def test_validations tracetag_valid({}) tracetag_valid({ :tag => nil }, false) @@ -24,7 +18,7 @@ class TracetagTest < ActiveSupport::TestCase private def tracetag_valid(attrs, result = true) - entry = Tracetag.new(gpx_file_tags(:first_trace_1).attributes) + entry = build(:tracetag) entry.assign_attributes(attrs) assert_equal result, entry.valid?, "Expected #{attrs.inspect} to be #{result}" end diff --git a/test/models/user_preference_test.rb b/test/models/user_preference_test.rb index ee2dbf2d8..c61bd607d 100644 --- a/test/models/user_preference_test.rb +++ b/test/models/user_preference_test.rb @@ -2,25 +2,16 @@ require "test_helper" class UserPreferenceTest < ActiveSupport::TestCase api_fixtures - fixtures :user_preferences - - # This checks to make sure that there are two user preferences - # stored in the test database. - # This test needs to be updated for every addition/deletion from - # the fixture file - def test_check_count - assert_equal 4, UserPreference.count - end # Checks that you cannot add a new preference, that is a duplicate def test_add_duplicate_preference - up = user_preferences(:a) + up = create(:user_preference) new_up = UserPreference.new new_up.user = users(:normal_user) new_up.k = up.k new_up.v = "some other value" assert_not_equal new_up.v, up.v - assert_raise (ActiveRecord::RecordNotUnique) { new_up.save } + assert_raise(ActiveRecord::RecordNotUnique) { new_up.save } end def test_check_valid_length diff --git a/test/models/user_test.rb b/test/models/user_test.rb index b3e6eae8f..a2a45e203 100644 --- a/test/models/user_test.rb +++ b/test/models/user_test.rb @@ -5,7 +5,7 @@ class UserTest < ActiveSupport::TestCase include Rails::Dom::Testing::Assertions::SelectorAssertions api_fixtures - fixtures :friends, :languages, :user_roles + fixtures :user_roles def test_invalid_with_empty_attributes user = User.new @@ -20,8 +20,9 @@ class UserTest < ActiveSupport::TestCase end def test_unique_email + existing_user = create(:user) new_user = User.new( - :email => users(:normal_user).email, + :email => existing_user.email, :status => "active", :pass_crypt => Digest::MD5.hexdigest("test"), :display_name => "new user", @@ -33,11 +34,12 @@ class UserTest < ActiveSupport::TestCase end def test_unique_display_name + existing_user = create(:user) new_user = User.new( :email => "tester@openstreetmap.org", :status => "pending", :pass_crypt => Digest::MD5.hexdigest("test"), - :display_name => users(:normal_user).display_name, + :display_name => existing_user.display_name, :data_public => 1, :description => "desc" ) @@ -52,20 +54,20 @@ class UserTest < ActiveSupport::TestCase 輕觸搖晃的遊戲@ah.com も対応します@s.name) ok.each do |name| - user = users(:normal_user) + user = build(:user) user.email = name assert user.valid?(:save), user.errors.full_messages.join(",") end bad.each do |name| - user = users(:normal_user) + user = build(:user) user.email = name assert user.invalid?(:save), "#{name} is valid when it shouldn't be" end end def test_display_name_length - user = users(:normal_user) + user = build(:user) user.display_name = "123" assert user.valid?, " should allow nil display name" user.display_name = "12" @@ -93,67 +95,68 @@ class UserTest < ActiveSupport::TestCase "new", "terms", "save", "confirm", "confirm-email", "go_public", "reset-password", "forgot-password", "suspended"] ok.each do |display_name| - user = users(:normal_user) + user = build(:user) user.display_name = display_name assert user.valid?, "#{display_name} is invalid, when it should be" end bad.each do |display_name| - user = users(:normal_user) + user = build(:user) user.display_name = display_name assert !user.valid?, "#{display_name} is valid when it shouldn't be" end end - def test_friend_with - assert users(:normal_user).is_friends_with?(users(:public_user)) - assert !users(:normal_user).is_friends_with?(users(:inactive_user)) - assert !users(:public_user).is_friends_with?(users(:normal_user)) - assert !users(:public_user).is_friends_with?(users(:inactive_user)) - assert !users(:inactive_user).is_friends_with?(users(:normal_user)) - assert !users(:inactive_user).is_friends_with?(users(:public_user)) + def test_friends_with + alice = create(:user, :active) + bob = create(:user, :active) + charlie = create(:user, :active) + create(:friend, :befriender => alice, :befriendee => bob) + + assert alice.is_friends_with?(bob) + assert !alice.is_friends_with?(charlie) + assert !bob.is_friends_with?(alice) + assert !bob.is_friends_with?(charlie) + assert !charlie.is_friends_with?(bob) + assert !charlie.is_friends_with?(alice) end def test_users_nearby - # second user has their data public and is close by normal user - assert_equal [users(:public_user), users(:german_user)], users(:normal_user).nearby - # second_user has normal user nearby, but normal user has their data private - assert_equal [users(:german_user)], users(:public_user).nearby - # inactive_user has no user nearby - assert_equal [], users(:inactive_user).nearby - # north_pole_user has no user nearby, and doesn't throw exception - assert_equal [], users(:north_pole_user).nearby - # confirmed_user has no home location - assert_equal [], users(:confirmed_user).nearby + alice = create(:user, :active, :home_lat => 51.0, :home_lon => 1.0, :data_public => false) + bob = create(:user, :active, :home_lat => 51.1, :home_lon => 1.0, :data_public => true) + charlie = create(:user, :active, :home_lat => 51.1, :home_lon => 1.1, :data_public => true) + david = create(:user, :active, :home_lat => 10.0, :home_lon => -123.0, :data_public => true) + _edward = create(:user, :suspended, :home_lat => 10.0, :home_lon => -123.0, :data_public => true) + south_pole_user = create(:user, :active, :home_lat => -90.0, :home_lon => 0.0, :data_public => true) + vagrant_user = create(:user, :active, :home_lat => nil, :home_lon => nil, :data_public => true) + + # bob and charlie are both near alice + assert_equal [bob, charlie], alice.nearby + # charlie and alice are both near bob, but alice has their data private + assert_equal [charlie], bob.nearby + # david has no user nearby, since edward is not active + assert_equal [], david.nearby + # south_pole_user has no user nearby, and doesn't throw exception + assert_equal [], south_pole_user.nearby + # vagrant_user has no home location + assert_equal [], vagrant_user.nearby end - def test_friends_with - # normal user is a friend of second user - # it should be a one way friend accossitation - assert_equal 1, Friend.count - norm = users(:normal_user) - sec = users(:public_user) - # friend = Friend.new - # friend.befriender = norm - # friend.befriendee = sec - # friend.save + def test_friend_users + norm = create(:user, :active) + sec = create(:user, :active) + create(:friend, :befriender => norm, :befriendee => sec) + assert_equal [sec], norm.friend_users assert_equal 1, norm.friend_users.size - assert_equal 1, Friend.count - assert norm.is_friends_with?(sec) - assert !sec.is_friends_with?(norm) - assert !users(:normal_user).is_friends_with?(users(:inactive_user)) - assert !users(:public_user).is_friends_with?(users(:normal_user)) - assert !users(:public_user).is_friends_with?(users(:inactive_user)) - assert !users(:inactive_user).is_friends_with?(users(:normal_user)) - assert !users(:inactive_user).is_friends_with?(users(:public_user)) - # Friend.delete(friend) - # assert_equal 0, Friend.count + + assert_equal [], sec.friend_users + assert_equal 0, sec.friend_users.size end def test_user_preferred_editor - user = users(:normal_user) - assert_equal nil, user.preferred_editor + user = create(:user) + assert_nil user.preferred_editor user.preferred_editor = "potlatch" assert_equal "potlatch", user.preferred_editor user.save! @@ -163,87 +166,109 @@ class UserTest < ActiveSupport::TestCase end def test_visible - assert_equal 19, User.visible.count + pending = create(:user, :pending) + active = create(:user, :active) + confirmed = create(:user, :confirmed) + suspended = create(:user, :suspended) + deleted = create(:user, :deleted) + + assert User.visible.find(pending.id) + assert User.visible.find(active.id) + assert User.visible.find(confirmed.id) assert_raise ActiveRecord::RecordNotFound do - User.visible.find(users(:suspended_user).id) + User.visible.find(suspended.id) end assert_raise ActiveRecord::RecordNotFound do - User.visible.find(users(:deleted_user).id) + User.visible.find(deleted.id) end end def test_active - assert_equal 18, User.active.count + pending = create(:user, :pending) + active = create(:user, :active) + confirmed = create(:user, :confirmed) + suspended = create(:user, :suspended) + deleted = create(:user, :deleted) + + assert User.active.find(active.id) + assert User.active.find(confirmed.id) assert_raise ActiveRecord::RecordNotFound do - User.active.find(users(:inactive_user).id) + User.active.find(pending.id) end assert_raise ActiveRecord::RecordNotFound do - User.active.find(users(:suspended_user).id) + User.active.find(suspended.id) end assert_raise ActiveRecord::RecordNotFound do - User.active.find(users(:deleted_user).id) + User.active.find(deleted.id) end end def test_identifiable - assert_equal 20, User.identifiable.count + public_user = create(:user, :data_public => true) + private_user = create(:user, :data_public => false) + + assert User.identifiable.find(public_user.id) assert_raise ActiveRecord::RecordNotFound do - User.identifiable.find(users(:normal_user).id) + User.identifiable.find(private_user.id) end end def test_languages - user = users(:normal_user) + create(:language, :code => "en") + create(:language, :code => "de") + create(:language, :code => "sl") + + user = create(:user, :languages => ["en"]) assert_equal ["en"], user.languages user.languages = %w(de fr en) assert_equal %w(de fr en), user.languages user.languages = %w(fr de sl) assert_equal "de", user.preferred_language - assert_equal "de", user.preferred_language_from(%w(en sl de es)) - user = users(:public_user) + assert_equal %w(fr de sl), user.preferred_languages.map(&:to_s) + user = create(:user, :languages => %w(en de)) assert_equal %w(en de), user.languages end def test_visible? - assert_equal true, users(:inactive_user).visible? - assert_equal true, users(:normal_user).visible? - assert_equal true, users(:confirmed_user).visible? - assert_equal false, users(:suspended_user).visible? - assert_equal false, users(:deleted_user).visible? + assert_equal true, build(:user, :pending).visible? + assert_equal true, build(:user, :active).visible? + assert_equal true, build(:user, :confirmed).visible? + assert_equal false, build(:user, :suspended).visible? + assert_equal false, build(:user, :deleted).visible? end def test_active? - assert_equal false, users(:inactive_user).active? - assert_equal true, users(:normal_user).active? - assert_equal true, users(:confirmed_user).active? - assert_equal false, users(:suspended_user).active? - assert_equal false, users(:deleted_user).active? + assert_equal false, build(:user, :pending).active? + assert_equal true, build(:user, :active).active? + assert_equal true, build(:user, :confirmed).active? + assert_equal false, build(:user, :suspended).active? + assert_equal false, build(:user, :deleted).active? end def test_moderator? - assert_equal false, users(:normal_user).moderator? - assert_equal true, users(:moderator_user).moderator? + assert_equal false, create(:user).moderator? + assert_equal true, create(:moderator_user).moderator? end def test_administrator? - assert_equal false, users(:normal_user).administrator? - assert_equal true, users(:administrator_user).administrator? + assert_equal false, create(:user).administrator? + assert_equal true, create(:administrator_user).administrator? end def test_has_role? - assert_equal false, users(:normal_user).has_role?("administrator") - assert_equal false, users(:normal_user).has_role?("moderator") - assert_equal true, users(:administrator_user).has_role?("administrator") - assert_equal true, users(:moderator_user).has_role?("moderator") + assert_equal false, create(:user).has_role?("administrator") + assert_equal false, create(:user).has_role?("moderator") + assert_equal true, create(:administrator_user).has_role?("administrator") + assert_equal true, create(:moderator_user).has_role?("moderator") end def test_delete - user = users(:normal_user) + user = create(:user, :with_home_location, :description => "foo") user.delete assert_equal "user_#{user.id}", user.display_name assert user.description.blank? - assert_equal nil, user.home_lat - assert_equal nil, user.home_lon + assert_nil user.home_lat + assert_nil user.home_lon assert_equal false, user.image.file? assert_equal "deleted", user.status assert_equal false, user.visible? @@ -251,7 +276,7 @@ class UserTest < ActiveSupport::TestCase end def test_to_xml - user = users(:normal_user) + user = build(:user, :with_home_location) xml = user.to_xml assert_select Nokogiri::XML::Document.parse(xml.to_s), "user" do assert_select "[display_name=?]", user.display_name @@ -261,7 +286,7 @@ class UserTest < ActiveSupport::TestCase end def test_to_xml_node - user = users(:normal_user) + user = build(:user, :with_home_location) xml = user.to_xml_node assert_select Nokogiri::XML::DocumentFragment.parse(xml.to_s), "user" do assert_select "[display_name=?]", user.display_name diff --git a/test/models/user_token_test.rb b/test/models/user_token_test.rb index 97a23045b..cf9f09ea4 100644 --- a/test/models/user_token_test.rb +++ b/test/models/user_token_test.rb @@ -1,10 +1,4 @@ require "test_helper" class UserTokenTest < ActiveSupport::TestCase - api_fixtures - fixtures :user_tokens - - def test_user_token_count - assert_equal 0, UserToken.count - end end diff --git a/test/models/way_tag_test.rb b/test/models/way_tag_test.rb index 46be06c94..ae8be73b3 100644 --- a/test/models/way_tag_test.rb +++ b/test/models/way_tag_test.rb @@ -3,52 +3,34 @@ require "test_helper" class WayTagTest < ActiveSupport::TestCase api_fixtures - def test_way_tag_count - assert_equal 6, WayTag.count - end - def test_length_key_valid - key = "k" + tag = create(:way_tag) (0..255).each do |i| - tag = WayTag.new - tag.way_id = current_way_tags(:t1).way_id - tag.k = key * i - tag.v = current_way_tags(:t1).v + tag.k = "k" * i assert tag.valid? end end def test_length_value_valid - val = "v" + tag = create(:way_tag) (0..255).each do |i| - tag = WayTag.new - tag.way_id = current_way_tags(:t1).way_id - tag.k = "k" - tag.v = val * i + tag.v = "v" * i assert tag.valid? end end def test_length_key_invalid - ["k" * 256].each do |i| - tag = WayTag.new - tag.way_id = current_way_tags(:t1).way_id - tag.k = i - tag.v = "v" - assert !tag.valid?, "Key #{i} should be too long" - assert tag.errors[:k].any? - end + tag = create(:way_tag) + tag.k = "k" * 256 + assert !tag.valid?, "Key should be too long" + assert tag.errors[:k].any? end def test_length_value_invalid - ["v" * 256].each do |i| - tag = WayTag.new - tag.way_id = current_way_tags(:t1).way_id - tag.k = "k" - tag.v = i - assert !tag.valid?, "Value #{i} should be too long" - assert tag.errors[:v].any? - end + tag = create(:way_tag) + tag.v = "v" * 256 + assert !tag.valid?, "Value should be too long" + assert tag.errors[:v].any? end def test_empty_tag_invalid @@ -58,10 +40,11 @@ class WayTagTest < ActiveSupport::TestCase end def test_uniqueness + existing = create(:way_tag) tag = WayTag.new - tag.way_id = current_way_tags(:t1).way_id - tag.k = current_way_tags(:t1).k - tag.v = current_way_tags(:t1).v + tag.way_id = existing.way_id + tag.k = existing.k + tag.v = existing.v assert tag.new_record? assert !tag.valid? assert_raise(ActiveRecord::RecordInvalid) { tag.save! } diff --git a/test/models/way_test.rb b/test/models/way_test.rb index 807079f09..807b71d5b 100644 --- a/test/models/way_test.rb +++ b/test/models/way_test.rb @@ -29,7 +29,7 @@ class WayTest < ActiveSupport::TestCase way = Way.find(current_ways(:visible_way).id) assert way.valid? # it already has 1 node - 1.upto((MAX_NUMBER_OF_WAY_NODES) / 2) do + 1.upto(MAX_NUMBER_OF_WAY_NODES / 2) do way.add_nd_num(current_nodes(:used_node_1).id) way.add_nd_num(current_nodes(:used_node_2).id) end @@ -165,20 +165,23 @@ class WayTest < ActiveSupport::TestCase def test_way_tags way = current_ways(:way_with_versions) + taglist = create_list(:way_tag, 2, :way => way) tags = Way.find(way.id).way_tags.order(:k) - assert_equal 2, tags.count - assert_equal "testing", tags[0].k - assert_equal "added in way version 3", tags[0].v - assert_equal "testing two", tags[1].k - assert_equal "modified in way version 4", tags[1].v + assert_equal taglist.count, tags.count + taglist.sort_by!(&:k).each_index do |i| + assert_equal taglist[i].k, tags[i].k + assert_equal taglist[i].v, tags[i].v + end end def test_tags way = current_ways(:way_with_versions) + taglist = create_list(:way_tag, 2, :way => way) tags = Way.find(way.id).tags - assert_equal 2, tags.size - assert_equal "added in way version 3", tags["testing"] - assert_equal "modified in way version 4", tags["testing two"] + assert_equal taglist.count, tags.count + taglist.each do |tag| + assert_equal tag.v, tags[tag.k] + end end def test_containing_relation_members diff --git a/test/test_helper.rb b/test/test_helper.rb index 15b03b4da..dba005145 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -4,62 +4,48 @@ Coveralls.wear!("rails") ENV["RAILS_ENV"] = "test" require File.expand_path("../../config/environment", __FILE__) require "rails/test_help" +require "webmock/minitest" load "composite_primary_keys/fixtures.rb" module ActiveSupport class TestCase + include FactoryGirl::Syntax::Methods + # Load standard fixtures needed to test API methods def self.api_fixtures # print "setting up the api_fixtures" - fixtures :users, :user_roles, :user_blocks - fixtures :changesets, :changeset_tags, :changeset_comments + fixtures :users, :user_roles + fixtures :changesets fixtures :current_nodes, :nodes set_fixture_class :current_nodes => Node set_fixture_class :nodes => OldNode - fixtures :current_node_tags, :node_tags - set_fixture_class :current_node_tags => NodeTag - set_fixture_class :node_tags => OldNodeTag - fixtures :current_ways set_fixture_class :current_ways => Way - fixtures :current_way_nodes, :current_way_tags + fixtures :current_way_nodes set_fixture_class :current_way_nodes => WayNode - set_fixture_class :current_way_tags => WayTag fixtures :ways set_fixture_class :ways => OldWay - fixtures :way_nodes, :way_tags + fixtures :way_nodes set_fixture_class :way_nodes => OldWayNode - set_fixture_class :way_tags => OldWayTag fixtures :current_relations set_fixture_class :current_relations => Relation - fixtures :current_relation_members, :current_relation_tags + fixtures :current_relation_members set_fixture_class :current_relation_members => RelationMember - set_fixture_class :current_relation_tags => RelationTag fixtures :relations set_fixture_class :relations => OldRelation - fixtures :relation_members, :relation_tags + fixtures :relation_members set_fixture_class :relation_members => OldRelationMember - set_fixture_class :relation_tags => OldRelationTag - - fixtures :gpx_files, :gps_points, :gpx_file_tags - set_fixture_class :gpx_files => Trace - set_fixture_class :gps_points => Tracepoint - set_fixture_class :gpx_file_tags => Tracetag - - fixtures :client_applications fixtures :redactions - - fixtures :notes, :note_comments end ## @@ -76,6 +62,19 @@ module ActiveSupport end end + ## + # work round minitest insanity that causes it to tell you + # to use assert_nil to test for nil, which is fine if you're + # comparing to a nil constant but not if you're comparing + # an expression that might be nil sometimes + def assert_equal_allowing_nil(exp, act, msg = nil) + if exp.nil? + assert_nil act, msg + else + assert_equal exp, act, msg + end + end + ## # for some reason assert_equal a, b fails when the relations are # actually equal, so this method manually checks the fields... @@ -160,22 +159,33 @@ module ActiveSupport ## # execute a block with a given set of HTTP responses stubbed def with_http_stubs(stubs_file) - http_client_save = OSM.http_client + stubs = YAML.load_file(File.expand_path("../http/#{stubs_file}.yml", __FILE__)) + stubs.each do |url, response| + stub_request(:get, Regexp.new(Regexp.quote(url))).to_return(:status => response["code"], :body => response["body"]) + end - begin - stubs = YAML.load_file(File.expand_path("../http/#{stubs_file}.yml", __FILE__)) - - OSM.http_client = Faraday.new do |builder| - builder.adapter :test do |stub| - stubs.each do |url, body| - stub.get(url) { |_env| [200, {}, body] } - end - end - end + yield + end - yield - ensure - OSM.http_client = http_client_save + def stub_gravatar_request(email, status = 200, body = nil) + hash = Digest::MD5.hexdigest(email.downcase) + url = "https://www.gravatar.com/avatar/#{hash}?d=404" + stub_request(:get, url).and_return(:status => status, :body => body) + end + + def stub_hostip_requests + # Controller tests and integration tests use different IPs + stub_request(:get, "http://api.hostip.info/country.php?ip=0.0.0.0") + stub_request(:get, "http://api.hostip.info/country.php?ip=127.0.0.1") + end + + def email_text_parts(message) + message.parts.each_with_object([]) do |part, text_parts| + if part.content_type.start_with?("text/") + text_parts.push(part) + elsif part.multipart? + text_parts.concat(email_text_parts(part)) + end end end end diff --git a/vendor/assets/iD/iD.css.erb b/vendor/assets/iD/iD.css.erb index 3f733c3b4..8f32de2e1 100644 --- a/vendor/assets/iD/iD.css.erb +++ b/vendor/assets/iD/iD.css.erb @@ -161,37 +161,18 @@ input::-moz-focus-inner { .cf:after { clear: both; } -/* tiles */ -img.tile { - position:absolute; - transform-origin:0 0; - -ms-transform-origin:0 0; - -webkit-transform-origin:0 0; - -moz-transform-origin:0 0; - -o-transform-origin:0 0; - opacity: 0; - - -webkit-transition: opacity 200ms linear; - transition: opacity 200ms linear; - -moz-transition: opacity 200ms linear; -} - -img.tile-loaded { - opacity: 1; -} -img.tile-removing { - opacity: 0; -} +use { pointer-events: none; } /* base styles */ -path { - fill: none; -} +.layer-osm path:not(.oneway) { fill: none; } /* IE needs :not(.oneway) */ -use { - pointer-events: none; -} +/* the above fill: none rule affects paths in shadow dom only in Firefox */ +.layer-osm use.icon path { fill: #333; } /* FF svg Maki icons */ +.layer-osm .turn use path { fill: #000; } /* FF turn restriction icons */ +#turn-only-shape2, #turn-only-u-shape2 { fill: #7092FF; } /* FF turn-only, turn-only-u */ +#turn-no-shape2, #turn-no-u-shape2 { fill: #E06D5F; } /* FF turn-no, turn-no-u */ +#turn-yes-shape2, #turn-yes-u-shape2 { fill: #8CD05F; } /* FF turn-yes, turn-yes-u */ g.point .shadow, g.vertex .shadow, @@ -203,11 +184,6 @@ path.shadow { pointer-events: stroke; } -.shadow { - -webkit-transition: 200ms; - -moz-transition: 200ms; - transition: 200ms; -} /* points */ @@ -224,6 +200,7 @@ g.point .shadow { stroke-opacity: 0; } +g.point.related:not(.selected) .shadow, g.point.hover:not(.selected) .shadow { stroke-opacity: 0.5; } @@ -259,6 +236,7 @@ g.midpoint .fill { opacity: .7; } +g.midpoint.tag-highway-corridor .fill, g.midpoint.tag-highway-pedestrian .fill, g.midpoint.tag-highway-steps .fill, g.midpoint.tag-highway-path .fill, @@ -290,13 +268,15 @@ g.vertex.vertex-hover { display: block; } +g.vertex.related:not(.selected) .shadow, g.vertex.hover:not(.selected) .shadow, +g.midpoint.related:not(.selected) .shadow, g.midpoint.hover:not(.selected) .shadow { - fill-opacity: 0.3; + fill-opacity: 0.5; } g.vertex.selected .shadow { - fill-opacity: 0.5; + fill-opacity: 0.7; } .mode-draw-area g.midpoint, @@ -309,13 +289,18 @@ g.vertex.selected .shadow { /* lines */ +.preset-icon .icon.other-line { + color: #fff; + fill: #777; +} + path.line { stroke-linecap: round; stroke-linejoin: bevel; } path.stroke { - stroke: black; + stroke: #000; stroke-width: 4; } @@ -325,8 +310,9 @@ path.shadow { stroke-opacity: 0; } +path.shadow.related:not(.selected), path.shadow.hover:not(.selected) { - stroke-opacity: 0.3; + stroke-opacity: 0.4; } path.shadow.selected { @@ -334,12 +320,12 @@ path.shadow.selected { } path.line.stroke { - stroke: white; + stroke: #fff; stroke-width: 2; } path.area.stroke { - stroke: white; + stroke: #fff; stroke-width: 1; } path.area.fill { @@ -398,17 +384,23 @@ path.fill.tag-leisure-park { background-color: rgba(140, 208, 95, 0.3); } +path.stroke.tag-amenity-swimming_pool, +path.stroke.tag-leisure-swimming_pool, path.stroke.tag-natural-water, path.stroke.tag-landuse-basin, path.stroke.tag-landuse-reservoir { stroke: rgb(119, 211, 222); } +path.fill.tag-amenity-swimming_pool, +path.fill.tag-leisure-swimming_pool, path.fill.tag-landuse-basin, path.fill.tag-landuse-reservoir, path.fill.tag-natural-water { stroke: rgba(119, 211, 222, 0.3); fill: rgba(119, 211, 222, 0.3); } +.preset-icon-fill-area.tag-amenity-swimming_pool, +.preset-icon-fill-area.tag-leisure-swimming_pool, .preset-icon-fill-area.tag-landuse-basin, .preset-icon-fill-area.tag-landuse-reservoir, .preset-icon-fill-area.tag-natural-water { @@ -436,7 +428,7 @@ path.fill.tag-amenity-university { .preset-icon-fill-area.tag-amenity-school, .preset-icon-fill-area.tag-amenity-college, .preset-icon-fill-area.tag-amenity-university { - border-color: rgb(255, 255, 148); + border-color: rgb(232, 232, 0); background-color: rgba(255, 255, 148, 0.15); } @@ -449,8 +441,7 @@ path.fill.tag-landuse-residential { } .preset-icon-fill-area.tag-landuse-residential { border-color: rgb(196, 189, 25); - background: none; - box-shadow: inset 0 0 0 5px rgba(196, 189, 25, 0.3); + background: rgba(196, 189, 25, 0.3); } path.stroke.tag-landuse-retail, @@ -465,30 +456,37 @@ path.fill.tag-landuse-commercial { .preset-icon-fill-area.tag-landuse-retail, .preset-icon-fill-area.tag-landuse-commercial { border-color: rgb(214, 136, 26); - background: none; - box-shadow: inset 0 0 0 5px rgba(214, 136, 26, 0.3); + background-color: rgba(214, 136, 26, 0.3); } -path.stroke.tag-landuse-industrial { +path.stroke.tag-landuse-industrial, +path.stroke.tag-power-plant { stroke: rgb(228, 164, 245); } -path.fill.tag-landuse-industrial { +path.fill.tag-landuse-industrial, +path.fill.tag-power-plant { stroke: rgba(228, 164, 245, 0.3); fill: rgba(228, 164, 245, 0.3); } -.preset-icon-fill-area.tag-landuse-industrial { +.preset-icon-fill-area.tag-landuse-industrial, +.preset-icon-fill-area.tag-power-plant { border-color: rgb(228, 164, 245); - background: none; - box-shadow: inset 0 0 0 5px rgba(228, 164, 245, 0.3); + background-color: rgba(228, 164, 245, 0.3); } +path.stroke.tag-natural-bare_rock, +path.stroke.tag-natural-scree, path.stroke.tag-landuse-quarry { stroke: rgb(166, 149, 123); } +path.fill.tag-natural-bare_rock, +path.fill.tag-natural-scree, path.fill.tag-landuse-quarry { stroke: rgba(166, 149, 123, 0.2); fill: rgba(166, 149, 123, 0.2); } +.preset-icon-fill-area.tag-natural-bare_rock, +.preset-icon-fill-area.tag-natural-scree, .preset-icon-fill-area.tag-landuse-quarry { border-color: rgb(166, 149, 123); background-color: rgba(166, 149, 123, 0.2); @@ -509,21 +507,26 @@ path.fill.tag-landuse-landfill { .pattern-color-construction { fill: rgba(196, 189, 25, 0.2); } +path.stroke.tag-landuse.tag-status, path.stroke.tag-landuse-construction { stroke: rgb(196, 189, 25); } +.preset-icon-fill-area.tag-landuse.tag-status, .preset-icon-fill-area.tag-landuse-construction { border-color: rgb(196, 189, 25); background-color: rgba(196, 189, 25, 0.2); } +path.stroke.tag-military, path.stroke.tag-landuse-military { stroke: rgb(214, 136, 26); } +path.fill.tag-military, path.fill.tag-landuse-military { stroke: rgba(214, 136, 26, 0.2); fill: rgba(214, 136, 26, 0.2); } +.preset-icon-fill-area.tag-military, .preset-icon-fill-area.tag-landuse-military { border-color: rgb(214, 136, 26); background-color: rgba(214, 136, 26, 0.2); @@ -551,13 +554,16 @@ path.stroke.tag-landuse-meadow { background-color: rgba(182, 225, 153, 0.2); } -.pattern-color-beach { +.pattern-color-beach, +.pattern-color-sand { fill: rgba(255, 255, 126, 0.2); } -path.stroke.tag-natural-beach { +path.stroke.tag-natural-beach, +path.stroke.tag-natural-sand { stroke: rgb(255, 255, 126); } -.preset-icon-fill-area.tag-natural-beach { +.preset-icon-fill-area.tag-natural-beach, +.preset-icon-fill-area.tag-natural-sand { border-color: rgb(255, 255, 126); background-color: rgba(255, 255, 126, 0.2); } @@ -586,6 +592,18 @@ path.stroke.tag-landuse-farmland { background-color: rgba(140, 208, 95, 0.2); } +path.stroke.tag-landuse-farmyard { + stroke: rgb(245, 220, 186); +} +path.fill.tag-landuse-farmyard { + stroke: rgba(245, 220, 186, 0.3); + fill: rgba(245, 220, 186, 0.3); +} +.preset-icon-fill-area.tag-landuse-farmyard { + border-color: rgb(245, 220, 186); + background: rgba(245, 220, 186, 0.3); +} + .pattern-color-cemetery, .pattern-color-orchard { fill: rgba(140, 208, 95, 0.2); @@ -611,12 +629,21 @@ path.fill.tag-amenity-parking { background-color: rgba(170, 170, 170, 0.3); } -path.fill.tag-place, -path.fill.tag-boundary { - fill: none; + +/* highway areas */ + +path.stroke.area.tag-highway { + stroke:#fff; + stroke-dasharray: none; + stroke-width: 2; } -/* highways */ +/* wide highways */ + +.preset-icon .icon.tag-highway.other-line { + color: #fff; + fill: #777; +} path.shadow.tag-highway { stroke-width:16; @@ -640,195 +667,457 @@ path.stroke.tag-highway { stroke-width:4; } +.preset-icon .icon.highway-motorway, +.preset-icon .icon.highway-motorway-link { + color: #CF2081; + fill: #70372f; +} path.stroke.tag-highway-motorway, path.stroke.tag-highway-motorway_link, -path.stroke.tag-construction-motorway { - stroke:#58a9ed; +path.stroke.tag-motorway { + stroke:#CF2081; } - path.casing.tag-highway-motorway, path.casing.tag-highway-motorway_link, -path.casing.tag-construction-motorway { - stroke:#2c5476; +path.casing.tag-motorway { + stroke:#70372f; } +.preset-icon .icon.highway-trunk, +.preset-icon .icon.highway-trunk-link { + color: #DD2F22; + fill: #70372f; +} path.stroke.tag-highway-trunk, path.stroke.tag-highway-trunk_link, -path.stroke.tag-construction-trunk { - stroke:#8cd05f; +path.stroke.tag-trunk { + stroke:#DD2F22; } path.casing.tag-highway-trunk, path.casing.tag-highway-trunk_link, -path.casing.tag-construction-trunk { - stroke:#46682f; +path.casing.tag-trunk { + stroke:#70372f; } +.preset-icon .icon.highway-primary, +.preset-icon .icon.highway-primary-link { + color: #F99806; + fill: #70372f; +} path.stroke.tag-highway-primary, path.stroke.tag-highway-primary_link, -path.stroke.tag-construction-primary { - stroke:#e06d5f; +path.stroke.tag-primary { + stroke:#F99806; } path.casing.tag-highway-primary, path.casing.tag-highway-primary_link, -path.casing.tag-construction-primary { +path.casing.tag-primary { stroke:#70372f; } +.preset-icon .icon.highway-secondary, +.preset-icon .icon.highway-secondary-link { + color: #F3F312; + fill: #70372f; +} path.stroke.tag-highway-secondary, path.stroke.tag-highway-secondary_link, -path.stroke.tag-construction-secondary { - stroke:#eab056; +path.stroke.tag-secondary { + stroke:#F3F312; } path.casing.tag-highway-secondary, path.casing.tag-highway-secondary_link, -path.casing.tag-construction-secondary { - stroke:#75582b; +path.casing.tag-secondary { + stroke:#70372f; } +.preset-icon .icon.highway-tertiary, +.preset-icon .icon.highway-tertiary-link { + color: #FFF9B3; + fill: #70372f; +} path.stroke.tag-highway-tertiary, path.stroke.tag-highway-tertiary_link, -path.stroke.tag-construction-tertiary { - stroke:#ffff7e; +path.stroke.tag-tertiary { + stroke:#FFF9B3; } path.casing.tag-highway-tertiary, path.casing.tag-highway-tertiary_link, -path.casing.tag-construction-tertiary { - stroke:#7f7f3f; +path.casing.tag-tertiary { + stroke:#70372f; } -path.stroke.tag-highway-unclassified, -path.stroke.tag-construction-unclassified { - stroke:#eaeaea; +.legacy-carto .preset-icon .icon.highway-motorway, +.legacy-carto .preset-icon .icon.highway-motorway-link { + color: #58a9ed; + fill: #2c5476; } -path.casing.tag-highway-unclassified, -path.casing.tag-construction-unclassified { - stroke:#444; +.legacy-carto path.stroke.tag-highway-motorway, +.legacy-carto path.stroke.tag-highway-motorway_link, +.legacy-carto path.stroke.tag-motorway { + stroke:#58a9ed; +} +.legacy-carto path.casing.tag-highway-motorway, +.legacy-carto path.casing.tag-highway-motorway_link, +.legacy-carto path.casing.tag-motorway { + stroke:#2c5476; +} + +.legacy-carto .preset-icon .icon.highway-trunk, +.legacy-carto .preset-icon .icon.highway-trunk-link { + color: #8cd05f; + fill: #46682f; +} +.legacy-carto path.stroke.tag-highway-trunk, +.legacy-carto path.stroke.tag-highway-trunk_link, +.legacy-carto path.stroke.tag-trunk { + stroke:#8cd05f; +} +.legacy-carto path.casing.tag-highway-trunk, +.legacy-carto path.casing.tag-highway-trunk_link, +.legacy-carto path.casing.tag-trunk { + stroke:#46682f; +} + +.legacy-carto .preset-icon .icon.highway-primary, +.legacy-carto .preset-icon .icon.highway-primary-link { + color: #e06d5f; + fill: #70372f; +} +.legacy-carto path.stroke.tag-highway-primary, +.legacy-carto path.stroke.tag-highway-primary_link, +.legacy-carto path.stroke.tag-primary { + stroke:#e06d5f; +} +.legacy-carto path.casing.tag-highway-primary, +.legacy-carto path.casing.tag-highway-primary_link, +.legacy-carto path.casing.tag-primary { + stroke:#70372f; } +.legacy-carto .preset-icon .icon.highway-secondary, +.legacy-carto .preset-icon .icon.highway-secondary-link { + color: #eab056; + fill: #75582b; +} +.legacy-carto path.stroke.tag-highway-secondary, +.legacy-carto path.stroke.tag-highway-secondary_link, +.legacy-carto path.stroke.tag-secondary { + stroke:#eab056; +} +.legacy-carto path.casing.tag-highway-secondary, +.legacy-carto path.casing.tag-highway-secondary_link, +.legacy-carto path.casing.tag-secondary { + stroke:#75582b; +} + +.legacy-carto .preset-icon .icon.highway-tertiary, +.legacy-carto .preset-icon .icon.highway-tertiary-link { + color: #ffff7e; + fill: #7f7f3f; +} +.legacy-carto path.stroke.tag-highway-tertiary, +.legacy-carto path.stroke.tag-highway-tertiary_link, +.legacy-carto path.stroke.tag-tertiary { + stroke:#ffff7e; +} +.legacy-carto path.casing.tag-highway-tertiary, +.legacy-carto path.casing.tag-highway-tertiary_link, +.legacy-carto path.casing.tag-tertiary { + stroke:#7f7f3f; +} + +.preset-icon .icon.highway-residential { + color: #fff; + fill: #444; +} path.stroke.tag-highway-residential, -path.stroke.tag-construction-residential { +path.stroke.tag-residential { stroke:#fff; } path.casing.tag-highway-residential, -path.casing.tag-construction-residential { +path.casing.tag-residential { stroke:#444; } -path.stroke.tag-highway-living_street { - stroke:#ccc; +.preset-icon .icon.highway-unclassified { + color: #dcd9b9; + fill: #444; +} +path.stroke.tag-highway-unclassified, +path.stroke.tag-unclassified { + stroke:#dcd9b9; +} +path.casing.tag-highway-unclassified, +path.casing.tag-unclassified { + stroke:#444; +} + + +/* narrow highways */ +path.stroke.tag-highway-living_street, +path.stroke.tag-highway-service, +path.stroke.tag-highway-track, +path.stroke.tag-highway-path, +path.stroke.tag-highway-footway, +path.stroke.tag-highway-cycleway, +path.stroke.tag-highway-bridleway, +path.stroke.tag-highway-corridor, +path.stroke.tag-highway-pedestrian, +path.stroke.tag-highway-steps, +path.stroke.tag-highway-road, +path.stroke.tag-living_street, +path.stroke.tag-service, +path.stroke.tag-track, +path.stroke.tag-path, +path.stroke.tag-footway, +path.stroke.tag-cycleway, +path.stroke.tag-bridleway, +path.stroke.tag-corridor, +path.stroke.tag-pedestrian, +path.stroke.tag-steps, +path.stroke.tag-road { stroke-width:4; } -path.casing.tag-highway-living_street { - stroke:#fff; +path.casing.tag-highway-living_street, +path.casing.tag-highway-service, +path.casing.tag-highway-track, +path.casing.tag-highway-path, +path.casing.tag-highway-footway, +path.casing.tag-highway-cycleway, +path.casing.tag-highway-bridleway, +path.casing.tag-highway-corridor, +path.casing.tag-highway-pedestrian, +path.casing.tag-highway-steps, +path.casing.tag-highway-road, +path.casing.tag-living_street, +path.casing.tag-service, +path.casing.tag-track, +path.casing.tag-path, +path.casing.tag-footway, +path.casing.tag-cycleway, +path.casing.tag-bridleway, +path.casing.tag-corridor, +path.casing.tag-pedestrian, +path.casing.tag-steps, +path.casing.tag-road { stroke-width:6; } -path.stroke.tag-highway-pedestrian { - stroke:#fff; - stroke-dasharray: 2, 8; +.low-zoom path.stroke.tag-highway-living_street, +.low-zoom path.stroke.tag-highway-service, +.low-zoom path.stroke.tag-highway-track, +.low-zoom path.stroke.tag-highway-path, +.low-zoom path.stroke.tag-highway-footway, +.low-zoom path.stroke.tag-highway-cycleway, +.low-zoom path.stroke.tag-highway-bridleway, +.low-zoom path.stroke.tag-highway-corridor, +.low-zoom path.stroke.tag-highway-pedestrian, +.low-zoom path.stroke.tag-highway-steps, +.low-zoom path.stroke.tag-highway-road, +.low-zoom path.stroke.tag-living_street, +.low-zoom path.stroke.tag-service, +.low-zoom path.stroke.tag-track, +.low-zoom path.stroke.tag-path, +.low-zoom path.stroke.tag-footway, +.low-zoom path.stroke.tag-cycleway, +.low-zoom path.stroke.tag-bridleway, +.low-zoom path.stroke.tag-corridor, +.low-zoom path.stroke.tag-pedestrian, +.low-zoom path.stroke.tag-steps, +.low-zoom path.stroke.tag-road { + stroke-width:2; +} +.low-zoom path.casing.tag-highway-living_street, +.low-zoom path.casing.tag-highway-service, +.low-zoom path.casing.tag-highway-track, +.low-zoom path.casing.tag-highway-path, +.low-zoom path.casing.tag-highway-footway, +.low-zoom path.casing.tag-highway-cycleway, +.low-zoom path.casing.tag-highway-bridleway, +.low-zoom path.casing.tag-highway-corridor, +.low-zoom path.casing.tag-highway-pedestrian, +.low-zoom path.casing.tag-highway-steps, +.low-zoom path.casing.tag-highway-road, +.low-zoom path.casing.tag-living_street, +.low-zoom path.casing.tag-service, +.low-zoom path.casing.tag-track, +.low-zoom path.casing.tag-path, +.low-zoom path.casing.tag-footway, +.low-zoom path.casing.tag-cycleway, +.low-zoom path.casing.tag-bridleway, +.low-zoom path.casing.tag-corridor, +.low-zoom path.casing.tag-pedestrian, +.low-zoom path.casing.tag-steps, +.low-zoom path.casing.tag-road { stroke-width:4; } -path.casing.tag-highway-pedestrian { - stroke:#8cd05f; - stroke-width:6; + +.preset-icon .icon.highway-living-street { + color: #bbb; + fill: #ddd; } -path.stroke.area.tag-highway-pedestrian { - stroke:#fff; - stroke-dasharray: none; - stroke-width: 2; +path.stroke.tag-highway-living_street, +path.stroke.tag-living_street { + stroke: #ccc; +} +path.casing.tag-highway-living_street, +path.casing.tag-living_street { + stroke: #fff; } -path.stroke.tag-highway-service { +.preset-icon .icon.highway-footway.tag-highway-corridor, +.preset-icon .icon.highway-footway.tag-highway-pedestrian { + color: #8cd05f; + fill: #fff; +} +path.stroke.tag-highway-corridor, +path.stroke.tag-highway-pedestrian, +path.stroke.tag-corridor, +path.stroke.tag-pedestrian { stroke:#fff; - stroke-width:4; + stroke-dasharray: 2, 8; } -path.casing.tag-highway-service { - stroke:#666; - stroke-width:6; +path.casing.tag-highway-corridor, +path.casing.tag-highway-pedestrian, +path.casing.tag-corridor, +path.casing.tag-pedestrian, +path.casing.tag-highway-corridor.tag-unpaved, +path.casing.tag-highway-pedestrian.tag-unpaved, +path.casing.tag-corridor.tag-unpaved, +path.casing.tag-pedestrian.tag-unpaved { + stroke: #8cd05f; + stroke-linecap: round; + stroke-dasharray: none; } -.low-zoom path.stroke.tag-highway-service { - stroke-width:2; + +.preset-icon .icon.highway-road { + color: #9e9e9e; + fill: #666; } -.low-zoom path.casing.tag-highway-service { - stroke-width:4; +path.stroke.tag-highway-road, +path.stroke.tag-road { + stroke:#9e9e9e; } - -path.stroke.tag-highway-track { - stroke: #fff; - stroke-width: 4; +path.casing.tag-highway-road, +path.casing.tag-road { + stroke:#666; } -path.casing.tag-highway-track { - stroke: #996600; - stroke-width: 6; - stroke-linecap: butt; - stroke-dasharray: 6, 6; + +.preset-icon .icon.highway-service { + color: #fff; + fill: #666; } -.low-zoom path.stroke.tag-highway-track { - stroke-width:2; +path.stroke.tag-highway-service, +path.stroke.tag-service { + stroke:#fff; } -.low-zoom path.casing.tag-highway-track { - stroke-width:4; +path.casing.tag-highway-service, +path.casing.tag-service { + stroke:#666; } -path.stroke.tag-highway-path { - stroke: #000; - stroke-width: 1 !important; - stroke-linecap: butt; - stroke-dasharray: 8, 4; +.preset-icon .icon.highway-track { + color: #eaeaea; + fill: #c5b59f; } -path.casing.tag-highway-path { - stroke-width: 1 !important; - stroke: #fff; +path.stroke.tag-highway-track, +path.stroke.tag-track { + stroke: #c5b59f; +} +path.casing.tag-highway-track, +path.casing.tag-track { + stroke: #746f6f; } +path.stroke.tag-highway-path, path.stroke.tag-highway-footway, path.stroke.tag-highway-cycleway, path.stroke.tag-highway-bridleway { - stroke-width: 4; stroke-linecap: butt; stroke-dasharray: 6, 6; } + +path.casing.tag-highway-path, +path.casing.tag-highway-path.tag-unpaved { + stroke: #c5b59f; + stroke-linecap: round; + stroke-dasharray: none; +} path.casing.tag-highway-footway, path.casing.tag-highway-cycleway, -path.casing.tag-highway-bridleway { - stroke-width: 6; +path.casing.tag-highway-bridleway, +path.casing.tag-highway-footway.tag-unpaved, +path.casing.tag-highway-cycleway.tag-unpaved, +path.casing.tag-highway-bridleway.tag-unpaved { stroke: #fff; + stroke-linecap: round; + stroke-dasharray: none; } -.low-zoom path.stroke.tag-highway-footway, -.low-zoom path.stroke.tag-highway-cycleway, -.low-zoom path.stroke.tag-highway-bridleway { - stroke-width: 2; +.preset-icon .icon.category-path, +.preset-icon .icon.highway-path { + color: #746f6f; + fill: #c5b59f; } -.low-zoom path.casing.tag-highway-footway, -.low-zoom path.casing.tag-highway-cycleway, -.low-zoom path.casing.tag-highway-bridleway { - stroke-width: 4; +path.stroke.tag-highway-path { + stroke: #746f6f; } +.preset-icon .icon.tag-route-foot, +.preset-icon .icon.tag-route-hiking, +.preset-icon .icon.highway-footway { + color: #ae8681; + fill: #fff; +} path.stroke.tag-highway-footway { stroke: #ae8681; } + +.preset-icon .icon.highway-footway.tag-crossing { + color: #444; +} +path.stroke.tag-highway-footway.tag-crossing { + stroke: #444; + stroke-dasharray: 6, 4; +} + +.preset-icon .icon.tag-route-bicycle, +.preset-icon .icon.highway-cycleway { + color: #58a9ed; + fill: #fff; +} path.stroke.tag-highway-cycleway { stroke: #58a9ed; } + +.preset-icon .icon.tag-route-horse, +.preset-icon .icon.highway-bridleway { + color: #e06d5f; + fill: #fff; +} path.stroke.tag-highway-bridleway { stroke: #e06d5f; } +.preset-icon .icon.highway-steps { + color: #81d25c; + fill: #fff; +} path.stroke.tag-highway-steps { stroke: #81d25c; - stroke-width: 4; stroke-linecap: butt; stroke-dasharray: 3, 3; } -path.casing.tag-highway-steps { - stroke-width: 6; +path.casing.tag-highway-steps, +path.casing.tag-highway-steps.tag-unpaved { stroke: #fff; + stroke-linecap: round; + stroke-dasharray: none; } -/* aeroways */ +/* aeroways */ path.stroke.tag-aeroway-taxiway { stroke: #805C80; stroke-width: 4; @@ -861,19 +1150,30 @@ path.fill.tag-aeroway-apron { /* railways */ - +.preset-icon .icon.tag-railway.other-line { + color: #fff; + fill: #777; +} +.preset-icon .icon.tag-railway { + color: #555; + fill: #eee; +} path.stroke.tag-railway { stroke: #eee; stroke-width: 2; stroke-linecap: butt; stroke-dasharray: 12,12; } - path.casing.tag-railway { stroke: #555; stroke-width: 4; } +.preset-icon .icon.tag-railway-disused, +.preset-icon .icon.tag-railway-abandoned { + color: #999; + fill: #eee; +} path.stroke.tag-railway-abandoned { stroke: #eee; } @@ -881,8 +1181,12 @@ path.casing.tag-railway-abandoned { stroke: #999; } +.preset-icon .icon.tag-railway-subway { + color: #222; + fill: #bbb; +} path.stroke.tag-railway-subway { - stroke: #666; + stroke: #bbb; } path.casing.tag-railway-subway { stroke: #222; @@ -906,7 +1210,18 @@ path.casing.tag-railway-platform { stroke: none; } + /* waterways */ +.preset-icon .icon.tag-waterway.other-line { + color: #77d3de; + fill: #77d3de; +} +.preset-icon .icon.category-water, +.preset-icon .icon.tag-route-ferry, +.preset-icon .icon.tag-waterway { + color: #77d3de; + fill: #fff; +} path.fill.tag-waterway { stroke: rgba(119, 211, 222, 0.3); @@ -929,6 +1244,9 @@ path.casing.tag-waterway-river { stroke-width: 6; } +.preset-icon .icon.tag-waterway-ditch { + color: #6591ff; +} path.stroke.tag-waterway-ditch { stroke: #6591ff; stroke-width: 1; @@ -938,7 +1256,31 @@ path.casing.tag-waterway-ditch { stroke-width: 3; } +path.area.stroke.tag-waterway-dock, +path.area.stroke.tag-waterway-boatyard, +path.area.stroke.tag-waterway-fuel { + stroke: white; + stroke-width: 1; +} +path.area.casing.tag-waterway-dock, +path.area.casing.tag-waterway-boatyard, +path.area.casing.tag-waterway-fuel { + stroke: none; +} +path.area.fill.tag-waterway-dock, +path.area.fill.tag-waterway-boatyard, +path.area.fill.tag-waterway-fuel { + stroke: rgba(255, 255, 255, 0.3); + fill: rgba(255, 255, 255, 0.3); +} + + /* power */ +.preset-icon .icon.tag-man_made-pipeline, +.preset-icon .icon.tag-power { + color: #939393; + fill: #939393; +} path.stroke.tag-power { stroke: #939393; @@ -948,8 +1290,8 @@ path.casing.tag-power { stroke: none; } -/* boundary */ +/* boundaries */ path.stroke.tag-boundary { stroke: #fff; stroke-width: 2; @@ -966,8 +1308,8 @@ path.casing.tag-boundary-national_park { stroke: #b0e298; } -/* barriers */ +/* barriers */ path.stroke.tag-barrier { stroke: #ddd; stroke-width: 3px; @@ -980,22 +1322,23 @@ path.stroke.tag-barrier { stroke-dasharray: 8, 2, 2, 2; } -/* bridges */ +/* bridges */ path.casing.tag-bridge { stroke-width: 16; stroke-opacity: 0.6; stroke: #000; stroke-linecap: butt; + stroke-dasharray: none; } path.shadow.tag-bridge { stroke-width: 22; } - path.casing.line.tag-railway.tag-bridge, path.casing.tag-highway-living_street.tag-bridge, path.casing.tag-highway-path.tag-bridge, +path.casing.tag-highway-corridor.tag-bridge, path.casing.line.tag-highway-pedestrian.tag-bridge, path.casing.tag-highway-service.tag-bridge, path.casing.tag-highway-track.tag-bridge, @@ -1005,10 +1348,10 @@ path.casing.tag-highway-cycleway.tag-bridge, path.casing.tag-highway-bridleway.tag-bridge { stroke-width: 10; } - path.shadow.line.tag-railway.tag-bridge, path.shadow.tag-highway-living_street.tag-bridge, path.shadow.tag-highway-path.tag-bridge, +path.shadow.tag-highway-corridor.tag-bridge, path.shadow.line.tag-highway-pedestrian.tag-bridge, path.shadow.tag-highway-service.tag-bridge, path.shadow.tag-highway-track.tag-bridge, @@ -1018,15 +1361,9 @@ path.shadow.tag-highway-cycleway.tag-bridge, path.shadow.tag-highway-bridleway.tag-bridge { stroke-width: 17; } - - .low-zoom path.casing.tag-bridge { stroke-width: 10; - stroke-opacity: 0.6; - stroke: #000; - stroke-linecap: butt; } - .low-zoom path.shadow.tag-bridge { stroke-width: 14; } @@ -1034,6 +1371,7 @@ path.shadow.tag-highway-bridleway.tag-bridge { .low-zoom path.casing.line.tag-railway.tag-bridge, .low-zoom path.casing.tag-highway-living_street.tag-bridge, .low-zoom path.casing.tag-highway-path.tag-bridge, +.low-zoom path.casing.tag-highway-corridor.tag-bridge, .low-zoom path.casing.line.tag-highway-pedestrian.tag-bridge, .low-zoom path.casing.tag-highway-service.tag-bridge, .low-zoom path.casing.tag-highway-track.tag-bridge, @@ -1047,6 +1385,7 @@ path.shadow.tag-highway-bridleway.tag-bridge { .low-zoom path.shadow.line.tag-railway.tag-bridge, .low-zoom path.shadow.tag-highway-living_street.tag-bridge, .low-zoom path.shadow.tag-highway-path.tag-bridge, +.low-zoom path.shadow.tag-highway-corridor.tag-bridge, .low-zoom path.shadow.line.tag-highway-pedestrian.tag-bridge, .low-zoom path.shadow.tag-highway-service.tag-bridge, .low-zoom path.shadow.tag-highway-track.tag-bridge, @@ -1057,18 +1396,19 @@ path.shadow.tag-highway-bridleway.tag-bridge { stroke-width: 13; } -/* tunnels */ +/* tunnels */ path.stroke.tag-tunnel { stroke-opacity: 0.3; } - path.casing.tag-tunnel { stroke-opacity: 0.5; + stroke-linecap: butt; + stroke-dasharray: none; } -/* embankments / cuttings */ +/* embankments / cuttings */ path.casing.tag-embankment, path.casing.tag-cutting { stroke-opacity: 0.5; @@ -1094,42 +1434,38 @@ path.shadow.tag-cutting { } -/* construction */ - -path.stroke.tag-highway-construction, -path.casing.tag-highway-construction { +/* Surface - unpaved */ +path.casing.tag-unpaved { + stroke: #ccc; stroke-linecap: butt; - stroke-dasharray: 7, 7; + stroke-dasharray: 4, 3; } - -.low-zoom path.stroke.tag-highway-construction, -.low-zoom path.casing.tag-highway-construction { - stroke-linecap: butt; - stroke-dasharray: 5, 5; +.low-zoom path.casing.tag-unpaved { + stroke-dasharray: 3, 2; } - -text { - font-size:10px; - pointer-events: none; - color: #222; - opacity: 1; +path.casing.tag-bridge.tag-unpaved { + stroke: #000; + stroke-dasharray: 4, 3; } - -.oneway .textpath.tag-waterway { - fill: #002F35; +.low-zoom path.casing.tag-bridge.tag-unpaved { + stroke: #000; + stroke-dasharray: 3, 2; } -marker#oneway-marker path { - fill:#000; - opacity: .5; -} -path.oneway { - stroke-width: 6px; +/* Status (e.g. construction, proposed, abandoned) */ +path.stroke.tag-status, +path.casing.tag-status { + stroke-linecap: butt; + stroke-dasharray: 7, 3; +} +.low-zoom path.stroke.tag-status, +.low-zoom path.casing.tag-status { + stroke-dasharray: 5, 2; } -/* Buildings */ +/* Buildings */ path.stroke.tag-building, path.stroke.tag-amenity-shelter { stroke: rgb(224, 110, 95); @@ -1146,9 +1482,23 @@ path.fill.tag-amenity-shelter { } -/* - * Labels - */ +/* Labels / Markers */ + +text { + font-size:10px; + pointer-events: none; + color: #222; + opacity: 1; +} + +.oneway .textpath.tag-waterway { + fill: #002F35; +} + +path.oneway { + stroke-width: 6px; +} + text.arealabel-halo, text.linelabel-halo, @@ -1156,24 +1506,21 @@ text.pointlabel-halo, text.arealabel, text.linelabel, text.pointlabel { + dominant-baseline: middle; + text-anchor: middle; font-size: 12px; font-weight: bold; fill: #333; - text-anchor: middle; pointer-events: none; -webkit-transition: opacity 100ms linear; transition: opacity 100ms linear; -moz-transition: opacity 100ms linear; } +/* Opera doesn't support dominant-baseline. See #715 */ +/* Safari 10 seems to have regressed too */ .linelabel-halo .textpath, .linelabel .textpath { - dominant-baseline: middle; -} - -/* Opera doesn't support dominant-baseline. See #715 */ -.opera .linelabel-halo .textpath, -.opera .linelabel .textpath { baseline-shift: -33%; dominant-baseline: auto; } @@ -1190,9 +1537,22 @@ text.proximate { } text.point { - font-size: 10px; + font-size: 10px; +} + +.icon.areaicon-halo { + opacity: 0.6; + stroke: #999; + stroke-width: 2px; + stroke-miterlimit: 1; +} + +.icon.areaicon { + fill: #222; + opacity: 0.8; } + /* Turns */ g.turn rect, @@ -1318,7 +1678,7 @@ g.turn circle { } /* GPX Paths */ -div.layer-gpx { +.layer-gpx { pointer-events: none; } @@ -1332,34 +1692,82 @@ text.gpx { fill: #FF26D4; } -/* Mapillary Layer */ +/* Mapillary Image Layer */ -.layer-mapillary { +.layer-mapillary-images { pointer-events: none; } -.layer-mapillary g { +.layer-mapillary-images .viewfield-group { pointer-events: visible; cursor: pointer; /* Opera */ cursor: url(<%= asset_path("iD/img/cursor-select-mapillary.png") %>) 6 1, pointer; /* FF */ } -.layer-mapillary g * { - stroke-width: 2; - stroke: #ffc600; +.layer-mapillary-images .viewfield-group * { + stroke-width: 1; + stroke: #444; fill: #ffc600; + z-index: 50; } -.layer-mapillary g:hover * { - stroke-width: 2; - stroke: #ff9900; +.layer-mapillary-images .viewfield-group:hover * { + stroke-width: 1; + stroke: #333; fill: #ff9900; + z-index: 60; } -.layer-mapillary g.selected * { - stroke-width: 4; - stroke: #ff5800; +.layer-mapillary-images .viewfield-group.selected * { + stroke-width: 2; + stroke: #222; fill: #ff5800; + z-index: 60; +} + +.layer-mapillary-images .viewfield-group:hover path.viewfield, +.layer-mapillary-images .viewfield-group.selected path.viewfield, +.layer-mapillary-images .viewfield-group path.viewfield { + stroke-width: 0; + fill-opacity: 0.6; +} + +/* Mapillary Sign Layer */ + +.layer-mapillary-signs { + pointer-events: none; +} + +.layer-mapillary-signs .icon-sign .icon-sign-body { + min-width: 20px; + height: 28px; + width: 28px; + border: 2px solid transparent; + pointer-events: visible; + cursor: pointer; /* Opera */ + cursor: url(<%= asset_path("iD/img/cursor-select-mapillary.png") %>) 6 1, pointer; /* FF */ + z-index: 70; + overflow: visible; +} + +.layer-mapillary-signs .icon-sign:hover .icon-sign-body { + border: 2px solid rgba(255,198,0,0.8); + z-index: 80; + } + +.layer-mapillary-signs .icon-sign.selected .icon-sign-body { + border: 2px solid rgba(255,0,0,0.8); + z-index: 80; + } + +.layer-mapillary-signs .icon-sign .t { + font-size: 28px; + z-index: 70; +} + +.layer-mapillary-signs .icon-sign:hover .t, +.layer-mapillary-signs .icon-sign.selected .t { + z-index: 80; } /* Modes */ @@ -1401,15 +1809,16 @@ text.gpx { stroke-width: 8; } +.fill-wireframe path.shadow.related:not(.selected), .fill-wireframe path.shadow.hover:not(.selected) { - stroke-opacity: 0.2; + stroke-opacity: 0.4; } .fill-wireframe path.shadow.selected { - stroke-opacity: 0.4; + stroke-opacity: 0.6; } .fill-wireframe .point, -.fill-wireframe .icon, +.fill-wireframe .areaicon, .fill-wireframe path.casing, .fill-wireframe path.fill, .fill-wireframe path.oneway { @@ -1434,7 +1843,10 @@ html, body { } body { - font:normal 12px/1.6667 'Helvetica Neue', Arial, sans-serif; + font: normal 12px/1.6667 -apple-system, BlinkMacSystemFont, + "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", + "Fira Sans", "Droid Sans", "Helvetica Neue", "Arial", + sans-serif; margin:0; padding:0; min-width: 768px; @@ -1452,7 +1864,6 @@ body { .id-container { height: 100%; width: 100%; - position: fixed; min-width: 768px; } @@ -1462,6 +1873,20 @@ body { height: 100%; } +#content.active { + -webkit-filter: none !important; + filter: none !important; + -webkit-duration: 200ms; + transition-duration: 200ms; +} + +#content.inactive { + -webkit-filter: grayscale(80%) brightness(80%); + filter: grayscale(80%) brightness(80%); + -webkit-duration: 200ms; + transition-duration: 200ms; +} + #defs { /* Can't be display: none or the clippaths are ignored. */ position: absolute; @@ -1481,14 +1906,12 @@ body { .spinner { opacity: .5; + float: right; } .spinner img { - position: absolute; height: 40px; width: 40px; - right: 10px; - top: 10px; border-radius: 4px; margin-right: 10px; background: black; @@ -1574,7 +1997,10 @@ a:hover { textarea { resize: vertical; - font:normal 12px/20px 'Helvetica Neue', Arial, sans-serif; + font:normal 12px/20px -apple-system, BlinkMacSystemFont, + "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", + "Fira Sans", "Droid Sans", "Helvetica Neue", "Arial", + sans-serif; } textarea, @@ -1585,6 +2011,7 @@ input[type=url], input[type=tel], input[type=email] { background-color: white; + color: #333; border:1px solid #ccc; padding:5px 10px; height:30px; @@ -1632,6 +2059,10 @@ table.tags, table.tags td, table.tags th { padding: 4px; } +::-ms-clear { + display: none; +} + /* Grid ------------------------------------------------------- */ @@ -1717,7 +2148,10 @@ ul li { list-style: none;} .fl { float: left;} .fr { float: right;} +.al { left: 0; } +.ar { right: 0; } +input.hide, div.hide, form.hide, button.hide, @@ -1785,7 +2219,7 @@ button:hover { button[disabled], button.disabled { background-color: rgba(255,255,255,.25); - color: rgba(0,0,0,.5); + color: rgba(0,0,0,.4); cursor: auto; } @@ -1868,10 +2302,6 @@ button.secondary-action:hover { background: #cccccc; } -button.save.has-count { - padding: 9px; -} - button.save .count { display: none; } @@ -1880,14 +2310,16 @@ button.save.has-count .count { display: block; position: absolute; top: 5px; - background: rgba(255, 255, 255, .5); + background: #fff; + border-color: #fff; + opacity: 0.5; color: #333; padding: 10px; height: 30px; line-height: 12px; border-radius: 4px; margin: auto; - margin-left: 8.3333%; + margin-left: 9.3333%; } button.save.has-count .count::before { @@ -1901,23 +2333,44 @@ button.save.has-count .count::before { bottom: 0; border-top: 6px solid transparent; border-bottom: 6px solid transparent; - border-right: 6px solid rgba(255,255,255,.5); + border-right-width: 6px; + border-right-style: solid; + border-right-color: inherit; } /* Icons */ .icon { - display:inline-block; - vertical-align:top; - width:20px; - height:20px; - background:transparent url(<%= asset_path("iD/img/sprite.svg") %>) no-repeat 0 0; - text-indent:-9999px; - overflow:hidden; - } + vertical-align: top; + width: 20px; + height: 20px; +} + +.icon.inline { + vertical-align: text-top; + width: 14px; + height: 14px; + margin: 0px 3px; +} -.icon-pre-text { - margin-right: 3px; +.icon.pre-text { + margin-right: 5px; +} + +.icon.light { + color: #fff; +} + +.icon.created { + color: #00ca07; +} + +.icon.modified { + color: #666; +} + +.icon.deleted { + color: #ea0000; } .user-icon { @@ -1928,104 +2381,6 @@ button.save.has-count .count::before { border-radius: 3px; } -/* Definitions for every icon */ -.icon.alert { background-position: 0 0;} -.icon.point, -.icon.add-point { background-position: -20px 0;} -.icon.line, -.icon.add-line { background-position: -40px 0;} -.icon.area, -.icon.add-area { background-position: -60px 0;} -.icon.undo { background-position: -80px 0;} -.icon.redo { background-position: -100px 0;} -.icon.apply { background-position: -120px 0;} -.icon.save { background-position: -140px 0;} -.icon.close { background-position: -160px 0;} -.icon.delete { background-position: -180px 0;} -.icon.remove { background-position: -200px 0;} -.icon.inspect { background-position: -220px 0;} -.icon.plus { background-position: -240px 0;} -.icon.search { background-position: -280px 0;} -.icon.geocode { background-position: -280px 0;} -.icon.layers { background-position: -300px 0;} -.icon.avatar { background-position: -320px 0;} -.icon.nearby { background-position: -340px 0;} -.icon.geolocate { background-position: -360px 0;} -.icon.warning { background-position: -380px 0;} -.icon.bug { background-position: -400px 0;} -.icon.back { background-position: -420px 0;} -.icon.forward { background-position: -440px 0;} -.icon.help { background-position: -460px 0;} -.icon.relation { background-position: -520px 0;} -.icon.relation.route { background-position: -540px 0;} -.icon.relation.multipolygon { background-position: -560px 0;} -.icon.vertex { background-position: -580px 0;} -.icon.data { background-position: -600px 0;} - -.icon.inspect.light { background-position: -220px -20px;} -.icon.plus.light { background-position: -240px -20px;} -.icon.zoom-in { background-position: -240px -20px;} -.icon.zoom-out { background-position: -260px -20px;} -.icon.geocode.light { background-position: -280px -20px;} -.icon.layers.light { background-position: -300px -20px;} -.icon.avatar.light { background-position: -320px -20px;} -.icon.nearby.light { background-position: -340px -20px;} -.icon.geolocate.light { background-position: -360px -20px;} -.icon.bug.light { background-position: -400px -20px;} -.icon.help.light { background-position: -460px -20px;} -.icon.data.light { background-position: -600px -20px;} - -.icon.back.blue { background-position: -420px -20px;} -.icon.forward.blue { background-position: -440px -20px;} - -button[disabled] .icon.alert { background-position: 0 -40px;} -button[disabled] .icon.add-point { background-position: -20px -40px;} -button[disabled] .icon.add-line { background-position: -40px -40px;} -button[disabled] .icon.add-area { background-position: -60px -40px;} -button.disabled .icon.undo { background-position: -80px -40px;} -button.disabled .icon.redo { background-position: -100px -40px;} -button[disabled] .apply.icon { background-position: -120px -40px;} -button[disabled] .close.icon { background-position: -160px -40px;} -button[disabled] .delete.icon { background-position: -180px -40px;} -button[disabled] .icon.remove { background-position: -200px -40px;} -button[disabled] .icon.inspect { background-position: -220px -40px;} -button[disabled] .icon.zoom-in { background-position: -240px -40px;} -button[disabled] .icon.zoom-out { background-position: -260px -40px;} -button[disabled] .icon.geocode { background-position: -280px -40px;} -button[disabled] .icon.layers { background-position: -300px -40px;} -button[disabled] .icon.avatar { background-position: -320px -40px;} -button[disabled] .icon.nearby { background-position: -340px -40px;} -button[disabled] .icon.data { background-position: -600px -40px;} - -.icon.point.deleted { background-position: -480px -80px;} -.icon.line.deleted { background-position: -500px -80px;} -.icon.area.deleted { background-position: -520px -80px;} - -.icon.point.created { background-position: -480px -100px;} -.icon.line.created { background-position: -500px -100px;} -.icon.area.created { background-position: -520px -100px;} - -.icon.point.modified { background-position: -22px 0; } - -.icon.modified { opacity: .5; } - -/* Out link is special */ - -.icon.out-link { height: 14px; width: 14px; background-position: -500px 0;} -a:hover .icon.out-link { background-position: -500px -14px;} - -.icon.plus-dark { background-position: -240px -40px;} - -/* Universal preset icons */ - -.icon.source { background-position: 0 -200px;} -.icon.address { background-position: -20px -200px;} -.icon.telephone { background-position: -40px -200px;} -.icon.website { background-position: -60px -200px;} -.icon.elevation { background-position: -80px -200px;} -.icon.wikipedia { background-position: -100px -200px;} -.icon.note { background-position: -120px -200px;} -.icon.wheelchair { background-position: -140px -200px;} /* ToolBar / Persistent UI Elements ------------------------------------------------------- */ @@ -2056,7 +2411,7 @@ a:hover .icon.out-link { background-position: -500px -14px;} white-space: nowrap; text-overflow: ellipsis; overflow: hidden; - padding: 20px; + padding: 20px 20px 20px 40px; } .header button, @@ -2072,12 +2427,25 @@ a:hover .icon.out-link { background-position: -500px -14px;} height: 100%; } -.preset-list-pane .header button { +.entity-editor-pane .header button.preset-close, +.preset-list-pane .header button.preset-choose { position: absolute; right: 0; top: 0; } +.entity-editor-pane .header button.preset-choose { + position: absolute; + left: 0; + top: 0; +} + +.preset-choose { + font-size: 16px; + line-height: 1.25; + font-weight: bold; +} + .modal > button { position: absolute; right: 0; @@ -2141,47 +2509,8 @@ a:hover .icon.out-link { background-position: -500px -14px;} bottom: 0; } -.mapillary-image { - position: absolute; - right: 0; - bottom: 30px; - width: 330px; - height: 250px; - padding: 5px; - background-color: #fff; -} - -.mapillary-image a { - display: block; - position: absolute; - height: auto; - background-color: rgba(0,0,0,.5); - bottom: 0; - right: 0; - padding: 5px 10px; -} - -.mapillary-image img { - width: 100%; - height: auto; - display: block; -} - -.mapillary-image.hidden { - visibility: hidden; -} -.mapillary-image.temp button { - display: none; -} -.mapillary-image button { - border-radius: 0; - padding: 5px; - position: absolute; - right: 0; - top: 0; -} .feature-list-pane .inspector-body { top: 120px; @@ -2241,9 +2570,24 @@ a:hover .icon.out-link { background-position: -500px -14px;} border-radius: 0; } +.feature-list-item { + background-color: white; + font-weight: bold; + height: 40px; + line-height: 20px; +} + +.feature-list-item:hover { + background-color: #ececec; +} + +.feature-list-item button { + background: transparent; +} + .feature-list-item .label { text-align: left; - padding: 5px 10px; + padding: 10px 10px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden; @@ -2254,8 +2598,13 @@ a:hover .icon.out-link { background-position: -500px -14px;} opacity: .5; } -.feature-list-item:hover .label { - background-color: #ececec; +.feature-list-item .close { + float: right; + padding: 10px; +} + +.feature-list-item .close .icon { + opacity: 1; } .feature-list-item .entity-type { @@ -2283,34 +2632,93 @@ a:hover .icon.out-link { background-position: -500px -14px;} border-bottom: 1px solid #ccc; } -.preset-list-button-wrap { - position: relative; - margin-bottom: 10px; +.preset-list-button-wrap { + position: relative; + margin-bottom: 10px; + height: 60px; +} + +.preset-list-button { + width: 100%; + height: 100%; + position: relative; + border: 1px solid #ccc; +} + +.preset-list.filtered .preset-list-item:first-child .preset-list-button { + background: #ececec; +} + +.preset-icon-fill-area { + cursor: inherit; + height: 40px; + width: 40px; + margin: auto; + position: absolute; + left: 10px; + top: 10px; +} + +.preset-icon-frame { + position: absolute; + top: 7px; + left: 7px; + height: 42px; + width: 42px; + margin: auto; +} + +.preset-icon-frame .icon { + width: 46px; + height: 46px; +} + +.preset-icon-60 { + position: absolute; + top: 0px; + left: 0px; + margin: auto; +} + +.preset-icon-60 .icon { + width: 60px; height: 60px; } -.preset-list-button { - width: 100%; - height: 100%; - position: relative; - border: 1px solid #ccc; +.preset-icon-44 { + position: absolute; + top: 9px; + left: 8px; + margin: auto; } -.preset-list.filtered .preset-list-item:first-child .preset-list-button { - background: #ececec; +.preset-icon-44 .icon { + width: 44px; + height: 44px; } -.preset-icon { +.preset-icon-28 { position: absolute; - top: 17px; - left: 17px; + top: 16px; + left: 16px; margin: auto; } -.preset-icon-line, -.preset-icon-relation { - top: 0; - left: 0; +.preset-icon-28 .icon { + width: 28px; + height: 28px; +} + +.preset-icon-24 { + position: absolute; + top: 18px; + left: 18px; + margin: auto; +} + +.preset-icon-24 .icon { + width: 24px; + height: 24px; } .preset-list-button .label { @@ -2345,6 +2753,10 @@ a:hover .icon.out-link { background-position: -500px -14px;} background: #fafafa; } +.preset-list-item button.tag-reference-button:hover { + background: #f1f1f1; +} + .preset-list-item button.tag-reference-button .icon { opacity: .5; } @@ -2390,32 +2802,16 @@ a:hover .icon.out-link { background-position: -500px -14px;} margin-top: -10px; } -/* Preset icon colors */ - -.preset-icon-fill-area { - cursor: inherit; - height: 39px; - width: 39px; - margin: auto; - position: absolute; - left: 10px; - top: 10px; -} - -.preset-icon-fill-area:after { - content: ''; - left: -4px; - top: -4px; - height: 45px; - width: 45px; - position: absolute; - background:transparent url(<%= asset_path("iD/img/sprite.svg") %>) no-repeat 0 -80px; -} /* preset form basics */ .inspector-preset { overflow: hidden; + padding-bottom: 10px; +} + +.inspector-preset a.hide-toggle { + margin: 0 20px 10px 20px; } .inspector-preset .preset-form { @@ -2424,25 +2820,10 @@ a:hover .icon.out-link { background-position: -500px -14px;} border-radius: 8px; } -.entity-editor-pane .preset-list-item::after { - content: ""; - position: absolute; - height: 0; - width: 0; - bottom: 0; - left: 0; - right: 0; - margin: auto; - border: solid rgba(0, 0, 0, 0); - border-width: 10px; - border-bottom-color: #ececec; -} - .entity-editor-pane .preset-list-item .preset-list-button-wrap { margin-bottom: 0; } - .form-field { margin-bottom: 10px; width: 100%; @@ -2486,11 +2867,14 @@ a:hover .icon.out-link { background-position: -500px -14px;} } .form-label button { - border-left: 1px solid #CCC; + border-left: 1px solid #ccc; width: 10%; height: 100%; border-radius: 0; - background: #fafafa; + background: #f6f6f6; +} +.form-label button:hover { + background: #f1f1f1; } .form-label .modified-icon, @@ -2506,10 +2890,11 @@ a:hover .icon.out-link { background-position: -500px -14px;} .form-field > input, .form-field > textarea, .form-field .preset-input-wrap { - border: 1px solid #CCC; + border: 1px solid #ccc; min-height: 30px; border-top: 0; border-radius: 0 0 4px 4px; + overflow: hidden; } .form-field textarea { @@ -2517,23 +2902,30 @@ a:hover .icon.out-link { background-position: -500px -14px;} } .inspector-border { - border-bottom: 1px solid #CCC + border-bottom: 1px solid #ccc } /* Preset form (hover mode) */ .inspector-hover .checkselect label:last-of-type, .inspector-hover .preset-input-wrap .label, +.inspector-hover .form-field-multicombo, .inspector-hover input, .inspector-hover label { background: #ececec; } .inspector-hover a, +.inspector-hover .form-field-multicombo .chips, .inspector-hover .checkselect label:last-of-type { color: #666; } +.inspector-hover .form-field-multicombo .chips { + background: #eee; + border: 1px solid #ccc; +} + /* hide and remove from layout */ .inspector-hidden, .inspector-hover label input[type="checkbox"], @@ -2542,6 +2934,7 @@ a:hover .icon.out-link { background-position: -500px -14px;} .inspector-hover .toggle-list label span, .inspector-hover .inspector-inner .add-tag, .inspector-hover .inspector-inner .add-relation, +.inspector-hover .form-field-multicombo .combobox-input, .inspector-hover .toggle-list label.remove .icon { height: 0; width: 0; @@ -2557,6 +2950,7 @@ a:hover .icon.out-link { background-position: -500px -14px;} .inspector-hover .combobox-caret, .inspector-hover .entity-editor-pane .header button, .inspector-hover .spin-control, +.inspector-hover .form-field-multicombo .chips .remove, .inspector-hover .hide-toggle:before, .inspector-hover .more-fields, .inspector-hover .form-label-button-wrap, @@ -2629,8 +3023,10 @@ a:hover .icon.out-link { background-position: -500px -14px;} font-weight: bold; } -.more-fields label { padding: 5px 10px 5px 0; } -.more-fields input { width: 50%;} +.more-fields input { + margin-left: 10px; + width: 50%; +} /* preset form access */ @@ -2657,6 +3053,78 @@ a:hover .icon.out-link { background-position: -500px -14px;} border-bottom-right-radius: 4px; } +/* preset form multicombo */ + +.form-field-multicombo { + border: 1px solid #cfcfcf; + border-top: 0px; + padding: 5px 0 5px 10px; + background: #fff; + display: block; + border-radius: 0 0 4px 4px; + overflow: hidden; +} + +.form-field-multicombo:focus { + border-bottom: 0px; +} + +.form-field-multicombo.active { + border-bottom-left-radius: 0px; + border-bottom-right-radius: 0px; +} + +.form-field-multicombo li { + background-color: #eff2f7; + border: 1px solid #ccd5e3; + border-radius: 4px; + line-height: 25px; + display: inline-block; + padding: 2px 5px; + margin: 3px; + height: 30px; +} + +.form-field-multicombo a { + font-family: Arial, Helvetica, sans-serif !important; + font-size: 16px !important; + line-height: 24px; + float: right; + margin: 1px 0 0 5px; + padding: 0; + cursor: pointer; + color: #a6b4ce; +} + +.form-field-multicombo input { + border: 1px solid #ddd; + width: 100px; + margin: 3px; +} + +.form-field-multicombo .combobox-caret { + margin: 3px 3px 3px -30px; +} + +.form-field-multicombo input:focus { + border-radius: 4px !important; +} + +/* preset form cycleway */ + +.form-field-cycleway .preset-input-wrap li { + border-bottom: 1px solid #CCC; +} +.form-field-cycleway .preset-input-wrap li:last-child { + border-bottom: 0; +} + +.preset-input-cycleway-wrap input { + border-radius: 0; + border-width: 0; + border-left-width: 1px; +} + /* preset form numbers */ input[type=number] { @@ -3148,6 +3616,27 @@ img.wiki-image { background: rgba(0,0,0,.8); } +/* Fullscreen button */ +div.full-screen { + float: right; + width: 40px; + margin-right: 10px; +} + +div.full-screen .tooltip { + min-width: 160px; +} + +div.full-screen > button, div.full-screen > button.active { + width: 40px; + height: 40px; + background: transparent; +} + +div.full-screen > button:hover { + background-color: rgba(0, 0, 0, .8); +} + /* Map Controls */ .map-controls { @@ -3181,7 +3670,6 @@ img.wiki-image { /* Background / Map Data Settings */ - .map-data-control button { border-radius: 0; } @@ -3195,12 +3683,8 @@ img.wiki-image { position: relative; } -.nudge-container { - border: 1px solid #CCC; -} - -.background-control .adjustments button:last-child { - border: 0; +.imagery-faq { + margin-bottom: 10px; } .map-data-control .hide-toggle, @@ -3208,7 +3692,7 @@ img.wiki-image { padding-bottom: 10px; } -.layer-list { +.layer-list, .controls-list { margin-bottom: 10px; border: 1px solid #CCC; border-radius: 4px; @@ -3221,6 +3705,10 @@ img.wiki-image { color: #7092FF; } +.layer-list:empty { + display: none; +} + .layer-list > li:first-child { border-radius: 3px 3px 0 0; } @@ -3241,10 +3729,23 @@ img.wiki-image { background-color: #ececec; } -.layer-list li.active { +.layer-list li.active, +.layer-list li.switch { background: #E8EBFF; } +.layer-list li.best > div.best { + display: inline-block; + padding: 5px; + float: right; +} + +/* make sure tooltip fits in map-control panel */ +/* if too wide, placement will be wrong the first time it displays */ +.layer-list li.best .tooltip-inner { + max-width: 160px; +} + .layer-list label { display: block; padding: 5px 10px; @@ -3258,6 +3759,22 @@ img.wiki-image { text-overflow: ellipsis; } +.minimap-toggle { + display: block; + padding: 5px 10px; + cursor: pointer; + color: #7092FF; + border-radius: 3px; +} + +.minimap-toggle.active { + background: #E8EBFF; +} + +.minimap-toggle:hover { + background-color: #ececec; +} + .hide-toggle { display: block; padding-left:12px; @@ -3284,15 +3801,41 @@ img.wiki-image { border-left: 4px solid transparent; } -.background-control .nudge-container button { - float: left; - display: block; - width:20%; - border-right: 1px solid #CCC; - position: relative; +/* Adjust Alignment controls */ + +.background-control .nudge-container { + border: 1px solid #ccc; + border-radius: 4px; + padding: 10px; +} + +.nudge-container .nudge-instructions { + padding-bottom: 15px; +} + +.nudge-container .nudge-outer-rect { + background-color: #eee; + border: 1px solid #ccc; + border-radius: 2px; + padding: 20px 0; + width: 70%; + display: flex; + justify-content: center; + align-items: center; + margin: 0 auto; + margin-top: 20px; + cursor: move; +} + +.nudge-container .nudge-inner-rect { + background-color: #fff; + border: 1px solid #ccc; + border-radius: 2px; + width: 65%; + min-height: 20px; } -.background-control .nudge::after { +.nudge-container .nudge::after { content: ''; display: block; position: absolute; @@ -3302,13 +3845,72 @@ img.wiki-image { width: 0; } -.background-control .nudge.left::after { +.nudge-container input { + width: 100%; + height: 20px; + text-align: center; + border: 0; +} + +.nudge-container input.error { + border: 1px solid #FF7878; + border-radius: 2px; + background: #ffb; +} + +.nudge-container input:focus { + background-color: transparent; +} + +.nudge-container button { + float: left; + display: block; + width: 20%; + position: relative; + background-color: transparent; +} + +.nudge-container button.right { + top: -50px; + right: -85%; +} + +.nudge-container button.left { + top: -50px; + right: 45%; +} + +.nudge-container button.top { + left: 20%; + top: -104px; +} + +.nudge-container button.bottom { + left: -20%; +} + +.nudge-container button.nudge-reset { + right: -10px; +} + +.nudge-surface { + position: absolute; + z-index: 5000; + left: 0; + top: 0; + width: 100%; + height: 100%; + background-color: transparent; + cursor: move; +} + +.background-control .nudge.right::after { border-top: 5px solid transparent; border-bottom: 5px solid transparent; border-left: 5px solid #222; } -.background-control .nudge.right::after { +.background-control .nudge.left::after { border-top: 5px solid transparent; border-bottom: 5px solid transparent; border-right: 5px solid #222; @@ -3439,7 +4041,7 @@ img.wiki-image { float:right; margin-left: 20px; margin-bottom: 20px; - padding-left: 5px + padding-left: 5px; } .help-wrap .toc li a, @@ -3482,26 +4084,84 @@ img.wiki-image { position: relative; } -.help-wrap .nav a { - float: left; - width: 50%; - text-align: center; +.help-wrap .nav a { + float: left; + width: 50%; + text-align: center; +} + +.help-wrap .nav a:first-child { + border-radius: 4px 0 0 4px; +} + +.help-wrap .nav a:last-child:not(:only-child) { + border-radius: 0 4px 4px 0; + border-left: 0; +} + +.help-wrap .nav a:only-child { + width: 100%; + border-radius: 4px; +} + + +/* Tiles +------------------------------------------------------- */ + +img.tile { + position:absolute; + transform-origin:0 0; + -ms-transform-origin:0 0; + -webkit-transform-origin:0 0; + -moz-transform-origin:0 0; + -o-transform-origin:0 0; + + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; + + opacity: 0; + + -webkit-transition: opacity 200ms linear; + transition: opacity 200ms linear; + -moz-transition: opacity 200ms linear; +} + +.tile-label-debug { + background: rgba(0, 0, 0, 0.7); + color: #fff; + position: absolute; + text-align: center; + width: 128px; + border-radius: 3px; + z-index: 2; + + transform-origin:0 0; + -ms-transform-origin:0 0; + -webkit-transform-origin:0 0; + -moz-transform-origin:0 0; + -o-transform-origin:0 0; + + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; } -.help-wrap .nav a:first-child { - border-radius: 4px 0 0 4px; +img.tile-debug { + border: 1px solid red; } -.help-wrap .nav a:last-child:not(:only-child) { - border-radius: 0 4px 4px 0; - border-left: 0; +img.tile-loaded { + opacity: 1; } -.help-wrap .nav a:only-child { - width: 100%; - border-radius: 4px; +img.tile-removing { + opacity: 0; } + /* Map ------------------------------------------------------- */ @@ -3518,13 +4178,14 @@ img.wiki-image { -webkit-transform-origin:0 0; -moz-transform-origin:0 0; -o-transform-origin:0 0; + -moz-user-select: none; -webkit-user-select: none; -ms-user-select: none; user-select: none; } -#supersurface, .layer-layer { +#supersurface, .layer { position: absolute; top: 0; left: 0; @@ -3534,7 +4195,6 @@ img.wiki-image { /* Map-In-Map ------------------------------------------------------- */ - .map-in-map { position: absolute; overflow: hidden; @@ -3553,19 +4213,31 @@ img.wiki-image { -webkit-transform-origin:0 0; -moz-transform-origin:0 0; -o-transform-origin:0 0; + -moz-user-select: none; -webkit-user-select: none; -ms-user-select: none; user-select: none; } -.map-in-map-svg { - position: relative; +.map-in-map-viewport, +.map-in-map-data { + top: 0; + left: 0; overflow: hidden; height: 100%; width: 100%; } +.map-in-map-viewport { + position: absolute; +} + +.map-in-map-data { + position: relative; + z-index: 10; +} + .map-in-map-bbox { fill: none; stroke: rgba(255, 255, 0, 0.75); @@ -3577,6 +4249,45 @@ img.wiki-image { stroke-width: 5; } + +/* Debug +------------------------------------------------------- */ +.debug { + stroke: currentColor; + fill: none; + stroke-width: 2; +} +.map-in-map-data .debug { + stroke-width: 1; +} + +.red { color: rgba(255, 0, 0, 0.75); } +.green { color: rgba(0, 255, 0, 0.75); } +.blue { color: rgba(0, 0, 255, 0.75); } +.yellow { color: rgba(255, 255, 0, 0.75); } +.cyan { color: rgba(0, 255, 255, 0.75); } +.magenta { color: rgba(255, 0, 255, 0.75); } +.orange { color: rgba(255, 153, 0, 0.75); } +.pink { color: rgba(255, 0, 153, 0.75); } +.purple { color: rgba(153, 0, 255, 0.75); } + +.debug-legend { + position: absolute; + top: 70px; + right: 80px; + padding: 5px; + border-radius: 4px; + pointer-events: none; +} + +.debug-legend-item { + padding-right: 5px; +} +.debug-legend-item:before { + content: "\25A0"; + padding: 0 5px; +} + /* Info Box ------------------------------------------------------- */ .infobox { @@ -3589,7 +4300,7 @@ img.wiki-image { border-bottom: 1px solid black; } -.infobox .selection-heading { +.infobox .infobox-heading { display: block; border-radius: 4px 0 0 0; padding: 5px 10px; @@ -3619,6 +4330,7 @@ img.wiki-image { right:0; bottom:0; border-radius: 0; + pointer-events: none; } #attrib { @@ -3627,7 +4339,6 @@ img.wiki-image { margin-bottom: 5px; float: left; clear: both; - pointer-events: none; } #attrib * { pointer-events: all; } @@ -3660,19 +4371,24 @@ img.wiki-image { width: 100%; float: left; clear: both; + pointer-events: all; } #scale-block { display: table-cell; vertical-align: bottom; width: 250px; - height: 30px; + max-height: 30px; float: left; clear: left; + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; } #info-block { - float: right; + max-height: 30px; clear: right; } @@ -3681,6 +4397,10 @@ img.wiki-image { width: 100%; } +#scale:hover { + cursor: pointer; +} + #scale text { font: 12px sans-serif; stroke: none; @@ -3699,6 +4419,7 @@ img.wiki-image { text-align: right; margin-right: 10px; clear: right; + overflow: hidden; } #about-list li { @@ -3740,12 +4461,20 @@ img.wiki-image { text-align: right; width: 100%; padding: 0px 10px; + color: #eee; } .api-status.offline, .api-status.readonly, .api-status.error { - background: red; + background: #a22; +} + +.api-status-login { + color: #aaf; +} +.api-status-login:hover { + color: #ccf; } /* Modals @@ -3808,6 +4537,14 @@ img.wiki-image { vertical-align: middle; } +.save-section .buttons .action, +.save-section .buttons .secondary-action { + display: inline-block; + margin: 0 20px 0 0; + text-align: center; + vertical-align: middle; +} + .loading-modal { text-align: center; } @@ -3829,7 +4566,7 @@ img.wiki-image { } .modal-actions button:before, -.save-success a.button:before, +.save-success a.button.osm:before, .walkthrough a:before { display: block; content: ''; @@ -3838,7 +4575,7 @@ img.wiki-image { max-width: 100px; margin: auto; margin-bottom: 10px; - background:transparent url(<%= asset_path("iD/img/sprite.svg") %>) no-repeat 0 -220px; + background:transparent url(<%= asset_path("iD/img/iD-sprite.svg") %>) no-repeat -200px -460px; } .modal-actions :first-child { @@ -3853,46 +4590,38 @@ img.wiki-image { ------------------------------------------------------- */ .modal-actions .restore:before { - background-position: -600px -220px; + background-position: -500px -460px; } .modal-actions .reset:before { - background-position: -700px -220px; + background-position: -600px -460px; } /* Success Modal ------------------------------------------------------- */ .save-success p { - padding: 15px; + padding: 15px 15px 0 15px; +} +.save-success a.details { + padding-left: 15px; } - .save-success .button { padding-top: 15px; } -.save-success .button.social { - height: 80px; +.save-success a.button.social { + height: auto; } -.save-success .button.social:before { - height: 50px; +.save-success .icon.social { + height: 80px; + width: 80px; + color: #7092FF; } .save-success .button.osm:before { - background-position: 0px -220px; -} - -.save-success .button.twitter:before { - background-position: -100px -245px; -} - -.save-success .button.facebook:before { - background-position: -200px -245px; -} - -.save-success .button.google:before { - background-position: -300px -245px; + background-position: -200px -460px; } /* Splash Modal @@ -3900,11 +4629,11 @@ img.wiki-image { .modal-actions .walkthrough:before, .walkthrough a:before { - background-position: -400px -220px; + background-position: -300px -460px; } .modal-actions .start:before { - background-position: -500px -220px; + background-position: -400px -460px; } /* Commit Modal @@ -4062,10 +4791,6 @@ img.wiki-image { margin-right:10px; } -.icon.zoom-in-invert { - background-position: -240px -40px; -} - /* Tooltips ------------------------------------------------------- */ @@ -4274,29 +4999,37 @@ img.wiki-image { } .radial-menu-background { + fill: none; stroke: black; stroke-opacity: 0.5; } -.radial-menu-item { - fill: white; -} - -.radial-menu-item:hover { - fill: #ececec; +.radial-menu-item circle { + fill: #eee; } -.radial-menu-item:active { - fill: #ececec; +.radial-menu-item circle:active, +.radial-menu-item circle:hover { + fill: #fff; } -.radial-menu-item.disabled { +.radial-menu-item.disabled circle { cursor: auto; fill: rgba(255,255,255,.5); } -.lasso-box { - fill-opacity:0.1; +.radial-menu-item use { + fill: #222; + color: #79f; +} + +.radial-menu-item.disabled use { + fill: rgba(32,32,32,.5); + color: rgba(40,40,40,.5); +} + +.lasso-path { + fill-opacity:0.3; stroke: #fff; stroke-width: 1; stroke-opacity: 1; @@ -4307,7 +5040,6 @@ img.wiki-image { ------------------------------------------------------- */ @media only screen and (max-width: 840px) { - #bar .icon.icon-pre-text { margin-right: 0;} /* override hide for save button */ #bar .save .label { display: block;} } @@ -4381,11 +5113,12 @@ img.wiki-image { background: #8cd05f; } -.intro-nav-wrap button.step .icon { +.intro-nav-wrap button.step .status { + margin-left: 3px; display: none; } -.intro-nav-wrap button.step.finished .icon { +.intro-nav-wrap button.step.finished .status { display: inline-block; } @@ -4429,7 +5162,7 @@ img.wiki-image { content: ""; height: 80px; width: 200px; - background:transparent url(<%= asset_path("iD/img/sprite.svg") %>) no-repeat 0 -320px; + background:transparent url(<%= asset_path("iD/img/iD-sprite.svg") %>) no-repeat 0 -320px; } .intro-areas-add .tooltip-inner::before { @@ -4449,189 +5182,380 @@ img.wiki-image { .huge-modal-button .illustration { height: 100px; width: 100px; - background: rgba(0, 0, 0, 0) url(<%= asset_path("iD/img/sprite.svg") %>) no-repeat -400px -220px; + background: rgba(0, 0, 0, 0) url(<%= asset_path("iD/img/iD-sprite.svg") %>) no-repeat -300px -460px; margin: auto; } -/* This file is generated by make. Do NOT edit manually. */ - -.preset-icon{background-image:url(<%= asset_path("iD/img/maki-sprite.png") %>);background-repeat:no-repeat;width:24px;height:24px;} -.preset-icon-line{background-image:url(<%= asset_path("iD/img/line-presets.png") %>);background-repeat:no-repeat;width:60px;height:60px;} -.preset-icon-relation{background-image:url(<%= asset_path("iD/img/relation-presets.png") %>);background-repeat:no-repeat;width:60px;height:60px;} -.feature-circle-stroked{background-position:-0px -0px;} -.feature-circle{background-position:-54px -0px;} -.feature-square-stroked{background-position:-108px -0px;} -.feature-square{background-position:-162px -0px;} -.feature-triangle-stroked{background-position:-216px -0px;} -.feature-triangle{background-position:-0px -24px;} -.feature-star-stroked{background-position:-54px -24px;} -.feature-star{background-position:-108px -24px;} -.feature-cross{background-position:-162px -24px;} -.feature-marker-stroked{background-position:-216px -24px;} -.feature-marker{background-position:-0px -48px;} -.feature-religious-jewish{background-position:-54px -48px;} -.feature-religious-christian{background-position:-108px -48px;} -.feature-religious-muslim{background-position:-162px -48px;} -.feature-cemetery{background-position:-216px -48px;} -.feature-rocket{background-position:-0px -72px;} -.feature-airport{background-position:-54px -72px;} -.feature-heliport{background-position:-108px -72px;} -.feature-rail{background-position:-162px -72px;} -.feature-rail-metro{background-position:-216px -72px;} -.feature-rail-light{background-position:-0px -96px;} -.feature-bus{background-position:-54px -96px;} -.feature-fuel{background-position:-108px -96px;} -.feature-parking{background-position:-162px -96px;} -.feature-parking-garage{background-position:-216px -96px;} -.feature-airfield{background-position:-0px -120px;} -.feature-roadblock{background-position:-54px -120px;} -.feature-ferry{background-position:-108px -120px;} -.feature-harbor{background-position:-162px -120px;} -.feature-bicycle{background-position:-216px -120px;} -.feature-park{background-position:-0px -144px;} -.feature-park2{background-position:-54px -144px;} -.feature-museum{background-position:-108px -144px;} -.feature-lodging{background-position:-162px -144px;} -.feature-monument{background-position:-216px -144px;} -.feature-zoo{background-position:-0px -168px;} -.feature-garden{background-position:-54px -168px;} -.feature-campsite{background-position:-108px -168px;} -.feature-theatre{background-position:-162px -168px;} -.feature-art-gallery{background-position:-216px -168px;} -.feature-pitch{background-position:-0px -192px;} -.feature-soccer{background-position:-54px -192px;} -.feature-america-football{background-position:-108px -192px;} -.feature-tennis{background-position:-162px -192px;} -.feature-basketball{background-position:-216px -192px;} -.feature-baseball{background-position:-0px -216px;} -.feature-golf{background-position:-54px -216px;} -.feature-swimming{background-position:-108px -216px;} -.feature-cricket{background-position:-162px -216px;} -.feature-skiing{background-position:-216px -216px;} -.feature-school{background-position:-0px -240px;} -.feature-college{background-position:-54px -240px;} -.feature-library{background-position:-108px -240px;} -.feature-post{background-position:-162px -240px;} -.feature-fire-station{background-position:-216px -240px;} -.feature-town-hall{background-position:-0px -264px;} -.feature-police{background-position:-54px -264px;} -.feature-prison{background-position:-108px -264px;} -.feature-embassy{background-position:-162px -264px;} -.feature-beer{background-position:-216px -264px;} -.feature-restaurant{background-position:-0px -288px;} -.feature-cafe{background-position:-54px -288px;} -.feature-shop{background-position:-108px -288px;} -.feature-fast-food{background-position:-162px -288px;} -.feature-bar{background-position:-216px -288px;} -.feature-bank{background-position:-0px -312px;} -.feature-grocery{background-position:-54px -312px;} -.feature-cinema{background-position:-108px -312px;} -.feature-pharmacy{background-position:-162px -312px;} -.feature-hospital{background-position:-216px -312px;} -.feature-danger{background-position:-0px -336px;} -.feature-industrial{background-position:-54px -336px;} -.feature-warehouse{background-position:-108px -336px;} -.feature-commercial{background-position:-162px -336px;} -.feature-building{background-position:-216px -336px;} -.feature-place-of-worship{background-position:-0px -360px;} -.feature-alcohol-shop{background-position:-54px -360px;} -.feature-logging{background-position:-108px -360px;} -.feature-oil-well{background-position:-162px -360px;} -.feature-slaughterhouse{background-position:-216px -360px;} -.feature-dam{background-position:-0px -384px;} -.feature-water{background-position:-54px -384px;} -.feature-wetland{background-position:-108px -384px;} -.feature-disability{background-position:-162px -384px;} -.feature-telephone{background-position:-216px -384px;} -.feature-emergency-telephone{background-position:-0px -408px;} -.feature-toilets{background-position:-54px -408px;} -.feature-waste-basket{background-position:-108px -408px;} -.feature-music{background-position:-162px -408px;} -.feature-land-use{background-position:-216px -408px;} -.feature-city{background-position:-0px -432px;} -.feature-town{background-position:-54px -432px;} -.feature-village{background-position:-108px -432px;} -.feature-farm{background-position:-162px -432px;} -.feature-bakery{background-position:-216px -432px;} -.feature-dog-park{background-position:-0px -456px;} -.feature-lighthouse{background-position:-54px -456px;} -.feature-clothing-store{background-position:-108px -456px;} -.feature-polling-place{background-position:-162px -456px;} -.feature-playground{background-position:-216px -456px;} -.feature-entrance{background-position:-0px -480px;} -.feature-heart{background-position:-54px -480px;} -.feature-london-underground{background-position:-108px -480px;} -.feature-minefield{background-position:-162px -480px;} -.feature-rail-underground{background-position:-216px -480px;} -.feature-rail-above{background-position:-0px -504px;} -.feature-camera{background-position:-54px -504px;} -.feature-laundry{background-position:-108px -504px;} -.feature-car{background-position:-162px -504px;} -.feature-suitcase{background-position:-216px -504px;} -.feature-hairdresser{background-position:-0px -528px;} -.feature-chemist{background-position:-54px -528px;} -.feature-mobilephone{background-position:-108px -528px;} -.feature-scooter{background-position:-162px -528px;} -.feature-gift{background-position:-216px -528px;} -.feature-ice-cream{background-position:-0px -552px;} -.preset-icon-line.feature-highway-motorway{background-position:-20px -25px;} -.preset-icon-line.feature-highway-trunk{background-position:-80px -25px;} -.preset-icon-line.feature-highway-primary{background-position:-140px -25px;} -.preset-icon-line.feature-highway-secondary{background-position:-200px -25px;} -.preset-icon-line.feature-highway-tertiary{background-position:-260px -25px;} -.preset-icon-line.feature-highway-motorway-link{background-position:-320px -25px;} -.preset-icon-line.feature-highway-trunk-link{background-position:-380px -25px;} -.preset-icon-line.feature-highway-primary-link{background-position:-440px -25px;} -.preset-icon-line.feature-highway-secondary-link{background-position:-500px -25px;} -.preset-icon-line.feature-highway-tertiary-link{background-position:-560px -25px;} -.preset-icon-line.feature-highway-residential{background-position:-620px -25px;} -.preset-icon-line.feature-highway-unclassified{background-position:-680px -25px;} -.preset-icon-line.feature-highway-service{background-position:-740px -25px;} -.preset-icon-line.feature-highway-road{background-position:-800px -25px;} -.preset-icon-line.feature-highway-track{background-position:-860px -25px;} -.preset-icon-line.feature-highway-living-street{background-position:-920px -25px;} -.preset-icon-line.feature-highway-path{background-position:-980px -25px;} -.preset-icon-line.feature-highway-cycleway{background-position:-1040px -25px;} -.preset-icon-line.feature-highway-footway{background-position:-1100px -25px;} -.preset-icon-line.feature-highway-bridleway{background-position:-1160px -25px;} -.preset-icon-line.feature-highway-steps{background-position:-1220px -25px;} -.preset-icon-line.feature-railway-rail{background-position:-1280px -25px;} -.preset-icon-line.feature-railway-disused{background-position:-1340px -25px;} -.preset-icon-line.feature-railway-abandoned{background-position:-1400px -25px;} -.preset-icon-line.feature-railway-subway{background-position:-1460px -25px;} -.preset-icon-line.feature-railway-light-rail{background-position:-1520px -25px;} -.preset-icon-line.feature-railway-monorail{background-position:-1580px -25px;} -.preset-icon-line.feature-waterway-river{background-position:-1640px -25px;} -.preset-icon-line.feature-waterway-stream{background-position:-1700px -25px;} -.preset-icon-line.feature-waterway-canal{background-position:-1760px -25px;} -.preset-icon-line.feature-waterway-ditch{background-position:-1820px -25px;} -.preset-icon-line.feature-power-line{background-position:-1880px -25px;} -.preset-icon-line.feature-other-line{background-position:-1940px -25px;} -.preset-icon-line.feature-category-roads{background-position:-2000px -25px;} -.preset-icon-line.feature-category-rail{background-position:-2060px -25px;} -.preset-icon-line.feature-category-path{background-position:-2120px -25px;} -.preset-icon-line.feature-category-water{background-position:-2180px -25px;} -.preset-icon-line.feature-ferry{background-position:-2240px -25px;} -.preset-icon-line.feature-pipeline{background-position:-2300px -25px;} -.preset-icon-relation.feature-relation{background-position:-20px -25px;} -.preset-icon-relation.feature-restriction{background-position:-80px -25px;} -.preset-icon-relation.feature-multipolygon{background-position:-141px -25px;} -.preset-icon-relation.feature-boundary{background-position:-200px -25px;} -.preset-icon-relation.feature-route{background-position:-260px -25px;} -.preset-icon-relation.feature-route-road{background-position:-320px -25px;} -.preset-icon-relation.feature-route-bicycle{background-position:-380px -25px;} -.preset-icon-relation.feature-route-foot{background-position:-440px -25px;} -.preset-icon-relation.feature-route-bus{background-position:-500px -25px;} -.preset-icon-relation.feature-route-train{background-position:-560px -25px;} -.preset-icon-relation.feature-route-detour{background-position:-620px -25px;} -.preset-icon-relation.feature-route-tram{background-position:-680px -25px;} -.preset-icon-relation.feature-route-ferry{background-position:-740px -25px;} -.preset-icon-relation.feature-route-power{background-position:-800px -25px;} -.preset-icon-relation.feature-route-pipeline{background-position:-860px -25px;} -.preset-icon-relation.feature-route-master{background-position:-920px -25px;} -.preset-icon-relation.feature-restriction-no-straight-on{background-position:-980px -25px;} -.preset-icon-relation.feature-restriction-no-u-turn{background-position:-1040px -25px;} -.preset-icon-relation.feature-restriction-no-left-turn{background-position:-1100px -25px;} -.preset-icon-relation.feature-restriction-no-right-turn{background-position:-1160px -25px;} -.preset-icon-relation.feature-restriction-only-straight-on{background-position:-1220px -25px;} -.preset-icon-relation.feature-restriction-only-left-turn{background-position:-1280px -25px;} -.preset-icon-relation.feature-restriction-only-right-turn{background-position:-1340px -25px;} + +.mapillary-wrap { + position: absolute; + bottom: 30px; + width: 330px; + height: 250px; + padding: 5px; + background-color: #fff; +} + +.mapillary-wrap.hidden { + visibility: hidden; +} + +.mapillary-wrap button.thumb-hide { + border-radius: 0; + padding: 5px; + position: absolute; + right: 0; + top: 0; + z-index: 500; +} + +.mly-wrapper { + visibility: hidden; + width: 100%; + height: 100%; +} + +.mly-wrapper.active { + visibility: visible; +} + +/* Right-to-left localization settings */ + +[dir='rtl'] #sidebar { + float: right; +} + +[dir='rtl'] #sidebar .search-header .icon { + left: auto; + right: 10px; +} + +/* header */ +[dir='rtl'] .header h3 { + text-align: right; + padding: 20px 40px 20px 20px; +} + +[dir='rtl'] .entity-editor-pane .header button.preset-choose { + left: auto; + right: 0; +} + +[dir='rtl'] .entity-editor-pane .header button.preset-close, [dir='rtl'] .preset-list-pane .header button.preset-choose { + left: 0; + right: auto; +} + +[dir='rtl'] .preset-icon-fill-area { + left: auto; + right: 10px; +} + +[dir='rtl'] .map-data-control .layer-list button, [dir='rtl'] .background-control .layer-list button { + float: left; + border-left: none; + border-right: 1px solid #CCC; +} + +[dir='rtl'] .map-data-control .layer-list button:first-of-type, [dir='rtl'] .background-control .layer-list button:first-of-type { + border-radius: 3px 0 0 3px; +} + +/* search */ +[dir='rtl'] .feature-list-item .label { + text-align: right; +} + +[dir='rtl'] .feature-list-item .entity-name { + padding-left: 0; + padding-right: 10px; +} + +/* preset form */ +[dir='rtl'] .form-label { + padding: 5px 10px 5px 0; +} + +[dir='rtl'] .form-label button { + border-left: none; + border-right: 1px solid #CCC; +} + +[dir='rtl'] .more-fields label { + padding: 5px 0 5px 10px; +} + +[dir='rtl'] .form-label-button-wrap { + text-align: left; +} + +[dir='rtl'] button.minor { + left: 0; + right: auto; +} + +[dir='rtl'] .form-field .localized-main { + padding-left: 10%; + padding-right: 10px; +} + +[dir='rtl'] .combobox-caret { + margin-left: 0; + margin-right: -30px; +} + +[dir='rtl'] .form-field .button-input-action { + margin-left: 0; + margin-right: -10%; +} + +[dir='rtl'] .icon.pre-text { + margin-left: 5px; + margin-right: 0; +} + +[dir='rtl'] .notice .zoom-to .icon { + margin-left: 10px; + margin-right: 0; +} + +[dir='rtl'] .preset-list-button .label { + text-align: right; + left: 0; + right: 60px; + border-left: none; + border-right: 1px solid rgba(0, 0, 0, .1); + border-radius: 3px 0 0 3px; +} + +[dir='rtl'] .preset-icon-frame { + left: auto; + right: 7px; +} + +[dir='rtl'] .preset-list-item button.tag-reference-button { + left: 0; + right: auto; + border-radius: 3px 0 0 3px; +} + +[dir='rtl'] .preset-list-button-wrap .preset-icon { + left: auto; + right: auto; +} + +[dir='rtl'] .preset-list-button-wrap .preset-icon-28 { + right: 16px; +} + +[dir='rtl'] .preset-list-button-wrap .preset-icon-24 { + right: 18px; +} + +[dir='rtl'] .form-field .maxspeed-unit { + border-radius: 0 0 0 4px; +} + +[dir='rtl'] input[type="checkbox"], [dir='rtl'] input[type="radio"] { + float: right; + margin-left: 5px; + margin-right: 0; +} + +[dir='rtl'] .preset-input-wrap .col6 { + float: right; +} + +/* tags form */ +[dir='rtl'] .tag-row .key-wrap, +[dir='rtl'] .tag-row .input-wrap-position { + float: right; +} + +[dir='rtl'] .tag-row input { + border-left: none; + border-right: 1px solid #CCC; +} + +[dir='rtl'] .tag-row:first-child input.key { + border-top-left-radius: 0; + border-top-right-radius: 4px; +} + +[dir='rtl'] .tag-row button { + left: 10%; + border-left-width: 1px; +} + +[dir='rtl'] .tag-row .tag-reference-button { + left: auto; + right: auto; + margin-right: 35px; + border-left-width: 1px; + border-right-width: 0; +} + +[dir='rtl'] .tag-row:first-child .tag-reference-button { + border-top-left-radius: 4px; + border-top-right-radius: 0; +} + +[dir='rtl'] .tag-row:last-child .tag-reference-button { + border-bottom-left-radius: 4px; + border-bottom-right-radius: 0; +} + +/* map control buttons */ +[dir='rtl'] .map-controls { + left: 0; + right: auto; +} + +[dir='rtl'] .background-control button, +[dir='rtl'] .zoombuttons button.zoom-in { + border-radius: 0 4px 0 0; +} + +[dir='rtl'] .help-control button, +[dir='rtl'] .geolocate-control button { + border-radius: 0 0 4px 0; +} + +[dir='rtl'] .list-item-gpx-browse svg { + transform: rotateY(180deg); +} + +/* map control button overlays */ +[dir='rtl'] .map-overlay { + padding: 20px 20px 20px 50px; + left: 0; + right: auto !important; +} + +[dir='rtl'] .opacity-options { + left: 50px; + right: auto; +} + +[dir='rtl'] .hide-toggle { + padding-left: 0; + padding-right: 12px; +} + +[dir='rtl'] .hide-toggle:before { + left: auto; + right: 0; + border-left: none; + border-right: 8px solid #7092ff; +} + +[dir='rtl'] .hide-toggle.expanded:before { + border-left: 4px solid transparent; + border-right: 4px solid transparent; +} + +/* navbar */ +[dir='rtl'] #bar .spacer, +[dir='rtl'] #bar .button-wrap, +[dir='rtl'] #bar .button-wrap button { + float: right; +} + +[dir='rtl'] .add-point .tooltip { + left: inherit !important; +} + +[dir='rtl'] .button-wrap:last-of-type { + padding-left: 0; + padding-right: 10px; +} + +[dir='rtl'] button.save.has-count .count { + margin-left: auto; + margin-right: 8%; +} + +[dir='rtl'] button.save.has-count .count::before { + border-left: 6px solid rgba(255,255,255,.5); + border-right: none; + left: auto; + right: -6px; +} + +[dir='rtl'] .joined button { + border-left: 1px solid rgba(0,0,0,.5); + border-right: none; +} + +[dir='rtl'] .joined button:first-child { + border-radius: 0 4px 4px 0; +} + +[dir='rtl'] .joined button:last-child { + border-radius: 4px 0 0 4px; +} + +[dir='rtl'] .spinner { + float: left; +} + +[dir='rtl'] .spinner img { + margin-left: 10px; + margin-right: auto; + -moz-transform: scaleX(-1); + -o-transform: scaleX(-1); + -webkit-transform: scaleX(-1); + transform: scaleX(-1); + filter: FlipH; + -ms-filter: "FlipH"; +} + +/* footer */ +[dir='rtl'] #scale-block { + float: right; + clear: right; +} + +[dir='rtl'] #info-block { + clear: left; +} + +[dir='rtl'] #about-list { + text-align: left; + clear: left; + margin-left: 10px; + margin-right: 0; +} + +[dir='rtl'] #about-list li { + float: left; + border-left: none; + border-right: 1px solid rgba(255,255,255,.5); + margin-left: 0; + margin-right: 5px; + padding: 5px 5px 5px 0; +} + +[dir='rtl'] #about-list li:last-child { + border-right: none; +} + +[dir='rtl'] #scale text { + text-anchor: end; +} + +/* increment / decrement control - code by Naoufel Razouane */ + +[dir='rtl'] .spin-control{ + margin-left: 0; + margin-right: -20%; +} +[dir='rtl'] .spin-control button{ + border-left: 0; + border-right: 1px solid #CCC; +} +[dir='rtl'] .spin-control button.decrement{ + border-bottom-right-radius: 0; +} +[dir='rtl'] .spin-control button.increment{ + border-bottom-left-radius: 3px; +} diff --git a/vendor/assets/iD/iD.js b/vendor/assets/iD/iD.js index 30b72e692..22a9842ab 100644 --- a/vendor/assets/iD/iD.js +++ b/vendor/assets/iD/iD.js @@ -1,61075 +1,71464 @@ -(function(exports) { - - var bootstrap = (typeof exports.bootstrap === "object") ? - exports.bootstrap : - (exports.bootstrap = {}); +(function () { +function actionAddEntity(way) { + return function(graph) { + return graph.replace(way); + }; +} - bootstrap.tooltip = function() { +var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; - var tooltip = function(selection) { - selection.each(setup); - }, - animation = d3.functor(false), - html = d3.functor(false), - title = function() { - var title = this.getAttribute("data-original-title"); - if (title) { - return title; - } else { - title = this.getAttribute("title"); - this.removeAttribute("title"); - this.setAttribute("data-original-title", title); - } - return title; - }, - over = "mouseenter.tooltip", - out = "mouseleave.tooltip", - placements = "top left bottom right".split(" "), - placement = d3.functor("top"); - - tooltip.title = function(_) { - if (arguments.length) { - title = d3.functor(_); - return tooltip; - } else { - return title; - } - }; +function commonjsRequire () { + throw new Error('Dynamic requires are not currently supported by rollup-plugin-commonjs'); +} - tooltip.html = function(_) { - if (arguments.length) { - html = d3.functor(_); - return tooltip; - } else { - return html; - } - }; - tooltip.placement = function(_) { - if (arguments.length) { - placement = d3.functor(_); - return tooltip; - } else { - return placement; - } - }; - tooltip.show = function(selection) { - selection.each(show); - }; +function createCommonjsModule(fn, module) { + return module = { exports: {} }, fn(module, module.exports), module.exports; +} - tooltip.hide = function(selection) { - selection.each(hide); - }; +var lodash = createCommonjsModule(function (module, exports) { +/** + * @license + * Lodash + * Copyright JS Foundation and other contributors + * Released under MIT license + * Based on Underscore.js 1.8.3 + * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + */ +(function() { - tooltip.toggle = function(selection) { - selection.each(toggle); - }; + /** Used as a safe reference for `undefined` in pre-ES5 environments. */ + var undefined; - tooltip.destroy = function(selection) { - selection - .on(over, null) - .on(out, null) - .attr("title", function() { - return this.getAttribute("data-original-title") || this.getAttribute("title"); - }) - .attr("data-original-title", null) - .select(".tooltip") - .remove(); - }; + /** Used as the semantic version number. */ + var VERSION = '4.17.4'; - function setup() { - var root = d3.select(this), - animate = animation.apply(this, arguments), - tip = root.append("div") - .attr("class", "tooltip"); + /** Used as the size to enable large array optimizations. */ + var LARGE_ARRAY_SIZE = 200; - if (animate) { - tip.classed("fade", true); - } + /** Error message constants. */ + var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.', + FUNC_ERROR_TEXT = 'Expected a function'; - // TODO "inside" checks? + /** Used to stand-in for `undefined` hash values. */ + var HASH_UNDEFINED = '__lodash_hash_undefined__'; - tip.append("div") - .attr("class", "tooltip-arrow"); - tip.append("div") - .attr("class", "tooltip-inner"); + /** Used as the maximum memoize cache size. */ + var MAX_MEMOIZE_SIZE = 500; - var place = placement.apply(this, arguments); - tip.classed(place, true); + /** Used as the internal argument placeholder. */ + var PLACEHOLDER = '__lodash_placeholder__'; - root.on(over, show); - root.on(out, hide); - } + /** Used to compose bitmasks for cloning. */ + var CLONE_DEEP_FLAG = 1, + CLONE_FLAT_FLAG = 2, + CLONE_SYMBOLS_FLAG = 4; + + /** Used to compose bitmasks for value comparisons. */ + var COMPARE_PARTIAL_FLAG = 1, + COMPARE_UNORDERED_FLAG = 2; + + /** Used to compose bitmasks for function metadata. */ + var WRAP_BIND_FLAG = 1, + WRAP_BIND_KEY_FLAG = 2, + WRAP_CURRY_BOUND_FLAG = 4, + WRAP_CURRY_FLAG = 8, + WRAP_CURRY_RIGHT_FLAG = 16, + WRAP_PARTIAL_FLAG = 32, + WRAP_PARTIAL_RIGHT_FLAG = 64, + WRAP_ARY_FLAG = 128, + WRAP_REARG_FLAG = 256, + WRAP_FLIP_FLAG = 512; + + /** Used as default options for `_.truncate`. */ + var DEFAULT_TRUNC_LENGTH = 30, + DEFAULT_TRUNC_OMISSION = '...'; + + /** Used to detect hot functions by number of calls within a span of milliseconds. */ + var HOT_COUNT = 800, + HOT_SPAN = 16; - function show() { - var root = d3.select(this), - content = title.apply(this, arguments), - tip = root.select(".tooltip") - .classed("in", true), - markup = html.apply(this, arguments), - innercontent = tip.select(".tooltip-inner")[markup ? "html" : "text"](content), - place = placement.apply(this, arguments), - outer = getPosition(root.node()), - inner = getPosition(tip.node()), - pos; + /** Used to indicate the type of lazy iteratees. */ + var LAZY_FILTER_FLAG = 1, + LAZY_MAP_FLAG = 2, + LAZY_WHILE_FLAG = 3; - switch (place) { - case "top": - pos = {x: outer.x + (outer.w - inner.w) / 2, y: outer.y - inner.h}; - break; - case "right": - pos = {x: outer.x + outer.w, y: outer.y + (outer.h - inner.h) / 2}; - break; - case "left": - pos = {x: outer.x - inner.w, y: outer.y + (outer.h - inner.h) / 2}; - break; - case "bottom": - pos = {x: Math.max(0, outer.x + (outer.w - inner.w) / 2), y: outer.y + outer.h}; - break; - } + /** Used as references for various `Number` constants. */ + var INFINITY = 1 / 0, + MAX_SAFE_INTEGER = 9007199254740991, + MAX_INTEGER = 1.7976931348623157e+308, + NAN = 0 / 0; - tip.style(pos ? - {left: ~~pos.x + "px", top: ~~pos.y + "px"} : - {left: null, top: null}); + /** Used as references for the maximum length and index of an array. */ + var MAX_ARRAY_LENGTH = 4294967295, + MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1, + HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1; - this.tooltipVisible = true; - } + /** Used to associate wrap methods with their bit flags. */ + var wrapFlags = [ + ['ary', WRAP_ARY_FLAG], + ['bind', WRAP_BIND_FLAG], + ['bindKey', WRAP_BIND_KEY_FLAG], + ['curry', WRAP_CURRY_FLAG], + ['curryRight', WRAP_CURRY_RIGHT_FLAG], + ['flip', WRAP_FLIP_FLAG], + ['partial', WRAP_PARTIAL_FLAG], + ['partialRight', WRAP_PARTIAL_RIGHT_FLAG], + ['rearg', WRAP_REARG_FLAG] + ]; - function hide() { - d3.select(this).select(".tooltip") - .classed("in", false); + /** `Object#toString` result references. */ + var argsTag = '[object Arguments]', + arrayTag = '[object Array]', + asyncTag = '[object AsyncFunction]', + boolTag = '[object Boolean]', + dateTag = '[object Date]', + domExcTag = '[object DOMException]', + errorTag = '[object Error]', + funcTag = '[object Function]', + genTag = '[object GeneratorFunction]', + mapTag = '[object Map]', + numberTag = '[object Number]', + nullTag = '[object Null]', + objectTag = '[object Object]', + promiseTag = '[object Promise]', + proxyTag = '[object Proxy]', + regexpTag = '[object RegExp]', + setTag = '[object Set]', + stringTag = '[object String]', + symbolTag = '[object Symbol]', + undefinedTag = '[object Undefined]', + weakMapTag = '[object WeakMap]', + weakSetTag = '[object WeakSet]'; - this.tooltipVisible = false; - } + var arrayBufferTag = '[object ArrayBuffer]', + dataViewTag = '[object DataView]', + float32Tag = '[object Float32Array]', + float64Tag = '[object Float64Array]', + int8Tag = '[object Int8Array]', + int16Tag = '[object Int16Array]', + int32Tag = '[object Int32Array]', + uint8Tag = '[object Uint8Array]', + uint8ClampedTag = '[object Uint8ClampedArray]', + uint16Tag = '[object Uint16Array]', + uint32Tag = '[object Uint32Array]'; - function toggle() { - if (this.tooltipVisible) { - hide.apply(this, arguments); - } else { - show.apply(this, arguments); - } - } + /** Used to match empty string literals in compiled template source. */ + var reEmptyStringLeading = /\b__p \+= '';/g, + reEmptyStringMiddle = /\b(__p \+=) '' \+/g, + reEmptyStringTrailing = /(__e\(.*?\)|\b__t\)) \+\n'';/g; - return tooltip; - }; + /** Used to match HTML entities and HTML characters. */ + var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g, + reUnescapedHtml = /[&<>"']/g, + reHasEscapedHtml = RegExp(reEscapedHtml.source), + reHasUnescapedHtml = RegExp(reUnescapedHtml.source); - function getPosition(node) { - var mode = d3.select(node).style('position'); - if (mode === 'absolute' || mode === 'static') { - return { - x: node.offsetLeft, - y: node.offsetTop, - w: node.offsetWidth, - h: node.offsetHeight - }; - } else { - return { - x: 0, - y: 0, - w: node.offsetWidth, - h: node.offsetHeight - }; - } - } + /** Used to match template delimiters. */ + var reEscape = /<%-([\s\S]+?)%>/g, + reEvaluate = /<%([\s\S]+?)%>/g, + reInterpolate = /<%=([\s\S]+?)%>/g; -})(this); -!function(){ - var d3 = {version: "3.5.5"}; // semver -d3.ascending = d3_ascending; + /** Used to match property names within property paths. */ + var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, + reIsPlainProp = /^\w*$/, + reLeadingDot = /^\./, + rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g; -function d3_ascending(a, b) { - return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; -} -d3.descending = function(a, b) { - return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN; -}; -d3.min = function(array, f) { - var i = -1, - n = array.length, - a, - b; - if (arguments.length === 1) { - while (++i < n) if ((b = array[i]) != null && b >= b) { a = b; break; } - while (++i < n) if ((b = array[i]) != null && a > b) a = b; - } else { - while (++i < n) if ((b = f.call(array, array[i], i)) != null && b >= b) { a = b; break; } - while (++i < n) if ((b = f.call(array, array[i], i)) != null && a > b) a = b; - } - return a; -}; -d3.max = function(array, f) { - var i = -1, - n = array.length, - a, - b; - if (arguments.length === 1) { - while (++i < n) if ((b = array[i]) != null && b >= b) { a = b; break; } - while (++i < n) if ((b = array[i]) != null && b > a) a = b; - } else { - while (++i < n) if ((b = f.call(array, array[i], i)) != null && b >= b) { a = b; break; } - while (++i < n) if ((b = f.call(array, array[i], i)) != null && b > a) a = b; - } - return a; -}; -d3.extent = function(array, f) { - var i = -1, - n = array.length, - a, - b, - c; - if (arguments.length === 1) { - while (++i < n) if ((b = array[i]) != null && b >= b) { a = c = b; break; } - while (++i < n) if ((b = array[i]) != null) { - if (a > b) a = b; - if (c < b) c = b; - } - } else { - while (++i < n) if ((b = f.call(array, array[i], i)) != null && b >= b) { a = c = b; break; } - while (++i < n) if ((b = f.call(array, array[i], i)) != null) { - if (a > b) a = b; - if (c < b) c = b; - } - } - return [a, c]; -}; -function d3_number(x) { - return x === null ? NaN : +x; -} + /** + * Used to match `RegExp` + * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns). + */ + var reRegExpChar = /[\\^$.*+?()[\]{}|]/g, + reHasRegExpChar = RegExp(reRegExpChar.source); -function d3_numeric(x) { - return !isNaN(x); -} + /** Used to match leading and trailing whitespace. */ + var reTrim = /^\s+|\s+$/g, + reTrimStart = /^\s+/, + reTrimEnd = /\s+$/; -d3.sum = function(array, f) { - var s = 0, - n = array.length, - a, - i = -1; - if (arguments.length === 1) { - while (++i < n) if (d3_numeric(a = +array[i])) s += a; // zero and null are equivalent - } else { - while (++i < n) if (d3_numeric(a = +f.call(array, array[i], i))) s += a; - } - return s; -}; + /** Used to match wrap detail comments. */ + var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/, + reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/, + reSplitDetails = /,? & /; -d3.mean = function(array, f) { - var s = 0, - n = array.length, - a, - i = -1, - j = n; - if (arguments.length === 1) { - while (++i < n) if (d3_numeric(a = d3_number(array[i]))) s += a; else --j; - } else { - while (++i < n) if (d3_numeric(a = d3_number(f.call(array, array[i], i)))) s += a; else --j; - } - if (j) return s / j; -}; -// R-7 per -d3.quantile = function(values, p) { - var H = (values.length - 1) * p + 1, - h = Math.floor(H), - v = +values[h - 1], - e = H - h; - return e ? v + e * (values[h] - v) : v; -}; + /** Used to match words composed of alphanumeric characters. */ + var reAsciiWord = /[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g; -d3.median = function(array, f) { - var numbers = [], - n = array.length, - a, - i = -1; - if (arguments.length === 1) { - while (++i < n) if (d3_numeric(a = d3_number(array[i]))) numbers.push(a); - } else { - while (++i < n) if (d3_numeric(a = d3_number(f.call(array, array[i], i)))) numbers.push(a); - } - if (numbers.length) return d3.quantile(numbers.sort(d3_ascending), .5); -}; + /** Used to match backslashes in property paths. */ + var reEscapeChar = /\\(\\)?/g; -d3.variance = function(array, f) { - var n = array.length, - m = 0, - a, - d, - s = 0, - i = -1, - j = 0; - if (arguments.length === 1) { - while (++i < n) { - if (d3_numeric(a = d3_number(array[i]))) { - d = a - m; - m += d / ++j; - s += d * (a - m); - } - } - } else { - while (++i < n) { - if (d3_numeric(a = d3_number(f.call(array, array[i], i)))) { - d = a - m; - m += d / ++j; - s += d * (a - m); - } - } - } - if (j > 1) return s / (j - 1); -}; + /** + * Used to match + * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components). + */ + var reEsTemplate = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g; -d3.deviation = function() { - var v = d3.variance.apply(this, arguments); - return v ? Math.sqrt(v) : v; -}; + /** Used to match `RegExp` flags from their coerced string values. */ + var reFlags = /\w*$/; -function d3_bisector(compare) { - return { - left: function(a, x, lo, hi) { - if (arguments.length < 3) lo = 0; - if (arguments.length < 4) hi = a.length; - while (lo < hi) { - var mid = lo + hi >>> 1; - if (compare(a[mid], x) < 0) lo = mid + 1; - else hi = mid; - } - return lo; - }, - right: function(a, x, lo, hi) { - if (arguments.length < 3) lo = 0; - if (arguments.length < 4) hi = a.length; - while (lo < hi) { - var mid = lo + hi >>> 1; - if (compare(a[mid], x) > 0) hi = mid; - else lo = mid + 1; - } - return lo; - } - }; -} + /** Used to detect bad signed hexadecimal string values. */ + var reIsBadHex = /^[-+]0x[0-9a-f]+$/i; -var d3_bisect = d3_bisector(d3_ascending); -d3.bisectLeft = d3_bisect.left; -d3.bisect = d3.bisectRight = d3_bisect.right; + /** Used to detect binary string values. */ + var reIsBinary = /^0b[01]+$/i; -d3.bisector = function(f) { - return d3_bisector(f.length === 1 - ? function(d, x) { return d3_ascending(f(d), x); } - : f); -}; -d3.shuffle = function(array, i0, i1) { - if ((m = arguments.length) < 3) { i1 = array.length; if (m < 2) i0 = 0; } - var m = i1 - i0, t, i; - while (m) { - i = Math.random() * m-- | 0; - t = array[m + i0], array[m + i0] = array[i + i0], array[i + i0] = t; - } - return array; -}; -d3.permute = function(array, indexes) { - var i = indexes.length, permutes = new Array(i); - while (i--) permutes[i] = array[indexes[i]]; - return permutes; -}; -d3.pairs = function(array) { - var i = 0, n = array.length - 1, p0, p1 = array[0], pairs = new Array(n < 0 ? 0 : n); - while (i < n) pairs[i] = [p0 = p1, p1 = array[++i]]; - return pairs; -}; + /** Used to detect host constructors (Safari). */ + var reIsHostCtor = /^\[object .+?Constructor\]$/; -d3.zip = function() { - if (!(n = arguments.length)) return []; - for (var i = -1, m = d3.min(arguments, d3_zipLength), zips = new Array(m); ++i < m;) { - for (var j = -1, n, zip = zips[i] = new Array(n); ++j < n;) { - zip[j] = arguments[j][i]; - } - } - return zips; -}; + /** Used to detect octal string values. */ + var reIsOctal = /^0o[0-7]+$/i; -function d3_zipLength(d) { - return d.length; -} + /** Used to detect unsigned integer values. */ + var reIsUint = /^(?:0|[1-9]\d*)$/; + + /** Used to match Latin Unicode letters (excluding mathematical operators). */ + var reLatin = /[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g; + + /** Used to ensure capturing order of template delimiters. */ + var reNoMatch = /($^)/; + + /** Used to match unescaped characters in compiled string literals. */ + var reUnescapedString = /['\n\r\u2028\u2029\\]/g; + + /** Used to compose unicode character classes. */ + var rsAstralRange = '\\ud800-\\udfff', + rsComboMarksRange = '\\u0300-\\u036f', + reComboHalfMarksRange = '\\ufe20-\\ufe2f', + rsComboSymbolsRange = '\\u20d0-\\u20ff', + rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange, + rsDingbatRange = '\\u2700-\\u27bf', + rsLowerRange = 'a-z\\xdf-\\xf6\\xf8-\\xff', + rsMathOpRange = '\\xac\\xb1\\xd7\\xf7', + rsNonCharRange = '\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf', + rsPunctuationRange = '\\u2000-\\u206f', + rsSpaceRange = ' \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000', + rsUpperRange = 'A-Z\\xc0-\\xd6\\xd8-\\xde', + rsVarRange = '\\ufe0e\\ufe0f', + rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange; + + /** Used to compose unicode capture groups. */ + var rsApos = "['\u2019]", + rsAstral = '[' + rsAstralRange + ']', + rsBreak = '[' + rsBreakRange + ']', + rsCombo = '[' + rsComboRange + ']', + rsDigits = '\\d+', + rsDingbat = '[' + rsDingbatRange + ']', + rsLower = '[' + rsLowerRange + ']', + rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']', + rsFitz = '\\ud83c[\\udffb-\\udfff]', + rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')', + rsNonAstral = '[^' + rsAstralRange + ']', + rsRegional = '(?:\\ud83c[\\udde6-\\uddff]){2}', + rsSurrPair = '[\\ud800-\\udbff][\\udc00-\\udfff]', + rsUpper = '[' + rsUpperRange + ']', + rsZWJ = '\\u200d'; + + /** Used to compose unicode regexes. */ + var rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')', + rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')', + rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?', + rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?', + reOptMod = rsModifier + '?', + rsOptVar = '[' + rsVarRange + ']?', + rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*', + rsOrdLower = '\\d*(?:(?:1st|2nd|3rd|(?![123])\\dth)\\b)', + rsOrdUpper = '\\d*(?:(?:1ST|2ND|3RD|(?![123])\\dTH)\\b)', + rsSeq = rsOptVar + reOptMod + rsOptJoin, + rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq, + rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')'; + + /** Used to match apostrophes. */ + var reApos = RegExp(rsApos, 'g'); -d3.transpose = function(matrix) { - return d3.zip.apply(d3, matrix); -}; -d3.keys = function(map) { - var keys = []; - for (var key in map) keys.push(key); - return keys; -}; -d3.values = function(map) { - var values = []; - for (var key in map) values.push(map[key]); - return values; -}; -d3.entries = function(map) { - var entries = []; - for (var key in map) entries.push({key: key, value: map[key]}); - return entries; -}; -d3.merge = function(arrays) { - var n = arrays.length, - m, - i = -1, - j = 0, - merged, - array; + /** + * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and + * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols). + */ + var reComboMark = RegExp(rsCombo, 'g'); + + /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */ + var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g'); + + /** Used to match complex or compound words. */ + var reUnicodeWord = RegExp([ + rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')', + rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')', + rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower, + rsUpper + '+' + rsOptContrUpper, + rsOrdUpper, + rsOrdLower, + rsDigits, + rsEmoji + ].join('|'), 'g'); + + /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */ + var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + ']'); + + /** Used to detect strings that need a more robust regexp to match words. */ + var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/; + + /** Used to assign default `context` object properties. */ + var contextProps = [ + 'Array', 'Buffer', 'DataView', 'Date', 'Error', 'Float32Array', 'Float64Array', + 'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object', + 'Promise', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError', 'Uint8Array', + 'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap', + '_', 'clearTimeout', 'isFinite', 'parseInt', 'setTimeout' + ]; - while (++i < n) j += arrays[i].length; - merged = new Array(j); + /** Used to make template sourceURLs easier to identify. */ + var templateCounter = -1; - while (--n >= 0) { - array = arrays[n]; - m = array.length; - while (--m >= 0) { - merged[--j] = array[m]; - } - } - - return merged; -}; -var abs = Math.abs; - -d3.range = function(start, stop, step) { - if (arguments.length < 3) { - step = 1; - if (arguments.length < 2) { - stop = start; - start = 0; - } - } - if ((stop - start) / step === Infinity) throw new Error("infinite range"); - var range = [], - k = d3_range_integerScale(abs(step)), - i = -1, - j; - start *= k, stop *= k, step *= k; - if (step < 0) while ((j = start + step * ++i) > stop) range.push(j / k); - else while ((j = start + step * ++i) < stop) range.push(j / k); - return range; -}; - -function d3_range_integerScale(x) { - var k = 1; - while (x * k % 1) k *= 10; - return k; -} -function d3_class(ctor, properties) { - for (var key in properties) { - Object.defineProperty(ctor.prototype, key, { - value: properties[key], - enumerable: false - }); - } -} + /** Used to identify `toStringTag` values of typed arrays. */ + var typedArrayTags = {}; + typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = + typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = + typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = + typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = + typedArrayTags[uint32Tag] = true; + typedArrayTags[argsTag] = typedArrayTags[arrayTag] = + typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = + typedArrayTags[dataViewTag] = typedArrayTags[dateTag] = + typedArrayTags[errorTag] = typedArrayTags[funcTag] = + typedArrayTags[mapTag] = typedArrayTags[numberTag] = + typedArrayTags[objectTag] = typedArrayTags[regexpTag] = + typedArrayTags[setTag] = typedArrayTags[stringTag] = + typedArrayTags[weakMapTag] = false; -d3.map = function(object, f) { - var map = new d3_Map; - if (object instanceof d3_Map) { - object.forEach(function(key, value) { map.set(key, value); }); - } else if (Array.isArray(object)) { - var i = -1, - n = object.length, - o; - if (arguments.length === 1) while (++i < n) map.set(i, object[i]); - else while (++i < n) map.set(f.call(object, o = object[i], i), o); - } else { - for (var key in object) map.set(key, object[key]); - } - return map; -}; + /** Used to identify `toStringTag` values supported by `_.clone`. */ + var cloneableTags = {}; + cloneableTags[argsTag] = cloneableTags[arrayTag] = + cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] = + cloneableTags[boolTag] = cloneableTags[dateTag] = + cloneableTags[float32Tag] = cloneableTags[float64Tag] = + cloneableTags[int8Tag] = cloneableTags[int16Tag] = + cloneableTags[int32Tag] = cloneableTags[mapTag] = + cloneableTags[numberTag] = cloneableTags[objectTag] = + cloneableTags[regexpTag] = cloneableTags[setTag] = + cloneableTags[stringTag] = cloneableTags[symbolTag] = + cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] = + cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true; + cloneableTags[errorTag] = cloneableTags[funcTag] = + cloneableTags[weakMapTag] = false; -function d3_Map() { - this._ = Object.create(null); -} + /** Used to map Latin Unicode letters to basic Latin letters. */ + var deburredLetters = { + // Latin-1 Supplement block. + '\xc0': 'A', '\xc1': 'A', '\xc2': 'A', '\xc3': 'A', '\xc4': 'A', '\xc5': 'A', + '\xe0': 'a', '\xe1': 'a', '\xe2': 'a', '\xe3': 'a', '\xe4': 'a', '\xe5': 'a', + '\xc7': 'C', '\xe7': 'c', + '\xd0': 'D', '\xf0': 'd', + '\xc8': 'E', '\xc9': 'E', '\xca': 'E', '\xcb': 'E', + '\xe8': 'e', '\xe9': 'e', '\xea': 'e', '\xeb': 'e', + '\xcc': 'I', '\xcd': 'I', '\xce': 'I', '\xcf': 'I', + '\xec': 'i', '\xed': 'i', '\xee': 'i', '\xef': 'i', + '\xd1': 'N', '\xf1': 'n', + '\xd2': 'O', '\xd3': 'O', '\xd4': 'O', '\xd5': 'O', '\xd6': 'O', '\xd8': 'O', + '\xf2': 'o', '\xf3': 'o', '\xf4': 'o', '\xf5': 'o', '\xf6': 'o', '\xf8': 'o', + '\xd9': 'U', '\xda': 'U', '\xdb': 'U', '\xdc': 'U', + '\xf9': 'u', '\xfa': 'u', '\xfb': 'u', '\xfc': 'u', + '\xdd': 'Y', '\xfd': 'y', '\xff': 'y', + '\xc6': 'Ae', '\xe6': 'ae', + '\xde': 'Th', '\xfe': 'th', + '\xdf': 'ss', + // Latin Extended-A block. + '\u0100': 'A', '\u0102': 'A', '\u0104': 'A', + '\u0101': 'a', '\u0103': 'a', '\u0105': 'a', + '\u0106': 'C', '\u0108': 'C', '\u010a': 'C', '\u010c': 'C', + '\u0107': 'c', '\u0109': 'c', '\u010b': 'c', '\u010d': 'c', + '\u010e': 'D', '\u0110': 'D', '\u010f': 'd', '\u0111': 'd', + '\u0112': 'E', '\u0114': 'E', '\u0116': 'E', '\u0118': 'E', '\u011a': 'E', + '\u0113': 'e', '\u0115': 'e', '\u0117': 'e', '\u0119': 'e', '\u011b': 'e', + '\u011c': 'G', '\u011e': 'G', '\u0120': 'G', '\u0122': 'G', + '\u011d': 'g', '\u011f': 'g', '\u0121': 'g', '\u0123': 'g', + '\u0124': 'H', '\u0126': 'H', '\u0125': 'h', '\u0127': 'h', + '\u0128': 'I', '\u012a': 'I', '\u012c': 'I', '\u012e': 'I', '\u0130': 'I', + '\u0129': 'i', '\u012b': 'i', '\u012d': 'i', '\u012f': 'i', '\u0131': 'i', + '\u0134': 'J', '\u0135': 'j', + '\u0136': 'K', '\u0137': 'k', '\u0138': 'k', + '\u0139': 'L', '\u013b': 'L', '\u013d': 'L', '\u013f': 'L', '\u0141': 'L', + '\u013a': 'l', '\u013c': 'l', '\u013e': 'l', '\u0140': 'l', '\u0142': 'l', + '\u0143': 'N', '\u0145': 'N', '\u0147': 'N', '\u014a': 'N', + '\u0144': 'n', '\u0146': 'n', '\u0148': 'n', '\u014b': 'n', + '\u014c': 'O', '\u014e': 'O', '\u0150': 'O', + '\u014d': 'o', '\u014f': 'o', '\u0151': 'o', + '\u0154': 'R', '\u0156': 'R', '\u0158': 'R', + '\u0155': 'r', '\u0157': 'r', '\u0159': 'r', + '\u015a': 'S', '\u015c': 'S', '\u015e': 'S', '\u0160': 'S', + '\u015b': 's', '\u015d': 's', '\u015f': 's', '\u0161': 's', + '\u0162': 'T', '\u0164': 'T', '\u0166': 'T', + '\u0163': 't', '\u0165': 't', '\u0167': 't', + '\u0168': 'U', '\u016a': 'U', '\u016c': 'U', '\u016e': 'U', '\u0170': 'U', '\u0172': 'U', + '\u0169': 'u', '\u016b': 'u', '\u016d': 'u', '\u016f': 'u', '\u0171': 'u', '\u0173': 'u', + '\u0174': 'W', '\u0175': 'w', + '\u0176': 'Y', '\u0177': 'y', '\u0178': 'Y', + '\u0179': 'Z', '\u017b': 'Z', '\u017d': 'Z', + '\u017a': 'z', '\u017c': 'z', '\u017e': 'z', + '\u0132': 'IJ', '\u0133': 'ij', + '\u0152': 'Oe', '\u0153': 'oe', + '\u0149': "'n", '\u017f': 's' + }; -var d3_map_proto = "__proto__", - d3_map_zero = "\0"; + /** Used to map characters to HTML entities. */ + var htmlEscapes = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''' + }; -d3_class(d3_Map, { - has: d3_map_has, - get: function(key) { - return this._[d3_map_escape(key)]; - }, - set: function(key, value) { - return this._[d3_map_escape(key)] = value; - }, - remove: d3_map_remove, - keys: d3_map_keys, - values: function() { - var values = []; - for (var key in this._) values.push(this._[key]); - return values; - }, - entries: function() { - var entries = []; - for (var key in this._) entries.push({key: d3_map_unescape(key), value: this._[key]}); - return entries; - }, - size: d3_map_size, - empty: d3_map_empty, - forEach: function(f) { - for (var key in this._) f.call(this, d3_map_unescape(key), this._[key]); - } -}); + /** Used to map HTML entities to characters. */ + var htmlUnescapes = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + ''': "'" + }; -function d3_map_escape(key) { - return (key += "") === d3_map_proto || key[0] === d3_map_zero ? d3_map_zero + key : key; -} + /** Used to escape characters for inclusion in compiled string literals. */ + var stringEscapes = { + '\\': '\\', + "'": "'", + '\n': 'n', + '\r': 'r', + '\u2028': 'u2028', + '\u2029': 'u2029' + }; -function d3_map_unescape(key) { - return (key += "")[0] === d3_map_zero ? key.slice(1) : key; -} + /** Built-in method references without a dependency on `root`. */ + var freeParseFloat = parseFloat, + freeParseInt = parseInt; -function d3_map_has(key) { - return d3_map_escape(key) in this._; -} + /** Detect free variable `global` from Node.js. */ + var freeGlobal = typeof commonjsGlobal == 'object' && commonjsGlobal && commonjsGlobal.Object === Object && commonjsGlobal; -function d3_map_remove(key) { - return (key = d3_map_escape(key)) in this._ && delete this._[key]; -} + /** Detect free variable `self`. */ + var freeSelf = typeof self == 'object' && self && self.Object === Object && self; -function d3_map_keys() { - var keys = []; - for (var key in this._) keys.push(d3_map_unescape(key)); - return keys; -} + /** Used as a reference to the global object. */ + var root = freeGlobal || freeSelf || Function('return this')(); -function d3_map_size() { - var size = 0; - for (var key in this._) ++size; - return size; -} + /** Detect free variable `exports`. */ + var freeExports = 'object' == 'object' && exports && !exports.nodeType && exports; -function d3_map_empty() { - for (var key in this._) return false; - return true; -} + /** Detect free variable `module`. */ + var freeModule = freeExports && 'object' == 'object' && module && !module.nodeType && module; -d3.nest = function() { - var nest = {}, - keys = [], - sortKeys = [], - sortValues, - rollup; + /** Detect the popular CommonJS extension `module.exports`. */ + var moduleExports = freeModule && freeModule.exports === freeExports; - function map(mapType, array, depth) { - if (depth >= keys.length) return rollup - ? rollup.call(nest, array) : (sortValues - ? array.sort(sortValues) - : array); + /** Detect free variable `process` from Node.js. */ + var freeProcess = moduleExports && freeGlobal.process; - var i = -1, - n = array.length, - key = keys[depth++], - keyValue, - object, - setter, - valuesByKey = new d3_Map, - values; + /** Used to access faster Node.js helpers. */ + var nodeUtil = (function() { + try { + return freeProcess && freeProcess.binding && freeProcess.binding('util'); + } catch (e) {} + }()); - while (++i < n) { - if (values = valuesByKey.get(keyValue = key(object = array[i]))) { - values.push(object); - } else { - valuesByKey.set(keyValue, [object]); - } - } + /* Node.js helper references. */ + var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer, + nodeIsDate = nodeUtil && nodeUtil.isDate, + nodeIsMap = nodeUtil && nodeUtil.isMap, + nodeIsRegExp = nodeUtil && nodeUtil.isRegExp, + nodeIsSet = nodeUtil && nodeUtil.isSet, + nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray; - if (mapType) { - object = mapType(); - setter = function(keyValue, values) { - object.set(keyValue, map(mapType, values, depth)); - }; - } else { - object = {}; - setter = function(keyValue, values) { - object[keyValue] = map(mapType, values, depth); - }; - } + /*--------------------------------------------------------------------------*/ - valuesByKey.forEach(setter); - return object; + /** + * Adds the key-value `pair` to `map`. + * + * @private + * @param {Object} map The map to modify. + * @param {Array} pair The key-value pair to add. + * @returns {Object} Returns `map`. + */ + function addMapEntry(map, pair) { + // Don't return `map.set` because it's not chainable in IE 11. + map.set(pair[0], pair[1]); + return map; } - function entries(map, depth) { - if (depth >= keys.length) return map; - - var array = [], - sortKey = sortKeys[depth++]; - - map.forEach(function(key, keyMap) { - array.push({key: key, values: entries(keyMap, depth)}); - }); - - return sortKey - ? array.sort(function(a, b) { return sortKey(a.key, b.key); }) - : array; + /** + * Adds `value` to `set`. + * + * @private + * @param {Object} set The set to modify. + * @param {*} value The value to add. + * @returns {Object} Returns `set`. + */ + function addSetEntry(set, value) { + // Don't return `set.add` because it's not chainable in IE 11. + set.add(value); + return set; } - nest.map = function(array, mapType) { - return map(mapType, array, 0); - }; - - nest.entries = function(array) { - return entries(map(d3.map, array, 0), 0); - }; - - nest.key = function(d) { - keys.push(d); - return nest; - }; - - // Specifies the order for the most-recently specified key. - // Note: only applies to entries. Map keys are unordered! - nest.sortKeys = function(order) { - sortKeys[keys.length - 1] = order; - return nest; - }; - - // Specifies the order for leaf values. - // Applies to both maps and entries array. - nest.sortValues = function(order) { - sortValues = order; - return nest; - }; - - nest.rollup = function(f) { - rollup = f; - return nest; - }; - - return nest; -}; - -d3.set = function(array) { - var set = new d3_Set; - if (array) for (var i = 0, n = array.length; i < n; ++i) set.add(array[i]); - return set; -}; - -function d3_Set() { - this._ = Object.create(null); -} - -d3_class(d3_Set, { - has: d3_map_has, - add: function(key) { - this._[d3_map_escape(key += "")] = true; - return key; - }, - remove: d3_map_remove, - values: d3_map_keys, - size: d3_map_size, - empty: d3_map_empty, - forEach: function(f) { - for (var key in this._) f.call(this, d3_map_unescape(key)); + /** + * A faster alternative to `Function#apply`, this function invokes `func` + * with the `this` binding of `thisArg` and the arguments of `args`. + * + * @private + * @param {Function} func The function to invoke. + * @param {*} thisArg The `this` binding of `func`. + * @param {Array} args The arguments to invoke `func` with. + * @returns {*} Returns the result of `func`. + */ + function apply(func, thisArg, args) { + switch (args.length) { + case 0: return func.call(thisArg); + case 1: return func.call(thisArg, args[0]); + case 2: return func.call(thisArg, args[0], args[1]); + case 3: return func.call(thisArg, args[0], args[1], args[2]); + } + return func.apply(thisArg, args); } -}); -d3.behavior = {}; -var d3_document = this.document; - -function d3_documentElement(node) { - return node - && (node.ownerDocument // node is a Node - || node.document // node is a Window - || node).documentElement; // node is a Document -} -function d3_window(node) { - return node - && ((node.ownerDocument && node.ownerDocument.defaultView) // node is a Node - || (node.document && node) // node is a Window - || node.defaultView); // node is a Document -} -// Copies a variable number of methods from source to target. -d3.rebind = function(target, source) { - var i = 1, n = arguments.length, method; - while (++i < n) target[method = arguments[i]] = d3_rebind(target, source, source[method]); - return target; -}; + /** + * A specialized version of `baseAggregator` for arrays. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} setter The function to set `accumulator` values. + * @param {Function} iteratee The iteratee to transform keys. + * @param {Object} accumulator The initial aggregated object. + * @returns {Function} Returns `accumulator`. + */ + function arrayAggregator(array, setter, iteratee, accumulator) { + var index = -1, + length = array == null ? 0 : array.length; -// Method is assumed to be a standard D3 getter-setter: -// If passed with no arguments, gets the value. -// If passed with arguments, sets the value and returns the target. -function d3_rebind(target, source, method) { - return function() { - var value = method.apply(source, arguments); - return value === source ? target : value; - }; -} -function d3_vendorSymbol(object, name) { - if (name in object) return name; - name = name.charAt(0).toUpperCase() + name.slice(1); - for (var i = 0, n = d3_vendorPrefixes.length; i < n; ++i) { - var prefixName = d3_vendorPrefixes[i] + name; - if (prefixName in object) return prefixName; + while (++index < length) { + var value = array[index]; + setter(accumulator, value, iteratee(value), array); + } + return accumulator; } -} - -var d3_vendorPrefixes = ["webkit", "ms", "moz", "Moz", "o", "O"]; -var d3_arraySlice = [].slice, - d3_array = function(list) { return d3_arraySlice.call(list); }; // conversion for NodeLists -function d3_noop() {} -d3.dispatch = function() { - var dispatch = new d3_dispatch, - i = -1, - n = arguments.length; - while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch); - return dispatch; -}; + /** + * A specialized version of `_.forEach` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns `array`. + */ + function arrayEach(array, iteratee) { + var index = -1, + length = array == null ? 0 : array.length; -function d3_dispatch() {} + while (++index < length) { + if (iteratee(array[index], index, array) === false) { + break; + } + } + return array; + } -d3_dispatch.prototype.on = function(type, listener) { - var i = type.indexOf("."), - name = ""; + /** + * A specialized version of `_.forEachRight` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns `array`. + */ + function arrayEachRight(array, iteratee) { + var length = array == null ? 0 : array.length; - // Extract optional namespace, e.g., "click.foo" - if (i >= 0) { - name = type.slice(i + 1); - type = type.slice(0, i); + while (length--) { + if (iteratee(array[length], length, array) === false) { + break; + } + } + return array; } - if (type) return arguments.length < 2 - ? this[type].on(name) - : this[type].on(name, listener); + /** + * A specialized version of `_.every` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if all elements pass the predicate check, + * else `false`. + */ + function arrayEvery(array, predicate) { + var index = -1, + length = array == null ? 0 : array.length; - if (arguments.length === 2) { - if (listener == null) for (type in this) { - if (this.hasOwnProperty(type)) this[type].on(name, null); + while (++index < length) { + if (!predicate(array[index], index, array)) { + return false; + } } - return this; + return true; } -}; -function d3_dispatch_event(dispatch) { - var listeners = [], - listenerByName = new d3_Map; + /** + * A specialized version of `_.filter` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {Array} Returns the new filtered array. + */ + function arrayFilter(array, predicate) { + var index = -1, + length = array == null ? 0 : array.length, + resIndex = 0, + result = []; - function event() { - var z = listeners, // defensive reference - i = -1, - n = z.length, - l; - while (++i < n) if (l = z[i].on) l.apply(this, arguments); - return dispatch; + while (++index < length) { + var value = array[index]; + if (predicate(value, index, array)) { + result[resIndex++] = value; + } + } + return result; } - event.on = function(name, listener) { - var l = listenerByName.get(name), - i; + /** + * A specialized version of `_.includes` for arrays without support for + * specifying an index to search from. + * + * @private + * @param {Array} [array] The array to inspect. + * @param {*} target The value to search for. + * @returns {boolean} Returns `true` if `target` is found, else `false`. + */ + function arrayIncludes(array, value) { + var length = array == null ? 0 : array.length; + return !!length && baseIndexOf(array, value, 0) > -1; + } - // return the current listener, if any - if (arguments.length < 2) return l && l.on; + /** + * This function is like `arrayIncludes` except that it accepts a comparator. + * + * @private + * @param {Array} [array] The array to inspect. + * @param {*} target The value to search for. + * @param {Function} comparator The comparator invoked per element. + * @returns {boolean} Returns `true` if `target` is found, else `false`. + */ + function arrayIncludesWith(array, value, comparator) { + var index = -1, + length = array == null ? 0 : array.length; - // remove the old listener, if any (with copy-on-write) - if (l) { - l.on = null; - listeners = listeners.slice(0, i = listeners.indexOf(l)).concat(listeners.slice(i + 1)); - listenerByName.remove(name); + while (++index < length) { + if (comparator(value, array[index])) { + return true; + } } + return false; + } - // add the new listener, if any - if (listener) listeners.push(listenerByName.set(name, {on: listener})); - - return dispatch; - }; + /** + * A specialized version of `_.map` for arrays without support for iteratee + * shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns the new mapped array. + */ + function arrayMap(array, iteratee) { + var index = -1, + length = array == null ? 0 : array.length, + result = Array(length); - return event; -} + while (++index < length) { + result[index] = iteratee(array[index], index, array); + } + return result; + } -d3.event = null; - -function d3_eventPreventDefault() { - d3.event.preventDefault(); -} - -function d3_eventCancel() { - d3.event.preventDefault(); - d3.event.stopPropagation(); -} - -function d3_eventSource() { - var e = d3.event, s; - while (s = e.sourceEvent) e = s; - return e; -} - -// Like d3.dispatch, but for custom events abstracting native UI events. These -// events have a target component (such as a brush), a target element (such as -// the svg:g element containing the brush) and the standard arguments `d` (the -// target element's data) and `i` (the selection index of the target element). -function d3_eventDispatch(target) { - var dispatch = new d3_dispatch, - i = 0, - n = arguments.length; - - while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch); - - // Creates a dispatch context for the specified `thiz` (typically, the target - // DOM element that received the source event) and `argumentz` (typically, the - // data `d` and index `i` of the target element). The returned function can be - // used to dispatch an event to any registered listeners; the function takes a - // single argument as input, being the event to dispatch. The event must have - // a "type" attribute which corresponds to a type registered in the - // constructor. This context will automatically populate the "sourceEvent" and - // "target" attributes of the event, as well as setting the `d3.event` global - // for the duration of the notification. - dispatch.of = function(thiz, argumentz) { - return function(e1) { - try { - var e0 = - e1.sourceEvent = d3.event; - e1.target = target; - d3.event = e1; - dispatch[e1.type].apply(thiz, argumentz); - } finally { - d3.event = e0; - } - }; - }; - - return dispatch; -} -d3.requote = function(s) { - return s.replace(d3_requote_re, "\\$&"); -}; - -var d3_requote_re = /[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g; -var d3_subclass = {}.__proto__? - -// Until ECMAScript supports array subclassing, prototype injection works well. -function(object, prototype) { - object.__proto__ = prototype; -}: - -// And if your browser doesn't support __proto__, we'll use direct extension. -function(object, prototype) { - for (var property in prototype) object[property] = prototype[property]; -}; - -function d3_selection(groups) { - d3_subclass(groups, d3_selectionPrototype); - return groups; -} - -var d3_select = function(s, n) { return n.querySelector(s); }, - d3_selectAll = function(s, n) { return n.querySelectorAll(s); }, - d3_selectMatches = function(n, s) { - var d3_selectMatcher = n.matches || n[d3_vendorSymbol(n, "matchesSelector")]; - d3_selectMatches = function(n, s) { - return d3_selectMatcher.call(n, s); - }; - return d3_selectMatches(n, s); - }; - -// Prefer Sizzle, if available. -if (typeof Sizzle === "function") { - d3_select = function(s, n) { return Sizzle(s, n)[0] || null; }; - d3_selectAll = Sizzle; - d3_selectMatches = Sizzle.matchesSelector; -} - -d3.selection = function() { - return d3.select(d3_document.documentElement); -}; - -var d3_selectionPrototype = d3.selection.prototype = []; - - -d3_selectionPrototype.select = function(selector) { - var subgroups = [], - subgroup, - subnode, - group, - node; - - selector = d3_selection_selector(selector); + /** + * Appends the elements of `values` to `array`. + * + * @private + * @param {Array} array The array to modify. + * @param {Array} values The values to append. + * @returns {Array} Returns `array`. + */ + function arrayPush(array, values) { + var index = -1, + length = values.length, + offset = array.length; - for (var j = -1, m = this.length; ++j < m;) { - subgroups.push(subgroup = []); - subgroup.parentNode = (group = this[j]).parentNode; - for (var i = -1, n = group.length; ++i < n;) { - if (node = group[i]) { - subgroup.push(subnode = selector.call(node, node.__data__, i, j)); - if (subnode && "__data__" in node) subnode.__data__ = node.__data__; - } else { - subgroup.push(null); - } + while (++index < length) { + array[offset + index] = values[index]; } + return array; } - return d3_selection(subgroups); -}; - -function d3_selection_selector(selector) { - return typeof selector === "function" ? selector : function() { - return d3_select(selector, this); - }; -} - -d3_selectionPrototype.selectAll = function(selector) { - var subgroups = [], - subgroup, - node; - - selector = d3_selection_selectorAll(selector); + /** + * A specialized version of `_.reduce` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {*} [accumulator] The initial value. + * @param {boolean} [initAccum] Specify using the first element of `array` as + * the initial value. + * @returns {*} Returns the accumulated value. + */ + function arrayReduce(array, iteratee, accumulator, initAccum) { + var index = -1, + length = array == null ? 0 : array.length; - for (var j = -1, m = this.length; ++j < m;) { - for (var group = this[j], i = -1, n = group.length; ++i < n;) { - if (node = group[i]) { - subgroups.push(subgroup = d3_array(selector.call(node, node.__data__, i, j))); - subgroup.parentNode = node; - } + if (initAccum && length) { + accumulator = array[++index]; + } + while (++index < length) { + accumulator = iteratee(accumulator, array[index], index, array); } + return accumulator; } - return d3_selection(subgroups); -}; - -function d3_selection_selectorAll(selector) { - return typeof selector === "function" ? selector : function() { - return d3_selectAll(selector, this); - }; -} -var d3_nsPrefix = { - svg: "http://www.w3.org/2000/svg", - xhtml: "http://www.w3.org/1999/xhtml", - xlink: "http://www.w3.org/1999/xlink", - xml: "http://www.w3.org/XML/1998/namespace", - xmlns: "http://www.w3.org/2000/xmlns/" -}; - -d3.ns = { - prefix: d3_nsPrefix, - qualify: function(name) { - var i = name.indexOf(":"), - prefix = name; - if (i >= 0) { - prefix = name.slice(0, i); - name = name.slice(i + 1); + /** + * A specialized version of `_.reduceRight` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {*} [accumulator] The initial value. + * @param {boolean} [initAccum] Specify using the last element of `array` as + * the initial value. + * @returns {*} Returns the accumulated value. + */ + function arrayReduceRight(array, iteratee, accumulator, initAccum) { + var length = array == null ? 0 : array.length; + if (initAccum && length) { + accumulator = array[--length]; + } + while (length--) { + accumulator = iteratee(accumulator, array[length], length, array); } - return d3_nsPrefix.hasOwnProperty(prefix) - ? {space: d3_nsPrefix[prefix], local: name} - : name; + return accumulator; } -}; -d3_selectionPrototype.attr = function(name, value) { - if (arguments.length < 2) { + /** + * A specialized version of `_.some` for arrays without support for iteratee + * shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if any element passes the predicate check, + * else `false`. + */ + function arraySome(array, predicate) { + var index = -1, + length = array == null ? 0 : array.length; - // For attr(string), return the attribute value for the first node. - if (typeof name === "string") { - var node = this.node(); - name = d3.ns.qualify(name); - return name.local - ? node.getAttributeNS(name.space, name.local) - : node.getAttribute(name); + while (++index < length) { + if (predicate(array[index], index, array)) { + return true; + } } - - // For attr(object), the object specifies the names and values of the - // attributes to set or remove. The values may be functions that are - // evaluated for each element. - for (value in name) this.each(d3_selection_attr(value, name[value])); - return this; + return false; } - return this.each(d3_selection_attr(name, value)); -}; - -function d3_selection_attr(name, value) { - name = d3.ns.qualify(name); + /** + * Gets the size of an ASCII `string`. + * + * @private + * @param {string} string The string inspect. + * @returns {number} Returns the string size. + */ + var asciiSize = baseProperty('length'); - // For attr(string, null), remove the attribute with the specified name. - function attrNull() { - this.removeAttribute(name); - } - function attrNullNS() { - this.removeAttributeNS(name.space, name.local); + /** + * Converts an ASCII `string` to an array. + * + * @private + * @param {string} string The string to convert. + * @returns {Array} Returns the converted array. + */ + function asciiToArray(string) { + return string.split(''); } - // For attr(string, string), set the attribute with the specified name. - function attrConstant() { - this.setAttribute(name, value); - } - function attrConstantNS() { - this.setAttributeNS(name.space, name.local, value); + /** + * Splits an ASCII `string` into an array of its words. + * + * @private + * @param {string} The string to inspect. + * @returns {Array} Returns the words of `string`. + */ + function asciiWords(string) { + return string.match(reAsciiWord) || []; } - // For attr(string, function), evaluate the function for each element, and set - // or remove the attribute as appropriate. - function attrFunction() { - var x = value.apply(this, arguments); - if (x == null) this.removeAttribute(name); - else this.setAttribute(name, x); - } - function attrFunctionNS() { - var x = value.apply(this, arguments); - if (x == null) this.removeAttributeNS(name.space, name.local); - else this.setAttributeNS(name.space, name.local, x); + /** + * The base implementation of methods like `_.findKey` and `_.findLastKey`, + * without support for iteratee shorthands, which iterates over `collection` + * using `eachFunc`. + * + * @private + * @param {Array|Object} collection The collection to inspect. + * @param {Function} predicate The function invoked per iteration. + * @param {Function} eachFunc The function to iterate over `collection`. + * @returns {*} Returns the found element or its key, else `undefined`. + */ + function baseFindKey(collection, predicate, eachFunc) { + var result; + eachFunc(collection, function(value, key, collection) { + if (predicate(value, key, collection)) { + result = key; + return false; + } + }); + return result; } - return value == null - ? (name.local ? attrNullNS : attrNull) : (typeof value === "function" - ? (name.local ? attrFunctionNS : attrFunction) - : (name.local ? attrConstantNS : attrConstant)); -} -function d3_collapse(s) { - return s.trim().replace(/\s+/g, " "); -} - -d3_selectionPrototype.classed = function(name, value) { - if (arguments.length < 2) { + /** + * The base implementation of `_.findIndex` and `_.findLastIndex` without + * support for iteratee shorthands. + * + * @private + * @param {Array} array The array to inspect. + * @param {Function} predicate The function invoked per iteration. + * @param {number} fromIndex The index to search from. + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {number} Returns the index of the matched value, else `-1`. + */ + function baseFindIndex(array, predicate, fromIndex, fromRight) { + var length = array.length, + index = fromIndex + (fromRight ? 1 : -1); - // For classed(string), return true only if the first node has the specified - // class or classes. Note that even if the browser supports DOMTokenList, it - // probably doesn't support it on SVG elements (which can be animated). - if (typeof name === "string") { - var node = this.node(), - n = (name = d3_selection_classes(name)).length, - i = -1; - if (value = node.classList) { - while (++i < n) if (!value.contains(name[i])) return false; - } else { - value = node.getAttribute("class"); - while (++i < n) if (!d3_selection_classedRe(name[i]).test(value)) return false; + while ((fromRight ? index-- : ++index < length)) { + if (predicate(array[index], index, array)) { + return index; } - return true; } - - // For classed(object), the object specifies the names of classes to add or - // remove. The values may be functions that are evaluated for each element. - for (value in name) this.each(d3_selection_classed(value, name[value])); - return this; - } - - // Otherwise, both a name and a value are specified, and are handled as below. - return this.each(d3_selection_classed(name, value)); -}; - -function d3_selection_classedRe(name) { - return new RegExp("(?:^|\\s+)" + d3.requote(name) + "(?:\\s+|$)", "g"); -} - -function d3_selection_classes(name) { - return (name + "").trim().split(/^|\s+/); -} - -// Multiple class names are allowed (e.g., "foo bar"). -function d3_selection_classed(name, value) { - name = d3_selection_classes(name).map(d3_selection_classedName); - var n = name.length; - - function classedConstant() { - var i = -1; - while (++i < n) name[i](this, value); + return -1; } - // When the value is a function, the function is still evaluated only once per - // element even if there are multiple class names. - function classedFunction() { - var i = -1, x = value.apply(this, arguments); - while (++i < n) name[i](this, x); + /** + * The base implementation of `_.indexOf` without `fromIndex` bounds checks. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @param {number} fromIndex The index to search from. + * @returns {number} Returns the index of the matched value, else `-1`. + */ + function baseIndexOf(array, value, fromIndex) { + return value === value + ? strictIndexOf(array, value, fromIndex) + : baseFindIndex(array, baseIsNaN, fromIndex); } - return typeof value === "function" - ? classedFunction - : classedConstant; -} - -function d3_selection_classedName(name) { - var re = d3_selection_classedRe(name); - return function(node, value) { - if (c = node.classList) return value ? c.add(name) : c.remove(name); - var c = node.getAttribute("class") || ""; - if (value) { - re.lastIndex = 0; - if (!re.test(c)) node.setAttribute("class", d3_collapse(c + " " + name)); - } else { - node.setAttribute("class", d3_collapse(c.replace(re, " "))); - } - }; -} - -d3_selectionPrototype.style = function(name, value, priority) { - var n = arguments.length; - if (n < 3) { - - // For style(object) or style(object, string), the object specifies the - // names and values of the attributes to set or remove. The values may be - // functions that are evaluated for each element. The optional string - // specifies the priority. - if (typeof name !== "string") { - if (n < 2) value = ""; - for (priority in name) this.each(d3_selection_style(priority, name[priority], value)); - return this; - } + /** + * This function is like `baseIndexOf` except that it accepts a comparator. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @param {number} fromIndex The index to search from. + * @param {Function} comparator The comparator invoked per element. + * @returns {number} Returns the index of the matched value, else `-1`. + */ + function baseIndexOfWith(array, value, fromIndex, comparator) { + var index = fromIndex - 1, + length = array.length; - // For style(string), return the computed style value for the first node. - if (n < 2) { - var node = this.node(); - return d3_window(node).getComputedStyle(node, null).getPropertyValue(name); + while (++index < length) { + if (comparator(array[index], value)) { + return index; + } } - - // For style(string, string) or style(string, function), use the default - // priority. The priority is ignored for style(string, null). - priority = ""; + return -1; } - // Otherwise, a name, value and priority are specified, and handled as below. - return this.each(d3_selection_style(name, value, priority)); -}; - -function d3_selection_style(name, value, priority) { - - // For style(name, null) or style(name, null, priority), remove the style - // property with the specified name. The priority is ignored. - function styleNull() { - this.style.removeProperty(name); + /** + * The base implementation of `_.isNaN` without support for number objects. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`. + */ + function baseIsNaN(value) { + return value !== value; } - // For style(name, string) or style(name, string, priority), set the style - // property with the specified name, using the specified priority. - function styleConstant() { - this.style.setProperty(name, value, priority); + /** + * The base implementation of `_.mean` and `_.meanBy` without support for + * iteratee shorthands. + * + * @private + * @param {Array} array The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {number} Returns the mean. + */ + function baseMean(array, iteratee) { + var length = array == null ? 0 : array.length; + return length ? (baseSum(array, iteratee) / length) : NAN; } - // For style(name, function) or style(name, function, priority), evaluate the - // function for each element, and set or remove the style property as - // appropriate. When setting, use the specified priority. - function styleFunction() { - var x = value.apply(this, arguments); - if (x == null) this.style.removeProperty(name); - else this.style.setProperty(name, x, priority); + /** + * The base implementation of `_.property` without support for deep paths. + * + * @private + * @param {string} key The key of the property to get. + * @returns {Function} Returns the new accessor function. + */ + function baseProperty(key) { + return function(object) { + return object == null ? undefined : object[key]; + }; } - return value == null - ? styleNull : (typeof value === "function" - ? styleFunction : styleConstant); -} - -d3_selectionPrototype.property = function(name, value) { - if (arguments.length < 2) { - - // For property(string), return the property value for the first node. - if (typeof name === "string") return this.node()[name]; - - // For property(object), the object specifies the names and values of the - // properties to set or remove. The values may be functions that are - // evaluated for each element. - for (value in name) this.each(d3_selection_property(value, name[value])); - return this; + /** + * The base implementation of `_.propertyOf` without support for deep paths. + * + * @private + * @param {Object} object The object to query. + * @returns {Function} Returns the new accessor function. + */ + function basePropertyOf(object) { + return function(key) { + return object == null ? undefined : object[key]; + }; } - // Otherwise, both a name and a value are specified, and are handled as below. - return this.each(d3_selection_property(name, value)); -}; - -function d3_selection_property(name, value) { + /** + * The base implementation of `_.reduce` and `_.reduceRight`, without support + * for iteratee shorthands, which iterates over `collection` using `eachFunc`. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {*} accumulator The initial value. + * @param {boolean} initAccum Specify using the first or last element of + * `collection` as the initial value. + * @param {Function} eachFunc The function to iterate over `collection`. + * @returns {*} Returns the accumulated value. + */ + function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) { + eachFunc(collection, function(value, index, collection) { + accumulator = initAccum + ? (initAccum = false, value) + : iteratee(accumulator, value, index, collection); + }); + return accumulator; + } - // For property(name, null), remove the property with the specified name. - function propertyNull() { - delete this[name]; - } + /** + * The base implementation of `_.sortBy` which uses `comparer` to define the + * sort order of `array` and replaces criteria objects with their corresponding + * values. + * + * @private + * @param {Array} array The array to sort. + * @param {Function} comparer The function to define sort order. + * @returns {Array} Returns `array`. + */ + function baseSortBy(array, comparer) { + var length = array.length; - // For property(name, string), set the property with the specified name. - function propertyConstant() { - this[name] = value; + array.sort(comparer); + while (length--) { + array[length] = array[length].value; + } + return array; } - // For property(name, function), evaluate the function for each element, and - // set or remove the property as appropriate. - function propertyFunction() { - var x = value.apply(this, arguments); - if (x == null) delete this[name]; - else this[name] = x; - } + /** + * The base implementation of `_.sum` and `_.sumBy` without support for + * iteratee shorthands. + * + * @private + * @param {Array} array The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {number} Returns the sum. + */ + function baseSum(array, iteratee) { + var result, + index = -1, + length = array.length; - return value == null - ? propertyNull : (typeof value === "function" - ? propertyFunction : propertyConstant); -} + while (++index < length) { + var current = iteratee(array[index]); + if (current !== undefined) { + result = result === undefined ? current : (result + current); + } + } + return result; + } -d3_selectionPrototype.text = function(value) { - return arguments.length - ? this.each(typeof value === "function" - ? function() { var v = value.apply(this, arguments); this.textContent = v == null ? "" : v; } : value == null - ? function() { if (this.textContent !== "") this.textContent = ""; } - : function() { if (this.textContent !== value) this.textContent = value; }) - : this.node().textContent; -}; + /** + * The base implementation of `_.times` without support for iteratee shorthands + * or max array length checks. + * + * @private + * @param {number} n The number of times to invoke `iteratee`. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns the array of results. + */ + function baseTimes(n, iteratee) { + var index = -1, + result = Array(n); -d3_selectionPrototype.html = function(value) { - return arguments.length - ? this.each(typeof value === "function" - ? function() { var v = value.apply(this, arguments); this.innerHTML = v == null ? "" : v; } : value == null - ? function() { this.innerHTML = ""; } - : function() { this.innerHTML = value; }) - : this.node().innerHTML; -}; + while (++index < n) { + result[index] = iteratee(index); + } + return result; + } -d3_selectionPrototype.append = function(name) { - name = d3_selection_creator(name); - return this.select(function() { - return this.appendChild(name.apply(this, arguments)); - }); -}; + /** + * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array + * of key-value pairs for `object` corresponding to the property names of `props`. + * + * @private + * @param {Object} object The object to query. + * @param {Array} props The property names to get values for. + * @returns {Object} Returns the key-value pairs. + */ + function baseToPairs(object, props) { + return arrayMap(props, function(key) { + return [key, object[key]]; + }); + } -function d3_selection_creator(name) { + /** + * The base implementation of `_.unary` without support for storing metadata. + * + * @private + * @param {Function} func The function to cap arguments for. + * @returns {Function} Returns the new capped function. + */ + function baseUnary(func) { + return function(value) { + return func(value); + }; + } - function create() { - var document = this.ownerDocument, - namespace = this.namespaceURI; - return namespace - ? document.createElementNS(namespace, name) - : document.createElement(name); + /** + * The base implementation of `_.values` and `_.valuesIn` which creates an + * array of `object` property values corresponding to the property names + * of `props`. + * + * @private + * @param {Object} object The object to query. + * @param {Array} props The property names to get values for. + * @returns {Object} Returns the array of property values. + */ + function baseValues(object, props) { + return arrayMap(props, function(key) { + return object[key]; + }); } - function createNS() { - return this.ownerDocument.createElementNS(name.space, name.local); + /** + * Checks if a `cache` value for `key` exists. + * + * @private + * @param {Object} cache The cache to query. + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ + function cacheHas(cache, key) { + return cache.has(key); } - return typeof name === "function" ? name - : (name = d3.ns.qualify(name)).local ? createNS - : create; -} + /** + * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol + * that is not found in the character symbols. + * + * @private + * @param {Array} strSymbols The string symbols to inspect. + * @param {Array} chrSymbols The character symbols to find. + * @returns {number} Returns the index of the first unmatched string symbol. + */ + function charsStartIndex(strSymbols, chrSymbols) { + var index = -1, + length = strSymbols.length; -d3_selectionPrototype.insert = function(name, before) { - name = d3_selection_creator(name); - before = d3_selection_selector(before); - return this.select(function() { - return this.insertBefore(name.apply(this, arguments), before.apply(this, arguments) || null); - }); -}; + while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {} + return index; + } -// TODO remove(selector)? -// TODO remove(node)? -// TODO remove(function)? -d3_selectionPrototype.remove = function() { - return this.each(d3_selectionRemove); -}; + /** + * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol + * that is not found in the character symbols. + * + * @private + * @param {Array} strSymbols The string symbols to inspect. + * @param {Array} chrSymbols The character symbols to find. + * @returns {number} Returns the index of the last unmatched string symbol. + */ + function charsEndIndex(strSymbols, chrSymbols) { + var index = strSymbols.length; -function d3_selectionRemove() { - var parent = this.parentNode; - if (parent) parent.removeChild(this); -} + while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {} + return index; + } -d3_selectionPrototype.data = function(value, key) { - var i = -1, - n = this.length, - group, - node; + /** + * Gets the number of `placeholder` occurrences in `array`. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} placeholder The placeholder to search for. + * @returns {number} Returns the placeholder count. + */ + function countHolders(array, placeholder) { + var length = array.length, + result = 0; - // If no value is specified, return the first value. - if (!arguments.length) { - value = new Array(n = (group = this[0]).length); - while (++i < n) { - if (node = group[i]) { - value[i] = node.__data__; + while (length--) { + if (array[length] === placeholder) { + ++result; } } - return value; + return result; } - function bind(group, groupData) { - var i, - n = group.length, - m = groupData.length, - n0 = Math.min(n, m), - updateNodes = new Array(m), - enterNodes = new Array(m), - exitNodes = new Array(n), - node, - nodeData; - - if (key) { - var nodeByKeyValue = new d3_Map, - keyValues = new Array(n), - keyValue; - - for (i = -1; ++i < n;) { - if (nodeByKeyValue.has(keyValue = key.call(node = group[i], node.__data__, i))) { - exitNodes[i] = node; // duplicate selection key - } else { - nodeByKeyValue.set(keyValue, node); - } - keyValues[i] = keyValue; - } + /** + * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A + * letters to basic Latin letters. + * + * @private + * @param {string} letter The matched letter to deburr. + * @returns {string} Returns the deburred letter. + */ + var deburrLetter = basePropertyOf(deburredLetters); - for (i = -1; ++i < m;) { - if (!(node = nodeByKeyValue.get(keyValue = key.call(groupData, nodeData = groupData[i], i)))) { - enterNodes[i] = d3_selection_dataNode(nodeData); - } else if (node !== true) { // no duplicate data key - updateNodes[i] = node; - node.__data__ = nodeData; - } - nodeByKeyValue.set(keyValue, true); - } + /** + * Used by `_.escape` to convert characters to HTML entities. + * + * @private + * @param {string} chr The matched character to escape. + * @returns {string} Returns the escaped character. + */ + var escapeHtmlChar = basePropertyOf(htmlEscapes); - for (i = -1; ++i < n;) { - if (nodeByKeyValue.get(keyValues[i]) !== true) { - exitNodes[i] = group[i]; - } - } - } else { - for (i = -1; ++i < n0;) { - node = group[i]; - nodeData = groupData[i]; - if (node) { - node.__data__ = nodeData; - updateNodes[i] = node; - } else { - enterNodes[i] = d3_selection_dataNode(nodeData); - } - } - for (; i < m; ++i) { - enterNodes[i] = d3_selection_dataNode(groupData[i]); - } - for (; i < n; ++i) { - exitNodes[i] = group[i]; - } - } + /** + * Used by `_.template` to escape characters for inclusion in compiled string literals. + * + * @private + * @param {string} chr The matched character to escape. + * @returns {string} Returns the escaped character. + */ + function escapeStringChar(chr) { + return '\\' + stringEscapes[chr]; + } - enterNodes.update - = updateNodes; + /** + * Gets the value at `key` of `object`. + * + * @private + * @param {Object} [object] The object to query. + * @param {string} key The key of the property to get. + * @returns {*} Returns the property value. + */ + function getValue(object, key) { + return object == null ? undefined : object[key]; + } - enterNodes.parentNode - = updateNodes.parentNode - = exitNodes.parentNode - = group.parentNode; + /** + * Checks if `string` contains Unicode symbols. + * + * @private + * @param {string} string The string to inspect. + * @returns {boolean} Returns `true` if a symbol is found, else `false`. + */ + function hasUnicode(string) { + return reHasUnicode.test(string); + } - enter.push(enterNodes); - update.push(updateNodes); - exit.push(exitNodes); + /** + * Checks if `string` contains a word composed of Unicode symbols. + * + * @private + * @param {string} string The string to inspect. + * @returns {boolean} Returns `true` if a word is found, else `false`. + */ + function hasUnicodeWord(string) { + return reHasUnicodeWord.test(string); } - var enter = d3_selection_enter([]), - update = d3_selection([]), - exit = d3_selection([]); + /** + * Converts `iterator` to an array. + * + * @private + * @param {Object} iterator The iterator to convert. + * @returns {Array} Returns the converted array. + */ + function iteratorToArray(iterator) { + var data, + result = []; - if (typeof value === "function") { - while (++i < n) { - bind(group = this[i], value.call(group, group.parentNode.__data__, i)); - } - } else { - while (++i < n) { - bind(group = this[i], value); + while (!(data = iterator.next()).done) { + result.push(data.value); } + return result; } - update.enter = function() { return enter; }; - update.exit = function() { return exit; }; - return update; -}; - -function d3_selection_dataNode(data) { - return {__data__: data}; -} + /** + * Converts `map` to its key-value pairs. + * + * @private + * @param {Object} map The map to convert. + * @returns {Array} Returns the key-value pairs. + */ + function mapToArray(map) { + var index = -1, + result = Array(map.size); -d3_selectionPrototype.datum = function(value) { - return arguments.length - ? this.property("__data__", value) - : this.property("__data__"); -}; + map.forEach(function(value, key) { + result[++index] = [key, value]; + }); + return result; + } -d3_selectionPrototype.filter = function(filter) { - var subgroups = [], - subgroup, - group, - node; + /** + * Creates a unary function that invokes `func` with its argument transformed. + * + * @private + * @param {Function} func The function to wrap. + * @param {Function} transform The argument transform. + * @returns {Function} Returns the new function. + */ + function overArg(func, transform) { + return function(arg) { + return func(transform(arg)); + }; + } - if (typeof filter !== "function") filter = d3_selection_filter(filter); + /** + * Replaces all `placeholder` elements in `array` with an internal placeholder + * and returns an array of their indexes. + * + * @private + * @param {Array} array The array to modify. + * @param {*} placeholder The placeholder to replace. + * @returns {Array} Returns the new array of placeholder indexes. + */ + function replaceHolders(array, placeholder) { + var index = -1, + length = array.length, + resIndex = 0, + result = []; - for (var j = 0, m = this.length; j < m; j++) { - subgroups.push(subgroup = []); - subgroup.parentNode = (group = this[j]).parentNode; - for (var i = 0, n = group.length; i < n; i++) { - if ((node = group[i]) && filter.call(node, node.__data__, i, j)) { - subgroup.push(node); + while (++index < length) { + var value = array[index]; + if (value === placeholder || value === PLACEHOLDER) { + array[index] = PLACEHOLDER; + result[resIndex++] = index; } } + return result; } - return d3_selection(subgroups); -}; - -function d3_selection_filter(selector) { - return function() { - return d3_selectMatches(this, selector); - }; -} + /** + * Converts `set` to an array of its values. + * + * @private + * @param {Object} set The set to convert. + * @returns {Array} Returns the values. + */ + function setToArray(set) { + var index = -1, + result = Array(set.size); -d3_selectionPrototype.order = function() { - for (var j = -1, m = this.length; ++j < m;) { - for (var group = this[j], i = group.length - 1, next = group[i], node; --i >= 0;) { - if (node = group[i]) { - if (next && next !== node.nextSibling) next.parentNode.insertBefore(node, next); - next = node; - } - } + set.forEach(function(value) { + result[++index] = value; + }); + return result; } - return this; -}; -d3_selectionPrototype.sort = function(comparator) { - comparator = d3_selection_sortComparator.apply(this, arguments); - for (var j = -1, m = this.length; ++j < m;) this[j].sort(comparator); - return this.order(); -}; + /** + * Converts `set` to its value-value pairs. + * + * @private + * @param {Object} set The set to convert. + * @returns {Array} Returns the value-value pairs. + */ + function setToPairs(set) { + var index = -1, + result = Array(set.size); -function d3_selection_sortComparator(comparator) { - if (!arguments.length) comparator = d3_ascending; - return function(a, b) { - return a && b ? comparator(a.__data__, b.__data__) : !a - !b; - }; -} + set.forEach(function(value) { + result[++index] = [value, value]; + }); + return result; + } -d3_selectionPrototype.each = function(callback) { - return d3_selection_each(this, function(node, i, j) { - callback.call(node, node.__data__, i, j); - }); -}; + /** + * A specialized version of `_.indexOf` which performs strict equality + * comparisons of values, i.e. `===`. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @param {number} fromIndex The index to search from. + * @returns {number} Returns the index of the matched value, else `-1`. + */ + function strictIndexOf(array, value, fromIndex) { + var index = fromIndex - 1, + length = array.length; -function d3_selection_each(groups, callback) { - for (var j = 0, m = groups.length; j < m; j++) { - for (var group = groups[j], i = 0, n = group.length, node; i < n; i++) { - if (node = group[i]) callback(node, i, j); + while (++index < length) { + if (array[index] === value) { + return index; + } } + return -1; } - return groups; -} -d3_selectionPrototype.call = function(callback) { - var args = d3_array(arguments); - callback.apply(args[0] = this, args); - return this; -}; + /** + * A specialized version of `_.lastIndexOf` which performs strict equality + * comparisons of values, i.e. `===`. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @param {number} fromIndex The index to search from. + * @returns {number} Returns the index of the matched value, else `-1`. + */ + function strictLastIndexOf(array, value, fromIndex) { + var index = fromIndex + 1; + while (index--) { + if (array[index] === value) { + return index; + } + } + return index; + } -d3_selectionPrototype.empty = function() { - return !this.node(); -}; + /** + * Gets the number of symbols in `string`. + * + * @private + * @param {string} string The string to inspect. + * @returns {number} Returns the string size. + */ + function stringSize(string) { + return hasUnicode(string) + ? unicodeSize(string) + : asciiSize(string); + } -d3_selectionPrototype.node = function() { - for (var j = 0, m = this.length; j < m; j++) { - for (var group = this[j], i = 0, n = group.length; i < n; i++) { - var node = group[i]; - if (node) return node; - } + /** + * Converts `string` to an array. + * + * @private + * @param {string} string The string to convert. + * @returns {Array} Returns the converted array. + */ + function stringToArray(string) { + return hasUnicode(string) + ? unicodeToArray(string) + : asciiToArray(string); } - return null; -}; -d3_selectionPrototype.size = function() { - var n = 0; - d3_selection_each(this, function() { ++n; }); - return n; -}; + /** + * Used by `_.unescape` to convert HTML entities to characters. + * + * @private + * @param {string} chr The matched character to unescape. + * @returns {string} Returns the unescaped character. + */ + var unescapeHtmlChar = basePropertyOf(htmlUnescapes); -function d3_selection_enter(selection) { - d3_subclass(selection, d3_selection_enterPrototype); - return selection; -} + /** + * Gets the size of a Unicode `string`. + * + * @private + * @param {string} string The string inspect. + * @returns {number} Returns the string size. + */ + function unicodeSize(string) { + var result = reUnicode.lastIndex = 0; + while (reUnicode.test(string)) { + ++result; + } + return result; + } -var d3_selection_enterPrototype = []; + /** + * Converts a Unicode `string` to an array. + * + * @private + * @param {string} string The string to convert. + * @returns {Array} Returns the converted array. + */ + function unicodeToArray(string) { + return string.match(reUnicode) || []; + } -d3.selection.enter = d3_selection_enter; -d3.selection.enter.prototype = d3_selection_enterPrototype; + /** + * Splits a Unicode `string` into an array of its words. + * + * @private + * @param {string} The string to inspect. + * @returns {Array} Returns the words of `string`. + */ + function unicodeWords(string) { + return string.match(reUnicodeWord) || []; + } -d3_selection_enterPrototype.append = d3_selectionPrototype.append; -d3_selection_enterPrototype.empty = d3_selectionPrototype.empty; -d3_selection_enterPrototype.node = d3_selectionPrototype.node; -d3_selection_enterPrototype.call = d3_selectionPrototype.call; -d3_selection_enterPrototype.size = d3_selectionPrototype.size; + /*--------------------------------------------------------------------------*/ + /** + * Create a new pristine `lodash` function using the `context` object. + * + * @static + * @memberOf _ + * @since 1.1.0 + * @category Util + * @param {Object} [context=root] The context object. + * @returns {Function} Returns a new `lodash` function. + * @example + * + * _.mixin({ 'foo': _.constant('foo') }); + * + * var lodash = _.runInContext(); + * lodash.mixin({ 'bar': lodash.constant('bar') }); + * + * _.isFunction(_.foo); + * // => true + * _.isFunction(_.bar); + * // => false + * + * lodash.isFunction(lodash.foo); + * // => false + * lodash.isFunction(lodash.bar); + * // => true + * + * // Create a suped-up `defer` in Node.js. + * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer; + */ + var runInContext = (function runInContext(context) { + context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps)); + + /** Built-in constructor references. */ + var Array = context.Array, + Date = context.Date, + Error = context.Error, + Function = context.Function, + Math = context.Math, + Object = context.Object, + RegExp = context.RegExp, + String = context.String, + TypeError = context.TypeError; + + /** Used for built-in method references. */ + var arrayProto = Array.prototype, + funcProto = Function.prototype, + objectProto = Object.prototype; + + /** Used to detect overreaching core-js shims. */ + var coreJsData = context['__core-js_shared__']; + + /** Used to resolve the decompiled source of functions. */ + var funcToString = funcProto.toString; + + /** Used to check objects for own properties. */ + var hasOwnProperty = objectProto.hasOwnProperty; + + /** Used to generate unique IDs. */ + var idCounter = 0; + + /** Used to detect methods masquerading as native. */ + var maskSrcKey = (function() { + var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || ''); + return uid ? ('Symbol(src)_1.' + uid) : ''; + }()); -d3_selection_enterPrototype.select = function(selector) { - var subgroups = [], - subgroup, - subnode, - upgroup, - group, - node; + /** + * Used to resolve the + * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) + * of values. + */ + var nativeObjectToString = objectProto.toString; + + /** Used to infer the `Object` constructor. */ + var objectCtorString = funcToString.call(Object); + + /** Used to restore the original `_` reference in `_.noConflict`. */ + var oldDash = root._; + + /** Used to detect if a method is native. */ + var reIsNative = RegExp('^' + + funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&') + .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' + ); + + /** Built-in value references. */ + var Buffer = moduleExports ? context.Buffer : undefined, + Symbol = context.Symbol, + Uint8Array = context.Uint8Array, + allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined, + getPrototype = overArg(Object.getPrototypeOf, Object), + objectCreate = Object.create, + propertyIsEnumerable = objectProto.propertyIsEnumerable, + splice = arrayProto.splice, + spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined, + symIterator = Symbol ? Symbol.iterator : undefined, + symToStringTag = Symbol ? Symbol.toStringTag : undefined; + + var defineProperty = (function() { + try { + var func = getNative(Object, 'defineProperty'); + func({}, '', {}); + return func; + } catch (e) {} + }()); + + /** Mocked built-ins. */ + var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout, + ctxNow = Date && Date.now !== root.Date.now && Date.now, + ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout; + + /* Built-in method references for those with the same name as other `lodash` methods. */ + var nativeCeil = Math.ceil, + nativeFloor = Math.floor, + nativeGetSymbols = Object.getOwnPropertySymbols, + nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined, + nativeIsFinite = context.isFinite, + nativeJoin = arrayProto.join, + nativeKeys = overArg(Object.keys, Object), + nativeMax = Math.max, + nativeMin = Math.min, + nativeNow = Date.now, + nativeParseInt = context.parseInt, + nativeRandom = Math.random, + nativeReverse = arrayProto.reverse; + + /* Built-in method references that are verified to be native. */ + var DataView = getNative(context, 'DataView'), + Map = getNative(context, 'Map'), + Promise = getNative(context, 'Promise'), + Set = getNative(context, 'Set'), + WeakMap = getNative(context, 'WeakMap'), + nativeCreate = getNative(Object, 'create'); + + /** Used to store function metadata. */ + var metaMap = WeakMap && new WeakMap; + + /** Used to lookup unminified function names. */ + var realNames = {}; + + /** Used to detect maps, sets, and weakmaps. */ + var dataViewCtorString = toSource(DataView), + mapCtorString = toSource(Map), + promiseCtorString = toSource(Promise), + setCtorString = toSource(Set), + weakMapCtorString = toSource(WeakMap); + + /** Used to convert symbols to primitives and strings. */ + var symbolProto = Symbol ? Symbol.prototype : undefined, + symbolValueOf = symbolProto ? symbolProto.valueOf : undefined, + symbolToString = symbolProto ? symbolProto.toString : undefined; + + /*------------------------------------------------------------------------*/ - for (var j = -1, m = this.length; ++j < m;) { - upgroup = (group = this[j]).update; - subgroups.push(subgroup = []); - subgroup.parentNode = group.parentNode; - for (var i = -1, n = group.length; ++i < n;) { - if (node = group[i]) { - subgroup.push(upgroup[i] = subnode = selector.call(group.parentNode, node.__data__, i, j)); - subnode.__data__ = node.__data__; - } else { - subgroup.push(null); + /** + * Creates a `lodash` object which wraps `value` to enable implicit method + * chain sequences. Methods that operate on and return arrays, collections, + * and functions can be chained together. Methods that retrieve a single value + * or may return a primitive value will automatically end the chain sequence + * and return the unwrapped value. Otherwise, the value must be unwrapped + * with `_#value`. + * + * Explicit chain sequences, which must be unwrapped with `_#value`, may be + * enabled using `_.chain`. + * + * The execution of chained methods is lazy, that is, it's deferred until + * `_#value` is implicitly or explicitly called. + * + * Lazy evaluation allows several methods to support shortcut fusion. + * Shortcut fusion is an optimization to merge iteratee calls; this avoids + * the creation of intermediate arrays and can greatly reduce the number of + * iteratee executions. Sections of a chain sequence qualify for shortcut + * fusion if the section is applied to an array and iteratees accept only + * one argument. The heuristic for whether a section qualifies for shortcut + * fusion is subject to change. + * + * Chaining is supported in custom builds as long as the `_#value` method is + * directly or indirectly included in the build. + * + * In addition to lodash methods, wrappers have `Array` and `String` methods. + * + * The wrapper `Array` methods are: + * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift` + * + * The wrapper `String` methods are: + * `replace` and `split` + * + * The wrapper methods that support shortcut fusion are: + * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`, + * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`, + * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray` + * + * The chainable wrapper methods are: + * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`, + * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`, + * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`, + * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`, + * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`, + * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`, + * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`, + * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`, + * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`, + * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`, + * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`, + * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`, + * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`, + * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`, + * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`, + * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`, + * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`, + * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`, + * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`, + * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`, + * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`, + * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`, + * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`, + * `zipObject`, `zipObjectDeep`, and `zipWith` + * + * The wrapper methods that are **not** chainable by default are: + * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`, + * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`, + * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`, + * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`, + * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`, + * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`, + * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`, + * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`, + * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`, + * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`, + * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`, + * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`, + * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`, + * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`, + * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`, + * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`, + * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`, + * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`, + * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`, + * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`, + * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`, + * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`, + * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`, + * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`, + * `upperFirst`, `value`, and `words` + * + * @name _ + * @constructor + * @category Seq + * @param {*} value The value to wrap in a `lodash` instance. + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * function square(n) { + * return n * n; + * } + * + * var wrapped = _([1, 2, 3]); + * + * // Returns an unwrapped value. + * wrapped.reduce(_.add); + * // => 6 + * + * // Returns a wrapped value. + * var squares = wrapped.map(square); + * + * _.isArray(squares); + * // => false + * + * _.isArray(squares.value()); + * // => true + */ + function lodash(value) { + if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) { + if (value instanceof LodashWrapper) { + return value; + } + if (hasOwnProperty.call(value, '__wrapped__')) { + return wrapperClone(value); + } } + return new LodashWrapper(value); } - } - return d3_selection(subgroups); -}; + /** + * The base implementation of `_.create` without support for assigning + * properties to the created object. + * + * @private + * @param {Object} proto The object to inherit from. + * @returns {Object} Returns the new object. + */ + var baseCreate = (function() { + function object() {} + return function(proto) { + if (!isObject(proto)) { + return {}; + } + if (objectCreate) { + return objectCreate(proto); + } + object.prototype = proto; + var result = new object; + object.prototype = undefined; + return result; + }; + }()); -d3_selection_enterPrototype.insert = function(name, before) { - if (arguments.length < 2) before = d3_selection_enterInsertBefore(this); - return d3_selectionPrototype.insert.call(this, name, before); -}; + /** + * The function whose prototype chain sequence wrappers inherit from. + * + * @private + */ + function baseLodash() { + // No operation performed. + } -function d3_selection_enterInsertBefore(enter) { - var i0, j0; - return function(d, i, j) { - var group = enter[j].update, - n = group.length, - node; - if (j != j0) j0 = j, i0 = 0; - if (i >= i0) i0 = i + 1; - while (!(node = group[i0]) && ++i0 < n); - return node; - }; -} + /** + * The base constructor for creating `lodash` wrapper objects. + * + * @private + * @param {*} value The value to wrap. + * @param {boolean} [chainAll] Enable explicit method chain sequences. + */ + function LodashWrapper(value, chainAll) { + this.__wrapped__ = value; + this.__actions__ = []; + this.__chain__ = !!chainAll; + this.__index__ = 0; + this.__values__ = undefined; + } -// TODO fast singleton implementation? -d3.select = function(node) { - var group; - if (typeof node === "string") { - group = [d3_select(node, d3_document)]; - group.parentNode = d3_document.documentElement; - } else { - group = [node]; - group.parentNode = d3_documentElement(node); - } - return d3_selection([group]); -}; + /** + * By default, the template delimiters used by lodash are like those in + * embedded Ruby (ERB) as well as ES2015 template strings. Change the + * following template settings to use alternative delimiters. + * + * @static + * @memberOf _ + * @type {Object} + */ + lodash.templateSettings = { + + /** + * Used to detect `data` property values to be HTML-escaped. + * + * @memberOf _.templateSettings + * @type {RegExp} + */ + 'escape': reEscape, + + /** + * Used to detect code to be evaluated. + * + * @memberOf _.templateSettings + * @type {RegExp} + */ + 'evaluate': reEvaluate, + + /** + * Used to detect `data` property values to inject. + * + * @memberOf _.templateSettings + * @type {RegExp} + */ + 'interpolate': reInterpolate, + + /** + * Used to reference the data object in the template text. + * + * @memberOf _.templateSettings + * @type {string} + */ + 'variable': '', + + /** + * Used to import variables into the compiled template. + * + * @memberOf _.templateSettings + * @type {Object} + */ + 'imports': { + + /** + * A reference to the `lodash` function. + * + * @memberOf _.templateSettings.imports + * @type {Function} + */ + '_': lodash + } + }; -d3.selectAll = function(nodes) { - var group; - if (typeof nodes === "string") { - group = d3_array(d3_selectAll(nodes, d3_document)); - group.parentNode = d3_document.documentElement; - } else { - group = nodes; - group.parentNode = null; - } - return d3_selection([group]); -}; + // Ensure wrappers are instances of `baseLodash`. + lodash.prototype = baseLodash.prototype; + lodash.prototype.constructor = lodash; -d3_selectionPrototype.on = function(type, listener, capture) { - var n = arguments.length; - if (n < 3) { + LodashWrapper.prototype = baseCreate(baseLodash.prototype); + LodashWrapper.prototype.constructor = LodashWrapper; - // For on(object) or on(object, boolean), the object specifies the event - // types and listeners to add or remove. The optional boolean specifies - // whether the listener captures events. - if (typeof type !== "string") { - if (n < 2) listener = false; - for (capture in type) this.each(d3_selection_on(capture, type[capture], listener)); - return this; - } + /*------------------------------------------------------------------------*/ - // For on(string), return the listener for the first node. - if (n < 2) return (n = this.node()["__on" + type]) && n._; + /** + * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation. + * + * @private + * @constructor + * @param {*} value The value to wrap. + */ + function LazyWrapper(value) { + this.__wrapped__ = value; + this.__actions__ = []; + this.__dir__ = 1; + this.__filtered__ = false; + this.__iteratees__ = []; + this.__takeCount__ = MAX_ARRAY_LENGTH; + this.__views__ = []; + } - // For on(string, function), use the default capture. - capture = false; - } + /** + * Creates a clone of the lazy wrapper object. + * + * @private + * @name clone + * @memberOf LazyWrapper + * @returns {Object} Returns the cloned `LazyWrapper` object. + */ + function lazyClone() { + var result = new LazyWrapper(this.__wrapped__); + result.__actions__ = copyArray(this.__actions__); + result.__dir__ = this.__dir__; + result.__filtered__ = this.__filtered__; + result.__iteratees__ = copyArray(this.__iteratees__); + result.__takeCount__ = this.__takeCount__; + result.__views__ = copyArray(this.__views__); + return result; + } - // Otherwise, a type, listener and capture are specified, and handled as below. - return this.each(d3_selection_on(type, listener, capture)); -}; + /** + * Reverses the direction of lazy iteration. + * + * @private + * @name reverse + * @memberOf LazyWrapper + * @returns {Object} Returns the new reversed `LazyWrapper` object. + */ + function lazyReverse() { + if (this.__filtered__) { + var result = new LazyWrapper(this); + result.__dir__ = -1; + result.__filtered__ = true; + } else { + result = this.clone(); + result.__dir__ *= -1; + } + return result; + } -function d3_selection_on(type, listener, capture) { - var name = "__on" + type, - i = type.indexOf("."), - wrap = d3_selection_onListener; + /** + * Extracts the unwrapped value from its lazy wrapper. + * + * @private + * @name value + * @memberOf LazyWrapper + * @returns {*} Returns the unwrapped value. + */ + function lazyValue() { + var array = this.__wrapped__.value(), + dir = this.__dir__, + isArr = isArray(array), + isRight = dir < 0, + arrLength = isArr ? array.length : 0, + view = getView(0, arrLength, this.__views__), + start = view.start, + end = view.end, + length = end - start, + index = isRight ? end : (start - 1), + iteratees = this.__iteratees__, + iterLength = iteratees.length, + resIndex = 0, + takeCount = nativeMin(length, this.__takeCount__); + + if (!isArr || (!isRight && arrLength == length && takeCount == length)) { + return baseWrapperValue(array, this.__actions__); + } + var result = []; - if (i > 0) type = type.slice(0, i); - var filter = d3_selection_onFilters.get(type); - if (filter) type = filter, wrap = d3_selection_onFilter; + outer: + while (length-- && resIndex < takeCount) { + index += dir; - function onRemove() { - var l = this[name]; - if (l) { - this.removeEventListener(type, l, l.$); - delete this[name]; - } - } + var iterIndex = -1, + value = array[index]; - function onAdd() { - var l = wrap(listener, d3_array(arguments)); - if (typeof Raven !== 'undefined') l = Raven.wrap(l); - onRemove.call(this); - this.addEventListener(type, this[name] = l, l.$ = capture); - l._ = listener; - } + while (++iterIndex < iterLength) { + var data = iteratees[iterIndex], + iteratee = data.iteratee, + type = data.type, + computed = iteratee(value); - function removeAll() { - var re = new RegExp("^__on([^.]+)" + d3.requote(type) + "$"), - match; - for (var name in this) { - if (match = name.match(re)) { - var l = this[name]; - this.removeEventListener(match[1], l, l.$); - delete this[name]; + if (type == LAZY_MAP_FLAG) { + value = computed; + } else if (!computed) { + if (type == LAZY_FILTER_FLAG) { + continue outer; + } else { + break outer; + } + } + } + result[resIndex++] = value; } + return result; } - } - return i - ? listener ? onAdd : onRemove - : listener ? d3_noop : removeAll; -} + // Ensure `LazyWrapper` is an instance of `baseLodash`. + LazyWrapper.prototype = baseCreate(baseLodash.prototype); + LazyWrapper.prototype.constructor = LazyWrapper; -var d3_selection_onFilters = d3.map({ - mouseenter: "mouseover", - mouseleave: "mouseout" -}); + /*------------------------------------------------------------------------*/ -if (d3_document) { - d3_selection_onFilters.forEach(function(k) { - if ("on" + k in d3_document) d3_selection_onFilters.remove(k); - }); -} + /** + * Creates a hash object. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ + function Hash(entries) { + var index = -1, + length = entries == null ? 0 : entries.length; -function d3_selection_onListener(listener, argumentz) { - return function(e) { - var o = d3.event; // Events can be reentrant (e.g., focus). - d3.event = e; - argumentz[0] = this.__data__; - try { - listener.apply(this, argumentz); - } finally { - d3.event = o; + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } } - }; -} -function d3_selection_onFilter(listener, argumentz) { - var l = d3_selection_onListener(listener, argumentz); - return function(e) { - var target = this, related = e.relatedTarget; - if (!related || (related !== target && !(related.compareDocumentPosition(target) & 8))) { - l.call(target, e); + /** + * Removes all key-value entries from the hash. + * + * @private + * @name clear + * @memberOf Hash + */ + function hashClear() { + this.__data__ = nativeCreate ? nativeCreate(null) : {}; + this.size = 0; } - }; -} - -var d3_event_dragSelect, - d3_event_dragId = 0; -function d3_event_dragSuppress(node) { - var name = ".dragsuppress-" + ++d3_event_dragId, - click = "click" + name, - w = d3.select(d3_window(node)) - .on("touchmove" + name, d3_eventPreventDefault) - .on("dragstart" + name, d3_eventPreventDefault) - .on("selectstart" + name, d3_eventPreventDefault); + /** + * Removes `key` and its value from the hash. + * + * @private + * @name delete + * @memberOf Hash + * @param {Object} hash The hash to modify. + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ + function hashDelete(key) { + var result = this.has(key) && delete this.__data__[key]; + this.size -= result ? 1 : 0; + return result; + } - if (d3_event_dragSelect == null) { - d3_event_dragSelect = "onselectstart" in node ? false - : d3_vendorSymbol(node.style, "userSelect"); - } + /** + * Gets the hash value for `key`. + * + * @private + * @name get + * @memberOf Hash + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ + function hashGet(key) { + var data = this.__data__; + if (nativeCreate) { + var result = data[key]; + return result === HASH_UNDEFINED ? undefined : result; + } + return hasOwnProperty.call(data, key) ? data[key] : undefined; + } - if (d3_event_dragSelect) { - var style = d3_documentElement(node).style, - select = style[d3_event_dragSelect]; - style[d3_event_dragSelect] = "none"; - } + /** + * Checks if a hash value for `key` exists. + * + * @private + * @name has + * @memberOf Hash + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ + function hashHas(key) { + var data = this.__data__; + return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key); + } - return function(suppressClick) { - w.on(name, null); - if (d3_event_dragSelect) style[d3_event_dragSelect] = select; - if (suppressClick) { // suppress the next click, but only if it’s immediate - var off = function() { w.on(click, null); }; - w.on(click, function() { d3_eventCancel(); off(); }, true); - setTimeout(off, 0); + /** + * Sets the hash `key` to `value`. + * + * @private + * @name set + * @memberOf Hash + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the hash instance. + */ + function hashSet(key, value) { + var data = this.__data__; + this.size += this.has(key) ? 0 : 1; + data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value; + return this; } - }; -} -d3.mouse = function(container) { - return d3_mousePoint(container, d3_eventSource()); -}; + // Add methods to `Hash`. + Hash.prototype.clear = hashClear; + Hash.prototype['delete'] = hashDelete; + Hash.prototype.get = hashGet; + Hash.prototype.has = hashHas; + Hash.prototype.set = hashSet; -// https://bugs.webkit.org/show_bug.cgi?id=44083 -var d3_mouse_bug44083 = this.navigator && /WebKit/.test(this.navigator.userAgent) ? -1 : 0; + /*------------------------------------------------------------------------*/ -function d3_mousePoint(container, e) { - if (e.changedTouches) e = e.changedTouches[0]; - var svg = container.ownerSVGElement || container; - if (svg.createSVGPoint) { - var point = svg.createSVGPoint(); - if (d3_mouse_bug44083 < 0) { - var window = d3_window(container); - if (window.scrollX || window.scrollY) { - svg = d3.select("body").append("svg").style({ - position: "absolute", - top: 0, - left: 0, - margin: 0, - padding: 0, - border: "none" - }, "important"); - var ctm = svg[0][0].getScreenCTM(); - d3_mouse_bug44083 = !(ctm.f || ctm.e); - svg.remove(); - } - } - if (d3_mouse_bug44083) point.x = e.pageX, point.y = e.pageY; - else point.x = e.clientX, point.y = e.clientY; - point = point.matrixTransform(container.getScreenCTM().inverse()); - return [point.x, point.y]; - } - var rect = container.getBoundingClientRect(); - return [e.clientX - rect.left - container.clientLeft, e.clientY - rect.top - container.clientTop]; -}; + /** + * Creates an list cache object. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ + function ListCache(entries) { + var index = -1, + length = entries == null ? 0 : entries.length; -d3.touches = function(container, touches) { - if (arguments.length < 2) touches = d3_eventSource().touches; - return touches ? d3_array(touches).map(function(touch) { - var point = d3_mousePoint(container, touch); - point.identifier = touch.identifier; - return point; - }) : []; -}; -var ε = 1e-6, - ε2 = ε * ε, - π = Math.PI, - τ = 2 * π, - τε = τ - ε, - halfπ = π / 2, - d3_radians = π / 180, - d3_degrees = 180 / π; + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } + } -function d3_sgn(x) { - return x > 0 ? 1 : x < 0 ? -1 : 0; -} + /** + * Removes all key-value entries from the list cache. + * + * @private + * @name clear + * @memberOf ListCache + */ + function listCacheClear() { + this.__data__ = []; + this.size = 0; + } -// Returns the 2D cross product of AB and AC vectors, i.e., the z-component of -// the 3D cross product in a quadrant I Cartesian coordinate system (+x is -// right, +y is up). Returns a positive value if ABC is counter-clockwise, -// negative if clockwise, and zero if the points are collinear. -function d3_cross2d(a, b, c) { - return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]); -} + /** + * Removes `key` and its value from the list cache. + * + * @private + * @name delete + * @memberOf ListCache + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ + function listCacheDelete(key) { + var data = this.__data__, + index = assocIndexOf(data, key); -function d3_acos(x) { - return x > 1 ? 0 : x < -1 ? π : Math.acos(x); -} + if (index < 0) { + return false; + } + var lastIndex = data.length - 1; + if (index == lastIndex) { + data.pop(); + } else { + splice.call(data, index, 1); + } + --this.size; + return true; + } -function d3_asin(x) { - return x > 1 ? halfπ : x < -1 ? -halfπ : Math.asin(x); -} + /** + * Gets the list cache value for `key`. + * + * @private + * @name get + * @memberOf ListCache + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ + function listCacheGet(key) { + var data = this.__data__, + index = assocIndexOf(data, key); -function d3_sinh(x) { - return ((x = Math.exp(x)) - 1 / x) / 2; -} + return index < 0 ? undefined : data[index][1]; + } -function d3_cosh(x) { - return ((x = Math.exp(x)) + 1 / x) / 2; -} + /** + * Checks if a list cache value for `key` exists. + * + * @private + * @name has + * @memberOf ListCache + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ + function listCacheHas(key) { + return assocIndexOf(this.__data__, key) > -1; + } -function d3_tanh(x) { - return ((x = Math.exp(2 * x)) - 1) / (x + 1); -} - -function d3_haversin(x) { - return (x = Math.sin(x / 2)) * x; -} - -var ρ = Math.SQRT2, - ρ2 = 2, - ρ4 = 4; - -// p0 = [ux0, uy0, w0] -// p1 = [ux1, uy1, w1] -d3.interpolateZoom = function(p0, p1) { - var ux0 = p0[0], uy0 = p0[1], w0 = p0[2], - ux1 = p1[0], uy1 = p1[1], w1 = p1[2]; - - var dx = ux1 - ux0, - dy = uy1 - uy0, - d2 = dx * dx + dy * dy, - d1 = Math.sqrt(d2), - b0 = (w1 * w1 - w0 * w0 + ρ4 * d2) / (2 * w0 * ρ2 * d1), - b1 = (w1 * w1 - w0 * w0 - ρ4 * d2) / (2 * w1 * ρ2 * d1), - r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0), - r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1), - dr = r1 - r0, - S = (dr || Math.log(w1 / w0)) / ρ; - - function interpolate(t) { - var s = t * S; - if (dr) { - // General case. - var coshr0 = d3_cosh(r0), - u = w0 / (ρ2 * d1) * (coshr0 * d3_tanh(ρ * s + r0) - d3_sinh(r0)); - return [ - ux0 + u * dx, - uy0 + u * dy, - w0 * coshr0 / d3_cosh(ρ * s + r0) - ]; - } - // Special case for u0 ~= u1. - return [ - ux0 + t * dx, - uy0 + t * dy, - w0 * Math.exp(ρ * s) - ]; - } - - interpolate.duration = S * 1000; - - return interpolate; -}; - -d3.behavior.zoom = function() { - var view = {x: 0, y: 0, k: 1}, - translate0, // translate when we started zooming (to avoid drift) - center0, // implicit desired position of translate0 after zooming - center, // explicit desired position of translate0 after zooming - size = [960, 500], // viewport size; required for zoom interpolation - scaleExtent = d3_behavior_zoomInfinity, - duration = 250, - zooming = 0, - mousedown = "mousedown.zoom", - mousemove = "mousemove.zoom", - mouseup = "mouseup.zoom", - mousewheelTimer, - touchstart = "touchstart.zoom", - touchtime, // time of last touchstart (to detect double-tap) - event = d3_eventDispatch(zoom, "zoomstart", "zoom", "zoomend"), - x0, - x1, - y0, - y1; - - // Lazily determine the DOM’s support for Wheel events. - // https://developer.mozilla.org/en-US/docs/Mozilla_event_reference/wheel - if (!d3_behavior_zoomWheel) { - d3_behavior_zoomWheel = "onwheel" in d3_document ? (d3_behavior_zoomDelta = function() { return -d3.event.deltaY * (d3.event.deltaMode ? 120 : 1); }, "wheel") - : "onmousewheel" in d3_document ? (d3_behavior_zoomDelta = function() { return d3.event.wheelDelta; }, "mousewheel") - : (d3_behavior_zoomDelta = function() { return -d3.event.detail; }, "MozMousePixelScroll"); - } + /** + * Sets the list cache `key` to `value`. + * + * @private + * @name set + * @memberOf ListCache + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the list cache instance. + */ + function listCacheSet(key, value) { + var data = this.__data__, + index = assocIndexOf(data, key); - function zoom(g) { - g .on(mousedown, mousedowned) - .on(d3_behavior_zoomWheel + ".zoom", mousewheeled) - .on("dblclick.zoom", dblclicked) - .on(touchstart, touchstarted); - } - - zoom.event = function(g) { - g.each(function() { - var dispatch = event.of(this, arguments), - view1 = view; - if (d3_transitionInheritId) { - d3.select(this).transition() - .each("start.zoom", function() { - view = this.__chart__ || {x: 0, y: 0, k: 1}; // pre-transition state - zoomstarted(dispatch); - }) - .tween("zoom:zoom", function() { - var dx = size[0], - dy = size[1], - cx = center0 ? center0[0] : dx / 2, - cy = center0 ? center0[1] : dy / 2, - i = d3.interpolateZoom( - [(cx - view.x) / view.k, (cy - view.y) / view.k, dx / view.k], - [(cx - view1.x) / view1.k, (cy - view1.y) / view1.k, dx / view1.k] - ); - return function(t) { - var l = i(t), k = dx / l[2]; - this.__chart__ = view = {x: cx - l[0] * k, y: cy - l[1] * k, k: k}; - zoomed(dispatch); - }; - }) - .each("interrupt.zoom", function() { - zoomended(dispatch); - }) - .each("end.zoom", function() { - zoomended(dispatch); - }); + if (index < 0) { + ++this.size; + data.push([key, value]); } else { - this.__chart__ = view; - zoomstarted(dispatch); - zoomed(dispatch); - zoomended(dispatch); + data[index][1] = value; } - }); - } + return this; + } - zoom.translate = function(_) { - if (!arguments.length) return [view.x, view.y]; - view = {x: +_[0], y: +_[1], k: view.k}; // copy-on-write - rescale(); - return zoom; - }; + // Add methods to `ListCache`. + ListCache.prototype.clear = listCacheClear; + ListCache.prototype['delete'] = listCacheDelete; + ListCache.prototype.get = listCacheGet; + ListCache.prototype.has = listCacheHas; + ListCache.prototype.set = listCacheSet; - zoom.scale = function(_) { - if (!arguments.length) return view.k; - view = {x: view.x, y: view.y, k: +_}; // copy-on-write - rescale(); - return zoom; - }; + /*------------------------------------------------------------------------*/ - zoom.scaleExtent = function(_) { - if (!arguments.length) return scaleExtent; - scaleExtent = _ == null ? d3_behavior_zoomInfinity : [+_[0], +_[1]]; - return zoom; - }; + /** + * Creates a map cache object to store key-value pairs. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ + function MapCache(entries) { + var index = -1, + length = entries == null ? 0 : entries.length; - zoom.center = function(_) { - if (!arguments.length) return center; - center = _ && [+_[0], +_[1]]; - return zoom; - }; + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } + } - zoom.size = function(_) { - if (!arguments.length) return size; - size = _ && [+_[0], +_[1]]; - return zoom; - }; + /** + * Removes all key-value entries from the map. + * + * @private + * @name clear + * @memberOf MapCache + */ + function mapCacheClear() { + this.size = 0; + this.__data__ = { + 'hash': new Hash, + 'map': new (Map || ListCache), + 'string': new Hash + }; + } - zoom.duration = function(_) { - if (!arguments.length) return duration; - duration = +_; // TODO function based on interpolateZoom distance? - return zoom; - }; + /** + * Removes `key` and its value from the map. + * + * @private + * @name delete + * @memberOf MapCache + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ + function mapCacheDelete(key) { + var result = getMapData(this, key)['delete'](key); + this.size -= result ? 1 : 0; + return result; + } - zoom.x = function(z) { - if (!arguments.length) return x1; - x1 = z; - x0 = z.copy(); - view = {x: 0, y: 0, k: 1}; // copy-on-write - return zoom; - }; + /** + * Gets the map value for `key`. + * + * @private + * @name get + * @memberOf MapCache + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ + function mapCacheGet(key) { + return getMapData(this, key).get(key); + } - zoom.y = function(z) { - if (!arguments.length) return y1; - y1 = z; - y0 = z.copy(); - view = {x: 0, y: 0, k: 1}; // copy-on-write - return zoom; - }; + /** + * Checks if a map value for `key` exists. + * + * @private + * @name has + * @memberOf MapCache + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ + function mapCacheHas(key) { + return getMapData(this, key).has(key); + } - function location(p) { - return [(p[0] - view.x) / view.k, (p[1] - view.y) / view.k]; - } + /** + * Sets the map `key` to `value`. + * + * @private + * @name set + * @memberOf MapCache + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the map cache instance. + */ + function mapCacheSet(key, value) { + var data = getMapData(this, key), + size = data.size; - function point(l) { - return [l[0] * view.k + view.x, l[1] * view.k + view.y]; - } + data.set(key, value); + this.size += data.size == size ? 0 : 1; + return this; + } - function scaleTo(s) { - view.k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], s)); - } + // Add methods to `MapCache`. + MapCache.prototype.clear = mapCacheClear; + MapCache.prototype['delete'] = mapCacheDelete; + MapCache.prototype.get = mapCacheGet; + MapCache.prototype.has = mapCacheHas; + MapCache.prototype.set = mapCacheSet; - function translateTo(p, l) { - l = point(l); - view.x += p[0] - l[0]; - view.y += p[1] - l[1]; - } + /*------------------------------------------------------------------------*/ - function zoomTo(that, p, l, k) { - that.__chart__ = {x: view.x, y: view.y, k: view.k}; + /** + * + * Creates an array cache object to store unique values. + * + * @private + * @constructor + * @param {Array} [values] The values to cache. + */ + function SetCache(values) { + var index = -1, + length = values == null ? 0 : values.length; - scaleTo(Math.pow(2, k)); - translateTo(center0 = p, l); + this.__data__ = new MapCache; + while (++index < length) { + this.add(values[index]); + } + } - that = d3.select(that); - if (duration > 0) that = that.transition().duration(duration); - that.call(zoom.event); - } + /** + * Adds `value` to the array cache. + * + * @private + * @name add + * @memberOf SetCache + * @alias push + * @param {*} value The value to cache. + * @returns {Object} Returns the cache instance. + */ + function setCacheAdd(value) { + this.__data__.set(value, HASH_UNDEFINED); + return this; + } - function rescale() { - if (x1) x1.domain(x0.range().map(function(x) { return (x - view.x) / view.k; }).map(x0.invert)); - if (y1) y1.domain(y0.range().map(function(y) { return (y - view.y) / view.k; }).map(y0.invert)); - } + /** + * Checks if `value` is in the array cache. + * + * @private + * @name has + * @memberOf SetCache + * @param {*} value The value to search for. + * @returns {number} Returns `true` if `value` is found, else `false`. + */ + function setCacheHas(value) { + return this.__data__.has(value); + } - function zoomstarted(dispatch) { - if (!zooming++) dispatch({type: "zoomstart"}); - } + // Add methods to `SetCache`. + SetCache.prototype.add = SetCache.prototype.push = setCacheAdd; + SetCache.prototype.has = setCacheHas; - function zoomed(dispatch) { - rescale(); - dispatch({type: "zoom", scale: view.k, translate: [view.x, view.y]}); - } + /*------------------------------------------------------------------------*/ - function zoomended(dispatch) { - if (!--zooming) dispatch({type: "zoomend"}); - center0 = null; - } + /** + * Creates a stack cache object to store key-value pairs. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ + function Stack(entries) { + var data = this.__data__ = new ListCache(entries); + this.size = data.size; + } - function mousedowned() { - var that = this, - target = d3.event.target, - dispatch = event.of(that, arguments), - dragged = 0, - subject = d3.select(d3_window(that)).on(mousemove, moved).on(mouseup, ended), - location0 = location(d3.mouse(that)), - dragRestore = d3_event_dragSuppress(that); + /** + * Removes all key-value entries from the stack. + * + * @private + * @name clear + * @memberOf Stack + */ + function stackClear() { + this.__data__ = new ListCache; + this.size = 0; + } - d3_selection_interrupt.call(that); - zoomstarted(dispatch); + /** + * Removes `key` and its value from the stack. + * + * @private + * @name delete + * @memberOf Stack + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ + function stackDelete(key) { + var data = this.__data__, + result = data['delete'](key); - function moved() { - dragged = 1; - translateTo(d3.mouse(that), location0); - zoomed(dispatch); + this.size = data.size; + return result; } - function ended() { - subject.on(mousemove, null).on(mouseup, null); - dragRestore(dragged && d3.event.target === target); - zoomended(dispatch); + /** + * Gets the stack value for `key`. + * + * @private + * @name get + * @memberOf Stack + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ + function stackGet(key) { + return this.__data__.get(key); } - } - // These closures persist for as long as at least one touch is active. - function touchstarted() { - var that = this, - dispatch = event.of(that, arguments), - locations0 = {}, // touchstart locations - distance0 = 0, // distance² between initial touches - scale0, // scale when we started touching - zoomName = ".zoom-" + d3.event.changedTouches[0].identifier, - touchmove = "touchmove" + zoomName, - touchend = "touchend" + zoomName, - targets = [], - subject = d3.select(that), - dragRestore = d3_event_dragSuppress(that); - - started(); - zoomstarted(dispatch); - - // Workaround for Chrome issue 412723: the touchstart listener must be set - // after the touchmove listener. - subject.on(mousedown, null).on(touchstart, started); // prevent duplicate events - - // Updates locations of any touches in locations0. - function relocate() { - var touches = d3.touches(that); - scale0 = view.k; - touches.forEach(function(t) { - if (t.identifier in locations0) locations0[t.identifier] = location(t); - }); - return touches; + /** + * Checks if a stack value for `key` exists. + * + * @private + * @name has + * @memberOf Stack + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ + function stackHas(key) { + return this.__data__.has(key); } - // Temporarily override touchstart while gesture is active. - function started() { - - // Listen for touchmove and touchend on the target of touchstart. - var target = d3.event.target; - d3.select(target).on(touchmove, moved).on(touchend, ended); - targets.push(target); - - // Only track touches started on the same subject element. - var changed = d3.event.changedTouches; - for (var i = 0, n = changed.length; i < n; ++i) { - locations0[changed[i].identifier] = null; + /** + * Sets the stack `key` to `value`. + * + * @private + * @name set + * @memberOf Stack + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the stack cache instance. + */ + function stackSet(key, value) { + var data = this.__data__; + if (data instanceof ListCache) { + var pairs = data.__data__; + if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) { + pairs.push([key, value]); + this.size = ++data.size; + return this; + } + data = this.__data__ = new MapCache(pairs); } + data.set(key, value); + this.size = data.size; + return this; + } - var touches = relocate(), - now = Date.now(); + // Add methods to `Stack`. + Stack.prototype.clear = stackClear; + Stack.prototype['delete'] = stackDelete; + Stack.prototype.get = stackGet; + Stack.prototype.has = stackHas; + Stack.prototype.set = stackSet; - if (touches.length === 1) { - if (now - touchtime < 500) { // dbltap - var p = touches[0]; - zoomTo(that, p, locations0[p.identifier], Math.floor(Math.log(view.k) / Math.LN2) + 1); - d3_eventPreventDefault(); + /*------------------------------------------------------------------------*/ + + /** + * Creates an array of the enumerable property names of the array-like `value`. + * + * @private + * @param {*} value The value to query. + * @param {boolean} inherited Specify returning inherited property names. + * @returns {Array} Returns the array of property names. + */ + function arrayLikeKeys(value, inherited) { + var isArr = isArray(value), + isArg = !isArr && isArguments(value), + isBuff = !isArr && !isArg && isBuffer(value), + isType = !isArr && !isArg && !isBuff && isTypedArray(value), + skipIndexes = isArr || isArg || isBuff || isType, + result = skipIndexes ? baseTimes(value.length, String) : [], + length = result.length; + + for (var key in value) { + if ((inherited || hasOwnProperty.call(value, key)) && + !(skipIndexes && ( + // Safari 9 has enumerable `arguments.length` in strict mode. + key == 'length' || + // Node.js 0.10 has enumerable non-index properties on buffers. + (isBuff && (key == 'offset' || key == 'parent')) || + // PhantomJS 2 has enumerable non-index properties on typed arrays. + (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) || + // Skip index properties. + isIndex(key, length) + ))) { + result.push(key); } - touchtime = now; - } else if (touches.length > 1) { - var p = touches[0], q = touches[1], - dx = p[0] - q[0], dy = p[1] - q[1]; - distance0 = dx * dx + dy * dy; } + return result; } - function moved() { - var touches = d3.touches(that), - p0, l0, - p1, l1; + /** + * A specialized version of `_.sample` for arrays. + * + * @private + * @param {Array} array The array to sample. + * @returns {*} Returns the random element. + */ + function arraySample(array) { + var length = array.length; + return length ? array[baseRandom(0, length - 1)] : undefined; + } - d3_selection_interrupt.call(that); + /** + * A specialized version of `_.sampleSize` for arrays. + * + * @private + * @param {Array} array The array to sample. + * @param {number} n The number of elements to sample. + * @returns {Array} Returns the random elements. + */ + function arraySampleSize(array, n) { + return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length)); + } - for (var i = 0, n = touches.length; i < n; ++i, l1 = null) { - p1 = touches[i]; - if (l1 = locations0[p1.identifier]) { - if (l0) break; - p0 = p1, l0 = l1; - } - } + /** + * A specialized version of `_.shuffle` for arrays. + * + * @private + * @param {Array} array The array to shuffle. + * @returns {Array} Returns the new shuffled array. + */ + function arrayShuffle(array) { + return shuffleSelf(copyArray(array)); + } - if (l1) { - var distance1 = (distance1 = p1[0] - p0[0]) * distance1 + (distance1 = p1[1] - p0[1]) * distance1, - scale1 = distance0 && Math.sqrt(distance1 / distance0); - p0 = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2]; - l0 = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2]; - scaleTo(scale1 * scale0); + /** + * This function is like `assignValue` except that it doesn't assign + * `undefined` values. + * + * @private + * @param {Object} object The object to modify. + * @param {string} key The key of the property to assign. + * @param {*} value The value to assign. + */ + function assignMergeValue(object, key, value) { + if ((value !== undefined && !eq(object[key], value)) || + (value === undefined && !(key in object))) { + baseAssignValue(object, key, value); } + } - touchtime = null; - translateTo(p0, l0); - zoomed(dispatch); + /** + * Assigns `value` to `key` of `object` if the existing value is not equivalent + * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. + * + * @private + * @param {Object} object The object to modify. + * @param {string} key The key of the property to assign. + * @param {*} value The value to assign. + */ + function assignValue(object, key, value) { + var objValue = object[key]; + if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) || + (value === undefined && !(key in object))) { + baseAssignValue(object, key, value); + } } - function ended() { - // If there are any globally-active touches remaining, remove the ended - // touches from locations0. - if (d3.event.touches.length) { - var changed = d3.event.changedTouches; - for (var i = 0, n = changed.length; i < n; ++i) { - delete locations0[changed[i].identifier]; - } - // If locations0 is not empty, then relocate and continue listening for - // touchmove and touchend. - for (var identifier in locations0) { - return void relocate(); // locations may have detached due to rotation + /** + * Gets the index at which the `key` is found in `array` of key-value pairs. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} key The key to search for. + * @returns {number} Returns the index of the matched value, else `-1`. + */ + function assocIndexOf(array, key) { + var length = array.length; + while (length--) { + if (eq(array[length][0], key)) { + return length; } } - // Otherwise, remove touchmove and touchend listeners. - d3.selectAll(targets).on(zoomName, null); - subject.on(mousedown, mousedowned).on(touchstart, touchstarted); - dragRestore(); - zoomended(dispatch); + return -1; } - } - - function mousewheeled() { - var dispatch = event.of(this, arguments); - if (mousewheelTimer) clearTimeout(mousewheelTimer); - else translate0 = location(center0 = center || d3.mouse(this)), d3_selection_interrupt.call(this), zoomstarted(dispatch); - mousewheelTimer = setTimeout(function() { mousewheelTimer = null; zoomended(dispatch); }, 50); - d3_eventPreventDefault(); - scaleTo(Math.pow(2, d3_behavior_zoomDelta() * .002) * view.k); - translateTo(center0, translate0); - zoomed(dispatch); - } - function dblclicked() { - var p = d3.mouse(this), - k = Math.log(view.k) / Math.LN2; + /** + * Aggregates elements of `collection` on `accumulator` with keys transformed + * by `iteratee` and values set by `setter`. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} setter The function to set `accumulator` values. + * @param {Function} iteratee The iteratee to transform keys. + * @param {Object} accumulator The initial aggregated object. + * @returns {Function} Returns `accumulator`. + */ + function baseAggregator(collection, setter, iteratee, accumulator) { + baseEach(collection, function(value, key, collection) { + setter(accumulator, value, iteratee(value), collection); + }); + return accumulator; + } - zoomTo(this, p, location(p), d3.event.shiftKey ? Math.ceil(k) - 1 : Math.floor(k) + 1); - } + /** + * The base implementation of `_.assign` without support for multiple sources + * or `customizer` functions. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @returns {Object} Returns `object`. + */ + function baseAssign(object, source) { + return object && copyObject(source, keys(source), object); + } - return d3.rebind(zoom, event, "on"); -}; + /** + * The base implementation of `_.assignIn` without support for multiple sources + * or `customizer` functions. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @returns {Object} Returns `object`. + */ + function baseAssignIn(object, source) { + return object && copyObject(source, keysIn(source), object); + } -var d3_behavior_zoomInfinity = [0, Infinity], // default scale extent - d3_behavior_zoomDelta, // initialized lazily - d3_behavior_zoomWheel; -function d3_functor(v) { - return typeof v === "function" ? v : function() { return v; }; -} + /** + * The base implementation of `assignValue` and `assignMergeValue` without + * value checks. + * + * @private + * @param {Object} object The object to modify. + * @param {string} key The key of the property to assign. + * @param {*} value The value to assign. + */ + function baseAssignValue(object, key, value) { + if (key == '__proto__' && defineProperty) { + defineProperty(object, key, { + 'configurable': true, + 'enumerable': true, + 'value': value, + 'writable': true + }); + } else { + object[key] = value; + } + } -d3.functor = d3_functor; + /** + * The base implementation of `_.at` without support for individual paths. + * + * @private + * @param {Object} object The object to iterate over. + * @param {string[]} paths The property paths to pick. + * @returns {Array} Returns the picked elements. + */ + function baseAt(object, paths) { + var index = -1, + length = paths.length, + result = Array(length), + skip = object == null; -d3.touch = function(container, touches, identifier) { - if (arguments.length < 3) identifier = touches, touches = d3_eventSource().changedTouches; - if (touches) for (var i = 0, n = touches.length, touch; i < n; ++i) { - if ((touch = touches[i]).identifier === identifier) { - return d3_mousePoint(container, touch); + while (++index < length) { + result[index] = skip ? undefined : get(object, paths[index]); + } + return result; } - } -}; - -var d3_timer_queueHead, - d3_timer_queueTail, - d3_timer_interval, // is an interval (or frame) active? - d3_timer_timeout, // is a timeout active? - d3_timer_active, // active timer object - d3_timer_frame = this[d3_vendorSymbol(this, "requestAnimationFrame")] || function(callback) { setTimeout(callback, 17); }; -// The timer will continue to fire until callback returns true. -d3.timer = function(callback, delay, then) { - var n = arguments.length; - if (n < 2) delay = 0; - if (n < 3) then = Date.now(); + /** + * The base implementation of `_.clamp` which doesn't coerce arguments. + * + * @private + * @param {number} number The number to clamp. + * @param {number} [lower] The lower bound. + * @param {number} upper The upper bound. + * @returns {number} Returns the clamped number. + */ + function baseClamp(number, lower, upper) { + if (number === number) { + if (upper !== undefined) { + number = number <= upper ? number : upper; + } + if (lower !== undefined) { + number = number >= lower ? number : lower; + } + } + return number; + } - // Add the callback to the tail of the queue. - var time = then + delay, timer = {c: callback, t: time, f: false, n: null}; - if (d3_timer_queueTail) d3_timer_queueTail.n = timer; - else d3_timer_queueHead = timer; - d3_timer_queueTail = timer; + /** + * The base implementation of `_.clone` and `_.cloneDeep` which tracks + * traversed objects. + * + * @private + * @param {*} value The value to clone. + * @param {boolean} bitmask The bitmask flags. + * 1 - Deep clone + * 2 - Flatten inherited properties + * 4 - Clone symbols + * @param {Function} [customizer] The function to customize cloning. + * @param {string} [key] The key of `value`. + * @param {Object} [object] The parent object of `value`. + * @param {Object} [stack] Tracks traversed objects and their clone counterparts. + * @returns {*} Returns the cloned value. + */ + function baseClone(value, bitmask, customizer, key, object, stack) { + var result, + isDeep = bitmask & CLONE_DEEP_FLAG, + isFlat = bitmask & CLONE_FLAT_FLAG, + isFull = bitmask & CLONE_SYMBOLS_FLAG; + + if (customizer) { + result = object ? customizer(value, key, object, stack) : customizer(value); + } + if (result !== undefined) { + return result; + } + if (!isObject(value)) { + return value; + } + var isArr = isArray(value); + if (isArr) { + result = initCloneArray(value); + if (!isDeep) { + return copyArray(value, result); + } + } else { + var tag = getTag(value), + isFunc = tag == funcTag || tag == genTag; + + if (isBuffer(value)) { + return cloneBuffer(value, isDeep); + } + if (tag == objectTag || tag == argsTag || (isFunc && !object)) { + result = (isFlat || isFunc) ? {} : initCloneObject(value); + if (!isDeep) { + return isFlat + ? copySymbolsIn(value, baseAssignIn(result, value)) + : copySymbols(value, baseAssign(result, value)); + } + } else { + if (!cloneableTags[tag]) { + return object ? value : {}; + } + result = initCloneByTag(value, tag, baseClone, isDeep); + } + } + // Check for circular references and return its corresponding clone. + stack || (stack = new Stack); + var stacked = stack.get(value); + if (stacked) { + return stacked; + } + stack.set(value, result); - // Start animatin'! - if (!d3_timer_interval) { - d3_timer_timeout = clearTimeout(d3_timer_timeout); - d3_timer_interval = 1; - d3_timer_frame(d3_timer_step); - } -}; + var keysFunc = isFull + ? (isFlat ? getAllKeysIn : getAllKeys) + : (isFlat ? keysIn : keys); -function d3_timer_step() { - var now = d3_timer_mark(), - delay = d3_timer_sweep() - now; - if (delay > 24) { - if (isFinite(delay)) { - clearTimeout(d3_timer_timeout); - d3_timer_timeout = setTimeout(d3_timer_step, delay); + var props = isArr ? undefined : keysFunc(value); + arrayEach(props || value, function(subValue, key) { + if (props) { + key = subValue; + subValue = value[key]; + } + // Recursively populate clone (susceptible to call stack limits). + assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack)); + }); + return result; } - d3_timer_interval = 0; - } else { - d3_timer_interval = 1; - d3_timer_frame(d3_timer_step); - } -} - -d3.timer.flush = function() { - d3_timer_mark(); - d3_timer_sweep(); -}; -function d3_timer_mark() { - var now = Date.now(); - d3_timer_active = d3_timer_queueHead; - while (d3_timer_active) { - if (now >= d3_timer_active.t) d3_timer_active.f = d3_timer_active.c(now - d3_timer_active.t); - d3_timer_active = d3_timer_active.n; - } - return now; -} - -// Flush after callbacks to avoid concurrent queue modification. -// Returns the time of the earliest active timer, post-sweep. -function d3_timer_sweep() { - var t0, - t1 = d3_timer_queueHead, - time = Infinity; - while (t1) { - if (t1.f) { - t1 = t0 ? t0.n = t1.n : d3_timer_queueHead = t1.n; - } else { - if (t1.t < time) time = t1.t; - t1 = (t0 = t1).n; + /** + * The base implementation of `_.conforms` which doesn't clone `source`. + * + * @private + * @param {Object} source The object of property predicates to conform to. + * @returns {Function} Returns the new spec function. + */ + function baseConforms(source) { + var props = keys(source); + return function(object) { + return baseConformsTo(object, source, props); + }; } - } - d3_timer_queueTail = t0; - return time; -} -d3.geo = {}; - -d3.geo.stream = function(object, listener) { - if (object && d3_geo_streamObjectType.hasOwnProperty(object.type)) { - d3_geo_streamObjectType[object.type](object, listener); - } else { - d3_geo_streamGeometry(object, listener); - } -}; -function d3_geo_streamGeometry(geometry, listener) { - if (geometry && d3_geo_streamGeometryType.hasOwnProperty(geometry.type)) { - d3_geo_streamGeometryType[geometry.type](geometry, listener); - } -} - -var d3_geo_streamObjectType = { - Feature: function(feature, listener) { - d3_geo_streamGeometry(feature.geometry, listener); - }, - FeatureCollection: function(object, listener) { - var features = object.features, i = -1, n = features.length; - while (++i < n) d3_geo_streamGeometry(features[i].geometry, listener); - } -}; - -var d3_geo_streamGeometryType = { - Sphere: function(object, listener) { - listener.sphere(); - }, - Point: function(object, listener) { - object = object.coordinates; - listener.point(object[0], object[1], object[2]); - }, - MultiPoint: function(object, listener) { - var coordinates = object.coordinates, i = -1, n = coordinates.length; - while (++i < n) object = coordinates[i], listener.point(object[0], object[1], object[2]); - }, - LineString: function(object, listener) { - d3_geo_streamLine(object.coordinates, listener, 0); - }, - MultiLineString: function(object, listener) { - var coordinates = object.coordinates, i = -1, n = coordinates.length; - while (++i < n) d3_geo_streamLine(coordinates[i], listener, 0); - }, - Polygon: function(object, listener) { - d3_geo_streamPolygon(object.coordinates, listener); - }, - MultiPolygon: function(object, listener) { - var coordinates = object.coordinates, i = -1, n = coordinates.length; - while (++i < n) d3_geo_streamPolygon(coordinates[i], listener); - }, - GeometryCollection: function(object, listener) { - var geometries = object.geometries, i = -1, n = geometries.length; - while (++i < n) d3_geo_streamGeometry(geometries[i], listener); - } -}; + /** + * The base implementation of `_.conformsTo` which accepts `props` to check. + * + * @private + * @param {Object} object The object to inspect. + * @param {Object} source The object of property predicates to conform to. + * @returns {boolean} Returns `true` if `object` conforms, else `false`. + */ + function baseConformsTo(object, source, props) { + var length = props.length; + if (object == null) { + return !length; + } + object = Object(object); + while (length--) { + var key = props[length], + predicate = source[key], + value = object[key]; -function d3_geo_streamLine(coordinates, listener, closed) { - var i = -1, n = coordinates.length - closed, coordinate; - listener.lineStart(); - while (++i < n) coordinate = coordinates[i], listener.point(coordinate[0], coordinate[1], coordinate[2]); - listener.lineEnd(); -} + if ((value === undefined && !(key in object)) || !predicate(value)) { + return false; + } + } + return true; + } -function d3_geo_streamPolygon(coordinates, listener) { - var i = -1, n = coordinates.length; - listener.polygonStart(); - while (++i < n) d3_geo_streamLine(coordinates[i], listener, 1); - listener.polygonEnd(); -} + /** + * The base implementation of `_.delay` and `_.defer` which accepts `args` + * to provide to `func`. + * + * @private + * @param {Function} func The function to delay. + * @param {number} wait The number of milliseconds to delay invocation. + * @param {Array} args The arguments to provide to `func`. + * @returns {number|Object} Returns the timer id or timeout object. + */ + function baseDelay(func, wait, args) { + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + return setTimeout(function() { func.apply(undefined, args); }, wait); + } -d3.geo.length = function(object) { - d3_geo_lengthSum = 0; - d3.geo.stream(object, d3_geo_length); - return d3_geo_lengthSum; -}; + /** + * The base implementation of methods like `_.difference` without support + * for excluding multiple arrays or iteratee shorthands. + * + * @private + * @param {Array} array The array to inspect. + * @param {Array} values The values to exclude. + * @param {Function} [iteratee] The iteratee invoked per element. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of filtered values. + */ + function baseDifference(array, values, iteratee, comparator) { + var index = -1, + includes = arrayIncludes, + isCommon = true, + length = array.length, + result = [], + valuesLength = values.length; -var d3_geo_lengthSum; + if (!length) { + return result; + } + if (iteratee) { + values = arrayMap(values, baseUnary(iteratee)); + } + if (comparator) { + includes = arrayIncludesWith; + isCommon = false; + } + else if (values.length >= LARGE_ARRAY_SIZE) { + includes = cacheHas; + isCommon = false; + values = new SetCache(values); + } + outer: + while (++index < length) { + var value = array[index], + computed = iteratee == null ? value : iteratee(value); + + value = (comparator || value !== 0) ? value : 0; + if (isCommon && computed === computed) { + var valuesIndex = valuesLength; + while (valuesIndex--) { + if (values[valuesIndex] === computed) { + continue outer; + } + } + result.push(value); + } + else if (!includes(values, computed, comparator)) { + result.push(value); + } + } + return result; + } -var d3_geo_length = { - sphere: d3_noop, - point: d3_noop, - lineStart: d3_geo_lengthLineStart, - lineEnd: d3_noop, - polygonStart: d3_noop, - polygonEnd: d3_noop -}; + /** + * The base implementation of `_.forEach` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array|Object} Returns `collection`. + */ + var baseEach = createBaseEach(baseForOwn); -function d3_geo_lengthLineStart() { - var λ0, sinφ0, cosφ0; + /** + * The base implementation of `_.forEachRight` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array|Object} Returns `collection`. + */ + var baseEachRight = createBaseEach(baseForOwnRight, true); - d3_geo_length.point = function(λ, φ) { - λ0 = λ * d3_radians, sinφ0 = Math.sin(φ *= d3_radians), cosφ0 = Math.cos(φ); - d3_geo_length.point = nextPoint; - }; + /** + * The base implementation of `_.every` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if all elements pass the predicate check, + * else `false` + */ + function baseEvery(collection, predicate) { + var result = true; + baseEach(collection, function(value, index, collection) { + result = !!predicate(value, index, collection); + return result; + }); + return result; + } - d3_geo_length.lineEnd = function() { - d3_geo_length.point = d3_geo_length.lineEnd = d3_noop; - }; + /** + * The base implementation of methods like `_.max` and `_.min` which accepts a + * `comparator` to determine the extremum value. + * + * @private + * @param {Array} array The array to iterate over. + * @param {Function} iteratee The iteratee invoked per iteration. + * @param {Function} comparator The comparator used to compare values. + * @returns {*} Returns the extremum value. + */ + function baseExtremum(array, iteratee, comparator) { + var index = -1, + length = array.length; - function nextPoint(λ, φ) { - var sinφ = Math.sin(φ *= d3_radians), - cosφ = Math.cos(φ), - t = abs((λ *= d3_radians) - λ0), - cosΔλ = Math.cos(t); - d3_geo_lengthSum += Math.atan2(Math.sqrt((t = cosφ * Math.sin(t)) * t + (t = cosφ0 * sinφ - sinφ0 * cosφ * cosΔλ) * t), sinφ0 * sinφ + cosφ0 * cosφ * cosΔλ); - λ0 = λ, sinφ0 = sinφ, cosφ0 = cosφ; - } -} -function d3_identity(d) { - return d; -} -function d3_true() { - return true; -} + while (++index < length) { + var value = array[index], + current = iteratee(value); -function d3_geo_spherical(cartesian) { - return [ - Math.atan2(cartesian[1], cartesian[0]), - d3_asin(cartesian[2]) - ]; -} + if (current != null && (computed === undefined + ? (current === current && !isSymbol(current)) + : comparator(current, computed) + )) { + var computed = current, + result = value; + } + } + return result; + } -function d3_geo_sphericalEqual(a, b) { - return abs(a[0] - b[0]) < ε && abs(a[1] - b[1]) < ε; -} + /** + * The base implementation of `_.fill` without an iteratee call guard. + * + * @private + * @param {Array} array The array to fill. + * @param {*} value The value to fill `array` with. + * @param {number} [start=0] The start position. + * @param {number} [end=array.length] The end position. + * @returns {Array} Returns `array`. + */ + function baseFill(array, value, start, end) { + var length = array.length; -// General spherical polygon clipping algorithm: takes a polygon, cuts it into -// visible line segments and rejoins the segments by interpolating along the -// clip edge. -function d3_geo_clipPolygon(segments, compare, clipStartInside, interpolate, listener) { - var subject = [], - clip = []; + start = toInteger(start); + if (start < 0) { + start = -start > length ? 0 : (length + start); + } + end = (end === undefined || end > length) ? length : toInteger(end); + if (end < 0) { + end += length; + } + end = start > end ? 0 : toLength(end); + while (start < end) { + array[start++] = value; + } + return array; + } - segments.forEach(function(segment) { - if ((n = segment.length - 1) <= 0) return; - var n, p0 = segment[0], p1 = segment[n]; - - // If the first and last points of a segment are coincident, then treat as - // a closed ring. - // TODO if all rings are closed, then the winding order of the exterior - // ring should be checked. - if (d3_geo_sphericalEqual(p0, p1)) { - listener.lineStart(); - for (var i = 0; i < n; ++i) listener.point((p0 = segment[i])[0], p0[1]); - listener.lineEnd(); - return; + /** + * The base implementation of `_.filter` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {Array} Returns the new filtered array. + */ + function baseFilter(collection, predicate) { + var result = []; + baseEach(collection, function(value, index, collection) { + if (predicate(value, index, collection)) { + result.push(value); + } + }); + return result; } - var a = new d3_geo_clipPolygonIntersection(p0, segment, null, true), - b = new d3_geo_clipPolygonIntersection(p0, null, a, false); - a.o = b; - subject.push(a); - clip.push(b); - a = new d3_geo_clipPolygonIntersection(p1, segment, null, false); - b = new d3_geo_clipPolygonIntersection(p1, null, a, true); - a.o = b; - subject.push(a); - clip.push(b); - }); - clip.sort(compare); - d3_geo_clipPolygonLinkCircular(subject); - d3_geo_clipPolygonLinkCircular(clip); - if (!subject.length) return; + /** + * The base implementation of `_.flatten` with support for restricting flattening. + * + * @private + * @param {Array} array The array to flatten. + * @param {number} depth The maximum recursion depth. + * @param {boolean} [predicate=isFlattenable] The function invoked per iteration. + * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks. + * @param {Array} [result=[]] The initial result value. + * @returns {Array} Returns the new flattened array. + */ + function baseFlatten(array, depth, predicate, isStrict, result) { + var index = -1, + length = array.length; - for (var i = 0, entry = clipStartInside, n = clip.length; i < n; ++i) { - clip[i].e = entry = !entry; - } + predicate || (predicate = isFlattenable); + result || (result = []); - var start = subject[0], - points, - point; - while (1) { - // Find first unvisited intersection. - var current = start, - isSubject = true; - while (current.v) if ((current = current.n) === start) return; - points = current.z; - listener.lineStart(); - do { - current.v = current.o.v = true; - if (current.e) { - if (isSubject) { - for (var i = 0, n = points.length; i < n; ++i) listener.point((point = points[i])[0], point[1]); - } else { - interpolate(current.x, current.n.x, 1, listener); - } - current = current.n; - } else { - if (isSubject) { - points = current.p.z; - for (var i = points.length - 1; i >= 0; --i) listener.point((point = points[i])[0], point[1]); - } else { - interpolate(current.x, current.p.x, -1, listener); + while (++index < length) { + var value = array[index]; + if (depth > 0 && predicate(value)) { + if (depth > 1) { + // Recursively flatten arrays (susceptible to call stack limits). + baseFlatten(value, depth - 1, predicate, isStrict, result); + } else { + arrayPush(result, value); + } + } else if (!isStrict) { + result[result.length] = value; } - current = current.p; } - current = current.o; - points = current.z; - isSubject = !isSubject; - } while (!current.v); - listener.lineEnd(); - } -} - -function d3_geo_clipPolygonLinkCircular(array) { - if (!(n = array.length)) return; - var n, - i = 0, - a = array[0], - b; - while (++i < n) { - a.n = b = array[i]; - b.p = a; - a = b; - } - a.n = b = array[0]; - b.p = a; -} - -function d3_geo_clipPolygonIntersection(point, points, other, entry) { - this.x = point; - this.z = points; - this.o = other; // another intersection - this.e = entry; // is an entry? - this.v = false; // visited - this.n = this.p = null; // next & previous -} + return result; + } -function d3_geo_clip(pointVisible, clipLine, interpolate, clipStart) { - return function(rotate, listener) { - var line = clipLine(listener), - rotatedClipStart = rotate.invert(clipStart[0], clipStart[1]); + /** + * The base implementation of `baseForOwn` which iterates over `object` + * properties returned by `keysFunc` and invokes `iteratee` for each property. + * Iteratee functions may exit iteration early by explicitly returning `false`. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {Function} keysFunc The function to get the keys of `object`. + * @returns {Object} Returns `object`. + */ + var baseFor = createBaseFor(); - var clip = { - point: point, - lineStart: lineStart, - lineEnd: lineEnd, - polygonStart: function() { - clip.point = pointRing; - clip.lineStart = ringStart; - clip.lineEnd = ringEnd; - segments = []; - polygon = []; - }, - polygonEnd: function() { - clip.point = point; - clip.lineStart = lineStart; - clip.lineEnd = lineEnd; + /** + * This function is like `baseFor` except that it iterates over properties + * in the opposite order. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {Function} keysFunc The function to get the keys of `object`. + * @returns {Object} Returns `object`. + */ + var baseForRight = createBaseFor(true); - segments = d3.merge(segments); - var clipStartInside = d3_geo_pointInPolygon(rotatedClipStart, polygon); - if (segments.length) { - if (!polygonStarted) listener.polygonStart(), polygonStarted = true; - d3_geo_clipPolygon(segments, d3_geo_clipSort, clipStartInside, interpolate, listener); - } else if (clipStartInside) { - if (!polygonStarted) listener.polygonStart(), polygonStarted = true; - listener.lineStart(); - interpolate(null, null, 1, listener); - listener.lineEnd(); - } - if (polygonStarted) listener.polygonEnd(), polygonStarted = false; - segments = polygon = null; - }, - sphere: function() { - listener.polygonStart(); - listener.lineStart(); - interpolate(null, null, 1, listener); - listener.lineEnd(); - listener.polygonEnd(); - } - }; + /** + * The base implementation of `_.forOwn` without support for iteratee shorthands. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Object} Returns `object`. + */ + function baseForOwn(object, iteratee) { + return object && baseFor(object, iteratee, keys); + } - function point(λ, φ) { - var point = rotate(λ, φ); - if (pointVisible(λ = point[0], φ = point[1])) listener.point(λ, φ); + /** + * The base implementation of `_.forOwnRight` without support for iteratee shorthands. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Object} Returns `object`. + */ + function baseForOwnRight(object, iteratee) { + return object && baseForRight(object, iteratee, keys); } - function pointLine(λ, φ) { - var point = rotate(λ, φ); - line.point(point[0], point[1]); + + /** + * The base implementation of `_.functions` which creates an array of + * `object` function property names filtered from `props`. + * + * @private + * @param {Object} object The object to inspect. + * @param {Array} props The property names to filter. + * @returns {Array} Returns the function names. + */ + function baseFunctions(object, props) { + return arrayFilter(props, function(key) { + return isFunction(object[key]); + }); } - function lineStart() { clip.point = pointLine; line.lineStart(); } - function lineEnd() { clip.point = point; line.lineEnd(); } - var segments; + /** + * The base implementation of `_.get` without support for default values. + * + * @private + * @param {Object} object The object to query. + * @param {Array|string} path The path of the property to get. + * @returns {*} Returns the resolved value. + */ + function baseGet(object, path) { + path = castPath(path, object); - var buffer = d3_geo_clipBufferListener(), - ringListener = clipLine(buffer), - polygonStarted = false, - polygon, - ring; + var index = 0, + length = path.length; - function pointRing(λ, φ) { - ring.push([λ, φ]); - var point = rotate(λ, φ); - ringListener.point(point[0], point[1]); + while (object != null && index < length) { + object = object[toKey(path[index++])]; + } + return (index && index == length) ? object : undefined; } - function ringStart() { - ringListener.lineStart(); - ring = []; + /** + * The base implementation of `getAllKeys` and `getAllKeysIn` which uses + * `keysFunc` and `symbolsFunc` to get the enumerable property names and + * symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {Function} keysFunc The function to get the keys of `object`. + * @param {Function} symbolsFunc The function to get the symbols of `object`. + * @returns {Array} Returns the array of property names and symbols. + */ + function baseGetAllKeys(object, keysFunc, symbolsFunc) { + var result = keysFunc(object); + return isArray(object) ? result : arrayPush(result, symbolsFunc(object)); } - function ringEnd() { - pointRing(ring[0][0], ring[0][1]); - ringListener.lineEnd(); - - var clean = ringListener.clean(), - ringSegments = buffer.buffer(), - segment, - n = ringSegments.length; + /** + * The base implementation of `getTag` without fallbacks for buggy environments. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the `toStringTag`. + */ + function baseGetTag(value) { + if (value == null) { + return value === undefined ? undefinedTag : nullTag; + } + return (symToStringTag && symToStringTag in Object(value)) + ? getRawTag(value) + : objectToString(value); + } - ring.pop(); - polygon.push(ring); - ring = null; + /** + * The base implementation of `_.gt` which doesn't coerce arguments. + * + * @private + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is greater than `other`, + * else `false`. + */ + function baseGt(value, other) { + return value > other; + } - if (!n) return; + /** + * The base implementation of `_.has` without support for deep paths. + * + * @private + * @param {Object} [object] The object to query. + * @param {Array|string} key The key to check. + * @returns {boolean} Returns `true` if `key` exists, else `false`. + */ + function baseHas(object, key) { + return object != null && hasOwnProperty.call(object, key); + } - // No intersections. - if (clean & 1) { - segment = ringSegments[0]; - var n = segment.length - 1, - i = -1, - point; - if (n > 0) { - if (!polygonStarted) listener.polygonStart(), polygonStarted = true; - listener.lineStart(); - while (++i < n) listener.point((point = segment[i])[0], point[1]); - listener.lineEnd(); + /** + * The base implementation of `_.hasIn` without support for deep paths. + * + * @private + * @param {Object} [object] The object to query. + * @param {Array|string} key The key to check. + * @returns {boolean} Returns `true` if `key` exists, else `false`. + */ + function baseHasIn(object, key) { + return object != null && key in Object(object); + } + + /** + * The base implementation of `_.inRange` which doesn't coerce arguments. + * + * @private + * @param {number} number The number to check. + * @param {number} start The start of the range. + * @param {number} end The end of the range. + * @returns {boolean} Returns `true` if `number` is in the range, else `false`. + */ + function baseInRange(number, start, end) { + return number >= nativeMin(start, end) && number < nativeMax(start, end); + } + + /** + * The base implementation of methods like `_.intersection`, without support + * for iteratee shorthands, that accepts an array of arrays to inspect. + * + * @private + * @param {Array} arrays The arrays to inspect. + * @param {Function} [iteratee] The iteratee invoked per element. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of shared values. + */ + function baseIntersection(arrays, iteratee, comparator) { + var includes = comparator ? arrayIncludesWith : arrayIncludes, + length = arrays[0].length, + othLength = arrays.length, + othIndex = othLength, + caches = Array(othLength), + maxLength = Infinity, + result = []; + + while (othIndex--) { + var array = arrays[othIndex]; + if (othIndex && iteratee) { + array = arrayMap(array, baseUnary(iteratee)); + } + maxLength = nativeMin(array.length, maxLength); + caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120)) + ? new SetCache(othIndex && array) + : undefined; + } + array = arrays[0]; + + var index = -1, + seen = caches[0]; + + outer: + while (++index < length && result.length < maxLength) { + var value = array[index], + computed = iteratee ? iteratee(value) : value; + + value = (comparator || value !== 0) ? value : 0; + if (!(seen + ? cacheHas(seen, computed) + : includes(result, computed, comparator) + )) { + othIndex = othLength; + while (--othIndex) { + var cache = caches[othIndex]; + if (!(cache + ? cacheHas(cache, computed) + : includes(arrays[othIndex], computed, comparator)) + ) { + continue outer; + } + } + if (seen) { + seen.push(computed); + } + result.push(value); } - return; } + return result; + } - // Rejoin connected segments. - // TODO reuse bufferListener.rejoin()? - if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift())); + /** + * The base implementation of `_.invert` and `_.invertBy` which inverts + * `object` with values transformed by `iteratee` and set by `setter`. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} setter The function to set `accumulator` values. + * @param {Function} iteratee The iteratee to transform values. + * @param {Object} accumulator The initial inverted object. + * @returns {Function} Returns `accumulator`. + */ + function baseInverter(object, setter, iteratee, accumulator) { + baseForOwn(object, function(value, key, object) { + setter(accumulator, iteratee(value), key, object); + }); + return accumulator; + } - segments.push(ringSegments.filter(d3_geo_clipSegmentLength1)); + /** + * The base implementation of `_.invoke` without support for individual + * method arguments. + * + * @private + * @param {Object} object The object to query. + * @param {Array|string} path The path of the method to invoke. + * @param {Array} args The arguments to invoke the method with. + * @returns {*} Returns the result of the invoked method. + */ + function baseInvoke(object, path, args) { + path = castPath(path, object); + object = parent(object, path); + var func = object == null ? object : object[toKey(last(path))]; + return func == null ? undefined : apply(func, object, args); } - return clip; - }; -} + /** + * The base implementation of `_.isArguments`. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an `arguments` object, + */ + function baseIsArguments(value) { + return isObjectLike(value) && baseGetTag(value) == argsTag; + } -function d3_geo_clipSegmentLength1(segment) { - return segment.length > 1; -} + /** + * The base implementation of `_.isArrayBuffer` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`. + */ + function baseIsArrayBuffer(value) { + return isObjectLike(value) && baseGetTag(value) == arrayBufferTag; + } -function d3_geo_clipBufferListener() { - var lines = [], - line; - return { - lineStart: function() { lines.push(line = []); }, - point: function(λ, φ) { line.push([λ, φ]); }, - lineEnd: d3_noop, - buffer: function() { - var buffer = lines; - lines = []; - line = null; - return buffer; - }, - rejoin: function() { - if (lines.length > 1) lines.push(lines.pop().concat(lines.shift())); + /** + * The base implementation of `_.isDate` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a date object, else `false`. + */ + function baseIsDate(value) { + return isObjectLike(value) && baseGetTag(value) == dateTag; } - }; -} -// Intersection points are sorted along the clip edge. For both antimeridian -// cutting and circle clipping, the same comparison is used. -function d3_geo_clipSort(a, b) { - return ((a = a.x)[0] < 0 ? a[1] - halfπ - ε : halfπ - a[1]) - - ((b = b.x)[0] < 0 ? b[1] - halfπ - ε : halfπ - b[1]); -} + /** + * The base implementation of `_.isEqual` which supports partial comparisons + * and tracks traversed objects. + * + * @private + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @param {boolean} bitmask The bitmask flags. + * 1 - Unordered comparison + * 2 - Partial comparison + * @param {Function} [customizer] The function to customize comparisons. + * @param {Object} [stack] Tracks traversed `value` and `other` objects. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + */ + function baseIsEqual(value, other, bitmask, customizer, stack) { + if (value === other) { + return true; + } + if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) { + return value !== value && other !== other; + } + return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack); + } -var d3_geo_clipAntimeridian = d3_geo_clip( - d3_true, - d3_geo_clipAntimeridianLine, - d3_geo_clipAntimeridianInterpolate, - [-π, -π / 2]); + /** + * A specialized version of `baseIsEqual` for arrays and objects which performs + * deep comparisons and tracks traversed objects enabling objects with circular + * references to be compared. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. + * @param {Function} customizer The function to customize comparisons. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Object} [stack] Tracks traversed `object` and `other` objects. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + */ + function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) { + var objIsArr = isArray(object), + othIsArr = isArray(other), + objTag = objIsArr ? arrayTag : getTag(object), + othTag = othIsArr ? arrayTag : getTag(other); -// Takes a line and cuts into visible segments. Return values: -// 0: there were intersections or the line was empty. -// 1: no intersections. -// 2: there were intersections, and the first and last segments should be -// rejoined. -function d3_geo_clipAntimeridianLine(listener) { - var λ0 = NaN, - φ0 = NaN, - sλ0 = NaN, - clean; // no intersections + objTag = objTag == argsTag ? objectTag : objTag; + othTag = othTag == argsTag ? objectTag : othTag; - return { - lineStart: function() { - listener.lineStart(); - clean = 1; - }, - point: function(λ1, φ1) { - var sλ1 = λ1 > 0 ? π : -π, - dλ = abs(λ1 - λ0); - if (abs(dλ - π) < ε) { // line crosses a pole - listener.point(λ0, φ0 = (φ0 + φ1) / 2 > 0 ? halfπ : -halfπ); - listener.point(sλ0, φ0); - listener.lineEnd(); - listener.lineStart(); - listener.point(sλ1, φ0); - listener.point(λ1, φ0); - clean = 0; - } else if (sλ0 !== sλ1 && dλ >= π) { // line crosses antimeridian - // handle degeneracies - if (abs(λ0 - sλ0) < ε) λ0 -= sλ0 * ε; - if (abs(λ1 - sλ1) < ε) λ1 -= sλ1 * ε; - φ0 = d3_geo_clipAntimeridianIntersect(λ0, φ0, λ1, φ1); - listener.point(sλ0, φ0); - listener.lineEnd(); - listener.lineStart(); - listener.point(sλ1, φ0); - clean = 0; + var objIsObj = objTag == objectTag, + othIsObj = othTag == objectTag, + isSameTag = objTag == othTag; + + if (isSameTag && isBuffer(object)) { + if (!isBuffer(other)) { + return false; + } + objIsArr = true; + objIsObj = false; } - listener.point(λ0 = λ1, φ0 = φ1); - sλ0 = sλ1; - }, - lineEnd: function() { - listener.lineEnd(); - λ0 = φ0 = NaN; - }, - // if there are intersections, we always rejoin the first and last segments. - clean: function() { return 2 - clean; } - }; -} + if (isSameTag && !objIsObj) { + stack || (stack = new Stack); + return (objIsArr || isTypedArray(object)) + ? equalArrays(object, other, bitmask, customizer, equalFunc, stack) + : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack); + } + if (!(bitmask & COMPARE_PARTIAL_FLAG)) { + var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'), + othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__'); -function d3_geo_clipAntimeridianIntersect(λ0, φ0, λ1, φ1) { - var cosφ0, - cosφ1, - sinλ0_λ1 = Math.sin(λ0 - λ1); - return abs(sinλ0_λ1) > ε - ? Math.atan((Math.sin(φ0) * (cosφ1 = Math.cos(φ1)) * Math.sin(λ1) - - Math.sin(φ1) * (cosφ0 = Math.cos(φ0)) * Math.sin(λ0)) - / (cosφ0 * cosφ1 * sinλ0_λ1)) - : (φ0 + φ1) / 2; -} + if (objIsWrapped || othIsWrapped) { + var objUnwrapped = objIsWrapped ? object.value() : object, + othUnwrapped = othIsWrapped ? other.value() : other; -function d3_geo_clipAntimeridianInterpolate(from, to, direction, listener) { - var φ; - if (from == null) { - φ = direction * halfπ; - listener.point(-π, φ); - listener.point( 0, φ); - listener.point( π, φ); - listener.point( π, 0); - listener.point( π, -φ); - listener.point( 0, -φ); - listener.point(-π, -φ); - listener.point(-π, 0); - listener.point(-π, φ); - } else if (abs(from[0] - to[0]) > ε) { - var s = from[0] < to[0] ? π : -π; - φ = direction * s / 2; - listener.point(-s, φ); - listener.point( 0, φ); - listener.point( s, φ); - } else { - listener.point(to[0], to[1]); - } -} -// TODO -// cross and scale return new vectors, -// whereas add and normalize operate in-place + stack || (stack = new Stack); + return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack); + } + } + if (!isSameTag) { + return false; + } + stack || (stack = new Stack); + return equalObjects(object, other, bitmask, customizer, equalFunc, stack); + } -function d3_geo_cartesian(spherical) { - var λ = spherical[0], - φ = spherical[1], - cosφ = Math.cos(φ); - return [ - cosφ * Math.cos(λ), - cosφ * Math.sin(λ), - Math.sin(φ) - ]; -} + /** + * The base implementation of `_.isMap` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a map, else `false`. + */ + function baseIsMap(value) { + return isObjectLike(value) && getTag(value) == mapTag; + } -function d3_geo_cartesianDot(a, b) { - return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; -} + /** + * The base implementation of `_.isMatch` without support for iteratee shorthands. + * + * @private + * @param {Object} object The object to inspect. + * @param {Object} source The object of property values to match. + * @param {Array} matchData The property names, values, and compare flags to match. + * @param {Function} [customizer] The function to customize comparisons. + * @returns {boolean} Returns `true` if `object` is a match, else `false`. + */ + function baseIsMatch(object, source, matchData, customizer) { + var index = matchData.length, + length = index, + noCustomizer = !customizer; -function d3_geo_cartesianCross(a, b) { - return [ - a[1] * b[2] - a[2] * b[1], - a[2] * b[0] - a[0] * b[2], - a[0] * b[1] - a[1] * b[0] - ]; -} + if (object == null) { + return !length; + } + object = Object(object); + while (index--) { + var data = matchData[index]; + if ((noCustomizer && data[2]) + ? data[1] !== object[data[0]] + : !(data[0] in object) + ) { + return false; + } + } + while (++index < length) { + data = matchData[index]; + var key = data[0], + objValue = object[key], + srcValue = data[1]; -function d3_geo_cartesianAdd(a, b) { - a[0] += b[0]; - a[1] += b[1]; - a[2] += b[2]; -} + if (noCustomizer && data[2]) { + if (objValue === undefined && !(key in object)) { + return false; + } + } else { + var stack = new Stack; + if (customizer) { + var result = customizer(objValue, srcValue, key, object, source, stack); + } + if (!(result === undefined + ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack) + : result + )) { + return false; + } + } + } + return true; + } -function d3_geo_cartesianScale(vector, k) { - return [ - vector[0] * k, - vector[1] * k, - vector[2] * k - ]; -} + /** + * The base implementation of `_.isNative` without bad shim checks. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a native function, + * else `false`. + */ + function baseIsNative(value) { + if (!isObject(value) || isMasked(value)) { + return false; + } + var pattern = isFunction(value) ? reIsNative : reIsHostCtor; + return pattern.test(toSource(value)); + } -function d3_geo_cartesianNormalize(d) { - var l = Math.sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]); - d[0] /= l; - d[1] /= l; - d[2] /= l; -} -function d3_geo_compose(a, b) { + /** + * The base implementation of `_.isRegExp` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a regexp, else `false`. + */ + function baseIsRegExp(value) { + return isObjectLike(value) && baseGetTag(value) == regexpTag; + } - function compose(x, y) { - return x = a(x, y), b(x[0], x[1]); - } + /** + * The base implementation of `_.isSet` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a set, else `false`. + */ + function baseIsSet(value) { + return isObjectLike(value) && getTag(value) == setTag; + } - if (a.invert && b.invert) compose.invert = function(x, y) { - return x = b.invert(x, y), x && a.invert(x[0], x[1]); - }; + /** + * The base implementation of `_.isTypedArray` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. + */ + function baseIsTypedArray(value) { + return isObjectLike(value) && + isLength(value.length) && !!typedArrayTags[baseGetTag(value)]; + } - return compose; -} + /** + * The base implementation of `_.iteratee`. + * + * @private + * @param {*} [value=_.identity] The value to convert to an iteratee. + * @returns {Function} Returns the iteratee. + */ + function baseIteratee(value) { + // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9. + // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details. + if (typeof value == 'function') { + return value; + } + if (value == null) { + return identity; + } + if (typeof value == 'object') { + return isArray(value) + ? baseMatchesProperty(value[0], value[1]) + : baseMatches(value); + } + return property(value); + } -function d3_geo_equirectangular(λ, φ) { - return [λ, φ]; -} + /** + * The base implementation of `_.keys` which doesn't treat sparse arrays as dense. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + */ + function baseKeys(object) { + if (!isPrototype(object)) { + return nativeKeys(object); + } + var result = []; + for (var key in Object(object)) { + if (hasOwnProperty.call(object, key) && key != 'constructor') { + result.push(key); + } + } + return result; + } -(d3.geo.equirectangular = function() { - return d3_geo_projection(d3_geo_equirectangular); -}).raw = d3_geo_equirectangular.invert = d3_geo_equirectangular; + /** + * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + */ + function baseKeysIn(object) { + if (!isObject(object)) { + return nativeKeysIn(object); + } + var isProto = isPrototype(object), + result = []; -d3.geo.rotation = function(rotate) { - rotate = d3_geo_rotation(rotate[0] % 360 * d3_radians, rotate[1] * d3_radians, rotate.length > 2 ? rotate[2] * d3_radians : 0); + for (var key in object) { + if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) { + result.push(key); + } + } + return result; + } - function forward(coordinates) { - coordinates = rotate(coordinates[0] * d3_radians, coordinates[1] * d3_radians); - return coordinates[0] *= d3_degrees, coordinates[1] *= d3_degrees, coordinates; - } + /** + * The base implementation of `_.lt` which doesn't coerce arguments. + * + * @private + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is less than `other`, + * else `false`. + */ + function baseLt(value, other) { + return value < other; + } - forward.invert = function(coordinates) { - coordinates = rotate.invert(coordinates[0] * d3_radians, coordinates[1] * d3_radians); - return coordinates[0] *= d3_degrees, coordinates[1] *= d3_degrees, coordinates; - }; + /** + * The base implementation of `_.map` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns the new mapped array. + */ + function baseMap(collection, iteratee) { + var index = -1, + result = isArrayLike(collection) ? Array(collection.length) : []; - return forward; -}; + baseEach(collection, function(value, key, collection) { + result[++index] = iteratee(value, key, collection); + }); + return result; + } -function d3_geo_identityRotation(λ, φ) { - return [λ > π ? λ - τ : λ < -π ? λ + τ : λ, φ]; -} + /** + * The base implementation of `_.matches` which doesn't clone `source`. + * + * @private + * @param {Object} source The object of property values to match. + * @returns {Function} Returns the new spec function. + */ + function baseMatches(source) { + var matchData = getMatchData(source); + if (matchData.length == 1 && matchData[0][2]) { + return matchesStrictComparable(matchData[0][0], matchData[0][1]); + } + return function(object) { + return object === source || baseIsMatch(object, source, matchData); + }; + } -d3_geo_identityRotation.invert = d3_geo_equirectangular; + /** + * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`. + * + * @private + * @param {string} path The path of the property to get. + * @param {*} srcValue The value to match. + * @returns {Function} Returns the new spec function. + */ + function baseMatchesProperty(path, srcValue) { + if (isKey(path) && isStrictComparable(srcValue)) { + return matchesStrictComparable(toKey(path), srcValue); + } + return function(object) { + var objValue = get(object, path); + return (objValue === undefined && objValue === srcValue) + ? hasIn(object, path) + : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG); + }; + } -// Note: |δλ| must be < 2π -function d3_geo_rotation(δλ, δφ, δγ) { - return δλ ? (δφ || δγ ? d3_geo_compose(d3_geo_rotationλ(δλ), d3_geo_rotationφγ(δφ, δγ)) - : d3_geo_rotationλ(δλ)) - : (δφ || δγ ? d3_geo_rotationφγ(δφ, δγ) - : d3_geo_identityRotation); -} + /** + * The base implementation of `_.merge` without support for multiple sources. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @param {number} srcIndex The index of `source`. + * @param {Function} [customizer] The function to customize merged values. + * @param {Object} [stack] Tracks traversed source values and their merged + * counterparts. + */ + function baseMerge(object, source, srcIndex, customizer, stack) { + if (object === source) { + return; + } + baseFor(source, function(srcValue, key) { + if (isObject(srcValue)) { + stack || (stack = new Stack); + baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack); + } + else { + var newValue = customizer + ? customizer(object[key], srcValue, (key + ''), object, source, stack) + : undefined; -function d3_geo_forwardRotationλ(δλ) { - return function(λ, φ) { - return λ += δλ, [λ > π ? λ - τ : λ < -π ? λ + τ : λ, φ]; - }; -} + if (newValue === undefined) { + newValue = srcValue; + } + assignMergeValue(object, key, newValue); + } + }, keysIn); + } -function d3_geo_rotationλ(δλ) { - var rotation = d3_geo_forwardRotationλ(δλ); - rotation.invert = d3_geo_forwardRotationλ(-δλ); - return rotation; -} + /** + * A specialized version of `baseMerge` for arrays and objects which performs + * deep merges and tracks traversed objects enabling objects with circular + * references to be merged. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @param {string} key The key of the value to merge. + * @param {number} srcIndex The index of `source`. + * @param {Function} mergeFunc The function to merge values. + * @param {Function} [customizer] The function to customize assigned values. + * @param {Object} [stack] Tracks traversed source values and their merged + * counterparts. + */ + function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) { + var objValue = object[key], + srcValue = source[key], + stacked = stack.get(srcValue); -function d3_geo_rotationφγ(δφ, δγ) { - var cosδφ = Math.cos(δφ), - sinδφ = Math.sin(δφ), - cosδγ = Math.cos(δγ), - sinδγ = Math.sin(δγ); + if (stacked) { + assignMergeValue(object, key, stacked); + return; + } + var newValue = customizer + ? customizer(objValue, srcValue, (key + ''), object, source, stack) + : undefined; - function rotation(λ, φ) { - var cosφ = Math.cos(φ), - x = Math.cos(λ) * cosφ, - y = Math.sin(λ) * cosφ, - z = Math.sin(φ), - k = z * cosδφ + x * sinδφ; - return [ - Math.atan2(y * cosδγ - k * sinδγ, x * cosδφ - z * sinδφ), - d3_asin(k * cosδγ + y * sinδγ) - ]; - } + var isCommon = newValue === undefined; - rotation.invert = function(λ, φ) { - var cosφ = Math.cos(φ), - x = Math.cos(λ) * cosφ, - y = Math.sin(λ) * cosφ, - z = Math.sin(φ), - k = z * cosδγ - y * sinδγ; - return [ - Math.atan2(y * cosδγ + z * sinδγ, x * cosδφ + k * sinδφ), - d3_asin(k * cosδφ - x * sinδφ) - ]; - }; - - return rotation; -} + if (isCommon) { + var isArr = isArray(srcValue), + isBuff = !isArr && isBuffer(srcValue), + isTyped = !isArr && !isBuff && isTypedArray(srcValue); -d3.geo.circle = function() { - var origin = [0, 0], - angle, - precision = 6, - interpolate; - - function circle() { - var center = typeof origin === "function" ? origin.apply(this, arguments) : origin, - rotate = d3_geo_rotation(-center[0] * d3_radians, -center[1] * d3_radians, 0).invert, - ring = []; + newValue = srcValue; + if (isArr || isBuff || isTyped) { + if (isArray(objValue)) { + newValue = objValue; + } + else if (isArrayLikeObject(objValue)) { + newValue = copyArray(objValue); + } + else if (isBuff) { + isCommon = false; + newValue = cloneBuffer(srcValue, true); + } + else if (isTyped) { + isCommon = false; + newValue = cloneTypedArray(srcValue, true); + } + else { + newValue = []; + } + } + else if (isPlainObject(srcValue) || isArguments(srcValue)) { + newValue = objValue; + if (isArguments(objValue)) { + newValue = toPlainObject(objValue); + } + else if (!isObject(objValue) || (srcIndex && isFunction(objValue))) { + newValue = initCloneObject(srcValue); + } + } + else { + isCommon = false; + } + } + if (isCommon) { + // Recursively merge objects and arrays (susceptible to call stack limits). + stack.set(srcValue, newValue); + mergeFunc(newValue, srcValue, srcIndex, customizer, stack); + stack['delete'](srcValue); + } + assignMergeValue(object, key, newValue); + } - interpolate(null, null, 1, { - point: function(x, y) { - ring.push(x = rotate(x, y)); - x[0] *= d3_degrees, x[1] *= d3_degrees; + /** + * The base implementation of `_.nth` which doesn't coerce arguments. + * + * @private + * @param {Array} array The array to query. + * @param {number} n The index of the element to return. + * @returns {*} Returns the nth element of `array`. + */ + function baseNth(array, n) { + var length = array.length; + if (!length) { + return; } - }); + n += n < 0 ? length : 0; + return isIndex(n, length) ? array[n] : undefined; + } - return {type: "Polygon", coordinates: [ring]}; - } + /** + * The base implementation of `_.orderBy` without param guards. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by. + * @param {string[]} orders The sort orders of `iteratees`. + * @returns {Array} Returns the new sorted array. + */ + function baseOrderBy(collection, iteratees, orders) { + var index = -1; + iteratees = arrayMap(iteratees.length ? iteratees : [identity], baseUnary(getIteratee())); - circle.origin = function(x) { - if (!arguments.length) return origin; - origin = x; - return circle; - }; + var result = baseMap(collection, function(value, key, collection) { + var criteria = arrayMap(iteratees, function(iteratee) { + return iteratee(value); + }); + return { 'criteria': criteria, 'index': ++index, 'value': value }; + }); - circle.angle = function(x) { - if (!arguments.length) return angle; - interpolate = d3_geo_circleInterpolate((angle = +x) * d3_radians, precision * d3_radians); - return circle; - }; + return baseSortBy(result, function(object, other) { + return compareMultiple(object, other, orders); + }); + } - circle.precision = function(_) { - if (!arguments.length) return precision; - interpolate = d3_geo_circleInterpolate(angle * d3_radians, (precision = +_) * d3_radians); - return circle; - }; + /** + * The base implementation of `_.pick` without support for individual + * property identifiers. + * + * @private + * @param {Object} object The source object. + * @param {string[]} paths The property paths to pick. + * @returns {Object} Returns the new object. + */ + function basePick(object, paths) { + return basePickBy(object, paths, function(value, path) { + return hasIn(object, path); + }); + } - return circle.angle(90); -}; + /** + * The base implementation of `_.pickBy` without support for iteratee shorthands. + * + * @private + * @param {Object} object The source object. + * @param {string[]} paths The property paths to pick. + * @param {Function} predicate The function invoked per property. + * @returns {Object} Returns the new object. + */ + function basePickBy(object, paths, predicate) { + var index = -1, + length = paths.length, + result = {}; -// Interpolates along a circle centered at [0°, 0°], with a given radius and -// precision. -function d3_geo_circleInterpolate(radius, precision) { - var cr = Math.cos(radius), - sr = Math.sin(radius); - return function(from, to, direction, listener) { - var step = direction * precision; - if (from != null) { - from = d3_geo_circleAngle(cr, from); - to = d3_geo_circleAngle(cr, to); - if (direction > 0 ? from < to: from > to) from += direction * τ; - } else { - from = radius + direction * τ; - to = radius - .5 * step; + while (++index < length) { + var path = paths[index], + value = baseGet(object, path); + + if (predicate(value, path)) { + baseSet(result, castPath(path, object), value); + } + } + return result; } - for (var point, t = from; direction > 0 ? t > to : t < to; t -= step) { - listener.point((point = d3_geo_spherical([ - cr, - -sr * Math.cos(t), - -sr * Math.sin(t) - ]))[0], point[1]); + + /** + * A specialized version of `baseProperty` which supports deep paths. + * + * @private + * @param {Array|string} path The path of the property to get. + * @returns {Function} Returns the new accessor function. + */ + function basePropertyDeep(path) { + return function(object) { + return baseGet(object, path); + }; } - }; -} -// Signed angle of a cartesian point relative to [cr, 0, 0]. -function d3_geo_circleAngle(cr, point) { - var a = d3_geo_cartesian(point); - a[0] -= cr; - d3_geo_cartesianNormalize(a); - var angle = d3_acos(-a[1]); - return ((-a[2] < 0 ? -angle : angle) + 2 * Math.PI - ε) % (2 * Math.PI); -} -// Adds floating point numbers with twice the normal precision. -// Reference: J. R. Shewchuk, Adaptive Precision Floating-Point Arithmetic and -// Fast Robust Geometric Predicates, Discrete & Computational Geometry 18(3) -// 305–363 (1997). -// Code adapted from GeographicLib by Charles F. F. Karney, -// http://geographiclib.sourceforge.net/ -// See lib/geographiclib/LICENSE for details. + /** + * The base implementation of `_.pullAllBy` without support for iteratee + * shorthands. + * + * @private + * @param {Array} array The array to modify. + * @param {Array} values The values to remove. + * @param {Function} [iteratee] The iteratee invoked per element. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns `array`. + */ + function basePullAll(array, values, iteratee, comparator) { + var indexOf = comparator ? baseIndexOfWith : baseIndexOf, + index = -1, + length = values.length, + seen = array; -function d3_adder() {} + if (array === values) { + values = copyArray(values); + } + if (iteratee) { + seen = arrayMap(array, baseUnary(iteratee)); + } + while (++index < length) { + var fromIndex = 0, + value = values[index], + computed = iteratee ? iteratee(value) : value; -d3_adder.prototype = { - s: 0, // rounded value - t: 0, // exact error - add: function(y) { - d3_adderSum(y, this.t, d3_adderTemp); - d3_adderSum(d3_adderTemp.s, this.s, this); - if (this.s) this.t += d3_adderTemp.t; - else this.s = d3_adderTemp.t; - }, - reset: function() { - this.s = this.t = 0; - }, - valueOf: function() { - return this.s; - } -}; + while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) { + if (seen !== array) { + splice.call(seen, fromIndex, 1); + } + splice.call(array, fromIndex, 1); + } + } + return array; + } -var d3_adderTemp = new d3_adder; + /** + * The base implementation of `_.pullAt` without support for individual + * indexes or capturing the removed elements. + * + * @private + * @param {Array} array The array to modify. + * @param {number[]} indexes The indexes of elements to remove. + * @returns {Array} Returns `array`. + */ + function basePullAt(array, indexes) { + var length = array ? indexes.length : 0, + lastIndex = length - 1; -function d3_adderSum(a, b, o) { - var x = o.s = a + b, // a + b - bv = x - a, av = x - bv; // b_virtual & a_virtual - o.t = (a - av) + (b - bv); // a_roundoff + b_roundoff -} + while (length--) { + var index = indexes[length]; + if (length == lastIndex || index !== previous) { + var previous = index; + if (isIndex(index)) { + splice.call(array, index, 1); + } else { + baseUnset(array, index); + } + } + } + return array; + } -d3.geo.area = function(object) { - d3_geo_areaSum = 0; - d3.geo.stream(object, d3_geo_area); - return d3_geo_areaSum; -}; + /** + * The base implementation of `_.random` without support for returning + * floating-point numbers. + * + * @private + * @param {number} lower The lower bound. + * @param {number} upper The upper bound. + * @returns {number} Returns the random number. + */ + function baseRandom(lower, upper) { + return lower + nativeFloor(nativeRandom() * (upper - lower + 1)); + } + + /** + * The base implementation of `_.range` and `_.rangeRight` which doesn't + * coerce arguments. + * + * @private + * @param {number} start The start of the range. + * @param {number} end The end of the range. + * @param {number} step The value to increment or decrement by. + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Array} Returns the range of numbers. + */ + function baseRange(start, end, step, fromRight) { + var index = -1, + length = nativeMax(nativeCeil((end - start) / (step || 1)), 0), + result = Array(length); -var d3_geo_areaSum, - d3_geo_areaRingSum = new d3_adder; + while (length--) { + result[fromRight ? length : ++index] = start; + start += step; + } + return result; + } -var d3_geo_area = { - sphere: function() { d3_geo_areaSum += 4 * π; }, - point: d3_noop, - lineStart: d3_noop, - lineEnd: d3_noop, + /** + * The base implementation of `_.repeat` which doesn't coerce arguments. + * + * @private + * @param {string} string The string to repeat. + * @param {number} n The number of times to repeat the string. + * @returns {string} Returns the repeated string. + */ + function baseRepeat(string, n) { + var result = ''; + if (!string || n < 1 || n > MAX_SAFE_INTEGER) { + return result; + } + // Leverage the exponentiation by squaring algorithm for a faster repeat. + // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details. + do { + if (n % 2) { + result += string; + } + n = nativeFloor(n / 2); + if (n) { + string += string; + } + } while (n); - // Only count area for polygon rings. - polygonStart: function() { - d3_geo_areaRingSum.reset(); - d3_geo_area.lineStart = d3_geo_areaRingStart; - }, - polygonEnd: function() { - var area = 2 * d3_geo_areaRingSum; - d3_geo_areaSum += area < 0 ? 4 * π + area : area; - d3_geo_area.lineStart = d3_geo_area.lineEnd = d3_geo_area.point = d3_noop; - } -}; + return result; + } -function d3_geo_areaRingStart() { - var λ00, φ00, λ0, cosφ0, sinφ0; // start point and previous point + /** + * The base implementation of `_.rest` which doesn't validate or coerce arguments. + * + * @private + * @param {Function} func The function to apply a rest parameter to. + * @param {number} [start=func.length-1] The start position of the rest parameter. + * @returns {Function} Returns the new function. + */ + function baseRest(func, start) { + return setToString(overRest(func, start, identity), func + ''); + } - // For the first point, … - d3_geo_area.point = function(λ, φ) { - d3_geo_area.point = nextPoint; - λ0 = (λ00 = λ) * d3_radians, cosφ0 = Math.cos(φ = (φ00 = φ) * d3_radians / 2 + π / 4), sinφ0 = Math.sin(φ); - }; + /** + * The base implementation of `_.sample`. + * + * @private + * @param {Array|Object} collection The collection to sample. + * @returns {*} Returns the random element. + */ + function baseSample(collection) { + return arraySample(values(collection)); + } - // For subsequent points, … - function nextPoint(λ, φ) { - λ *= d3_radians; - φ = φ * d3_radians / 2 + π / 4; // half the angular distance from south pole + /** + * The base implementation of `_.sampleSize` without param guards. + * + * @private + * @param {Array|Object} collection The collection to sample. + * @param {number} n The number of elements to sample. + * @returns {Array} Returns the random elements. + */ + function baseSampleSize(collection, n) { + var array = values(collection); + return shuffleSelf(array, baseClamp(n, 0, array.length)); + } - // Spherical excess E for a spherical triangle with vertices: south pole, - // previous point, current point. Uses a formula derived from Cagnoli’s - // theorem. See Todhunter, Spherical Trig. (1871), Sec. 103, Eq. (2). - var dλ = λ - λ0, - sdλ = dλ >= 0 ? 1 : -1, - adλ = sdλ * dλ, - cosφ = Math.cos(φ), - sinφ = Math.sin(φ), - k = sinφ0 * sinφ, - u = cosφ0 * cosφ + k * Math.cos(adλ), - v = k * sdλ * Math.sin(adλ); - d3_geo_areaRingSum.add(Math.atan2(v, u)); + /** + * The base implementation of `_.set`. + * + * @private + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to set. + * @param {*} value The value to set. + * @param {Function} [customizer] The function to customize path creation. + * @returns {Object} Returns `object`. + */ + function baseSet(object, path, value, customizer) { + if (!isObject(object)) { + return object; + } + path = castPath(path, object); - // Advance the previous points. - λ0 = λ, cosφ0 = cosφ, sinφ0 = sinφ; - } + var index = -1, + length = path.length, + lastIndex = length - 1, + nested = object; + + while (nested != null && ++index < length) { + var key = toKey(path[index]), + newValue = value; + + if (index != lastIndex) { + var objValue = nested[key]; + newValue = customizer ? customizer(objValue, key, nested) : undefined; + if (newValue === undefined) { + newValue = isObject(objValue) + ? objValue + : (isIndex(path[index + 1]) ? [] : {}); + } + } + assignValue(nested, key, newValue); + nested = nested[key]; + } + return object; + } - // For the last point, return to the start. - d3_geo_area.lineEnd = function() { - nextPoint(λ00, φ00); - }; -} + /** + * The base implementation of `setData` without support for hot loop shorting. + * + * @private + * @param {Function} func The function to associate metadata with. + * @param {*} data The metadata. + * @returns {Function} Returns `func`. + */ + var baseSetData = !metaMap ? identity : function(func, data) { + metaMap.set(func, data); + return func; + }; -function d3_geo_pointInPolygon(point, polygon) { - var meridian = point[0], - parallel = point[1], - meridianNormal = [Math.sin(meridian), -Math.cos(meridian), 0], - polarAngle = 0, - winding = 0; - d3_geo_areaRingSum.reset(); + /** + * The base implementation of `setToString` without support for hot loop shorting. + * + * @private + * @param {Function} func The function to modify. + * @param {Function} string The `toString` result. + * @returns {Function} Returns `func`. + */ + var baseSetToString = !defineProperty ? identity : function(func, string) { + return defineProperty(func, 'toString', { + 'configurable': true, + 'enumerable': false, + 'value': constant(string), + 'writable': true + }); + }; - for (var i = 0, n = polygon.length; i < n; ++i) { - var ring = polygon[i], - m = ring.length; - if (!m) continue; - var point0 = ring[0], - λ0 = point0[0], - φ0 = point0[1] / 2 + π / 4, - sinφ0 = Math.sin(φ0), - cosφ0 = Math.cos(φ0), - j = 1; - - while (true) { - if (j === m) j = 0; - point = ring[j]; - var λ = point[0], - φ = point[1] / 2 + π / 4, - sinφ = Math.sin(φ), - cosφ = Math.cos(φ), - dλ = λ - λ0, - sdλ = dλ >= 0 ? 1 : -1, - adλ = sdλ * dλ, - antimeridian = adλ > π, - k = sinφ0 * sinφ; - d3_geo_areaRingSum.add(Math.atan2(k * sdλ * Math.sin(adλ), cosφ0 * cosφ + k * Math.cos(adλ))); - - polarAngle += antimeridian ? dλ + sdλ * τ : dλ; - - // Are the longitudes either side of the point's meridian, and are the - // latitudes smaller than the parallel? - if (antimeridian ^ λ0 >= meridian ^ λ >= meridian) { - var arc = d3_geo_cartesianCross(d3_geo_cartesian(point0), d3_geo_cartesian(point)); - d3_geo_cartesianNormalize(arc); - var intersection = d3_geo_cartesianCross(meridianNormal, arc); - d3_geo_cartesianNormalize(intersection); - var φarc = (antimeridian ^ dλ >= 0 ? -1 : 1) * d3_asin(intersection[2]); - if (parallel > φarc || parallel === φarc && (arc[0] || arc[1])) { - winding += antimeridian ^ dλ >= 0 ? 1 : -1; - } - } - if (!j++) break; - λ0 = λ, sinφ0 = sinφ, cosφ0 = cosφ, point0 = point; + /** + * The base implementation of `_.shuffle`. + * + * @private + * @param {Array|Object} collection The collection to shuffle. + * @returns {Array} Returns the new shuffled array. + */ + function baseShuffle(collection) { + return shuffleSelf(values(collection)); } - } - // First, determine whether the South pole is inside or outside: - // - // It is inside if: - // * the polygon winds around it in a clockwise direction. - // * the polygon does not (cumulatively) wind around it, but has a negative - // (counter-clockwise) area. - // - // Second, count the (signed) number of times a segment crosses a meridian - // from the point to the South pole. If it is zero, then the point is the - // same side as the South pole. + /** + * The base implementation of `_.slice` without an iteratee call guard. + * + * @private + * @param {Array} array The array to slice. + * @param {number} [start=0] The start position. + * @param {number} [end=array.length] The end position. + * @returns {Array} Returns the slice of `array`. + */ + function baseSlice(array, start, end) { + var index = -1, + length = array.length; - return (polarAngle < -ε || polarAngle < ε && d3_geo_areaRingSum < 0) ^ (winding & 1); -} + if (start < 0) { + start = -start > length ? 0 : (length + start); + } + end = end > length ? length : end; + if (end < 0) { + end += length; + } + length = start > end ? 0 : ((end - start) >>> 0); + start >>>= 0; -// Clip features against a small circle centered at [0°, 0°]. -function d3_geo_clipCircle(radius) { - var cr = Math.cos(radius), - smallRadius = cr > 0, - notHemisphere = abs(cr) > ε, // TODO optimise for this common case - interpolate = d3_geo_circleInterpolate(radius, 6 * d3_radians); + var result = Array(length); + while (++index < length) { + result[index] = array[index + start]; + } + return result; + } - return d3_geo_clip(visible, clipLine, interpolate, smallRadius ? [0, -radius] : [-π, radius - π]); + /** + * The base implementation of `_.some` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if any element passes the predicate check, + * else `false`. + */ + function baseSome(collection, predicate) { + var result; - function visible(λ, φ) { - return Math.cos(λ) * Math.cos(φ) > cr; - } + baseEach(collection, function(value, index, collection) { + result = predicate(value, index, collection); + return !result; + }); + return !!result; + } - // Takes a line and cuts into visible segments. Return values used for - // polygon clipping: - // 0: there were intersections or the line was empty. - // 1: no intersections. - // 2: there were intersections, and the first and last segments should be - // rejoined. - function clipLine(listener) { - var point0, // previous point - c0, // code for previous point - v0, // visibility of previous point - v00, // visibility of first point - clean; // no intersections - return { - lineStart: function() { - v00 = v0 = false; - clean = 1; - }, - point: function(λ, φ) { - var point1 = [λ, φ], - point2, - v = visible(λ, φ), - c = smallRadius - ? v ? 0 : code(λ, φ) - : v ? code(λ + (λ < 0 ? π : -π), φ) : 0; - if (!point0 && (v00 = v0 = v)) listener.lineStart(); - // Handle degeneracies. - // TODO ignore if not clipping polygons. - if (v !== v0) { - point2 = intersect(point0, point1); - if (d3_geo_sphericalEqual(point0, point2) || d3_geo_sphericalEqual(point1, point2)) { - point1[0] += ε; - point1[1] += ε; - v = visible(point1[0], point1[1]); - } - } - if (v !== v0) { - clean = 0; - if (v) { - // outside going in - listener.lineStart(); - point2 = intersect(point1, point0); - listener.point(point2[0], point2[1]); + /** + * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which + * performs a binary search of `array` to determine the index at which `value` + * should be inserted into `array` in order to maintain its sort order. + * + * @private + * @param {Array} array The sorted array to inspect. + * @param {*} value The value to evaluate. + * @param {boolean} [retHighest] Specify returning the highest qualified index. + * @returns {number} Returns the index at which `value` should be inserted + * into `array`. + */ + function baseSortedIndex(array, value, retHighest) { + var low = 0, + high = array == null ? low : array.length; + + if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) { + while (low < high) { + var mid = (low + high) >>> 1, + computed = array[mid]; + + if (computed !== null && !isSymbol(computed) && + (retHighest ? (computed <= value) : (computed < value))) { + low = mid + 1; } else { - // inside going out - point2 = intersect(point0, point1); - listener.point(point2[0], point2[1]); - listener.lineEnd(); - } - point0 = point2; - } else if (notHemisphere && point0 && smallRadius ^ v) { - var t; - // If the codes for two points are different, or are both zero, - // and there this segment intersects with the small circle. - if (!(c & c0) && (t = intersect(point1, point0, true))) { - clean = 0; - if (smallRadius) { - listener.lineStart(); - listener.point(t[0][0], t[0][1]); - listener.point(t[1][0], t[1][1]); - listener.lineEnd(); - } else { - listener.point(t[1][0], t[1][1]); - listener.lineEnd(); - listener.lineStart(); - listener.point(t[0][0], t[0][1]); - } + high = mid; } } - if (v && (!point0 || !d3_geo_sphericalEqual(point0, point1))) { - listener.point(point1[0], point1[1]); - } - point0 = point1, v0 = v, c0 = c; - }, - lineEnd: function() { - if (v0) listener.lineEnd(); - point0 = null; - }, - // Rejoin first and last segments if there were intersections and the first - // and last points were visible. - clean: function() { return clean | ((v00 && v0) << 1); } - }; - } + return high; + } + return baseSortedIndexBy(array, value, identity, retHighest); + } - // Intersects the great circle between a and b with the clip circle. - function intersect(a, b, two) { - var pa = d3_geo_cartesian(a), - pb = d3_geo_cartesian(b); + /** + * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy` + * which invokes `iteratee` for `value` and each element of `array` to compute + * their sort ranking. The iteratee is invoked with one argument; (value). + * + * @private + * @param {Array} array The sorted array to inspect. + * @param {*} value The value to evaluate. + * @param {Function} iteratee The iteratee invoked per element. + * @param {boolean} [retHighest] Specify returning the highest qualified index. + * @returns {number} Returns the index at which `value` should be inserted + * into `array`. + */ + function baseSortedIndexBy(array, value, iteratee, retHighest) { + value = iteratee(value); - // We have two planes, n1.p = d1 and n2.p = d2. - // Find intersection line p(t) = c1 n1 + c2 n2 + t (n1 ⨯ n2). - var n1 = [1, 0, 0], // normal - n2 = d3_geo_cartesianCross(pa, pb), - n2n2 = d3_geo_cartesianDot(n2, n2), - n1n2 = n2[0], // d3_geo_cartesianDot(n1, n2), - determinant = n2n2 - n1n2 * n1n2; - - // Two polar points. - if (!determinant) return !two && a; - - var c1 = cr * n2n2 / determinant, - c2 = -cr * n1n2 / determinant, - n1xn2 = d3_geo_cartesianCross(n1, n2), - A = d3_geo_cartesianScale(n1, c1), - B = d3_geo_cartesianScale(n2, c2); - d3_geo_cartesianAdd(A, B); - - // Solve |p(t)|^2 = 1. - var u = n1xn2, - w = d3_geo_cartesianDot(A, u), - uu = d3_geo_cartesianDot(u, u), - t2 = w * w - uu * (d3_geo_cartesianDot(A, A) - 1); + var low = 0, + high = array == null ? 0 : array.length, + valIsNaN = value !== value, + valIsNull = value === null, + valIsSymbol = isSymbol(value), + valIsUndefined = value === undefined; - if (t2 < 0) return; + while (low < high) { + var mid = nativeFloor((low + high) / 2), + computed = iteratee(array[mid]), + othIsDefined = computed !== undefined, + othIsNull = computed === null, + othIsReflexive = computed === computed, + othIsSymbol = isSymbol(computed); + + if (valIsNaN) { + var setLow = retHighest || othIsReflexive; + } else if (valIsUndefined) { + setLow = othIsReflexive && (retHighest || othIsDefined); + } else if (valIsNull) { + setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull); + } else if (valIsSymbol) { + setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol); + } else if (othIsNull || othIsSymbol) { + setLow = false; + } else { + setLow = retHighest ? (computed <= value) : (computed < value); + } + if (setLow) { + low = mid + 1; + } else { + high = mid; + } + } + return nativeMin(high, MAX_ARRAY_INDEX); + } - var t = Math.sqrt(t2), - q = d3_geo_cartesianScale(u, (-w - t) / uu); - d3_geo_cartesianAdd(q, A); - q = d3_geo_spherical(q); - if (!two) return q; + /** + * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without + * support for iteratee shorthands. + * + * @private + * @param {Array} array The array to inspect. + * @param {Function} [iteratee] The iteratee invoked per element. + * @returns {Array} Returns the new duplicate free array. + */ + function baseSortedUniq(array, iteratee) { + var index = -1, + length = array.length, + resIndex = 0, + result = []; - // Two intersection points. - var λ0 = a[0], - λ1 = b[0], - φ0 = a[1], - φ1 = b[1], - z; - if (λ1 < λ0) z = λ0, λ0 = λ1, λ1 = z; - var δλ = λ1 - λ0, - polar = abs(δλ - π) < ε, - meridian = polar || δλ < ε; + while (++index < length) { + var value = array[index], + computed = iteratee ? iteratee(value) : value; - if (!polar && φ1 < φ0) z = φ0, φ0 = φ1, φ1 = z; + if (!index || !eq(computed, seen)) { + var seen = computed; + result[resIndex++] = value === 0 ? 0 : value; + } + } + return result; + } - // Check that the first point is between a and b. - if (meridian - ? polar - ? φ0 + φ1 > 0 ^ q[1] < (abs(q[0] - λ0) < ε ? φ0 : φ1) - : φ0 <= q[1] && q[1] <= φ1 - : δλ > π ^ (λ0 <= q[0] && q[0] <= λ1)) { - var q1 = d3_geo_cartesianScale(u, (-w + t) / uu); - d3_geo_cartesianAdd(q1, A); - return [q, d3_geo_spherical(q1)]; + /** + * The base implementation of `_.toNumber` which doesn't ensure correct + * conversions of binary, hexadecimal, or octal string values. + * + * @private + * @param {*} value The value to process. + * @returns {number} Returns the number. + */ + function baseToNumber(value) { + if (typeof value == 'number') { + return value; + } + if (isSymbol(value)) { + return NAN; + } + return +value; } - } - // Generates a 4-bit vector representing the location of a point relative to - // the small circle's bounding box. - function code(λ, φ) { - var r = smallRadius ? radius : π - radius, - code = 0; - if (λ < -r) code |= 1; // left - else if (λ > r) code |= 2; // right - if (φ < -r) code |= 4; // below - else if (φ > r) code |= 8; // above - return code; - } -} + /** + * The base implementation of `_.toString` which doesn't convert nullish + * values to empty strings. + * + * @private + * @param {*} value The value to process. + * @returns {string} Returns the string. + */ + function baseToString(value) { + // Exit early for strings to avoid a performance hit in some environments. + if (typeof value == 'string') { + return value; + } + if (isArray(value)) { + // Recursively convert values (susceptible to call stack limits). + return arrayMap(value, baseToString) + ''; + } + if (isSymbol(value)) { + return symbolToString ? symbolToString.call(value) : ''; + } + var result = (value + ''); + return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; + } -// Liang–Barsky line clipping. -function d3_geom_clipLine(x0, y0, x1, y1) { - return function(line) { - var a = line.a, - b = line.b, - ax = a.x, - ay = a.y, - bx = b.x, - by = b.y, - t0 = 0, - t1 = 1, - dx = bx - ax, - dy = by - ay, - r; + /** + * The base implementation of `_.uniqBy` without support for iteratee shorthands. + * + * @private + * @param {Array} array The array to inspect. + * @param {Function} [iteratee] The iteratee invoked per element. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new duplicate free array. + */ + function baseUniq(array, iteratee, comparator) { + var index = -1, + includes = arrayIncludes, + length = array.length, + isCommon = true, + result = [], + seen = result; - r = x0 - ax; - if (!dx && r > 0) return; - r /= dx; - if (dx < 0) { - if (r < t0) return; - if (r < t1) t1 = r; - } else if (dx > 0) { - if (r > t1) return; - if (r > t0) t0 = r; - } - - r = x1 - ax; - if (!dx && r < 0) return; - r /= dx; - if (dx < 0) { - if (r > t1) return; - if (r > t0) t0 = r; - } else if (dx > 0) { - if (r < t0) return; - if (r < t1) t1 = r; - } - - r = y0 - ay; - if (!dy && r > 0) return; - r /= dy; - if (dy < 0) { - if (r < t0) return; - if (r < t1) t1 = r; - } else if (dy > 0) { - if (r > t1) return; - if (r > t0) t0 = r; - } - - r = y1 - ay; - if (!dy && r < 0) return; - r /= dy; - if (dy < 0) { - if (r > t1) return; - if (r > t0) t0 = r; - } else if (dy > 0) { - if (r < t0) return; - if (r < t1) t1 = r; - } - - if (t0 > 0) line.a = {x: ax + t0 * dx, y: ay + t0 * dy}; - if (t1 < 1) line.b = {x: ax + t1 * dx, y: ay + t1 * dy}; - return line; - }; -} - -var d3_geo_clipExtentMAX = 1e9; - -d3.geo.clipExtent = function() { - var x0, y0, x1, y1, - stream, - clip, - clipExtent = { - stream: function(output) { - if (stream) stream.valid = false; - stream = clip(output); - stream.valid = true; // allow caching by d3.geo.path - return stream; - }, - extent: function(_) { - if (!arguments.length) return [[x0, y0], [x1, y1]]; - clip = d3_geo_clipExtent(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]); - if (stream) stream.valid = false, stream = null; - return clipExtent; + if (comparator) { + isCommon = false; + includes = arrayIncludesWith; + } + else if (length >= LARGE_ARRAY_SIZE) { + var set = iteratee ? null : createSet(array); + if (set) { + return setToArray(set); } - }; - return clipExtent.extent([[0, 0], [960, 500]]); -}; - -function d3_geo_clipExtent(x0, y0, x1, y1) { - return function(listener) { - var listener_ = listener, - bufferListener = d3_geo_clipBufferListener(), - clipLine = d3_geom_clipLine(x0, y0, x1, y1), - segments, - polygon, - ring; - - var clip = { - point: point, - lineStart: lineStart, - lineEnd: lineEnd, - polygonStart: function() { - listener = bufferListener; - segments = []; - polygon = []; - clean = true; - }, - polygonEnd: function() { - listener = listener_; - segments = d3.merge(segments); - var clipStartInside = insidePolygon([x0, y1]), - inside = clean && clipStartInside, - visible = segments.length; - if (inside || visible) { - listener.polygonStart(); - if (inside) { - listener.lineStart(); - interpolate(null, null, 1, listener); - listener.lineEnd(); + isCommon = false; + includes = cacheHas; + seen = new SetCache; + } + else { + seen = iteratee ? [] : result; + } + outer: + while (++index < length) { + var value = array[index], + computed = iteratee ? iteratee(value) : value; + + value = (comparator || value !== 0) ? value : 0; + if (isCommon && computed === computed) { + var seenIndex = seen.length; + while (seenIndex--) { + if (seen[seenIndex] === computed) { + continue outer; + } } - if (visible) { - d3_geo_clipPolygon(segments, compare, clipStartInside, interpolate, listener); + if (iteratee) { + seen.push(computed); } - listener.polygonEnd(); + result.push(value); } - segments = polygon = ring = null; - } - }; - - function insidePolygon(p) { - var wn = 0, // the winding number counter - n = polygon.length, - y = p[1]; - - for (var i = 0; i < n; ++i) { - for (var j = 1, v = polygon[i], m = v.length, a = v[0], b; j < m; ++j) { - b = v[j]; - if (a[1] <= y) { - if (b[1] > y && d3_cross2d(a, b, p) > 0) ++wn; - } else { - if (b[1] <= y && d3_cross2d(a, b, p) < 0) --wn; + else if (!includes(seen, computed, comparator)) { + if (seen !== result) { + seen.push(computed); } - a = b; + result.push(value); } } - return wn !== 0; + return result; } - function interpolate(from, to, direction, listener) { - var a = 0, a1 = 0; - if (from == null || - (a = corner(from, direction)) !== (a1 = corner(to, direction)) || - comparePoints(from, to) < 0 ^ direction > 0) { - do { - listener.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0); - } while ((a = (a + direction + 4) % 4) !== a1); - } else { - listener.point(to[0], to[1]); - } + /** + * The base implementation of `_.unset`. + * + * @private + * @param {Object} object The object to modify. + * @param {Array|string} path The property path to unset. + * @returns {boolean} Returns `true` if the property is deleted, else `false`. + */ + function baseUnset(object, path) { + path = castPath(path, object); + object = parent(object, path); + return object == null || delete object[toKey(last(path))]; } - function pointVisible(x, y) { - return x0 <= x && x <= x1 && y0 <= y && y <= y1; + /** + * The base implementation of `_.update`. + * + * @private + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to update. + * @param {Function} updater The function to produce the updated value. + * @param {Function} [customizer] The function to customize path creation. + * @returns {Object} Returns `object`. + */ + function baseUpdate(object, path, updater, customizer) { + return baseSet(object, path, updater(baseGet(object, path)), customizer); } - function point(x, y) { - if (pointVisible(x, y)) listener.point(x, y); - } + /** + * The base implementation of methods like `_.dropWhile` and `_.takeWhile` + * without support for iteratee shorthands. + * + * @private + * @param {Array} array The array to query. + * @param {Function} predicate The function invoked per iteration. + * @param {boolean} [isDrop] Specify dropping elements instead of taking them. + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Array} Returns the slice of `array`. + */ + function baseWhile(array, predicate, isDrop, fromRight) { + var length = array.length, + index = fromRight ? length : -1; - var x__, y__, v__, // first point - x_, y_, v_, // previous point - first, - clean; + while ((fromRight ? index-- : ++index < length) && + predicate(array[index], index, array)) {} - function lineStart() { - clip.point = linePoint; - if (polygon) polygon.push(ring = []); - first = true; - v_ = false; - x_ = y_ = NaN; + return isDrop + ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length)) + : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index)); } - function lineEnd() { - // TODO rather than special-case polygons, simply handle them separately. - // Ideally, coincident intersection points should be jittered to avoid - // clipping issues. - if (segments) { - linePoint(x__, y__); - if (v__ && v_) bufferListener.rejoin(); - segments.push(bufferListener.buffer()); + /** + * The base implementation of `wrapperValue` which returns the result of + * performing a sequence of actions on the unwrapped `value`, where each + * successive action is supplied the return value of the previous. + * + * @private + * @param {*} value The unwrapped value. + * @param {Array} actions Actions to perform to resolve the unwrapped value. + * @returns {*} Returns the resolved value. + */ + function baseWrapperValue(value, actions) { + var result = value; + if (result instanceof LazyWrapper) { + result = result.value(); } - clip.point = point; - if (v_) listener.lineEnd(); + return arrayReduce(actions, function(result, action) { + return action.func.apply(action.thisArg, arrayPush([result], action.args)); + }, result); } - function linePoint(x, y) { - x = Math.max(-d3_geo_clipExtentMAX, Math.min(d3_geo_clipExtentMAX, x)); - y = Math.max(-d3_geo_clipExtentMAX, Math.min(d3_geo_clipExtentMAX, y)); - var v = pointVisible(x, y); - if (polygon) ring.push([x, y]); - if (first) { - x__ = x, y__ = y, v__ = v; - first = false; - if (v) { - listener.lineStart(); - listener.point(x, y); - } - } else { - if (v && v_) listener.point(x, y); - else { - var l = {a: {x: x_, y: y_}, b: {x: x, y: y}}; - if (clipLine(l)) { - if (!v_) { - listener.lineStart(); - listener.point(l.a.x, l.a.y); - } - listener.point(l.b.x, l.b.y); - if (!v) listener.lineEnd(); - clean = false; - } else if (v) { - listener.lineStart(); - listener.point(x, y); - clean = false; + /** + * The base implementation of methods like `_.xor`, without support for + * iteratee shorthands, that accepts an array of arrays to inspect. + * + * @private + * @param {Array} arrays The arrays to inspect. + * @param {Function} [iteratee] The iteratee invoked per element. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of values. + */ + function baseXor(arrays, iteratee, comparator) { + var length = arrays.length; + if (length < 2) { + return length ? baseUniq(arrays[0]) : []; + } + var index = -1, + result = Array(length); + + while (++index < length) { + var array = arrays[index], + othIndex = -1; + + while (++othIndex < length) { + if (othIndex != index) { + result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator); } } } - x_ = x, y_ = y, v_ = v; + return baseUniq(baseFlatten(result, 1), iteratee, comparator); } - return clip; - }; + /** + * This base implementation of `_.zipObject` which assigns values using `assignFunc`. + * + * @private + * @param {Array} props The property identifiers. + * @param {Array} values The property values. + * @param {Function} assignFunc The function to assign values. + * @returns {Object} Returns the new object. + */ + function baseZipObject(props, values, assignFunc) { + var index = -1, + length = props.length, + valsLength = values.length, + result = {}; - function corner(p, direction) { - return abs(p[0] - x0) < ε ? direction > 0 ? 0 : 3 - : abs(p[0] - x1) < ε ? direction > 0 ? 2 : 1 - : abs(p[1] - y0) < ε ? direction > 0 ? 1 : 0 - : direction > 0 ? 3 : 2; // abs(p[1] - y1) < ε - } + while (++index < length) { + var value = index < valsLength ? values[index] : undefined; + assignFunc(result, props[index], value); + } + return result; + } - function compare(a, b) { - return comparePoints(a.x, b.x); - } + /** + * Casts `value` to an empty array if it's not an array like object. + * + * @private + * @param {*} value The value to inspect. + * @returns {Array|Object} Returns the cast array-like object. + */ + function castArrayLikeObject(value) { + return isArrayLikeObject(value) ? value : []; + } - function comparePoints(a, b) { - var ca = corner(a, 1), - cb = corner(b, 1); - return ca !== cb ? ca - cb - : ca === 0 ? b[1] - a[1] - : ca === 1 ? a[0] - b[0] - : ca === 2 ? a[1] - b[1] - : b[0] - a[0]; - } -} + /** + * Casts `value` to `identity` if it's not a function. + * + * @private + * @param {*} value The value to inspect. + * @returns {Function} Returns cast function. + */ + function castFunction(value) { + return typeof value == 'function' ? value : identity; + } -function d3_geo_conic(projectAt) { - var φ0 = 0, - φ1 = π / 3, - m = d3_geo_projectionMutator(projectAt), - p = m(φ0, φ1); + /** + * Casts `value` to a path array if it's not one. + * + * @private + * @param {*} value The value to inspect. + * @param {Object} [object] The object to query keys on. + * @returns {Array} Returns the cast property path array. + */ + function castPath(value, object) { + if (isArray(value)) { + return value; + } + return isKey(value, object) ? [value] : stringToPath(toString(value)); + } - p.parallels = function(_) { - if (!arguments.length) return [φ0 / π * 180, φ1 / π * 180]; - return m(φ0 = _[0] * π / 180, φ1 = _[1] * π / 180); - }; + /** + * A `baseRest` alias which can be replaced with `identity` by module + * replacement plugins. + * + * @private + * @type {Function} + * @param {Function} func The function to apply a rest parameter to. + * @returns {Function} Returns the new function. + */ + var castRest = baseRest; - return p; -} + /** + * Casts `array` to a slice if it's needed. + * + * @private + * @param {Array} array The array to inspect. + * @param {number} start The start position. + * @param {number} [end=array.length] The end position. + * @returns {Array} Returns the cast slice. + */ + function castSlice(array, start, end) { + var length = array.length; + end = end === undefined ? length : end; + return (!start && end >= length) ? array : baseSlice(array, start, end); + } -function d3_geo_conicEqualArea(φ0, φ1) { - var sinφ0 = Math.sin(φ0), - n = (sinφ0 + Math.sin(φ1)) / 2, - C = 1 + sinφ0 * (2 * n - sinφ0), - ρ0 = Math.sqrt(C) / n; + /** + * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout). + * + * @private + * @param {number|Object} id The timer id or timeout object of the timer to clear. + */ + var clearTimeout = ctxClearTimeout || function(id) { + return root.clearTimeout(id); + }; - function forward(λ, φ) { - var ρ = Math.sqrt(C - 2 * n * Math.sin(φ)) / n; - return [ - ρ * Math.sin(λ *= n), - ρ0 - ρ * Math.cos(λ) - ]; - } + /** + * Creates a clone of `buffer`. + * + * @private + * @param {Buffer} buffer The buffer to clone. + * @param {boolean} [isDeep] Specify a deep clone. + * @returns {Buffer} Returns the cloned buffer. + */ + function cloneBuffer(buffer, isDeep) { + if (isDeep) { + return buffer.slice(); + } + var length = buffer.length, + result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length); - forward.invert = function(x, y) { - var ρ0_y = ρ0 - y; - return [ - Math.atan2(x, ρ0_y) / n, - d3_asin((C - (x * x + ρ0_y * ρ0_y) * n * n) / (2 * n)) - ]; - }; + buffer.copy(result); + return result; + } - return forward; -} + /** + * Creates a clone of `arrayBuffer`. + * + * @private + * @param {ArrayBuffer} arrayBuffer The array buffer to clone. + * @returns {ArrayBuffer} Returns the cloned array buffer. + */ + function cloneArrayBuffer(arrayBuffer) { + var result = new arrayBuffer.constructor(arrayBuffer.byteLength); + new Uint8Array(result).set(new Uint8Array(arrayBuffer)); + return result; + } -(d3.geo.conicEqualArea = function() { - return d3_geo_conic(d3_geo_conicEqualArea); -}).raw = d3_geo_conicEqualArea; + /** + * Creates a clone of `dataView`. + * + * @private + * @param {Object} dataView The data view to clone. + * @param {boolean} [isDeep] Specify a deep clone. + * @returns {Object} Returns the cloned data view. + */ + function cloneDataView(dataView, isDeep) { + var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer; + return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength); + } -// ESRI:102003 -d3.geo.albers = function() { - return d3.geo.conicEqualArea() - .rotate([96, 0]) - .center([-.6, 38.7]) - .parallels([29.5, 45.5]) - .scale(1070); -}; + /** + * Creates a clone of `map`. + * + * @private + * @param {Object} map The map to clone. + * @param {Function} cloneFunc The function to clone values. + * @param {boolean} [isDeep] Specify a deep clone. + * @returns {Object} Returns the cloned map. + */ + function cloneMap(map, isDeep, cloneFunc) { + var array = isDeep ? cloneFunc(mapToArray(map), CLONE_DEEP_FLAG) : mapToArray(map); + return arrayReduce(array, addMapEntry, new map.constructor); + } -// A composite projection for the United States, configured by default for -// 960×500. Also works quite well at 960×600 with scale 1285. The set of -// standard parallels for each region comes from USGS, which is published here: -// http://egsc.usgs.gov/isb/pubs/MapProjections/projections.html#albers -d3.geo.albersUsa = function() { - var lower48 = d3.geo.albers(); - - // EPSG:3338 - var alaska = d3.geo.conicEqualArea() - .rotate([154, 0]) - .center([-2, 58.5]) - .parallels([55, 65]); - - // ESRI:102007 - var hawaii = d3.geo.conicEqualArea() - .rotate([157, 0]) - .center([-3, 19.9]) - .parallels([8, 18]); - - var point, - pointStream = {point: function(x, y) { point = [x, y]; }}, - lower48Point, - alaskaPoint, - hawaiiPoint; + /** + * Creates a clone of `regexp`. + * + * @private + * @param {Object} regexp The regexp to clone. + * @returns {Object} Returns the cloned regexp. + */ + function cloneRegExp(regexp) { + var result = new regexp.constructor(regexp.source, reFlags.exec(regexp)); + result.lastIndex = regexp.lastIndex; + return result; + } - function albersUsa(coordinates) { - var x = coordinates[0], y = coordinates[1]; - point = null; - (lower48Point(x, y), point) - || (alaskaPoint(x, y), point) - || hawaiiPoint(x, y); - return point; - } + /** + * Creates a clone of `set`. + * + * @private + * @param {Object} set The set to clone. + * @param {Function} cloneFunc The function to clone values. + * @param {boolean} [isDeep] Specify a deep clone. + * @returns {Object} Returns the cloned set. + */ + function cloneSet(set, isDeep, cloneFunc) { + var array = isDeep ? cloneFunc(setToArray(set), CLONE_DEEP_FLAG) : setToArray(set); + return arrayReduce(array, addSetEntry, new set.constructor); + } - albersUsa.invert = function(coordinates) { - var k = lower48.scale(), - t = lower48.translate(), - x = (coordinates[0] - t[0]) / k, - y = (coordinates[1] - t[1]) / k; - return (y >= .120 && y < .234 && x >= -.425 && x < -.214 ? alaska - : y >= .166 && y < .234 && x >= -.214 && x < -.115 ? hawaii - : lower48).invert(coordinates); - }; + /** + * Creates a clone of the `symbol` object. + * + * @private + * @param {Object} symbol The symbol object to clone. + * @returns {Object} Returns the cloned symbol object. + */ + function cloneSymbol(symbol) { + return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {}; + } - // A naïve multi-projection stream. - // The projections must have mutually exclusive clip regions on the sphere, - // as this will avoid emitting interleaving lines and polygons. - albersUsa.stream = function(stream) { - var lower48Stream = lower48.stream(stream), - alaskaStream = alaska.stream(stream), - hawaiiStream = hawaii.stream(stream); - return { - point: function(x, y) { - lower48Stream.point(x, y); - alaskaStream.point(x, y); - hawaiiStream.point(x, y); - }, - sphere: function() { - lower48Stream.sphere(); - alaskaStream.sphere(); - hawaiiStream.sphere(); - }, - lineStart: function() { - lower48Stream.lineStart(); - alaskaStream.lineStart(); - hawaiiStream.lineStart(); - }, - lineEnd: function() { - lower48Stream.lineEnd(); - alaskaStream.lineEnd(); - hawaiiStream.lineEnd(); - }, - polygonStart: function() { - lower48Stream.polygonStart(); - alaskaStream.polygonStart(); - hawaiiStream.polygonStart(); - }, - polygonEnd: function() { - lower48Stream.polygonEnd(); - alaskaStream.polygonEnd(); - hawaiiStream.polygonEnd(); - } - }; - }; - - albersUsa.precision = function(_) { - if (!arguments.length) return lower48.precision(); - lower48.precision(_); - alaska.precision(_); - hawaii.precision(_); - return albersUsa; - }; - - albersUsa.scale = function(_) { - if (!arguments.length) return lower48.scale(); - lower48.scale(_); - alaska.scale(_ * .35); - hawaii.scale(_); - return albersUsa.translate(lower48.translate()); - }; - - albersUsa.translate = function(_) { - if (!arguments.length) return lower48.translate(); - var k = lower48.scale(), x = +_[0], y = +_[1]; - - lower48Point = lower48 - .translate(_) - .clipExtent([[x - .455 * k, y - .238 * k], [x + .455 * k, y + .238 * k]]) - .stream(pointStream).point; - - alaskaPoint = alaska - .translate([x - .307 * k, y + .201 * k]) - .clipExtent([[x - .425 * k + ε, y + .120 * k + ε], [x - .214 * k - ε, y + .234 * k - ε]]) - .stream(pointStream).point; - - hawaiiPoint = hawaii - .translate([x - .205 * k, y + .212 * k]) - .clipExtent([[x - .214 * k + ε, y + .166 * k + ε], [x - .115 * k - ε, y + .234 * k - ε]]) - .stream(pointStream).point; + /** + * Creates a clone of `typedArray`. + * + * @private + * @param {Object} typedArray The typed array to clone. + * @param {boolean} [isDeep] Specify a deep clone. + * @returns {Object} Returns the cloned typed array. + */ + function cloneTypedArray(typedArray, isDeep) { + var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer; + return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length); + } - return albersUsa; - }; + /** + * Compares values to sort them in ascending order. + * + * @private + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {number} Returns the sort order indicator for `value`. + */ + function compareAscending(value, other) { + if (value !== other) { + var valIsDefined = value !== undefined, + valIsNull = value === null, + valIsReflexive = value === value, + valIsSymbol = isSymbol(value); + + var othIsDefined = other !== undefined, + othIsNull = other === null, + othIsReflexive = other === other, + othIsSymbol = isSymbol(other); + + if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) || + (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) || + (valIsNull && othIsDefined && othIsReflexive) || + (!valIsDefined && othIsReflexive) || + !valIsReflexive) { + return 1; + } + if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) || + (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) || + (othIsNull && valIsDefined && valIsReflexive) || + (!othIsDefined && valIsReflexive) || + !othIsReflexive) { + return -1; + } + } + return 0; + } - return albersUsa.scale(1070); -}; + /** + * Used by `_.orderBy` to compare multiple properties of a value to another + * and stable sort them. + * + * If `orders` is unspecified, all values are sorted in ascending order. Otherwise, + * specify an order of "desc" for descending or "asc" for ascending sort order + * of corresponding values. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {boolean[]|string[]} orders The order to sort by for each property. + * @returns {number} Returns the sort order indicator for `object`. + */ + function compareMultiple(object, other, orders) { + var index = -1, + objCriteria = object.criteria, + othCriteria = other.criteria, + length = objCriteria.length, + ordersLength = orders.length; -d3.geo.bounds = (function() { - var λ0, φ0, λ1, φ1, // bounds - λ_, // previous λ-coordinate - λ__, φ__, // first point - p0, // previous 3D point - dλSum, - ranges, - range; - - var bound = { - point: point, - lineStart: lineStart, - lineEnd: lineEnd, - - polygonStart: function() { - bound.point = ringPoint; - bound.lineStart = ringStart; - bound.lineEnd = ringEnd; - dλSum = 0; - d3_geo_area.polygonStart(); - }, - polygonEnd: function() { - d3_geo_area.polygonEnd(); - bound.point = point; - bound.lineStart = lineStart; - bound.lineEnd = lineEnd; - if (d3_geo_areaRingSum < 0) λ0 = -(λ1 = 180), φ0 = -(φ1 = 90); - else if (dλSum > ε) φ1 = 90; - else if (dλSum < -ε) φ0 = -90; - range[0] = λ0, range[1] = λ1; - } - }; - - function point(λ, φ) { - ranges.push(range = [λ0 = λ, λ1 = λ]); - if (φ < φ0) φ0 = φ; - if (φ > φ1) φ1 = φ; - } - - function linePoint(λ, φ) { - var p = d3_geo_cartesian([λ * d3_radians, φ * d3_radians]); - if (p0) { - var normal = d3_geo_cartesianCross(p0, p), - equatorial = [normal[1], -normal[0], 0], - inflection = d3_geo_cartesianCross(equatorial, normal); - d3_geo_cartesianNormalize(inflection); - inflection = d3_geo_spherical(inflection); - var dλ = λ - λ_, - s = dλ > 0 ? 1 : -1, - λi = inflection[0] * d3_degrees * s, - antimeridian = abs(dλ) > 180; - if (antimeridian ^ (s * λ_ < λi && λi < s * λ)) { - var φi = inflection[1] * d3_degrees; - if (φi > φ1) φ1 = φi; - } else if (λi = (λi + 360) % 360 - 180, antimeridian ^ (s * λ_ < λi && λi < s * λ)) { - var φi = -inflection[1] * d3_degrees; - if (φi < φ0) φ0 = φi; - } else { - if (φ < φ0) φ0 = φ; - if (φ > φ1) φ1 = φ; - } - if (antimeridian) { - if (λ < λ_) { - if (angle(λ0, λ) > angle(λ0, λ1)) λ1 = λ; - } else { - if (angle(λ, λ1) > angle(λ0, λ1)) λ0 = λ; - } - } else { - if (λ1 >= λ0) { - if (λ < λ0) λ0 = λ; - if (λ > λ1) λ1 = λ; - } else { - if (λ > λ_) { - if (angle(λ0, λ) > angle(λ0, λ1)) λ1 = λ; - } else { - if (angle(λ, λ1) > angle(λ0, λ1)) λ0 = λ; + while (++index < length) { + var result = compareAscending(objCriteria[index], othCriteria[index]); + if (result) { + if (index >= ordersLength) { + return result; } + var order = orders[index]; + return result * (order == 'desc' ? -1 : 1); } } - } else { - point(λ, φ); + // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications + // that causes it, under certain circumstances, to provide the same value for + // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247 + // for more details. + // + // This also ensures a stable sort in V8 and other engines. + // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details. + return object.index - other.index; } - p0 = p, λ_ = λ; - } - function lineStart() { bound.point = linePoint; } - function lineEnd() { - range[0] = λ0, range[1] = λ1; - bound.point = point; - p0 = null; - } + /** + * Creates an array that is the composition of partially applied arguments, + * placeholders, and provided arguments into a single array of arguments. + * + * @private + * @param {Array} args The provided arguments. + * @param {Array} partials The arguments to prepend to those provided. + * @param {Array} holders The `partials` placeholder indexes. + * @params {boolean} [isCurried] Specify composing for a curried function. + * @returns {Array} Returns the new array of composed arguments. + */ + function composeArgs(args, partials, holders, isCurried) { + var argsIndex = -1, + argsLength = args.length, + holdersLength = holders.length, + leftIndex = -1, + leftLength = partials.length, + rangeLength = nativeMax(argsLength - holdersLength, 0), + result = Array(leftLength + rangeLength), + isUncurried = !isCurried; - function ringPoint(λ, φ) { - if (p0) { - var dλ = λ - λ_; - dλSum += abs(dλ) > 180 ? dλ + (dλ > 0 ? 360 : -360) : dλ; - } else λ__ = λ, φ__ = φ; - d3_geo_area.point(λ, φ); - linePoint(λ, φ); - } + while (++leftIndex < leftLength) { + result[leftIndex] = partials[leftIndex]; + } + while (++argsIndex < holdersLength) { + if (isUncurried || argsIndex < argsLength) { + result[holders[argsIndex]] = args[argsIndex]; + } + } + while (rangeLength--) { + result[leftIndex++] = args[argsIndex++]; + } + return result; + } - function ringStart() { - d3_geo_area.lineStart(); - } + /** + * This function is like `composeArgs` except that the arguments composition + * is tailored for `_.partialRight`. + * + * @private + * @param {Array} args The provided arguments. + * @param {Array} partials The arguments to append to those provided. + * @param {Array} holders The `partials` placeholder indexes. + * @params {boolean} [isCurried] Specify composing for a curried function. + * @returns {Array} Returns the new array of composed arguments. + */ + function composeArgsRight(args, partials, holders, isCurried) { + var argsIndex = -1, + argsLength = args.length, + holdersIndex = -1, + holdersLength = holders.length, + rightIndex = -1, + rightLength = partials.length, + rangeLength = nativeMax(argsLength - holdersLength, 0), + result = Array(rangeLength + rightLength), + isUncurried = !isCurried; + + while (++argsIndex < rangeLength) { + result[argsIndex] = args[argsIndex]; + } + var offset = argsIndex; + while (++rightIndex < rightLength) { + result[offset + rightIndex] = partials[rightIndex]; + } + while (++holdersIndex < holdersLength) { + if (isUncurried || argsIndex < argsLength) { + result[offset + holders[holdersIndex]] = args[argsIndex++]; + } + } + return result; + } - function ringEnd() { - ringPoint(λ__, φ__); - d3_geo_area.lineEnd(); - if (abs(dλSum) > ε) λ0 = -(λ1 = 180); - range[0] = λ0, range[1] = λ1; - p0 = null; - } + /** + * Copies the values of `source` to `array`. + * + * @private + * @param {Array} source The array to copy values from. + * @param {Array} [array=[]] The array to copy values to. + * @returns {Array} Returns `array`. + */ + function copyArray(source, array) { + var index = -1, + length = source.length; - // Finds the left-right distance between two longitudes. - // This is almost the same as (λ1 - λ0 + 360°) % 360°, except that we want - // the distance between ±180° to be 360°. - function angle(λ0, λ1) { return (λ1 -= λ0) < 0 ? λ1 + 360 : λ1; } + array || (array = Array(length)); + while (++index < length) { + array[index] = source[index]; + } + return array; + } - function compareRanges(a, b) { return a[0] - b[0]; } + /** + * Copies properties of `source` to `object`. + * + * @private + * @param {Object} source The object to copy properties from. + * @param {Array} props The property identifiers to copy. + * @param {Object} [object={}] The object to copy properties to. + * @param {Function} [customizer] The function to customize copied values. + * @returns {Object} Returns `object`. + */ + function copyObject(source, props, object, customizer) { + var isNew = !object; + object || (object = {}); - function withinRange(x, range) { - return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x; - } + var index = -1, + length = props.length; - return function(feature) { - φ1 = λ1 = -(λ0 = φ0 = Infinity); - ranges = []; + while (++index < length) { + var key = props[index]; - d3.geo.stream(feature, bound); + var newValue = customizer + ? customizer(object[key], source[key], key, object, source) + : undefined; - var n = ranges.length; - if (n) { - // First, sort ranges by their minimum longitudes. - ranges.sort(compareRanges); - - // Then, merge any ranges that overlap. - for (var i = 1, a = ranges[0], b, merged = [a]; i < n; ++i) { - b = ranges[i]; - if (withinRange(b[0], a) || withinRange(b[1], a)) { - if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1]; - if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0]; + if (newValue === undefined) { + newValue = source[key]; + } + if (isNew) { + baseAssignValue(object, key, newValue); } else { - merged.push(a = b); + assignValue(object, key, newValue); } } - - // Finally, find the largest gap between the merged ranges. - // The final bounding box will be the inverse of this gap. - var best = -Infinity, dλ; - for (var n = merged.length - 1, i = 0, a = merged[n], b; i <= n; a = b, ++i) { - b = merged[i]; - if ((dλ = angle(a[1], b[0])) > best) best = dλ, λ0 = b[0], λ1 = a[1]; - } + return object; } - ranges = range = null; - return λ0 === Infinity || φ0 === Infinity - ? [[NaN, NaN], [NaN, NaN]] - : [[λ0, φ0], [λ1, φ1]]; - }; -})(); + /** + * Copies own symbols of `source` to `object`. + * + * @private + * @param {Object} source The object to copy symbols from. + * @param {Object} [object={}] The object to copy symbols to. + * @returns {Object} Returns `object`. + */ + function copySymbols(source, object) { + return copyObject(source, getSymbols(source), object); + } -d3.geo.centroid = function(object) { - d3_geo_centroidW0 = d3_geo_centroidW1 = - d3_geo_centroidX0 = d3_geo_centroidY0 = d3_geo_centroidZ0 = - d3_geo_centroidX1 = d3_geo_centroidY1 = d3_geo_centroidZ1 = - d3_geo_centroidX2 = d3_geo_centroidY2 = d3_geo_centroidZ2 = 0; - d3.geo.stream(object, d3_geo_centroid); + /** + * Copies own and inherited symbols of `source` to `object`. + * + * @private + * @param {Object} source The object to copy symbols from. + * @param {Object} [object={}] The object to copy symbols to. + * @returns {Object} Returns `object`. + */ + function copySymbolsIn(source, object) { + return copyObject(source, getSymbolsIn(source), object); + } - var x = d3_geo_centroidX2, - y = d3_geo_centroidY2, - z = d3_geo_centroidZ2, - m = x * x + y * y + z * z; + /** + * Creates a function like `_.groupBy`. + * + * @private + * @param {Function} setter The function to set accumulator values. + * @param {Function} [initializer] The accumulator object initializer. + * @returns {Function} Returns the new aggregator function. + */ + function createAggregator(setter, initializer) { + return function(collection, iteratee) { + var func = isArray(collection) ? arrayAggregator : baseAggregator, + accumulator = initializer ? initializer() : {}; - // If the area-weighted centroid is undefined, fall back to length-weighted centroid. - if (m < ε2) { - x = d3_geo_centroidX1, y = d3_geo_centroidY1, z = d3_geo_centroidZ1; - // If the feature has zero length, fall back to arithmetic mean of point vectors. - if (d3_geo_centroidW1 < ε) x = d3_geo_centroidX0, y = d3_geo_centroidY0, z = d3_geo_centroidZ0; - m = x * x + y * y + z * z; - // If the feature still has an undefined centroid, then return. - if (m < ε2) return [NaN, NaN]; - } - - return [Math.atan2(y, x) * d3_degrees, d3_asin(z / Math.sqrt(m)) * d3_degrees]; -}; - -var d3_geo_centroidW0, - d3_geo_centroidW1, - d3_geo_centroidX0, - d3_geo_centroidY0, - d3_geo_centroidZ0, - d3_geo_centroidX1, - d3_geo_centroidY1, - d3_geo_centroidZ1, - d3_geo_centroidX2, - d3_geo_centroidY2, - d3_geo_centroidZ2; - -var d3_geo_centroid = { - sphere: d3_noop, - point: d3_geo_centroidPoint, - lineStart: d3_geo_centroidLineStart, - lineEnd: d3_geo_centroidLineEnd, - polygonStart: function() { - d3_geo_centroid.lineStart = d3_geo_centroidRingStart; - }, - polygonEnd: function() { - d3_geo_centroid.lineStart = d3_geo_centroidLineStart; - } -}; + return func(collection, setter, getIteratee(iteratee, 2), accumulator); + }; + } -// Arithmetic mean of Cartesian vectors. -function d3_geo_centroidPoint(λ, φ) { - λ *= d3_radians; - var cosφ = Math.cos(φ *= d3_radians); - d3_geo_centroidPointXYZ(cosφ * Math.cos(λ), cosφ * Math.sin(λ), Math.sin(φ)); -} + /** + * Creates a function like `_.assign`. + * + * @private + * @param {Function} assigner The function to assign values. + * @returns {Function} Returns the new assigner function. + */ + function createAssigner(assigner) { + return baseRest(function(object, sources) { + var index = -1, + length = sources.length, + customizer = length > 1 ? sources[length - 1] : undefined, + guard = length > 2 ? sources[2] : undefined; -function d3_geo_centroidPointXYZ(x, y, z) { - ++d3_geo_centroidW0; - d3_geo_centroidX0 += (x - d3_geo_centroidX0) / d3_geo_centroidW0; - d3_geo_centroidY0 += (y - d3_geo_centroidY0) / d3_geo_centroidW0; - d3_geo_centroidZ0 += (z - d3_geo_centroidZ0) / d3_geo_centroidW0; -} + customizer = (assigner.length > 3 && typeof customizer == 'function') + ? (length--, customizer) + : undefined; -function d3_geo_centroidLineStart() { - var x0, y0, z0; // previous point + if (guard && isIterateeCall(sources[0], sources[1], guard)) { + customizer = length < 3 ? undefined : customizer; + length = 1; + } + object = Object(object); + while (++index < length) { + var source = sources[index]; + if (source) { + assigner(object, source, index, customizer); + } + } + return object; + }); + } - d3_geo_centroid.point = function(λ, φ) { - λ *= d3_radians; - var cosφ = Math.cos(φ *= d3_radians); - x0 = cosφ * Math.cos(λ); - y0 = cosφ * Math.sin(λ); - z0 = Math.sin(φ); - d3_geo_centroid.point = nextPoint; - d3_geo_centroidPointXYZ(x0, y0, z0); - }; + /** + * Creates a `baseEach` or `baseEachRight` function. + * + * @private + * @param {Function} eachFunc The function to iterate over a collection. + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new base function. + */ + function createBaseEach(eachFunc, fromRight) { + return function(collection, iteratee) { + if (collection == null) { + return collection; + } + if (!isArrayLike(collection)) { + return eachFunc(collection, iteratee); + } + var length = collection.length, + index = fromRight ? length : -1, + iterable = Object(collection); - function nextPoint(λ, φ) { - λ *= d3_radians; - var cosφ = Math.cos(φ *= d3_radians), - x = cosφ * Math.cos(λ), - y = cosφ * Math.sin(λ), - z = Math.sin(φ), - w = Math.atan2( - Math.sqrt((w = y0 * z - z0 * y) * w + (w = z0 * x - x0 * z) * w + (w = x0 * y - y0 * x) * w), - x0 * x + y0 * y + z0 * z); - d3_geo_centroidW1 += w; - d3_geo_centroidX1 += w * (x0 + (x0 = x)); - d3_geo_centroidY1 += w * (y0 + (y0 = y)); - d3_geo_centroidZ1 += w * (z0 + (z0 = z)); - d3_geo_centroidPointXYZ(x0, y0, z0); - } -} + while ((fromRight ? index-- : ++index < length)) { + if (iteratee(iterable[index], index, iterable) === false) { + break; + } + } + return collection; + }; + } -function d3_geo_centroidLineEnd() { - d3_geo_centroid.point = d3_geo_centroidPoint; -} + /** + * Creates a base function for methods like `_.forIn` and `_.forOwn`. + * + * @private + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new base function. + */ + function createBaseFor(fromRight) { + return function(object, iteratee, keysFunc) { + var index = -1, + iterable = Object(object), + props = keysFunc(object), + length = props.length; + + while (length--) { + var key = props[fromRight ? length : ++index]; + if (iteratee(iterable[key], key, iterable) === false) { + break; + } + } + return object; + }; + } -// See J. E. Brock, The Inertia Tensor for a Spherical Triangle, -// J. Applied Mechanics 42, 239 (1975). -function d3_geo_centroidRingStart() { - var λ00, φ00, // first point - x0, y0, z0; // previous point - - d3_geo_centroid.point = function(λ, φ) { - λ00 = λ, φ00 = φ; - d3_geo_centroid.point = nextPoint; - λ *= d3_radians; - var cosφ = Math.cos(φ *= d3_radians); - x0 = cosφ * Math.cos(λ); - y0 = cosφ * Math.sin(λ); - z0 = Math.sin(φ); - d3_geo_centroidPointXYZ(x0, y0, z0); - }; - - d3_geo_centroid.lineEnd = function() { - nextPoint(λ00, φ00); - d3_geo_centroid.lineEnd = d3_geo_centroidLineEnd; - d3_geo_centroid.point = d3_geo_centroidPoint; - }; - - function nextPoint(λ, φ) { - λ *= d3_radians; - var cosφ = Math.cos(φ *= d3_radians), - x = cosφ * Math.cos(λ), - y = cosφ * Math.sin(λ), - z = Math.sin(φ), - cx = y0 * z - z0 * y, - cy = z0 * x - x0 * z, - cz = x0 * y - y0 * x, - m = Math.sqrt(cx * cx + cy * cy + cz * cz), - u = x0 * x + y0 * y + z0 * z, - v = m && -d3_acos(u) / m, // area weight - w = Math.atan2(m, u); // line weight - d3_geo_centroidX2 += v * cx; - d3_geo_centroidY2 += v * cy; - d3_geo_centroidZ2 += v * cz; - d3_geo_centroidW1 += w; - d3_geo_centroidX1 += w * (x0 + (x0 = x)); - d3_geo_centroidY1 += w * (y0 + (y0 = y)); - d3_geo_centroidZ1 += w * (z0 + (z0 = z)); - d3_geo_centroidPointXYZ(x0, y0, z0); - } -} - -// TODO Unify this code with d3.geom.polygon area? - -var d3_geo_pathAreaSum, d3_geo_pathAreaPolygon, d3_geo_pathArea = { - point: d3_noop, - lineStart: d3_noop, - lineEnd: d3_noop, - - // Only count area for polygon rings. - polygonStart: function() { - d3_geo_pathAreaPolygon = 0; - d3_geo_pathArea.lineStart = d3_geo_pathAreaRingStart; - }, - polygonEnd: function() { - d3_geo_pathArea.lineStart = d3_geo_pathArea.lineEnd = d3_geo_pathArea.point = d3_noop; - d3_geo_pathAreaSum += abs(d3_geo_pathAreaPolygon / 2); - } -}; + /** + * Creates a function that wraps `func` to invoke it with the optional `this` + * binding of `thisArg`. + * + * @private + * @param {Function} func The function to wrap. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @param {*} [thisArg] The `this` binding of `func`. + * @returns {Function} Returns the new wrapped function. + */ + function createBind(func, bitmask, thisArg) { + var isBind = bitmask & WRAP_BIND_FLAG, + Ctor = createCtor(func); -function d3_geo_pathAreaRingStart() { - var x00, y00, x0, y0; + function wrapper() { + var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func; + return fn.apply(isBind ? thisArg : this, arguments); + } + return wrapper; + } - // For the first point, … - d3_geo_pathArea.point = function(x, y) { - d3_geo_pathArea.point = nextPoint; - x00 = x0 = x, y00 = y0 = y; - }; + /** + * Creates a function like `_.lowerFirst`. + * + * @private + * @param {string} methodName The name of the `String` case method to use. + * @returns {Function} Returns the new case function. + */ + function createCaseFirst(methodName) { + return function(string) { + string = toString(string); - // For subsequent points, … - function nextPoint(x, y) { - d3_geo_pathAreaPolygon += y0 * x - x0 * y; - x0 = x, y0 = y; - } + var strSymbols = hasUnicode(string) + ? stringToArray(string) + : undefined; - // For the last point, return to the start. - d3_geo_pathArea.lineEnd = function() { - nextPoint(x00, y00); - }; -} + var chr = strSymbols + ? strSymbols[0] + : string.charAt(0); -var d3_geo_pathBoundsX0, - d3_geo_pathBoundsY0, - d3_geo_pathBoundsX1, - d3_geo_pathBoundsY1; + var trailing = strSymbols + ? castSlice(strSymbols, 1).join('') + : string.slice(1); -var d3_geo_pathBounds = { - point: d3_geo_pathBoundsPoint, - lineStart: d3_noop, - lineEnd: d3_noop, - polygonStart: d3_noop, - polygonEnd: d3_noop -}; + return chr[methodName]() + trailing; + }; + } -function d3_geo_pathBoundsPoint(x, y) { - if (x < d3_geo_pathBoundsX0) d3_geo_pathBoundsX0 = x; - if (x > d3_geo_pathBoundsX1) d3_geo_pathBoundsX1 = x; - if (y < d3_geo_pathBoundsY0) d3_geo_pathBoundsY0 = y; - if (y > d3_geo_pathBoundsY1) d3_geo_pathBoundsY1 = y; -} -function d3_geo_pathBuffer() { - var pointCircle = d3_geo_pathBufferCircle(4.5), - buffer = []; + /** + * Creates a function like `_.camelCase`. + * + * @private + * @param {Function} callback The function to combine each word. + * @returns {Function} Returns the new compounder function. + */ + function createCompounder(callback) { + return function(string) { + return arrayReduce(words(deburr(string).replace(reApos, '')), callback, ''); + }; + } - var stream = { - point: point, + /** + * Creates a function that produces an instance of `Ctor` regardless of + * whether it was invoked as part of a `new` expression or by `call` or `apply`. + * + * @private + * @param {Function} Ctor The constructor to wrap. + * @returns {Function} Returns the new wrapped function. + */ + function createCtor(Ctor) { + return function() { + // Use a `switch` statement to work with class constructors. See + // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist + // for more details. + var args = arguments; + switch (args.length) { + case 0: return new Ctor; + case 1: return new Ctor(args[0]); + case 2: return new Ctor(args[0], args[1]); + case 3: return new Ctor(args[0], args[1], args[2]); + case 4: return new Ctor(args[0], args[1], args[2], args[3]); + case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]); + case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]); + case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]); + } + var thisBinding = baseCreate(Ctor.prototype), + result = Ctor.apply(thisBinding, args); + + // Mimic the constructor's `return` behavior. + // See https://es5.github.io/#x13.2.2 for more details. + return isObject(result) ? result : thisBinding; + }; + } - // While inside a line, override point to moveTo then lineTo. - lineStart: function() { stream.point = pointLineStart; }, - lineEnd: lineEnd, + /** + * Creates a function that wraps `func` to enable currying. + * + * @private + * @param {Function} func The function to wrap. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @param {number} arity The arity of `func`. + * @returns {Function} Returns the new wrapped function. + */ + function createCurry(func, bitmask, arity) { + var Ctor = createCtor(func); - // While inside a polygon, override lineEnd to closePath. - polygonStart: function() { stream.lineEnd = lineEndPolygon; }, - polygonEnd: function() { stream.lineEnd = lineEnd; stream.point = point; }, + function wrapper() { + var length = arguments.length, + args = Array(length), + index = length, + placeholder = getHolder(wrapper); - pointRadius: function(_) { - pointCircle = d3_geo_pathBufferCircle(_); - return stream; - }, + while (index--) { + args[index] = arguments[index]; + } + var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder) + ? [] + : replaceHolders(args, placeholder); - result: function() { - if (buffer.length) { - var result = buffer.join(""); - buffer = []; - return result; + length -= holders.length; + if (length < arity) { + return createRecurry( + func, bitmask, createHybrid, wrapper.placeholder, undefined, + args, holders, undefined, undefined, arity - length); + } + var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func; + return apply(fn, this, args); } + return wrapper; } - }; - function point(x, y) { - buffer.push("M", x, ",", y, pointCircle); - } + /** + * Creates a `_.find` or `_.findLast` function. + * + * @private + * @param {Function} findIndexFunc The function to find the collection index. + * @returns {Function} Returns the new find function. + */ + function createFind(findIndexFunc) { + return function(collection, predicate, fromIndex) { + var iterable = Object(collection); + if (!isArrayLike(collection)) { + var iteratee = getIteratee(predicate, 3); + collection = keys(collection); + predicate = function(key) { return iteratee(iterable[key], key, iterable); }; + } + var index = findIndexFunc(collection, predicate, fromIndex); + return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined; + }; + } - function pointLineStart(x, y) { - buffer.push("M", x, ",", y); - stream.point = pointLine; - } + /** + * Creates a `_.flow` or `_.flowRight` function. + * + * @private + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new flow function. + */ + function createFlow(fromRight) { + return flatRest(function(funcs) { + var length = funcs.length, + index = length, + prereq = LodashWrapper.prototype.thru; + + if (fromRight) { + funcs.reverse(); + } + while (index--) { + var func = funcs[index]; + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + if (prereq && !wrapper && getFuncName(func) == 'wrapper') { + var wrapper = new LodashWrapper([], true); + } + } + index = wrapper ? index : length; + while (++index < length) { + func = funcs[index]; - function pointLine(x, y) { - buffer.push("L", x, ",", y); - } + var funcName = getFuncName(func), + data = funcName == 'wrapper' ? getData(func) : undefined; - function lineEnd() { - stream.point = point; - } + if (data && isLaziable(data[0]) && + data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) && + !data[4].length && data[9] == 1 + ) { + wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]); + } else { + wrapper = (func.length == 1 && isLaziable(func)) + ? wrapper[funcName]() + : wrapper.thru(func); + } + } + return function() { + var args = arguments, + value = args[0]; - function lineEndPolygon() { - buffer.push("Z"); - } + if (wrapper && args.length == 1 && isArray(value)) { + return wrapper.plant(value).value(); + } + var index = 0, + result = length ? funcs[index].apply(this, args) : value; - return stream; -} + while (++index < length) { + result = funcs[index].call(this, result); + } + return result; + }; + }); + } -function d3_geo_pathBufferCircle(radius) { - return "m0," + radius - + "a" + radius + "," + radius + " 0 1,1 0," + -2 * radius - + "a" + radius + "," + radius + " 0 1,1 0," + 2 * radius - + "z"; -} + /** + * Creates a function that wraps `func` to invoke it with optional `this` + * binding of `thisArg`, partial application, and currying. + * + * @private + * @param {Function|string} func The function or method name to wrap. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @param {*} [thisArg] The `this` binding of `func`. + * @param {Array} [partials] The arguments to prepend to those provided to + * the new function. + * @param {Array} [holders] The `partials` placeholder indexes. + * @param {Array} [partialsRight] The arguments to append to those provided + * to the new function. + * @param {Array} [holdersRight] The `partialsRight` placeholder indexes. + * @param {Array} [argPos] The argument positions of the new function. + * @param {number} [ary] The arity cap of `func`. + * @param {number} [arity] The arity of `func`. + * @returns {Function} Returns the new wrapped function. + */ + function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) { + var isAry = bitmask & WRAP_ARY_FLAG, + isBind = bitmask & WRAP_BIND_FLAG, + isBindKey = bitmask & WRAP_BIND_KEY_FLAG, + isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG), + isFlip = bitmask & WRAP_FLIP_FLAG, + Ctor = isBindKey ? undefined : createCtor(func); + + function wrapper() { + var length = arguments.length, + args = Array(length), + index = length; + + while (index--) { + args[index] = arguments[index]; + } + if (isCurried) { + var placeholder = getHolder(wrapper), + holdersCount = countHolders(args, placeholder); + } + if (partials) { + args = composeArgs(args, partials, holders, isCurried); + } + if (partialsRight) { + args = composeArgsRight(args, partialsRight, holdersRight, isCurried); + } + length -= holdersCount; + if (isCurried && length < arity) { + var newHolders = replaceHolders(args, placeholder); + return createRecurry( + func, bitmask, createHybrid, wrapper.placeholder, thisArg, + args, newHolders, argPos, ary, arity - length + ); + } + var thisBinding = isBind ? thisArg : this, + fn = isBindKey ? thisBinding[func] : func; + + length = args.length; + if (argPos) { + args = reorder(args, argPos); + } else if (isFlip && length > 1) { + args.reverse(); + } + if (isAry && ary < length) { + args.length = ary; + } + if (this && this !== root && this instanceof wrapper) { + fn = Ctor || createCtor(fn); + } + return fn.apply(thisBinding, args); + } + return wrapper; + } -// TODO Unify this code with d3.geom.polygon centroid? -// TODO Enforce positive area for exterior, negative area for interior? + /** + * Creates a function like `_.invertBy`. + * + * @private + * @param {Function} setter The function to set accumulator values. + * @param {Function} toIteratee The function to resolve iteratees. + * @returns {Function} Returns the new inverter function. + */ + function createInverter(setter, toIteratee) { + return function(object, iteratee) { + return baseInverter(object, setter, toIteratee(iteratee), {}); + }; + } -var d3_geo_pathCentroid = { - point: d3_geo_pathCentroidPoint, + /** + * Creates a function that performs a mathematical operation on two values. + * + * @private + * @param {Function} operator The function to perform the operation. + * @param {number} [defaultValue] The value used for `undefined` arguments. + * @returns {Function} Returns the new mathematical operation function. + */ + function createMathOperation(operator, defaultValue) { + return function(value, other) { + var result; + if (value === undefined && other === undefined) { + return defaultValue; + } + if (value !== undefined) { + result = value; + } + if (other !== undefined) { + if (result === undefined) { + return other; + } + if (typeof value == 'string' || typeof other == 'string') { + value = baseToString(value); + other = baseToString(other); + } else { + value = baseToNumber(value); + other = baseToNumber(other); + } + result = operator(value, other); + } + return result; + }; + } - // For lines, weight by length. - lineStart: d3_geo_pathCentroidLineStart, - lineEnd: d3_geo_pathCentroidLineEnd, + /** + * Creates a function like `_.over`. + * + * @private + * @param {Function} arrayFunc The function to iterate over iteratees. + * @returns {Function} Returns the new over function. + */ + function createOver(arrayFunc) { + return flatRest(function(iteratees) { + iteratees = arrayMap(iteratees, baseUnary(getIteratee())); + return baseRest(function(args) { + var thisArg = this; + return arrayFunc(iteratees, function(iteratee) { + return apply(iteratee, thisArg, args); + }); + }); + }); + } - // For polygons, weight by area. - polygonStart: function() { - d3_geo_pathCentroid.lineStart = d3_geo_pathCentroidRingStart; - }, - polygonEnd: function() { - d3_geo_pathCentroid.point = d3_geo_pathCentroidPoint; - d3_geo_pathCentroid.lineStart = d3_geo_pathCentroidLineStart; - d3_geo_pathCentroid.lineEnd = d3_geo_pathCentroidLineEnd; - } -}; + /** + * Creates the padding for `string` based on `length`. The `chars` string + * is truncated if the number of characters exceeds `length`. + * + * @private + * @param {number} length The padding length. + * @param {string} [chars=' '] The string used as padding. + * @returns {string} Returns the padding for `string`. + */ + function createPadding(length, chars) { + chars = chars === undefined ? ' ' : baseToString(chars); -function d3_geo_pathCentroidPoint(x, y) { - d3_geo_centroidX0 += x; - d3_geo_centroidY0 += y; - ++d3_geo_centroidZ0; -} + var charsLength = chars.length; + if (charsLength < 2) { + return charsLength ? baseRepeat(chars, length) : chars; + } + var result = baseRepeat(chars, nativeCeil(length / stringSize(chars))); + return hasUnicode(chars) + ? castSlice(stringToArray(result), 0, length).join('') + : result.slice(0, length); + } -function d3_geo_pathCentroidLineStart() { - var x0, y0; + /** + * Creates a function that wraps `func` to invoke it with the `this` binding + * of `thisArg` and `partials` prepended to the arguments it receives. + * + * @private + * @param {Function} func The function to wrap. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @param {*} thisArg The `this` binding of `func`. + * @param {Array} partials The arguments to prepend to those provided to + * the new function. + * @returns {Function} Returns the new wrapped function. + */ + function createPartial(func, bitmask, thisArg, partials) { + var isBind = bitmask & WRAP_BIND_FLAG, + Ctor = createCtor(func); - d3_geo_pathCentroid.point = function(x, y) { - d3_geo_pathCentroid.point = nextPoint; - d3_geo_pathCentroidPoint(x0 = x, y0 = y); - }; + function wrapper() { + var argsIndex = -1, + argsLength = arguments.length, + leftIndex = -1, + leftLength = partials.length, + args = Array(leftLength + argsLength), + fn = (this && this !== root && this instanceof wrapper) ? Ctor : func; - function nextPoint(x, y) { - var dx = x - x0, dy = y - y0, z = Math.sqrt(dx * dx + dy * dy); - d3_geo_centroidX1 += z * (x0 + x) / 2; - d3_geo_centroidY1 += z * (y0 + y) / 2; - d3_geo_centroidZ1 += z; - d3_geo_pathCentroidPoint(x0 = x, y0 = y); - } -} + while (++leftIndex < leftLength) { + args[leftIndex] = partials[leftIndex]; + } + while (argsLength--) { + args[leftIndex++] = arguments[++argsIndex]; + } + return apply(fn, isBind ? thisArg : this, args); + } + return wrapper; + } -function d3_geo_pathCentroidLineEnd() { - d3_geo_pathCentroid.point = d3_geo_pathCentroidPoint; -} + /** + * Creates a `_.range` or `_.rangeRight` function. + * + * @private + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new range function. + */ + function createRange(fromRight) { + return function(start, end, step) { + if (step && typeof step != 'number' && isIterateeCall(start, end, step)) { + end = step = undefined; + } + // Ensure the sign of `-0` is preserved. + start = toFinite(start); + if (end === undefined) { + end = start; + start = 0; + } else { + end = toFinite(end); + } + step = step === undefined ? (start < end ? 1 : -1) : toFinite(step); + return baseRange(start, end, step, fromRight); + }; + } -function d3_geo_pathCentroidRingStart() { - var x00, y00, x0, y0; + /** + * Creates a function that performs a relational operation on two values. + * + * @private + * @param {Function} operator The function to perform the operation. + * @returns {Function} Returns the new relational operation function. + */ + function createRelationalOperation(operator) { + return function(value, other) { + if (!(typeof value == 'string' && typeof other == 'string')) { + value = toNumber(value); + other = toNumber(other); + } + return operator(value, other); + }; + } - // For the first point, … - d3_geo_pathCentroid.point = function(x, y) { - d3_geo_pathCentroid.point = nextPoint; - d3_geo_pathCentroidPoint(x00 = x0 = x, y00 = y0 = y); - }; + /** + * Creates a function that wraps `func` to continue currying. + * + * @private + * @param {Function} func The function to wrap. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @param {Function} wrapFunc The function to create the `func` wrapper. + * @param {*} placeholder The placeholder value. + * @param {*} [thisArg] The `this` binding of `func`. + * @param {Array} [partials] The arguments to prepend to those provided to + * the new function. + * @param {Array} [holders] The `partials` placeholder indexes. + * @param {Array} [argPos] The argument positions of the new function. + * @param {number} [ary] The arity cap of `func`. + * @param {number} [arity] The arity of `func`. + * @returns {Function} Returns the new wrapped function. + */ + function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) { + var isCurry = bitmask & WRAP_CURRY_FLAG, + newHolders = isCurry ? holders : undefined, + newHoldersRight = isCurry ? undefined : holders, + newPartials = isCurry ? partials : undefined, + newPartialsRight = isCurry ? undefined : partials; + + bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG); + bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG); + + if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) { + bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG); + } + var newData = [ + func, bitmask, thisArg, newPartials, newHolders, newPartialsRight, + newHoldersRight, argPos, ary, arity + ]; - // For subsequent points, … - function nextPoint(x, y) { - var dx = x - x0, dy = y - y0, z = Math.sqrt(dx * dx + dy * dy); - d3_geo_centroidX1 += z * (x0 + x) / 2; - d3_geo_centroidY1 += z * (y0 + y) / 2; - d3_geo_centroidZ1 += z; + var result = wrapFunc.apply(undefined, newData); + if (isLaziable(func)) { + setData(result, newData); + } + result.placeholder = placeholder; + return setWrapToString(result, func, bitmask); + } - z = y0 * x - x0 * y; - d3_geo_centroidX2 += z * (x0 + x); - d3_geo_centroidY2 += z * (y0 + y); - d3_geo_centroidZ2 += z * 3; - d3_geo_pathCentroidPoint(x0 = x, y0 = y); - } + /** + * Creates a function like `_.round`. + * + * @private + * @param {string} methodName The name of the `Math` method to use when rounding. + * @returns {Function} Returns the new round function. + */ + function createRound(methodName) { + var func = Math[methodName]; + return function(number, precision) { + number = toNumber(number); + precision = precision == null ? 0 : nativeMin(toInteger(precision), 292); + if (precision) { + // Shift with exponential notation to avoid floating-point issues. + // See [MDN](https://mdn.io/round#Examples) for more details. + var pair = (toString(number) + 'e').split('e'), + value = func(pair[0] + 'e' + (+pair[1] + precision)); + + pair = (toString(value) + 'e').split('e'); + return +(pair[0] + 'e' + (+pair[1] - precision)); + } + return func(number); + }; + } - // For the last point, return to the start. - d3_geo_pathCentroid.lineEnd = function() { - nextPoint(x00, y00); - }; -} + /** + * Creates a set object of `values`. + * + * @private + * @param {Array} values The values to add to the set. + * @returns {Object} Returns the new set. + */ + var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) { + return new Set(values); + }; -function d3_geo_pathContext(context) { - var pointRadius = 4.5; + /** + * Creates a `_.toPairs` or `_.toPairsIn` function. + * + * @private + * @param {Function} keysFunc The function to get the keys of a given object. + * @returns {Function} Returns the new pairs function. + */ + function createToPairs(keysFunc) { + return function(object) { + var tag = getTag(object); + if (tag == mapTag) { + return mapToArray(object); + } + if (tag == setTag) { + return setToPairs(object); + } + return baseToPairs(object, keysFunc(object)); + }; + } - var stream = { - point: point, + /** + * Creates a function that either curries or invokes `func` with optional + * `this` binding and partially applied arguments. + * + * @private + * @param {Function|string} func The function or method name to wrap. + * @param {number} bitmask The bitmask flags. + * 1 - `_.bind` + * 2 - `_.bindKey` + * 4 - `_.curry` or `_.curryRight` of a bound function + * 8 - `_.curry` + * 16 - `_.curryRight` + * 32 - `_.partial` + * 64 - `_.partialRight` + * 128 - `_.rearg` + * 256 - `_.ary` + * 512 - `_.flip` + * @param {*} [thisArg] The `this` binding of `func`. + * @param {Array} [partials] The arguments to be partially applied. + * @param {Array} [holders] The `partials` placeholder indexes. + * @param {Array} [argPos] The argument positions of the new function. + * @param {number} [ary] The arity cap of `func`. + * @param {number} [arity] The arity of `func`. + * @returns {Function} Returns the new wrapped function. + */ + function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) { + var isBindKey = bitmask & WRAP_BIND_KEY_FLAG; + if (!isBindKey && typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + var length = partials ? partials.length : 0; + if (!length) { + bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG); + partials = holders = undefined; + } + ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0); + arity = arity === undefined ? arity : toInteger(arity); + length -= holders ? holders.length : 0; - // While inside a line, override point to moveTo then lineTo. - lineStart: function() { stream.point = pointLineStart; }, - lineEnd: lineEnd, + if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) { + var partialsRight = partials, + holdersRight = holders; - // While inside a polygon, override lineEnd to closePath. - polygonStart: function() { stream.lineEnd = lineEndPolygon; }, - polygonEnd: function() { stream.lineEnd = lineEnd; stream.point = point; }, + partials = holders = undefined; + } + var data = isBindKey ? undefined : getData(func); - pointRadius: function(_) { - pointRadius = _; - return stream; - }, + var newData = [ + func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, + argPos, ary, arity + ]; - result: d3_noop - }; + if (data) { + mergeData(newData, data); + } + func = newData[0]; + bitmask = newData[1]; + thisArg = newData[2]; + partials = newData[3]; + holders = newData[4]; + arity = newData[9] = newData[9] === undefined + ? (isBindKey ? 0 : func.length) + : nativeMax(newData[9] - length, 0); + + if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) { + bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG); + } + if (!bitmask || bitmask == WRAP_BIND_FLAG) { + var result = createBind(func, bitmask, thisArg); + } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) { + result = createCurry(func, bitmask, arity); + } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) { + result = createPartial(func, bitmask, thisArg, partials); + } else { + result = createHybrid.apply(undefined, newData); + } + var setter = data ? baseSetData : setData; + return setWrapToString(setter(result, newData), func, bitmask); + } - function point(x, y) { - context.moveTo(x + pointRadius, y); - context.arc(x, y, pointRadius, 0, τ); - } + /** + * Used by `_.defaults` to customize its `_.assignIn` use to assign properties + * of source objects to the destination object for all destination properties + * that resolve to `undefined`. + * + * @private + * @param {*} objValue The destination value. + * @param {*} srcValue The source value. + * @param {string} key The key of the property to assign. + * @param {Object} object The parent object of `objValue`. + * @returns {*} Returns the value to assign. + */ + function customDefaultsAssignIn(objValue, srcValue, key, object) { + if (objValue === undefined || + (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) { + return srcValue; + } + return objValue; + } - function pointLineStart(x, y) { - context.moveTo(x, y); - stream.point = pointLine; - } + /** + * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source + * objects into destination objects that are passed thru. + * + * @private + * @param {*} objValue The destination value. + * @param {*} srcValue The source value. + * @param {string} key The key of the property to merge. + * @param {Object} object The parent object of `objValue`. + * @param {Object} source The parent object of `srcValue`. + * @param {Object} [stack] Tracks traversed source values and their merged + * counterparts. + * @returns {*} Returns the value to assign. + */ + function customDefaultsMerge(objValue, srcValue, key, object, source, stack) { + if (isObject(objValue) && isObject(srcValue)) { + // Recursively merge objects and arrays (susceptible to call stack limits). + stack.set(srcValue, objValue); + baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack); + stack['delete'](srcValue); + } + return objValue; + } - function pointLine(x, y) { - context.lineTo(x, y); - } + /** + * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain + * objects. + * + * @private + * @param {*} value The value to inspect. + * @param {string} key The key of the property to inspect. + * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`. + */ + function customOmitClone(value) { + return isPlainObject(value) ? undefined : value; + } - function lineEnd() { - stream.point = point; - } + /** + * A specialized version of `baseIsEqualDeep` for arrays with support for + * partial deep comparisons. + * + * @private + * @param {Array} array The array to compare. + * @param {Array} other The other array to compare. + * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. + * @param {Function} customizer The function to customize comparisons. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Object} stack Tracks traversed `array` and `other` objects. + * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`. + */ + function equalArrays(array, other, bitmask, customizer, equalFunc, stack) { + var isPartial = bitmask & COMPARE_PARTIAL_FLAG, + arrLength = array.length, + othLength = other.length; - function lineEndPolygon() { - context.closePath(); - } + if (arrLength != othLength && !(isPartial && othLength > arrLength)) { + return false; + } + // Assume cyclic values are equal. + var stacked = stack.get(array); + if (stacked && stack.get(other)) { + return stacked == other; + } + var index = -1, + result = true, + seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined; - return stream; -} + stack.set(array, other); + stack.set(other, array); -function d3_geo_resample(project) { - var δ2 = .5, // precision, px² - cosMinDistance = Math.cos(30 * d3_radians), // cos(minimum angular distance) - maxDepth = 16; + // Ignore non-index properties. + while (++index < arrLength) { + var arrValue = array[index], + othValue = other[index]; - function resample(stream) { - return (maxDepth ? resampleRecursive : resampleNone)(stream); - } + if (customizer) { + var compared = isPartial + ? customizer(othValue, arrValue, index, other, array, stack) + : customizer(arrValue, othValue, index, array, other, stack); + } + if (compared !== undefined) { + if (compared) { + continue; + } + result = false; + break; + } + // Recursively compare arrays (susceptible to call stack limits). + if (seen) { + if (!arraySome(other, function(othValue, othIndex) { + if (!cacheHas(seen, othIndex) && + (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) { + return seen.push(othIndex); + } + })) { + result = false; + break; + } + } else if (!( + arrValue === othValue || + equalFunc(arrValue, othValue, bitmask, customizer, stack) + )) { + result = false; + break; + } + } + stack['delete'](array); + stack['delete'](other); + return result; + } - function resampleNone(stream) { - return d3_geo_transformPoint(stream, function(x, y) { - x = project(x, y); - stream.point(x[0], x[1]); - }); - } + /** + * A specialized version of `baseIsEqualDeep` for comparing objects of + * the same `toStringTag`. + * + * **Note:** This function only supports comparing values with tags of + * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {string} tag The `toStringTag` of the objects to compare. + * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. + * @param {Function} customizer The function to customize comparisons. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Object} stack Tracks traversed `object` and `other` objects. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + */ + function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) { + switch (tag) { + case dataViewTag: + if ((object.byteLength != other.byteLength) || + (object.byteOffset != other.byteOffset)) { + return false; + } + object = object.buffer; + other = other.buffer; - function resampleRecursive(stream) { - var λ00, φ00, x00, y00, a00, b00, c00, // first point - λ0, x0, y0, a0, b0, c0; // previous point + case arrayBufferTag: + if ((object.byteLength != other.byteLength) || + !equalFunc(new Uint8Array(object), new Uint8Array(other))) { + return false; + } + return true; - var resample = { - point: point, - lineStart: lineStart, - lineEnd: lineEnd, - polygonStart: function() { stream.polygonStart(); resample.lineStart = ringStart; }, - polygonEnd: function() { stream.polygonEnd(); resample.lineStart = lineStart; } - }; + case boolTag: + case dateTag: + case numberTag: + // Coerce booleans to `1` or `0` and dates to milliseconds. + // Invalid dates are coerced to `NaN`. + return eq(+object, +other); - function point(x, y) { - x = project(x, y); - stream.point(x[0], x[1]); - } + case errorTag: + return object.name == other.name && object.message == other.message; - function lineStart() { - x0 = NaN; - resample.point = linePoint; - stream.lineStart(); - } + case regexpTag: + case stringTag: + // Coerce regexes to strings and treat strings, primitives and objects, + // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring + // for more details. + return object == (other + ''); - function linePoint(λ, φ) { - var c = d3_geo_cartesian([λ, φ]), p = project(λ, φ); - resampleLineTo(x0, y0, λ0, a0, b0, c0, x0 = p[0], y0 = p[1], λ0 = λ, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream); - stream.point(x0, y0); - } + case mapTag: + var convert = mapToArray; - function lineEnd() { - resample.point = point; - stream.lineEnd(); - } + case setTag: + var isPartial = bitmask & COMPARE_PARTIAL_FLAG; + convert || (convert = setToArray); - function ringStart() { - lineStart(); - resample.point = ringPoint; - resample.lineEnd = ringEnd; - } + if (object.size != other.size && !isPartial) { + return false; + } + // Assume cyclic values are equal. + var stacked = stack.get(object); + if (stacked) { + return stacked == other; + } + bitmask |= COMPARE_UNORDERED_FLAG; - function ringPoint(λ, φ) { - linePoint(λ00 = λ, φ00 = φ), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0; - resample.point = linePoint; - } + // Recursively compare objects (susceptible to call stack limits). + stack.set(object, other); + var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack); + stack['delete'](object); + return result; - function ringEnd() { - resampleLineTo(x0, y0, λ0, a0, b0, c0, x00, y00, λ00, a00, b00, c00, maxDepth, stream); - resample.lineEnd = lineEnd; - lineEnd(); + case symbolTag: + if (symbolValueOf) { + return symbolValueOf.call(object) == symbolValueOf.call(other); + } + } + return false; } - return resample; - } + /** + * A specialized version of `baseIsEqualDeep` for objects with support for + * partial deep comparisons. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. + * @param {Function} customizer The function to customize comparisons. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Object} stack Tracks traversed `object` and `other` objects. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + */ + function equalObjects(object, other, bitmask, customizer, equalFunc, stack) { + var isPartial = bitmask & COMPARE_PARTIAL_FLAG, + objProps = getAllKeys(object), + objLength = objProps.length, + othProps = getAllKeys(other), + othLength = othProps.length; + + if (objLength != othLength && !isPartial) { + return false; + } + var index = objLength; + while (index--) { + var key = objProps[index]; + if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) { + return false; + } + } + // Assume cyclic values are equal. + var stacked = stack.get(object); + if (stacked && stack.get(other)) { + return stacked == other; + } + var result = true; + stack.set(object, other); + stack.set(other, object); + + var skipCtor = isPartial; + while (++index < objLength) { + key = objProps[index]; + var objValue = object[key], + othValue = other[key]; + + if (customizer) { + var compared = isPartial + ? customizer(othValue, objValue, key, other, object, stack) + : customizer(objValue, othValue, key, object, other, stack); + } + // Recursively compare objects (susceptible to call stack limits). + if (!(compared === undefined + ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack)) + : compared + )) { + result = false; + break; + } + skipCtor || (skipCtor = key == 'constructor'); + } + if (result && !skipCtor) { + var objCtor = object.constructor, + othCtor = other.constructor; - function resampleLineTo(x0, y0, λ0, a0, b0, c0, x1, y1, λ1, a1, b1, c1, depth, stream) { - var dx = x1 - x0, - dy = y1 - y0, - d2 = dx * dx + dy * dy; - if (d2 > 4 * δ2 && depth--) { - var a = a0 + a1, - b = b0 + b1, - c = c0 + c1, - m = Math.sqrt(a * a + b * b + c * c), - φ2 = Math.asin(c /= m), - λ2 = abs(abs(c) - 1) < ε || abs(λ0 - λ1) < ε ? (λ0 + λ1) / 2 : Math.atan2(b, a), - p = project(λ2, φ2), - x2 = p[0], - y2 = p[1], - dx2 = x2 - x0, - dy2 = y2 - y0, - dz = dy * dx2 - dx * dy2; - if (dz * dz / d2 > δ2 // perpendicular projected distance - || abs((dx * dx2 + dy * dy2) / d2 - .5) > .3 // midpoint close to an end - || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) { // angular distance - resampleLineTo(x0, y0, λ0, a0, b0, c0, x2, y2, λ2, a /= m, b /= m, c, depth, stream); - stream.point(x2, y2); - resampleLineTo(x2, y2, λ2, a, b, c, x1, y1, λ1, a1, b1, c1, depth, stream); + // Non `Object` object instances with different constructors are not equal. + if (objCtor != othCtor && + ('constructor' in object && 'constructor' in other) && + !(typeof objCtor == 'function' && objCtor instanceof objCtor && + typeof othCtor == 'function' && othCtor instanceof othCtor)) { + result = false; + } } + stack['delete'](object); + stack['delete'](other); + return result; } - } - - resample.precision = function(_) { - if (!arguments.length) return Math.sqrt(δ2); - maxDepth = (δ2 = _ * _) > 0 && 16; - return resample; - }; - return resample; -} + /** + * A specialized version of `baseRest` which flattens the rest array. + * + * @private + * @param {Function} func The function to apply a rest parameter to. + * @returns {Function} Returns the new function. + */ + function flatRest(func) { + return setToString(overRest(func, undefined, flatten), func + ''); + } -d3.geo.path = function() { - var pointRadius = 4.5, - projection, - context, - projectStream, - contextStream, - cacheStream; + /** + * Creates an array of own enumerable property names and symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names and symbols. + */ + function getAllKeys(object) { + return baseGetAllKeys(object, keys, getSymbols); + } - function path(object) { - if (object) { - if (typeof pointRadius === "function") contextStream.pointRadius(+pointRadius.apply(this, arguments)); - if (!cacheStream || !cacheStream.valid) cacheStream = projectStream(contextStream); - d3.geo.stream(object, cacheStream); + /** + * Creates an array of own and inherited enumerable property names and + * symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names and symbols. + */ + function getAllKeysIn(object) { + return baseGetAllKeys(object, keysIn, getSymbolsIn); } - return contextStream.result(); - } - path.area = function(object) { - d3_geo_pathAreaSum = 0; - d3.geo.stream(object, projectStream(d3_geo_pathArea)); - return d3_geo_pathAreaSum; - }; + /** + * Gets metadata for `func`. + * + * @private + * @param {Function} func The function to query. + * @returns {*} Returns the metadata for `func`. + */ + var getData = !metaMap ? noop : function(func) { + return metaMap.get(func); + }; - path.centroid = function(object) { - d3_geo_centroidX0 = d3_geo_centroidY0 = d3_geo_centroidZ0 = - d3_geo_centroidX1 = d3_geo_centroidY1 = d3_geo_centroidZ1 = - d3_geo_centroidX2 = d3_geo_centroidY2 = d3_geo_centroidZ2 = 0; - d3.geo.stream(object, projectStream(d3_geo_pathCentroid)); - return d3_geo_centroidZ2 ? [d3_geo_centroidX2 / d3_geo_centroidZ2, d3_geo_centroidY2 / d3_geo_centroidZ2] - : d3_geo_centroidZ1 ? [d3_geo_centroidX1 / d3_geo_centroidZ1, d3_geo_centroidY1 / d3_geo_centroidZ1] - : d3_geo_centroidZ0 ? [d3_geo_centroidX0 / d3_geo_centroidZ0, d3_geo_centroidY0 / d3_geo_centroidZ0] - : [NaN, NaN]; - }; + /** + * Gets the name of `func`. + * + * @private + * @param {Function} func The function to query. + * @returns {string} Returns the function name. + */ + function getFuncName(func) { + var result = (func.name + ''), + array = realNames[result], + length = hasOwnProperty.call(realNames, result) ? array.length : 0; - path.bounds = function(object) { - d3_geo_pathBoundsX1 = d3_geo_pathBoundsY1 = -(d3_geo_pathBoundsX0 = d3_geo_pathBoundsY0 = Infinity); - d3.geo.stream(object, projectStream(d3_geo_pathBounds)); - return [[d3_geo_pathBoundsX0, d3_geo_pathBoundsY0], [d3_geo_pathBoundsX1, d3_geo_pathBoundsY1]]; - }; + while (length--) { + var data = array[length], + otherFunc = data.func; + if (otherFunc == null || otherFunc == func) { + return data.name; + } + } + return result; + } - path.projection = function(_) { - if (!arguments.length) return projection; - projectStream = (projection = _) ? _.stream || d3_geo_pathProjectStream(_) : d3_identity; - return reset(); - }; - - path.context = function(_) { - if (!arguments.length) return context; - contextStream = (context = _) == null ? new d3_geo_pathBuffer : new d3_geo_pathContext(_); - if (typeof pointRadius !== "function") contextStream.pointRadius(pointRadius); - return reset(); - }; + /** + * Gets the argument placeholder value for `func`. + * + * @private + * @param {Function} func The function to inspect. + * @returns {*} Returns the placeholder value. + */ + function getHolder(func) { + var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func; + return object.placeholder; + } - path.pointRadius = function(_) { - if (!arguments.length) return pointRadius; - pointRadius = typeof _ === "function" ? _ : (contextStream.pointRadius(+_), +_); - return path; - }; + /** + * Gets the appropriate "iteratee" function. If `_.iteratee` is customized, + * this function returns the custom method, otherwise it returns `baseIteratee`. + * If arguments are provided, the chosen function is invoked with them and + * its result is returned. + * + * @private + * @param {*} [value] The value to convert to an iteratee. + * @param {number} [arity] The arity of the created iteratee. + * @returns {Function} Returns the chosen function or its result. + */ + function getIteratee() { + var result = lodash.iteratee || iteratee; + result = result === iteratee ? baseIteratee : result; + return arguments.length ? result(arguments[0], arguments[1]) : result; + } - function reset() { - cacheStream = null; - return path; - } + /** + * Gets the data for `map`. + * + * @private + * @param {Object} map The map to query. + * @param {string} key The reference key. + * @returns {*} Returns the map data. + */ + function getMapData(map, key) { + var data = map.__data__; + return isKeyable(key) + ? data[typeof key == 'string' ? 'string' : 'hash'] + : data.map; + } - return path.projection(d3.geo.albersUsa()).context(null); -}; + /** + * Gets the property names, values, and compare flags of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the match data of `object`. + */ + function getMatchData(object) { + var result = keys(object), + length = result.length; -function d3_geo_pathProjectStream(project) { - var resample = d3_geo_resample(function(x, y) { return project([x * d3_degrees, y * d3_degrees]); }); - return function(stream) { return d3_geo_projectionRadians(resample(stream)); }; -} + while (length--) { + var key = result[length], + value = object[key]; -d3.geo.transform = function(methods) { - return { - stream: function(stream) { - var transform = new d3_geo_transform(stream); - for (var k in methods) transform[k] = methods[k]; - return transform; + result[length] = [key, value, isStrictComparable(value)]; + } + return result; } - }; -}; - -function d3_geo_transform(stream) { - this.stream = stream; -} - -d3_geo_transform.prototype = { - point: function(x, y) { this.stream.point(x, y); }, - sphere: function() { this.stream.sphere(); }, - lineStart: function() { this.stream.lineStart(); }, - lineEnd: function() { this.stream.lineEnd(); }, - polygonStart: function() { this.stream.polygonStart(); }, - polygonEnd: function() { this.stream.polygonEnd(); } -}; -function d3_geo_transformPoint(stream, point) { - return { - point: point, - sphere: function() { stream.sphere(); }, - lineStart: function() { stream.lineStart(); }, - lineEnd: function() { stream.lineEnd(); }, - polygonStart: function() { stream.polygonStart(); }, - polygonEnd: function() { stream.polygonEnd(); }, - }; -} + /** + * Gets the native function at `key` of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {string} key The key of the method to get. + * @returns {*} Returns the function if it's native, else `undefined`. + */ + function getNative(object, key) { + var value = getValue(object, key); + return baseIsNative(value) ? value : undefined; + } -d3.geo.projection = d3_geo_projection; -d3.geo.projectionMutator = d3_geo_projectionMutator; + /** + * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the raw `toStringTag`. + */ + function getRawTag(value) { + var isOwn = hasOwnProperty.call(value, symToStringTag), + tag = value[symToStringTag]; -function d3_geo_projection(project) { - return d3_geo_projectionMutator(function() { return project; })(); -} + try { + value[symToStringTag] = undefined; + var unmasked = true; + } catch (e) {} + + var result = nativeObjectToString.call(value); + if (unmasked) { + if (isOwn) { + value[symToStringTag] = tag; + } else { + delete value[symToStringTag]; + } + } + return result; + } -function d3_geo_projectionMutator(projectAt) { - var project, - rotate, - projectRotate, - projectResample = d3_geo_resample(function(x, y) { x = project(x, y); return [x[0] * k + δx, δy - x[1] * k]; }), - k = 150, // scale - x = 480, y = 250, // translate - λ = 0, φ = 0, // center - δλ = 0, δφ = 0, δγ = 0, // rotate - δx, δy, // center - preclip = d3_geo_clipAntimeridian, - postclip = d3_identity, - clipAngle = null, - clipExtent = null, - stream; + /** + * Creates an array of the own enumerable symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of symbols. + */ + var getSymbols = !nativeGetSymbols ? stubArray : function(object) { + if (object == null) { + return []; + } + object = Object(object); + return arrayFilter(nativeGetSymbols(object), function(symbol) { + return propertyIsEnumerable.call(object, symbol); + }); + }; - function projection(point) { - point = projectRotate(point[0] * d3_radians, point[1] * d3_radians); - return [point[0] * k + δx, δy - point[1] * k]; - } + /** + * Creates an array of the own and inherited enumerable symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of symbols. + */ + var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) { + var result = []; + while (object) { + arrayPush(result, getSymbols(object)); + object = getPrototype(object); + } + return result; + }; - function invert(point) { - point = projectRotate.invert((point[0] - δx) / k, (δy - point[1]) / k); - return point && [point[0] * d3_degrees, point[1] * d3_degrees]; - } + /** + * Gets the `toStringTag` of `value`. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the `toStringTag`. + */ + var getTag = baseGetTag; + + // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6. + if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) || + (Map && getTag(new Map) != mapTag) || + (Promise && getTag(Promise.resolve()) != promiseTag) || + (Set && getTag(new Set) != setTag) || + (WeakMap && getTag(new WeakMap) != weakMapTag)) { + getTag = function(value) { + var result = baseGetTag(value), + Ctor = result == objectTag ? value.constructor : undefined, + ctorString = Ctor ? toSource(Ctor) : ''; + + if (ctorString) { + switch (ctorString) { + case dataViewCtorString: return dataViewTag; + case mapCtorString: return mapTag; + case promiseCtorString: return promiseTag; + case setCtorString: return setTag; + case weakMapCtorString: return weakMapTag; + } + } + return result; + }; + } - projection.stream = function(output) { - if (stream) stream.valid = false; - stream = d3_geo_projectionRadians(preclip(rotate, projectResample(postclip(output)))); - stream.valid = true; // allow caching by d3.geo.path - return stream; - }; + /** + * Gets the view, applying any `transforms` to the `start` and `end` positions. + * + * @private + * @param {number} start The start of the view. + * @param {number} end The end of the view. + * @param {Array} transforms The transformations to apply to the view. + * @returns {Object} Returns an object containing the `start` and `end` + * positions of the view. + */ + function getView(start, end, transforms) { + var index = -1, + length = transforms.length; - projection.clipAngle = function(_) { - if (!arguments.length) return clipAngle; - preclip = _ == null ? (clipAngle = _, d3_geo_clipAntimeridian) : d3_geo_clipCircle((clipAngle = +_) * d3_radians); - return invalidate(); - }; + while (++index < length) { + var data = transforms[index], + size = data.size; - projection.clipExtent = function(_) { - if (!arguments.length) return clipExtent; - clipExtent = _; - postclip = _ ? d3_geo_clipExtent(_[0][0], _[0][1], _[1][0], _[1][1]) : d3_identity; - return invalidate(); - }; + switch (data.type) { + case 'drop': start += size; break; + case 'dropRight': end -= size; break; + case 'take': end = nativeMin(end, start + size); break; + case 'takeRight': start = nativeMax(start, end - size); break; + } + } + return { 'start': start, 'end': end }; + } - projection.scale = function(_) { - if (!arguments.length) return k; - k = +_; - return reset(); - }; + /** + * Extracts wrapper details from the `source` body comment. + * + * @private + * @param {string} source The source to inspect. + * @returns {Array} Returns the wrapper details. + */ + function getWrapDetails(source) { + var match = source.match(reWrapDetails); + return match ? match[1].split(reSplitDetails) : []; + } - projection.translate = function(_) { - if (!arguments.length) return [x, y]; - x = +_[0]; - y = +_[1]; - return reset(); - }; + /** + * Checks if `path` exists on `object`. + * + * @private + * @param {Object} object The object to query. + * @param {Array|string} path The path to check. + * @param {Function} hasFunc The function to check properties. + * @returns {boolean} Returns `true` if `path` exists, else `false`. + */ + function hasPath(object, path, hasFunc) { + path = castPath(path, object); - projection.center = function(_) { - if (!arguments.length) return [λ * d3_degrees, φ * d3_degrees]; - λ = _[0] % 360 * d3_radians; - φ = _[1] % 360 * d3_radians; - return reset(); - }; + var index = -1, + length = path.length, + result = false; - projection.rotate = function(_) { - if (!arguments.length) return [δλ * d3_degrees, δφ * d3_degrees, δγ * d3_degrees]; - δλ = _[0] % 360 * d3_radians; - δφ = _[1] % 360 * d3_radians; - δγ = _.length > 2 ? _[2] % 360 * d3_radians : 0; - return reset(); - }; + while (++index < length) { + var key = toKey(path[index]); + if (!(result = object != null && hasFunc(object, key))) { + break; + } + object = object[key]; + } + if (result || ++index != length) { + return result; + } + length = object == null ? 0 : object.length; + return !!length && isLength(length) && isIndex(key, length) && + (isArray(object) || isArguments(object)); + } - d3.rebind(projection, projectResample, "precision"); + /** + * Initializes an array clone. + * + * @private + * @param {Array} array The array to clone. + * @returns {Array} Returns the initialized clone. + */ + function initCloneArray(array) { + var length = array.length, + result = array.constructor(length); + + // Add properties assigned by `RegExp#exec`. + if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) { + result.index = array.index; + result.input = array.input; + } + return result; + } - function reset() { - projectRotate = d3_geo_compose(rotate = d3_geo_rotation(δλ, δφ, δγ), project); - var center = project(λ, φ); - δx = x - center[0] * k; - δy = y + center[1] * k; - return invalidate(); - } + /** + * Initializes an object clone. + * + * @private + * @param {Object} object The object to clone. + * @returns {Object} Returns the initialized clone. + */ + function initCloneObject(object) { + return (typeof object.constructor == 'function' && !isPrototype(object)) + ? baseCreate(getPrototype(object)) + : {}; + } - function invalidate() { - if (stream) stream.valid = false, stream = null; - return projection; - } + /** + * Initializes an object clone based on its `toStringTag`. + * + * **Note:** This function only supports cloning values with tags of + * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`. + * + * @private + * @param {Object} object The object to clone. + * @param {string} tag The `toStringTag` of the object to clone. + * @param {Function} cloneFunc The function to clone values. + * @param {boolean} [isDeep] Specify a deep clone. + * @returns {Object} Returns the initialized clone. + */ + function initCloneByTag(object, tag, cloneFunc, isDeep) { + var Ctor = object.constructor; + switch (tag) { + case arrayBufferTag: + return cloneArrayBuffer(object); - return function() { - project = projectAt.apply(this, arguments); - projection.invert = project.invert && invert; - return reset(); - }; -} + case boolTag: + case dateTag: + return new Ctor(+object); -function d3_geo_projectionRadians(stream) { - return d3_geo_transformPoint(stream, function(x, y) { - stream.point(x * d3_radians, y * d3_radians); - }); -} + case dataViewTag: + return cloneDataView(object, isDeep); -function d3_geo_mercator(λ, φ) { - return [λ, Math.log(Math.tan(π / 4 + φ / 2))]; -} + case float32Tag: case float64Tag: + case int8Tag: case int16Tag: case int32Tag: + case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag: + return cloneTypedArray(object, isDeep); -d3_geo_mercator.invert = function(x, y) { - return [x, 2 * Math.atan(Math.exp(y)) - halfπ]; -}; + case mapTag: + return cloneMap(object, isDeep, cloneFunc); -function d3_geo_mercatorProjection(project) { - var m = d3_geo_projection(project), - scale = m.scale, - translate = m.translate, - clipExtent = m.clipExtent, - clipAuto; + case numberTag: + case stringTag: + return new Ctor(object); - m.scale = function() { - var v = scale.apply(m, arguments); - return v === m ? (clipAuto ? m.clipExtent(null) : m) : v; - }; + case regexpTag: + return cloneRegExp(object); - m.translate = function() { - var v = translate.apply(m, arguments); - return v === m ? (clipAuto ? m.clipExtent(null) : m) : v; - }; + case setTag: + return cloneSet(object, isDeep, cloneFunc); - m.clipExtent = function(_) { - var v = clipExtent.apply(m, arguments); - if (v === m) { - if (clipAuto = _ == null) { - var k = π * scale(), t = translate(); - clipExtent([[t[0] - k, t[1] - k], [t[0] + k, t[1] + k]]); + case symbolTag: + return cloneSymbol(object); } - } else if (clipAuto) { - v = null; } - return v; - }; - return m.clipExtent(null); -} + /** + * Inserts wrapper `details` in a comment at the top of the `source` body. + * + * @private + * @param {string} source The source to modify. + * @returns {Array} details The details to insert. + * @returns {string} Returns the modified source. + */ + function insertWrapDetails(source, details) { + var length = details.length; + if (!length) { + return source; + } + var lastIndex = length - 1; + details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex]; + details = details.join(length > 2 ? ', ' : ' '); + return source.replace(reWrapComment, '{\n/* [wrapped with ' + details + '] */\n'); + } -(d3.geo.mercator = function() { - return d3_geo_mercatorProjection(d3_geo_mercator); -}).raw = d3_geo_mercator; -d3.geom = {}; + /** + * Checks if `value` is a flattenable `arguments` object or array. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is flattenable, else `false`. + */ + function isFlattenable(value) { + return isArray(value) || isArguments(value) || + !!(spreadableSymbol && value && value[spreadableSymbol]); + } -d3.geom.polygon = function(coordinates) { - d3_subclass(coordinates, d3_geom_polygonPrototype); - return coordinates; -}; + /** + * Checks if `value` is a valid array-like index. + * + * @private + * @param {*} value The value to check. + * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. + * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. + */ + function isIndex(value, length) { + length = length == null ? MAX_SAFE_INTEGER : length; + return !!length && + (typeof value == 'number' || reIsUint.test(value)) && + (value > -1 && value % 1 == 0 && value < length); + } -var d3_geom_polygonPrototype = d3.geom.polygon.prototype = []; + /** + * Checks if the given arguments are from an iteratee call. + * + * @private + * @param {*} value The potential iteratee value argument. + * @param {*} index The potential iteratee index or key argument. + * @param {*} object The potential iteratee object argument. + * @returns {boolean} Returns `true` if the arguments are from an iteratee call, + * else `false`. + */ + function isIterateeCall(value, index, object) { + if (!isObject(object)) { + return false; + } + var type = typeof index; + if (type == 'number' + ? (isArrayLike(object) && isIndex(index, object.length)) + : (type == 'string' && index in object) + ) { + return eq(object[index], value); + } + return false; + } -d3_geom_polygonPrototype.area = function() { - var i = -1, - n = this.length, - a, - b = this[n - 1], - area = 0; + /** + * Checks if `value` is a property name and not a property path. + * + * @private + * @param {*} value The value to check. + * @param {Object} [object] The object to query keys on. + * @returns {boolean} Returns `true` if `value` is a property name, else `false`. + */ + function isKey(value, object) { + if (isArray(value)) { + return false; + } + var type = typeof value; + if (type == 'number' || type == 'symbol' || type == 'boolean' || + value == null || isSymbol(value)) { + return true; + } + return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || + (object != null && value in Object(object)); + } - while (++i < n) { - a = b; - b = this[i]; - area += a[1] * b[0] - a[0] * b[1]; - } + /** + * Checks if `value` is suitable for use as unique object key. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is suitable, else `false`. + */ + function isKeyable(value) { + var type = typeof value; + return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean') + ? (value !== '__proto__') + : (value === null); + } - return area * .5; -}; + /** + * Checks if `func` has a lazy counterpart. + * + * @private + * @param {Function} func The function to check. + * @returns {boolean} Returns `true` if `func` has a lazy counterpart, + * else `false`. + */ + function isLaziable(func) { + var funcName = getFuncName(func), + other = lodash[funcName]; -d3_geom_polygonPrototype.centroid = function(k) { - var i = -1, - n = this.length, - x = 0, - y = 0, - a, - b = this[n - 1], - c; + if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) { + return false; + } + if (func === other) { + return true; + } + var data = getData(other); + return !!data && func === data[0]; + } - if (!arguments.length) k = -1 / (6 * this.area()); + /** + * Checks if `func` has its source masked. + * + * @private + * @param {Function} func The function to check. + * @returns {boolean} Returns `true` if `func` is masked, else `false`. + */ + function isMasked(func) { + return !!maskSrcKey && (maskSrcKey in func); + } - while (++i < n) { - a = b; - b = this[i]; - c = a[0] * b[1] - b[0] * a[1]; - x += (a[0] + b[0]) * c; - y += (a[1] + b[1]) * c; - } + /** + * Checks if `func` is capable of being masked. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `func` is maskable, else `false`. + */ + var isMaskable = coreJsData ? isFunction : stubFalse; - return [x * k, y * k]; -}; + /** + * Checks if `value` is likely a prototype object. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a prototype, else `false`. + */ + function isPrototype(value) { + var Ctor = value && value.constructor, + proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto; -// The Sutherland-Hodgman clipping algorithm. -// Note: requires the clip polygon to be counterclockwise and convex. -d3_geom_polygonPrototype.clip = function(subject) { - var input, - closed = d3_geom_polygonClosed(subject), - i = -1, - n = this.length - d3_geom_polygonClosed(this), - j, - m, - a = this[n - 1], - b, - c, - d; + return value === proto; + } - while (++i < n) { - input = subject.slice(); - subject.length = 0; - b = this[i]; - c = input[(m = input.length - closed) - 1]; - j = -1; - while (++j < m) { - d = input[j]; - if (d3_geom_polygonInside(d, a, b)) { - if (!d3_geom_polygonInside(c, a, b)) { - subject.push(d3_geom_polygonIntersect(c, d, a, b)); - } - subject.push(d); - } else if (d3_geom_polygonInside(c, a, b)) { - subject.push(d3_geom_polygonIntersect(c, d, a, b)); - } - c = d; - } - if (closed) subject.push(subject[0]); - a = b; - } - - return subject; -}; - -function d3_geom_polygonInside(p, a, b) { - return (b[0] - a[0]) * (p[1] - a[1]) < (b[1] - a[1]) * (p[0] - a[0]); -} - -// Intersect two infinite lines cd and ab. -function d3_geom_polygonIntersect(c, d, a, b) { - var x1 = c[0], x3 = a[0], x21 = d[0] - x1, x43 = b[0] - x3, - y1 = c[1], y3 = a[1], y21 = d[1] - y1, y43 = b[1] - y3, - ua = (x43 * (y1 - y3) - y43 * (x1 - x3)) / (y43 * x21 - x43 * y21); - return [x1 + ua * x21, y1 + ua * y21]; -} - -// Returns true if the polygon is closed. -function d3_geom_polygonClosed(coordinates) { - var a = coordinates[0], - b = coordinates[coordinates.length - 1]; - return !(a[0] - b[0] || a[1] - b[1]); -} -function d3_geom_pointX(d) { - return d[0]; -} - -function d3_geom_pointY(d) { - return d[1]; -} - -/** - * Computes the 2D convex hull of a set of points using the monotone chain - * algorithm: - * http://en.wikibooks.org/wiki/Algorithm_Implementation/Geometry/Convex_hull/Monotone_chain) - * - * The runtime of this algorithm is O(n log n), where n is the number of input - * points. However in practice it outperforms other O(n log n) hulls. - * - * @param vertices [[x1, y1], [x2, y2], ...] - * @returns polygon [[x1, y1], [x2, y2], ...] - */ -d3.geom.hull = function(vertices) { - var x = d3_geom_pointX, - y = d3_geom_pointY; - - if (arguments.length) return hull(vertices); - - function hull(data) { - // Hull of < 3 points is not well-defined - if (data.length < 3) return []; - - var fx = d3_functor(x), - fy = d3_functor(y), - i, - n = data.length, - points = [], // of the form [[x0, y0, 0], ..., [xn, yn, n]] - flippedPoints = []; - - for (i = 0 ; i < n; i++) { - points.push([+fx.call(this, data[i], i), +fy.call(this, data[i], i), i]); + /** + * Checks if `value` is suitable for strict equality comparisons, i.e. `===`. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` if suitable for strict + * equality comparisons, else `false`. + */ + function isStrictComparable(value) { + return value === value && !isObject(value); } - // sort ascending by x-coord first, y-coord second - points.sort(d3_geom_hullOrder); - - // we flip bottommost points across y axis so we can use the upper hull routine on both - for (i = 0; i < n; i++) flippedPoints.push([points[i][0], -points[i][1]]); - - var upper = d3_geom_hullUpper(points), - lower = d3_geom_hullUpper(flippedPoints); - - // construct the polygon, removing possible duplicate endpoints - var skipLeft = lower[0] === upper[0], - skipRight = lower[lower.length - 1] === upper[upper.length - 1], - polygon = []; + /** + * A specialized version of `matchesProperty` for source values suitable + * for strict equality comparisons, i.e. `===`. + * + * @private + * @param {string} key The key of the property to get. + * @param {*} srcValue The value to match. + * @returns {Function} Returns the new spec function. + */ + function matchesStrictComparable(key, srcValue) { + return function(object) { + if (object == null) { + return false; + } + return object[key] === srcValue && + (srcValue !== undefined || (key in Object(object))); + }; + } - // add upper hull in r->l order - // then add lower hull in l->r order - for (i = upper.length - 1; i >= 0; --i) polygon.push(data[points[upper[i]][2]]); - for (i = +skipLeft; i < lower.length - skipRight; ++i) polygon.push(data[points[lower[i]][2]]); + /** + * A specialized version of `_.memoize` which clears the memoized function's + * cache when it exceeds `MAX_MEMOIZE_SIZE`. + * + * @private + * @param {Function} func The function to have its output memoized. + * @returns {Function} Returns the new memoized function. + */ + function memoizeCapped(func) { + var result = memoize(func, function(key) { + if (cache.size === MAX_MEMOIZE_SIZE) { + cache.clear(); + } + return key; + }); - return polygon; - } + var cache = result.cache; + return result; + } - hull.x = function(_) { - return arguments.length ? (x = _, hull) : x; - }; + /** + * Merges the function metadata of `source` into `data`. + * + * Merging metadata reduces the number of wrappers used to invoke a function. + * This is possible because methods like `_.bind`, `_.curry`, and `_.partial` + * may be applied regardless of execution order. Methods like `_.ary` and + * `_.rearg` modify function arguments, making the order in which they are + * executed important, preventing the merging of metadata. However, we make + * an exception for a safe combined case where curried functions have `_.ary` + * and or `_.rearg` applied. + * + * @private + * @param {Array} data The destination metadata. + * @param {Array} source The source metadata. + * @returns {Array} Returns `data`. + */ + function mergeData(data, source) { + var bitmask = data[1], + srcBitmask = source[1], + newBitmask = bitmask | srcBitmask, + isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG); + + var isCombo = + ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) || + ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) || + ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG)); + + // Exit early if metadata can't be merged. + if (!(isCommon || isCombo)) { + return data; + } + // Use source `thisArg` if available. + if (srcBitmask & WRAP_BIND_FLAG) { + data[2] = source[2]; + // Set when currying a bound function. + newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG; + } + // Compose partial arguments. + var value = source[3]; + if (value) { + var partials = data[3]; + data[3] = partials ? composeArgs(partials, value, source[4]) : value; + data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4]; + } + // Compose partial right arguments. + value = source[5]; + if (value) { + partials = data[5]; + data[5] = partials ? composeArgsRight(partials, value, source[6]) : value; + data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6]; + } + // Use source `argPos` if available. + value = source[7]; + if (value) { + data[7] = value; + } + // Use source `ary` if it's smaller. + if (srcBitmask & WRAP_ARY_FLAG) { + data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]); + } + // Use source `arity` if one is not provided. + if (data[9] == null) { + data[9] = source[9]; + } + // Use source `func` and merge bitmasks. + data[0] = source[0]; + data[1] = newBitmask; - hull.y = function(_) { - return arguments.length ? (y = _, hull) : y; - }; + return data; + } - return hull; -}; + /** + * This function is like + * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) + * except that it includes inherited enumerable properties. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + */ + function nativeKeysIn(object) { + var result = []; + if (object != null) { + for (var key in Object(object)) { + result.push(key); + } + } + return result; + } -// finds the 'upper convex hull' (see wiki link above) -// assumes points arg has >=3 elements, is sorted by x, unique in y -// returns array of indices into points in left to right order -function d3_geom_hullUpper(points) { - var n = points.length, - hull = [0, 1], - hs = 2; // hull size + /** + * Converts `value` to a string using `Object.prototype.toString`. + * + * @private + * @param {*} value The value to convert. + * @returns {string} Returns the converted string. + */ + function objectToString(value) { + return nativeObjectToString.call(value); + } - for (var i = 2; i < n; i++) { - while (hs > 1 && d3_cross2d(points[hull[hs-2]], points[hull[hs-1]], points[i]) <= 0) --hs; - hull[hs++] = i; - } + /** + * A specialized version of `baseRest` which transforms the rest array. + * + * @private + * @param {Function} func The function to apply a rest parameter to. + * @param {number} [start=func.length-1] The start position of the rest parameter. + * @param {Function} transform The rest array transform. + * @returns {Function} Returns the new function. + */ + function overRest(func, start, transform) { + start = nativeMax(start === undefined ? (func.length - 1) : start, 0); + return function() { + var args = arguments, + index = -1, + length = nativeMax(args.length - start, 0), + array = Array(length); - // we slice to make sure that the points we 'popped' from hull don't stay behind - return hull.slice(0, hs); -} + while (++index < length) { + array[index] = args[start + index]; + } + index = -1; + var otherArgs = Array(start + 1); + while (++index < start) { + otherArgs[index] = args[index]; + } + otherArgs[start] = transform(array); + return apply(func, this, otherArgs); + }; + } -// comparator for ascending sort by x-coord first, y-coord second -function d3_geom_hullOrder(a, b) { - return a[0] - b[0] || a[1] - b[1]; -} -// import "../transition/transition"; + /** + * Gets the parent value at `path` of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {Array} path The path to get the parent value of. + * @returns {*} Returns the parent value. + */ + function parent(object, path) { + return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1)); + } -d3_selectionPrototype.transition = function(name) { - var id = d3_transitionInheritId || ++d3_transitionId, - ns = d3_transitionNamespace(name), - subgroups = [], - subgroup, - node, - transition = d3_transitionInherit || {time: Date.now(), ease: d3_ease_cubicInOut, delay: 0, duration: 250}; + /** + * Reorder `array` according to the specified indexes where the element at + * the first index is assigned as the first element, the element at + * the second index is assigned as the second element, and so on. + * + * @private + * @param {Array} array The array to reorder. + * @param {Array} indexes The arranged array indexes. + * @returns {Array} Returns `array`. + */ + function reorder(array, indexes) { + var arrLength = array.length, + length = nativeMin(indexes.length, arrLength), + oldArray = copyArray(array); - for (var j = -1, m = this.length; ++j < m;) { - subgroups.push(subgroup = []); - for (var group = this[j], i = -1, n = group.length; ++i < n;) { - if (node = group[i]) d3_transitionNode(node, i, ns, id, transition); - subgroup.push(node); + while (length--) { + var index = indexes[length]; + array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined; + } + return array; } - } - return d3_transition(subgroups, ns, id); -}; -// import "../transition/transition"; + /** + * Sets metadata for `func`. + * + * **Note:** If this function becomes hot, i.e. is invoked a lot in a short + * period of time, it will trip its breaker and transition to an identity + * function to avoid garbage collection pauses in V8. See + * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070) + * for more details. + * + * @private + * @param {Function} func The function to associate metadata with. + * @param {*} data The metadata. + * @returns {Function} Returns `func`. + */ + var setData = shortOut(baseSetData); -// TODO Interrupt transitions for all namespaces? -d3_selectionPrototype.interrupt = function(name) { - return this.each(name == null - ? d3_selection_interrupt - : d3_selection_interruptNS(d3_transitionNamespace(name))); -}; + /** + * A simple wrapper around the global [`setTimeout`](https://mdn.io/setTimeout). + * + * @private + * @param {Function} func The function to delay. + * @param {number} wait The number of milliseconds to delay invocation. + * @returns {number|Object} Returns the timer id or timeout object. + */ + var setTimeout = ctxSetTimeout || function(func, wait) { + return root.setTimeout(func, wait); + }; -var d3_selection_interrupt = d3_selection_interruptNS(d3_transitionNamespace()); + /** + * Sets the `toString` method of `func` to return `string`. + * + * @private + * @param {Function} func The function to modify. + * @param {Function} string The `toString` result. + * @returns {Function} Returns `func`. + */ + var setToString = shortOut(baseSetToString); -function d3_selection_interruptNS(ns) { - return function() { - var lock, active; - if ((lock = this[ns]) && (active = lock[lock.active])) { - if (--lock.count) delete lock[lock.active]; - else delete this[ns]; - lock.active += .5; - active.event && active.event.interrupt.call(this, this.__data__, active.index); + /** + * Sets the `toString` method of `wrapper` to mimic the source of `reference` + * with wrapper details in a comment at the top of the source body. + * + * @private + * @param {Function} wrapper The function to modify. + * @param {Function} reference The reference function. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @returns {Function} Returns `wrapper`. + */ + function setWrapToString(wrapper, reference, bitmask) { + var source = (reference + ''); + return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask))); } - }; -} -function d3_transition(groups, ns, id) { - d3_subclass(groups, d3_transitionPrototype); + /** + * Creates a function that'll short out and invoke `identity` instead + * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN` + * milliseconds. + * + * @private + * @param {Function} func The function to restrict. + * @returns {Function} Returns the new shortable function. + */ + function shortOut(func) { + var count = 0, + lastCalled = 0; + + return function() { + var stamp = nativeNow(), + remaining = HOT_SPAN - (stamp - lastCalled); + + lastCalled = stamp; + if (remaining > 0) { + if (++count >= HOT_COUNT) { + return arguments[0]; + } + } else { + count = 0; + } + return func.apply(undefined, arguments); + }; + } - // Note: read-only! - groups.namespace = ns; - groups.id = id; + /** + * A specialized version of `_.shuffle` which mutates and sets the size of `array`. + * + * @private + * @param {Array} array The array to shuffle. + * @param {number} [size=array.length] The size of `array`. + * @returns {Array} Returns `array`. + */ + function shuffleSelf(array, size) { + var index = -1, + length = array.length, + lastIndex = length - 1; - return groups; -} + size = size === undefined ? length : size; + while (++index < size) { + var rand = baseRandom(index, lastIndex), + value = array[rand]; -var d3_transitionPrototype = [], - d3_transitionId = 0, - d3_transitionInheritId, - d3_transitionInherit; + array[rand] = array[index]; + array[index] = value; + } + array.length = size; + return array; + } -d3_transitionPrototype.call = d3_selectionPrototype.call; -d3_transitionPrototype.empty = d3_selectionPrototype.empty; -d3_transitionPrototype.node = d3_selectionPrototype.node; -d3_transitionPrototype.size = d3_selectionPrototype.size; + /** + * Converts `string` to a property path array. + * + * @private + * @param {string} string The string to convert. + * @returns {Array} Returns the property path array. + */ + var stringToPath = memoizeCapped(function(string) { + var result = []; + if (reLeadingDot.test(string)) { + result.push(''); + } + string.replace(rePropName, function(match, number, quote, string) { + result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match)); + }); + return result; + }); -d3.transition = function(selection, name) { - return selection && selection.transition - ? (d3_transitionInheritId ? selection.transition(name) : selection) - : d3.selection().transition(selection); -}; + /** + * Converts `value` to a string key if it's not a string or symbol. + * + * @private + * @param {*} value The value to inspect. + * @returns {string|symbol} Returns the key. + */ + function toKey(value) { + if (typeof value == 'string' || isSymbol(value)) { + return value; + } + var result = (value + ''); + return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; + } -d3.transition.prototype = d3_transitionPrototype; + /** + * Converts `func` to its source code. + * + * @private + * @param {Function} func The function to convert. + * @returns {string} Returns the source code. + */ + function toSource(func) { + if (func != null) { + try { + return funcToString.call(func); + } catch (e) {} + try { + return (func + ''); + } catch (e) {} + } + return ''; + } + /** + * Updates wrapper `details` based on `bitmask` flags. + * + * @private + * @returns {Array} details The details to modify. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @returns {Array} Returns `details`. + */ + function updateWrapDetails(details, bitmask) { + arrayEach(wrapFlags, function(pair) { + var value = '_.' + pair[0]; + if ((bitmask & pair[1]) && !arrayIncludes(details, value)) { + details.push(value); + } + }); + return details.sort(); + } -d3_transitionPrototype.select = function(selector) { - var id = this.id, - ns = this.namespace, - subgroups = [], - subgroup, - subnode, - node; + /** + * Creates a clone of `wrapper`. + * + * @private + * @param {Object} wrapper The wrapper to clone. + * @returns {Object} Returns the cloned wrapper. + */ + function wrapperClone(wrapper) { + if (wrapper instanceof LazyWrapper) { + return wrapper.clone(); + } + var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__); + result.__actions__ = copyArray(wrapper.__actions__); + result.__index__ = wrapper.__index__; + result.__values__ = wrapper.__values__; + return result; + } - selector = d3_selection_selector(selector); + /*------------------------------------------------------------------------*/ - for (var j = -1, m = this.length; ++j < m;) { - subgroups.push(subgroup = []); - for (var group = this[j], i = -1, n = group.length; ++i < n;) { - if ((node = group[i]) && (subnode = selector.call(node, node.__data__, i, j))) { - if ("__data__" in node) subnode.__data__ = node.__data__; - d3_transitionNode(subnode, i, ns, id, node[ns][id]); - subgroup.push(subnode); + /** + * Creates an array of elements split into groups the length of `size`. + * If `array` can't be split evenly, the final chunk will be the remaining + * elements. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to process. + * @param {number} [size=1] The length of each chunk + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Array} Returns the new array of chunks. + * @example + * + * _.chunk(['a', 'b', 'c', 'd'], 2); + * // => [['a', 'b'], ['c', 'd']] + * + * _.chunk(['a', 'b', 'c', 'd'], 3); + * // => [['a', 'b', 'c'], ['d']] + */ + function chunk(array, size, guard) { + if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) { + size = 1; } else { - subgroup.push(null); + size = nativeMax(toInteger(size), 0); } - } - } - - return d3_transition(subgroups, ns, id); -}; + var length = array == null ? 0 : array.length; + if (!length || size < 1) { + return []; + } + var index = 0, + resIndex = 0, + result = Array(nativeCeil(length / size)); -d3_transitionPrototype.selectAll = function(selector) { - var id = this.id, - ns = this.namespace, - subgroups = [], - subgroup, - subnodes, - node, - subnode, - transition; + while (index < length) { + result[resIndex++] = baseSlice(array, index, (index += size)); + } + return result; + } - selector = d3_selection_selectorAll(selector); + /** + * Creates an array with all falsey values removed. The values `false`, `null`, + * `0`, `""`, `undefined`, and `NaN` are falsey. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to compact. + * @returns {Array} Returns the new array of filtered values. + * @example + * + * _.compact([0, 1, false, 2, '', 3]); + * // => [1, 2, 3] + */ + function compact(array) { + var index = -1, + length = array == null ? 0 : array.length, + resIndex = 0, + result = []; - for (var j = -1, m = this.length; ++j < m;) { - for (var group = this[j], i = -1, n = group.length; ++i < n;) { - if (node = group[i]) { - transition = node[ns][id]; - subnodes = selector.call(node, node.__data__, i, j); - subgroups.push(subgroup = []); - for (var k = -1, o = subnodes.length; ++k < o;) { - if (subnode = subnodes[k]) d3_transitionNode(subnode, k, ns, id, transition); - subgroup.push(subnode); + while (++index < length) { + var value = array[index]; + if (value) { + result[resIndex++] = value; } } + return result; } - } - return d3_transition(subgroups, ns, id); -}; - -d3_transitionPrototype.filter = function(filter) { - var subgroups = [], - subgroup, - group, - node; - - if (typeof filter !== "function") filter = d3_selection_filter(filter); + /** + * Creates a new array concatenating `array` with any additional arrays + * and/or values. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to concatenate. + * @param {...*} [values] The values to concatenate. + * @returns {Array} Returns the new concatenated array. + * @example + * + * var array = [1]; + * var other = _.concat(array, 2, [3], [[4]]); + * + * console.log(other); + * // => [1, 2, 3, [4]] + * + * console.log(array); + * // => [1] + */ + function concat() { + var length = arguments.length; + if (!length) { + return []; + } + var args = Array(length - 1), + array = arguments[0], + index = length; - for (var j = 0, m = this.length; j < m; j++) { - subgroups.push(subgroup = []); - for (var group = this[j], i = 0, n = group.length; i < n; i++) { - if ((node = group[i]) && filter.call(node, node.__data__, i, j)) { - subgroup.push(node); + while (index--) { + args[index - 1] = arguments[index]; } + return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1)); } - } - - return d3_transition(subgroups, this.namespace, this.id); -}; -d3.color = d3_color; -function d3_color() {} - -d3_color.prototype.toString = function() { - return this.rgb() + ""; -}; - -d3.hsl = d3_hsl; - -function d3_hsl(h, s, l) { - return this instanceof d3_hsl ? void (this.h = +h, this.s = +s, this.l = +l) - : arguments.length < 2 ? (h instanceof d3_hsl ? new d3_hsl(h.h, h.s, h.l) - : d3_rgb_parse("" + h, d3_rgb_hsl, d3_hsl)) - : new d3_hsl(h, s, l); -} + /** + * Creates an array of `array` values not included in the other given arrays + * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. The order and references of result values are + * determined by the first array. + * + * **Note:** Unlike `_.pullAll`, this method returns a new array. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {...Array} [values] The values to exclude. + * @returns {Array} Returns the new array of filtered values. + * @see _.without, _.xor + * @example + * + * _.difference([2, 1], [2, 3]); + * // => [1] + */ + var difference = baseRest(function(array, values) { + return isArrayLikeObject(array) + ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true)) + : []; + }); -var d3_hslPrototype = d3_hsl.prototype = new d3_color; + /** + * This method is like `_.difference` except that it accepts `iteratee` which + * is invoked for each element of `array` and `values` to generate the criterion + * by which they're compared. The order and references of result values are + * determined by the first array. The iteratee is invoked with one argument: + * (value). + * + * **Note:** Unlike `_.pullAllBy`, this method returns a new array. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {...Array} [values] The values to exclude. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {Array} Returns the new array of filtered values. + * @example + * + * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor); + * // => [1.2] + * + * // The `_.property` iteratee shorthand. + * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x'); + * // => [{ 'x': 2 }] + */ + var differenceBy = baseRest(function(array, values) { + var iteratee = last(values); + if (isArrayLikeObject(iteratee)) { + iteratee = undefined; + } + return isArrayLikeObject(array) + ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2)) + : []; + }); -d3_hslPrototype.brighter = function(k) { - k = Math.pow(0.7, arguments.length ? k : 1); - return new d3_hsl(this.h, this.s, this.l / k); -}; + /** + * This method is like `_.difference` except that it accepts `comparator` + * which is invoked to compare elements of `array` to `values`. The order and + * references of result values are determined by the first array. The comparator + * is invoked with two arguments: (arrVal, othVal). + * + * **Note:** Unlike `_.pullAllWith`, this method returns a new array. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {...Array} [values] The values to exclude. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of filtered values. + * @example + * + * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]; + * + * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual); + * // => [{ 'x': 2, 'y': 1 }] + */ + var differenceWith = baseRest(function(array, values) { + var comparator = last(values); + if (isArrayLikeObject(comparator)) { + comparator = undefined; + } + return isArrayLikeObject(array) + ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator) + : []; + }); -d3_hslPrototype.darker = function(k) { - k = Math.pow(0.7, arguments.length ? k : 1); - return new d3_hsl(this.h, this.s, k * this.l); -}; + /** + * Creates a slice of `array` with `n` elements dropped from the beginning. + * + * @static + * @memberOf _ + * @since 0.5.0 + * @category Array + * @param {Array} array The array to query. + * @param {number} [n=1] The number of elements to drop. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.drop([1, 2, 3]); + * // => [2, 3] + * + * _.drop([1, 2, 3], 2); + * // => [3] + * + * _.drop([1, 2, 3], 5); + * // => [] + * + * _.drop([1, 2, 3], 0); + * // => [1, 2, 3] + */ + function drop(array, n, guard) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + n = (guard || n === undefined) ? 1 : toInteger(n); + return baseSlice(array, n < 0 ? 0 : n, length); + } -d3_hslPrototype.rgb = function() { - return d3_hsl_rgb(this.h, this.s, this.l); -}; - -function d3_hsl_rgb(h, s, l) { - var m1, - m2; - - /* Some simple corrections for h, s and l. */ - h = isNaN(h) ? 0 : (h %= 360) < 0 ? h + 360 : h; - s = isNaN(s) ? 0 : s < 0 ? 0 : s > 1 ? 1 : s; - l = l < 0 ? 0 : l > 1 ? 1 : l; - - /* From FvD 13.37, CSS Color Module Level 3 */ - m2 = l <= .5 ? l * (1 + s) : l + s - l * s; - m1 = 2 * l - m2; - - function v(h) { - if (h > 360) h -= 360; - else if (h < 0) h += 360; - if (h < 60) return m1 + (m2 - m1) * h / 60; - if (h < 180) return m2; - if (h < 240) return m1 + (m2 - m1) * (240 - h) / 60; - return m1; - } + /** + * Creates a slice of `array` with `n` elements dropped from the end. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to query. + * @param {number} [n=1] The number of elements to drop. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.dropRight([1, 2, 3]); + * // => [1, 2] + * + * _.dropRight([1, 2, 3], 2); + * // => [1] + * + * _.dropRight([1, 2, 3], 5); + * // => [] + * + * _.dropRight([1, 2, 3], 0); + * // => [1, 2, 3] + */ + function dropRight(array, n, guard) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + n = (guard || n === undefined) ? 1 : toInteger(n); + n = length - n; + return baseSlice(array, 0, n < 0 ? 0 : n); + } - function vv(h) { - return Math.round(v(h) * 255); - } + /** + * Creates a slice of `array` excluding elements dropped from the end. + * Elements are dropped until `predicate` returns falsey. The predicate is + * invoked with three arguments: (value, index, array). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to query. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the slice of `array`. + * @example + * + * var users = [ + * { 'user': 'barney', 'active': true }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': false } + * ]; + * + * _.dropRightWhile(users, function(o) { return !o.active; }); + * // => objects for ['barney'] + * + * // The `_.matches` iteratee shorthand. + * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false }); + * // => objects for ['barney', 'fred'] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.dropRightWhile(users, ['active', false]); + * // => objects for ['barney'] + * + * // The `_.property` iteratee shorthand. + * _.dropRightWhile(users, 'active'); + * // => objects for ['barney', 'fred', 'pebbles'] + */ + function dropRightWhile(array, predicate) { + return (array && array.length) + ? baseWhile(array, getIteratee(predicate, 3), true, true) + : []; + } - return new d3_rgb(vv(h + 120), vv(h), vv(h - 120)); -} + /** + * Creates a slice of `array` excluding elements dropped from the beginning. + * Elements are dropped until `predicate` returns falsey. The predicate is + * invoked with three arguments: (value, index, array). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to query. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the slice of `array`. + * @example + * + * var users = [ + * { 'user': 'barney', 'active': false }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': true } + * ]; + * + * _.dropWhile(users, function(o) { return !o.active; }); + * // => objects for ['pebbles'] + * + * // The `_.matches` iteratee shorthand. + * _.dropWhile(users, { 'user': 'barney', 'active': false }); + * // => objects for ['fred', 'pebbles'] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.dropWhile(users, ['active', false]); + * // => objects for ['pebbles'] + * + * // The `_.property` iteratee shorthand. + * _.dropWhile(users, 'active'); + * // => objects for ['barney', 'fred', 'pebbles'] + */ + function dropWhile(array, predicate) { + return (array && array.length) + ? baseWhile(array, getIteratee(predicate, 3), true) + : []; + } -d3.hcl = d3_hcl; + /** + * Fills elements of `array` with `value` from `start` up to, but not + * including, `end`. + * + * **Note:** This method mutates `array`. + * + * @static + * @memberOf _ + * @since 3.2.0 + * @category Array + * @param {Array} array The array to fill. + * @param {*} value The value to fill `array` with. + * @param {number} [start=0] The start position. + * @param {number} [end=array.length] The end position. + * @returns {Array} Returns `array`. + * @example + * + * var array = [1, 2, 3]; + * + * _.fill(array, 'a'); + * console.log(array); + * // => ['a', 'a', 'a'] + * + * _.fill(Array(3), 2); + * // => [2, 2, 2] + * + * _.fill([4, 6, 8, 10], '*', 1, 3); + * // => [4, '*', '*', 10] + */ + function fill(array, value, start, end) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + if (start && typeof start != 'number' && isIterateeCall(array, value, start)) { + start = 0; + end = length; + } + return baseFill(array, value, start, end); + } -function d3_hcl(h, c, l) { - return this instanceof d3_hcl ? void (this.h = +h, this.c = +c, this.l = +l) - : arguments.length < 2 ? (h instanceof d3_hcl ? new d3_hcl(h.h, h.c, h.l) - : (h instanceof d3_lab ? d3_lab_hcl(h.l, h.a, h.b) - : d3_lab_hcl((h = d3_rgb_lab((h = d3.rgb(h)).r, h.g, h.b)).l, h.a, h.b))) - : new d3_hcl(h, c, l); -} + /** + * This method is like `_.find` except that it returns the index of the first + * element `predicate` returns truthy for instead of the element itself. + * + * @static + * @memberOf _ + * @since 1.1.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param {number} [fromIndex=0] The index to search from. + * @returns {number} Returns the index of the found element, else `-1`. + * @example + * + * var users = [ + * { 'user': 'barney', 'active': false }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': true } + * ]; + * + * _.findIndex(users, function(o) { return o.user == 'barney'; }); + * // => 0 + * + * // The `_.matches` iteratee shorthand. + * _.findIndex(users, { 'user': 'fred', 'active': false }); + * // => 1 + * + * // The `_.matchesProperty` iteratee shorthand. + * _.findIndex(users, ['active', false]); + * // => 0 + * + * // The `_.property` iteratee shorthand. + * _.findIndex(users, 'active'); + * // => 2 + */ + function findIndex(array, predicate, fromIndex) { + var length = array == null ? 0 : array.length; + if (!length) { + return -1; + } + var index = fromIndex == null ? 0 : toInteger(fromIndex); + if (index < 0) { + index = nativeMax(length + index, 0); + } + return baseFindIndex(array, getIteratee(predicate, 3), index); + } -var d3_hclPrototype = d3_hcl.prototype = new d3_color; + /** + * This method is like `_.findIndex` except that it iterates over elements + * of `collection` from right to left. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param {number} [fromIndex=array.length-1] The index to search from. + * @returns {number} Returns the index of the found element, else `-1`. + * @example + * + * var users = [ + * { 'user': 'barney', 'active': true }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': false } + * ]; + * + * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; }); + * // => 2 + * + * // The `_.matches` iteratee shorthand. + * _.findLastIndex(users, { 'user': 'barney', 'active': true }); + * // => 0 + * + * // The `_.matchesProperty` iteratee shorthand. + * _.findLastIndex(users, ['active', false]); + * // => 2 + * + * // The `_.property` iteratee shorthand. + * _.findLastIndex(users, 'active'); + * // => 0 + */ + function findLastIndex(array, predicate, fromIndex) { + var length = array == null ? 0 : array.length; + if (!length) { + return -1; + } + var index = length - 1; + if (fromIndex !== undefined) { + index = toInteger(fromIndex); + index = fromIndex < 0 + ? nativeMax(length + index, 0) + : nativeMin(index, length - 1); + } + return baseFindIndex(array, getIteratee(predicate, 3), index, true); + } -d3_hclPrototype.brighter = function(k) { - return new d3_hcl(this.h, this.c, Math.min(100, this.l + d3_lab_K * (arguments.length ? k : 1))); -}; + /** + * Flattens `array` a single level deep. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to flatten. + * @returns {Array} Returns the new flattened array. + * @example + * + * _.flatten([1, [2, [3, [4]], 5]]); + * // => [1, 2, [3, [4]], 5] + */ + function flatten(array) { + var length = array == null ? 0 : array.length; + return length ? baseFlatten(array, 1) : []; + } -d3_hclPrototype.darker = function(k) { - return new d3_hcl(this.h, this.c, Math.max(0, this.l - d3_lab_K * (arguments.length ? k : 1))); -}; + /** + * Recursively flattens `array`. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to flatten. + * @returns {Array} Returns the new flattened array. + * @example + * + * _.flattenDeep([1, [2, [3, [4]], 5]]); + * // => [1, 2, 3, 4, 5] + */ + function flattenDeep(array) { + var length = array == null ? 0 : array.length; + return length ? baseFlatten(array, INFINITY) : []; + } -d3_hclPrototype.rgb = function() { - return d3_hcl_lab(this.h, this.c, this.l).rgb(); -}; + /** + * Recursively flatten `array` up to `depth` times. + * + * @static + * @memberOf _ + * @since 4.4.0 + * @category Array + * @param {Array} array The array to flatten. + * @param {number} [depth=1] The maximum recursion depth. + * @returns {Array} Returns the new flattened array. + * @example + * + * var array = [1, [2, [3, [4]], 5]]; + * + * _.flattenDepth(array, 1); + * // => [1, 2, [3, [4]], 5] + * + * _.flattenDepth(array, 2); + * // => [1, 2, 3, [4], 5] + */ + function flattenDepth(array, depth) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + depth = depth === undefined ? 1 : toInteger(depth); + return baseFlatten(array, depth); + } -function d3_hcl_lab(h, c, l) { - if (isNaN(h)) h = 0; - if (isNaN(c)) c = 0; - return new d3_lab(l, Math.cos(h *= d3_radians) * c, Math.sin(h) * c); -} + /** + * The inverse of `_.toPairs`; this method returns an object composed + * from key-value `pairs`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} pairs The key-value pairs. + * @returns {Object} Returns the new object. + * @example + * + * _.fromPairs([['a', 1], ['b', 2]]); + * // => { 'a': 1, 'b': 2 } + */ + function fromPairs(pairs) { + var index = -1, + length = pairs == null ? 0 : pairs.length, + result = {}; -d3.lab = d3_lab; + while (++index < length) { + var pair = pairs[index]; + result[pair[0]] = pair[1]; + } + return result; + } -function d3_lab(l, a, b) { - return this instanceof d3_lab ? void (this.l = +l, this.a = +a, this.b = +b) - : arguments.length < 2 ? (l instanceof d3_lab ? new d3_lab(l.l, l.a, l.b) - : (l instanceof d3_hcl ? d3_hcl_lab(l.h, l.c, l.l) - : d3_rgb_lab((l = d3_rgb(l)).r, l.g, l.b))) - : new d3_lab(l, a, b); -} + /** + * Gets the first element of `array`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @alias first + * @category Array + * @param {Array} array The array to query. + * @returns {*} Returns the first element of `array`. + * @example + * + * _.head([1, 2, 3]); + * // => 1 + * + * _.head([]); + * // => undefined + */ + function head(array) { + return (array && array.length) ? array[0] : undefined; + } -// Corresponds roughly to RGB brighter/darker -var d3_lab_K = 18; + /** + * Gets the index at which the first occurrence of `value` is found in `array` + * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. If `fromIndex` is negative, it's used as the + * offset from the end of `array`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @param {number} [fromIndex=0] The index to search from. + * @returns {number} Returns the index of the matched value, else `-1`. + * @example + * + * _.indexOf([1, 2, 1, 2], 2); + * // => 1 + * + * // Search from the `fromIndex`. + * _.indexOf([1, 2, 1, 2], 2, 2); + * // => 3 + */ + function indexOf(array, value, fromIndex) { + var length = array == null ? 0 : array.length; + if (!length) { + return -1; + } + var index = fromIndex == null ? 0 : toInteger(fromIndex); + if (index < 0) { + index = nativeMax(length + index, 0); + } + return baseIndexOf(array, value, index); + } -// D65 standard referent -var d3_lab_X = 0.950470, - d3_lab_Y = 1, - d3_lab_Z = 1.088830; + /** + * Gets all but the last element of `array`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to query. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.initial([1, 2, 3]); + * // => [1, 2] + */ + function initial(array) { + var length = array == null ? 0 : array.length; + return length ? baseSlice(array, 0, -1) : []; + } -var d3_labPrototype = d3_lab.prototype = new d3_color; + /** + * Creates an array of unique values that are included in all given arrays + * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. The order and references of result values are + * determined by the first array. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @returns {Array} Returns the new array of intersecting values. + * @example + * + * _.intersection([2, 1], [2, 3]); + * // => [2] + */ + var intersection = baseRest(function(arrays) { + var mapped = arrayMap(arrays, castArrayLikeObject); + return (mapped.length && mapped[0] === arrays[0]) + ? baseIntersection(mapped) + : []; + }); -d3_labPrototype.brighter = function(k) { - return new d3_lab(Math.min(100, this.l + d3_lab_K * (arguments.length ? k : 1)), this.a, this.b); -}; + /** + * This method is like `_.intersection` except that it accepts `iteratee` + * which is invoked for each element of each `arrays` to generate the criterion + * by which they're compared. The order and references of result values are + * determined by the first array. The iteratee is invoked with one argument: + * (value). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {Array} Returns the new array of intersecting values. + * @example + * + * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor); + * // => [2.1] + * + * // The `_.property` iteratee shorthand. + * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x'); + * // => [{ 'x': 1 }] + */ + var intersectionBy = baseRest(function(arrays) { + var iteratee = last(arrays), + mapped = arrayMap(arrays, castArrayLikeObject); -d3_labPrototype.darker = function(k) { - return new d3_lab(Math.max(0, this.l - d3_lab_K * (arguments.length ? k : 1)), this.a, this.b); -}; + if (iteratee === last(mapped)) { + iteratee = undefined; + } else { + mapped.pop(); + } + return (mapped.length && mapped[0] === arrays[0]) + ? baseIntersection(mapped, getIteratee(iteratee, 2)) + : []; + }); -d3_labPrototype.rgb = function() { - return d3_lab_rgb(this.l, this.a, this.b); -}; + /** + * This method is like `_.intersection` except that it accepts `comparator` + * which is invoked to compare elements of `arrays`. The order and references + * of result values are determined by the first array. The comparator is + * invoked with two arguments: (arrVal, othVal). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of intersecting values. + * @example + * + * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]; + * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }]; + * + * _.intersectionWith(objects, others, _.isEqual); + * // => [{ 'x': 1, 'y': 2 }] + */ + var intersectionWith = baseRest(function(arrays) { + var comparator = last(arrays), + mapped = arrayMap(arrays, castArrayLikeObject); -function d3_lab_rgb(l, a, b) { - var y = (l + 16) / 116, - x = y + a / 500, - z = y - b / 200; - x = d3_lab_xyz(x) * d3_lab_X; - y = d3_lab_xyz(y) * d3_lab_Y; - z = d3_lab_xyz(z) * d3_lab_Z; - return new d3_rgb( - d3_xyz_rgb( 3.2404542 * x - 1.5371385 * y - 0.4985314 * z), - d3_xyz_rgb(-0.9692660 * x + 1.8760108 * y + 0.0415560 * z), - d3_xyz_rgb( 0.0556434 * x - 0.2040259 * y + 1.0572252 * z) - ); -} + comparator = typeof comparator == 'function' ? comparator : undefined; + if (comparator) { + mapped.pop(); + } + return (mapped.length && mapped[0] === arrays[0]) + ? baseIntersection(mapped, undefined, comparator) + : []; + }); -function d3_lab_hcl(l, a, b) { - return l > 0 - ? new d3_hcl(Math.atan2(b, a) * d3_degrees, Math.sqrt(a * a + b * b), l) - : new d3_hcl(NaN, NaN, l); -} + /** + * Converts all elements in `array` into a string separated by `separator`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to convert. + * @param {string} [separator=','] The element separator. + * @returns {string} Returns the joined string. + * @example + * + * _.join(['a', 'b', 'c'], '~'); + * // => 'a~b~c' + */ + function join(array, separator) { + return array == null ? '' : nativeJoin.call(array, separator); + } -function d3_lab_xyz(x) { - return x > 0.206893034 ? x * x * x : (x - 4 / 29) / 7.787037; -} -function d3_xyz_lab(x) { - return x > 0.008856 ? Math.pow(x, 1 / 3) : 7.787037 * x + 4 / 29; -} + /** + * Gets the last element of `array`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to query. + * @returns {*} Returns the last element of `array`. + * @example + * + * _.last([1, 2, 3]); + * // => 3 + */ + function last(array) { + var length = array == null ? 0 : array.length; + return length ? array[length - 1] : undefined; + } -function d3_xyz_rgb(r) { - return Math.round(255 * (r <= 0.00304 ? 12.92 * r : 1.055 * Math.pow(r, 1 / 2.4) - 0.055)); -} + /** + * This method is like `_.indexOf` except that it iterates over elements of + * `array` from right to left. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @param {number} [fromIndex=array.length-1] The index to search from. + * @returns {number} Returns the index of the matched value, else `-1`. + * @example + * + * _.lastIndexOf([1, 2, 1, 2], 2); + * // => 3 + * + * // Search from the `fromIndex`. + * _.lastIndexOf([1, 2, 1, 2], 2, 2); + * // => 1 + */ + function lastIndexOf(array, value, fromIndex) { + var length = array == null ? 0 : array.length; + if (!length) { + return -1; + } + var index = length; + if (fromIndex !== undefined) { + index = toInteger(fromIndex); + index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1); + } + return value === value + ? strictLastIndexOf(array, value, index) + : baseFindIndex(array, baseIsNaN, index, true); + } -d3.rgb = d3_rgb; + /** + * Gets the element at index `n` of `array`. If `n` is negative, the nth + * element from the end is returned. + * + * @static + * @memberOf _ + * @since 4.11.0 + * @category Array + * @param {Array} array The array to query. + * @param {number} [n=0] The index of the element to return. + * @returns {*} Returns the nth element of `array`. + * @example + * + * var array = ['a', 'b', 'c', 'd']; + * + * _.nth(array, 1); + * // => 'b' + * + * _.nth(array, -2); + * // => 'c'; + */ + function nth(array, n) { + return (array && array.length) ? baseNth(array, toInteger(n)) : undefined; + } -function d3_rgb(r, g, b) { - return this instanceof d3_rgb ? void (this.r = ~~r, this.g = ~~g, this.b = ~~b) - : arguments.length < 2 ? (r instanceof d3_rgb ? new d3_rgb(r.r, r.g, r.b) - : d3_rgb_parse("" + r, d3_rgb, d3_hsl_rgb)) - : new d3_rgb(r, g, b); -} + /** + * Removes all given values from `array` using + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. + * + * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove` + * to remove elements from an array by predicate. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Array + * @param {Array} array The array to modify. + * @param {...*} [values] The values to remove. + * @returns {Array} Returns `array`. + * @example + * + * var array = ['a', 'b', 'c', 'a', 'b', 'c']; + * + * _.pull(array, 'a', 'c'); + * console.log(array); + * // => ['b', 'b'] + */ + var pull = baseRest(pullAll); -function d3_rgbNumber(value) { - return new d3_rgb(value >> 16, value >> 8 & 0xff, value & 0xff); -} + /** + * This method is like `_.pull` except that it accepts an array of values to remove. + * + * **Note:** Unlike `_.difference`, this method mutates `array`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to modify. + * @param {Array} values The values to remove. + * @returns {Array} Returns `array`. + * @example + * + * var array = ['a', 'b', 'c', 'a', 'b', 'c']; + * + * _.pullAll(array, ['a', 'c']); + * console.log(array); + * // => ['b', 'b'] + */ + function pullAll(array, values) { + return (array && array.length && values && values.length) + ? basePullAll(array, values) + : array; + } -function d3_rgbString(value) { - return d3_rgbNumber(value) + ""; -} + /** + * This method is like `_.pullAll` except that it accepts `iteratee` which is + * invoked for each element of `array` and `values` to generate the criterion + * by which they're compared. The iteratee is invoked with one argument: (value). + * + * **Note:** Unlike `_.differenceBy`, this method mutates `array`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to modify. + * @param {Array} values The values to remove. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {Array} Returns `array`. + * @example + * + * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }]; + * + * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x'); + * console.log(array); + * // => [{ 'x': 2 }] + */ + function pullAllBy(array, values, iteratee) { + return (array && array.length && values && values.length) + ? basePullAll(array, values, getIteratee(iteratee, 2)) + : array; + } -var d3_rgbPrototype = d3_rgb.prototype = new d3_color; + /** + * This method is like `_.pullAll` except that it accepts `comparator` which + * is invoked to compare elements of `array` to `values`. The comparator is + * invoked with two arguments: (arrVal, othVal). + * + * **Note:** Unlike `_.differenceWith`, this method mutates `array`. + * + * @static + * @memberOf _ + * @since 4.6.0 + * @category Array + * @param {Array} array The array to modify. + * @param {Array} values The values to remove. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns `array`. + * @example + * + * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }]; + * + * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual); + * console.log(array); + * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }] + */ + function pullAllWith(array, values, comparator) { + return (array && array.length && values && values.length) + ? basePullAll(array, values, undefined, comparator) + : array; + } -d3_rgbPrototype.brighter = function(k) { - k = Math.pow(0.7, arguments.length ? k : 1); - var r = this.r, - g = this.g, - b = this.b, - i = 30; - if (!r && !g && !b) return new d3_rgb(i, i, i); - if (r && r < i) r = i; - if (g && g < i) g = i; - if (b && b < i) b = i; - return new d3_rgb(Math.min(255, r / k), Math.min(255, g / k), Math.min(255, b / k)); -}; + /** + * Removes elements from `array` corresponding to `indexes` and returns an + * array of removed elements. + * + * **Note:** Unlike `_.at`, this method mutates `array`. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to modify. + * @param {...(number|number[])} [indexes] The indexes of elements to remove. + * @returns {Array} Returns the new array of removed elements. + * @example + * + * var array = ['a', 'b', 'c', 'd']; + * var pulled = _.pullAt(array, [1, 3]); + * + * console.log(array); + * // => ['a', 'c'] + * + * console.log(pulled); + * // => ['b', 'd'] + */ + var pullAt = flatRest(function(array, indexes) { + var length = array == null ? 0 : array.length, + result = baseAt(array, indexes); -d3_rgbPrototype.darker = function(k) { - k = Math.pow(0.7, arguments.length ? k : 1); - return new d3_rgb(k * this.r, k * this.g, k * this.b); -}; + basePullAt(array, arrayMap(indexes, function(index) { + return isIndex(index, length) ? +index : index; + }).sort(compareAscending)); -d3_rgbPrototype.hsl = function() { - return d3_rgb_hsl(this.r, this.g, this.b); -}; + return result; + }); -d3_rgbPrototype.toString = function() { - return "#" + d3_rgb_hex(this.r) + d3_rgb_hex(this.g) + d3_rgb_hex(this.b); -}; + /** + * Removes all elements from `array` that `predicate` returns truthy for + * and returns an array of the removed elements. The predicate is invoked + * with three arguments: (value, index, array). + * + * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull` + * to pull elements from an array by value. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Array + * @param {Array} array The array to modify. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new array of removed elements. + * @example + * + * var array = [1, 2, 3, 4]; + * var evens = _.remove(array, function(n) { + * return n % 2 == 0; + * }); + * + * console.log(array); + * // => [1, 3] + * + * console.log(evens); + * // => [2, 4] + */ + function remove(array, predicate) { + var result = []; + if (!(array && array.length)) { + return result; + } + var index = -1, + indexes = [], + length = array.length; -function d3_rgb_hex(v) { - return v < 0x10 - ? "0" + Math.max(0, v).toString(16) - : Math.min(255, v).toString(16); -} + predicate = getIteratee(predicate, 3); + while (++index < length) { + var value = array[index]; + if (predicate(value, index, array)) { + result.push(value); + indexes.push(index); + } + } + basePullAt(array, indexes); + return result; + } -function d3_rgb_parse(format, rgb, hsl) { - var r = 0, // red channel; int in [0, 255] - g = 0, // green channel; int in [0, 255] - b = 0, // blue channel; int in [0, 255] - m1, // CSS color specification match - m2, // CSS color specification type (e.g., rgb) - color; + /** + * Reverses `array` so that the first element becomes the last, the second + * element becomes the second to last, and so on. + * + * **Note:** This method mutates `array` and is based on + * [`Array#reverse`](https://mdn.io/Array/reverse). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to modify. + * @returns {Array} Returns `array`. + * @example + * + * var array = [1, 2, 3]; + * + * _.reverse(array); + * // => [3, 2, 1] + * + * console.log(array); + * // => [3, 2, 1] + */ + function reverse(array) { + return array == null ? array : nativeReverse.call(array); + } - /* Handle hsl, rgb. */ - m1 = /([a-z]+)\((.*)\)/i.exec(format); - if (m1) { - m2 = m1[2].split(","); - switch (m1[1]) { - case "hsl": { - return hsl( - parseFloat(m2[0]), // degrees - parseFloat(m2[1]) / 100, // percentage - parseFloat(m2[2]) / 100 // percentage - ); + /** + * Creates a slice of `array` from `start` up to, but not including, `end`. + * + * **Note:** This method is used instead of + * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are + * returned. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to slice. + * @param {number} [start=0] The start position. + * @param {number} [end=array.length] The end position. + * @returns {Array} Returns the slice of `array`. + */ + function slice(array, start, end) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; } - case "rgb": { - return rgb( - d3_rgb_parseNumber(m2[0]), - d3_rgb_parseNumber(m2[1]), - d3_rgb_parseNumber(m2[2]) - ); + if (end && typeof end != 'number' && isIterateeCall(array, start, end)) { + start = 0; + end = length; + } + else { + start = start == null ? 0 : toInteger(start); + end = end === undefined ? length : toInteger(end); } + return baseSlice(array, start, end); } - } - /* Named colors. */ - if (color = d3_rgb_names.get(format.toLowerCase())) { - return rgb(color.r, color.g, color.b); - } - - /* Hexadecimal colors: #rgb and #rrggbb. */ - if (format != null && format.charAt(0) === "#" && !isNaN(color = parseInt(format.slice(1), 16))) { - if (format.length === 4) { - r = (color & 0xf00) >> 4; r = (r >> 4) | r; - g = (color & 0xf0); g = (g >> 4) | g; - b = (color & 0xf); b = (b << 4) | b; - } else if (format.length === 7) { - r = (color & 0xff0000) >> 16; - g = (color & 0xff00) >> 8; - b = (color & 0xff); + /** + * Uses a binary search to determine the lowest index at which `value` + * should be inserted into `array` in order to maintain its sort order. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The sorted array to inspect. + * @param {*} value The value to evaluate. + * @returns {number} Returns the index at which `value` should be inserted + * into `array`. + * @example + * + * _.sortedIndex([30, 50], 40); + * // => 1 + */ + function sortedIndex(array, value) { + return baseSortedIndex(array, value); } - } - - return rgb(r, g, b); -} - -function d3_rgb_hsl(r, g, b) { - var min = Math.min(r /= 255, g /= 255, b /= 255), - max = Math.max(r, g, b), - d = max - min, - h, - s, - l = (max + min) / 2; - if (d) { - s = l < .5 ? d / (max + min) : d / (2 - max - min); - if (r == max) h = (g - b) / d + (g < b ? 6 : 0); - else if (g == max) h = (b - r) / d + 2; - else h = (r - g) / d + 4; - h *= 60; - } else { - h = NaN; - s = l > 0 && l < 1 ? 0 : h; - } - return new d3_hsl(h, s, l); -} -function d3_rgb_lab(r, g, b) { - r = d3_rgb_xyz(r); - g = d3_rgb_xyz(g); - b = d3_rgb_xyz(b); - var x = d3_xyz_lab((0.4124564 * r + 0.3575761 * g + 0.1804375 * b) / d3_lab_X), - y = d3_xyz_lab((0.2126729 * r + 0.7151522 * g + 0.0721750 * b) / d3_lab_Y), - z = d3_xyz_lab((0.0193339 * r + 0.1191920 * g + 0.9503041 * b) / d3_lab_Z); - return d3_lab(116 * y - 16, 500 * (x - y), 200 * (y - z)); -} + /** + * This method is like `_.sortedIndex` except that it accepts `iteratee` + * which is invoked for `value` and each element of `array` to compute their + * sort ranking. The iteratee is invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The sorted array to inspect. + * @param {*} value The value to evaluate. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {number} Returns the index at which `value` should be inserted + * into `array`. + * @example + * + * var objects = [{ 'x': 4 }, { 'x': 5 }]; + * + * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; }); + * // => 0 + * + * // The `_.property` iteratee shorthand. + * _.sortedIndexBy(objects, { 'x': 4 }, 'x'); + * // => 0 + */ + function sortedIndexBy(array, value, iteratee) { + return baseSortedIndexBy(array, value, getIteratee(iteratee, 2)); + } -function d3_rgb_xyz(r) { - return (r /= 255) <= 0.04045 ? r / 12.92 : Math.pow((r + 0.055) / 1.055, 2.4); -} + /** + * This method is like `_.indexOf` except that it performs a binary + * search on a sorted `array`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @returns {number} Returns the index of the matched value, else `-1`. + * @example + * + * _.sortedIndexOf([4, 5, 5, 5, 6], 5); + * // => 1 + */ + function sortedIndexOf(array, value) { + var length = array == null ? 0 : array.length; + if (length) { + var index = baseSortedIndex(array, value); + if (index < length && eq(array[index], value)) { + return index; + } + } + return -1; + } -function d3_rgb_parseNumber(c) { // either integer or percentage - var f = parseFloat(c); - return c.charAt(c.length - 1) === "%" ? Math.round(f * 2.55) : f; -} + /** + * This method is like `_.sortedIndex` except that it returns the highest + * index at which `value` should be inserted into `array` in order to + * maintain its sort order. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The sorted array to inspect. + * @param {*} value The value to evaluate. + * @returns {number} Returns the index at which `value` should be inserted + * into `array`. + * @example + * + * _.sortedLastIndex([4, 5, 5, 5, 6], 5); + * // => 4 + */ + function sortedLastIndex(array, value) { + return baseSortedIndex(array, value, true); + } -var d3_rgb_names = d3.map({ - aliceblue: 0xf0f8ff, - antiquewhite: 0xfaebd7, - aqua: 0x00ffff, - aquamarine: 0x7fffd4, - azure: 0xf0ffff, - beige: 0xf5f5dc, - bisque: 0xffe4c4, - black: 0x000000, - blanchedalmond: 0xffebcd, - blue: 0x0000ff, - blueviolet: 0x8a2be2, - brown: 0xa52a2a, - burlywood: 0xdeb887, - cadetblue: 0x5f9ea0, - chartreuse: 0x7fff00, - chocolate: 0xd2691e, - coral: 0xff7f50, - cornflowerblue: 0x6495ed, - cornsilk: 0xfff8dc, - crimson: 0xdc143c, - cyan: 0x00ffff, - darkblue: 0x00008b, - darkcyan: 0x008b8b, - darkgoldenrod: 0xb8860b, - darkgray: 0xa9a9a9, - darkgreen: 0x006400, - darkgrey: 0xa9a9a9, - darkkhaki: 0xbdb76b, - darkmagenta: 0x8b008b, - darkolivegreen: 0x556b2f, - darkorange: 0xff8c00, - darkorchid: 0x9932cc, - darkred: 0x8b0000, - darksalmon: 0xe9967a, - darkseagreen: 0x8fbc8f, - darkslateblue: 0x483d8b, - darkslategray: 0x2f4f4f, - darkslategrey: 0x2f4f4f, - darkturquoise: 0x00ced1, - darkviolet: 0x9400d3, - deeppink: 0xff1493, - deepskyblue: 0x00bfff, - dimgray: 0x696969, - dimgrey: 0x696969, - dodgerblue: 0x1e90ff, - firebrick: 0xb22222, - floralwhite: 0xfffaf0, - forestgreen: 0x228b22, - fuchsia: 0xff00ff, - gainsboro: 0xdcdcdc, - ghostwhite: 0xf8f8ff, - gold: 0xffd700, - goldenrod: 0xdaa520, - gray: 0x808080, - green: 0x008000, - greenyellow: 0xadff2f, - grey: 0x808080, - honeydew: 0xf0fff0, - hotpink: 0xff69b4, - indianred: 0xcd5c5c, - indigo: 0x4b0082, - ivory: 0xfffff0, - khaki: 0xf0e68c, - lavender: 0xe6e6fa, - lavenderblush: 0xfff0f5, - lawngreen: 0x7cfc00, - lemonchiffon: 0xfffacd, - lightblue: 0xadd8e6, - lightcoral: 0xf08080, - lightcyan: 0xe0ffff, - lightgoldenrodyellow: 0xfafad2, - lightgray: 0xd3d3d3, - lightgreen: 0x90ee90, - lightgrey: 0xd3d3d3, - lightpink: 0xffb6c1, - lightsalmon: 0xffa07a, - lightseagreen: 0x20b2aa, - lightskyblue: 0x87cefa, - lightslategray: 0x778899, - lightslategrey: 0x778899, - lightsteelblue: 0xb0c4de, - lightyellow: 0xffffe0, - lime: 0x00ff00, - limegreen: 0x32cd32, - linen: 0xfaf0e6, - magenta: 0xff00ff, - maroon: 0x800000, - mediumaquamarine: 0x66cdaa, - mediumblue: 0x0000cd, - mediumorchid: 0xba55d3, - mediumpurple: 0x9370db, - mediumseagreen: 0x3cb371, - mediumslateblue: 0x7b68ee, - mediumspringgreen: 0x00fa9a, - mediumturquoise: 0x48d1cc, - mediumvioletred: 0xc71585, - midnightblue: 0x191970, - mintcream: 0xf5fffa, - mistyrose: 0xffe4e1, - moccasin: 0xffe4b5, - navajowhite: 0xffdead, - navy: 0x000080, - oldlace: 0xfdf5e6, - olive: 0x808000, - olivedrab: 0x6b8e23, - orange: 0xffa500, - orangered: 0xff4500, - orchid: 0xda70d6, - palegoldenrod: 0xeee8aa, - palegreen: 0x98fb98, - paleturquoise: 0xafeeee, - palevioletred: 0xdb7093, - papayawhip: 0xffefd5, - peachpuff: 0xffdab9, - peru: 0xcd853f, - pink: 0xffc0cb, - plum: 0xdda0dd, - powderblue: 0xb0e0e6, - purple: 0x800080, - rebeccapurple: 0x663399, - red: 0xff0000, - rosybrown: 0xbc8f8f, - royalblue: 0x4169e1, - saddlebrown: 0x8b4513, - salmon: 0xfa8072, - sandybrown: 0xf4a460, - seagreen: 0x2e8b57, - seashell: 0xfff5ee, - sienna: 0xa0522d, - silver: 0xc0c0c0, - skyblue: 0x87ceeb, - slateblue: 0x6a5acd, - slategray: 0x708090, - slategrey: 0x708090, - snow: 0xfffafa, - springgreen: 0x00ff7f, - steelblue: 0x4682b4, - tan: 0xd2b48c, - teal: 0x008080, - thistle: 0xd8bfd8, - tomato: 0xff6347, - turquoise: 0x40e0d0, - violet: 0xee82ee, - wheat: 0xf5deb3, - white: 0xffffff, - whitesmoke: 0xf5f5f5, - yellow: 0xffff00, - yellowgreen: 0x9acd32 -}); + /** + * This method is like `_.sortedLastIndex` except that it accepts `iteratee` + * which is invoked for `value` and each element of `array` to compute their + * sort ranking. The iteratee is invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The sorted array to inspect. + * @param {*} value The value to evaluate. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {number} Returns the index at which `value` should be inserted + * into `array`. + * @example + * + * var objects = [{ 'x': 4 }, { 'x': 5 }]; + * + * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; }); + * // => 1 + * + * // The `_.property` iteratee shorthand. + * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x'); + * // => 1 + */ + function sortedLastIndexBy(array, value, iteratee) { + return baseSortedIndexBy(array, value, getIteratee(iteratee, 2), true); + } -d3_rgb_names.forEach(function(key, value) { - d3_rgb_names.set(key, d3_rgbNumber(value)); -}); + /** + * This method is like `_.lastIndexOf` except that it performs a binary + * search on a sorted `array`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @returns {number} Returns the index of the matched value, else `-1`. + * @example + * + * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5); + * // => 3 + */ + function sortedLastIndexOf(array, value) { + var length = array == null ? 0 : array.length; + if (length) { + var index = baseSortedIndex(array, value, true) - 1; + if (eq(array[index], value)) { + return index; + } + } + return -1; + } -d3.interpolateRgb = d3_interpolateRgb; - -function d3_interpolateRgb(a, b) { - a = d3.rgb(a); - b = d3.rgb(b); - var ar = a.r, - ag = a.g, - ab = a.b, - br = b.r - ar, - bg = b.g - ag, - bb = b.b - ab; - return function(t) { - return "#" - + d3_rgb_hex(Math.round(ar + br * t)) - + d3_rgb_hex(Math.round(ag + bg * t)) - + d3_rgb_hex(Math.round(ab + bb * t)); - }; -} + /** + * This method is like `_.uniq` except that it's designed and optimized + * for sorted arrays. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @returns {Array} Returns the new duplicate free array. + * @example + * + * _.sortedUniq([1, 1, 2]); + * // => [1, 2] + */ + function sortedUniq(array) { + return (array && array.length) + ? baseSortedUniq(array) + : []; + } -d3.interpolateObject = d3_interpolateObject; + /** + * This method is like `_.uniqBy` except that it's designed and optimized + * for sorted arrays. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {Function} [iteratee] The iteratee invoked per element. + * @returns {Array} Returns the new duplicate free array. + * @example + * + * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor); + * // => [1.1, 2.3] + */ + function sortedUniqBy(array, iteratee) { + return (array && array.length) + ? baseSortedUniq(array, getIteratee(iteratee, 2)) + : []; + } -function d3_interpolateObject(a, b) { - var i = {}, - c = {}, - k; - for (k in a) { - if (k in b) { - i[k] = d3_interpolate(a[k], b[k]); - } else { - c[k] = a[k]; + /** + * Gets all but the first element of `array`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to query. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.tail([1, 2, 3]); + * // => [2, 3] + */ + function tail(array) { + var length = array == null ? 0 : array.length; + return length ? baseSlice(array, 1, length) : []; } - } - for (k in b) { - if (!(k in a)) { - c[k] = b[k]; + + /** + * Creates a slice of `array` with `n` elements taken from the beginning. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to query. + * @param {number} [n=1] The number of elements to take. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.take([1, 2, 3]); + * // => [1] + * + * _.take([1, 2, 3], 2); + * // => [1, 2] + * + * _.take([1, 2, 3], 5); + * // => [1, 2, 3] + * + * _.take([1, 2, 3], 0); + * // => [] + */ + function take(array, n, guard) { + if (!(array && array.length)) { + return []; + } + n = (guard || n === undefined) ? 1 : toInteger(n); + return baseSlice(array, 0, n < 0 ? 0 : n); } - } - return function(t) { - for (k in i) c[k] = i[k](t); - return c; - }; -} -d3.interpolateArray = d3_interpolateArray; + /** + * Creates a slice of `array` with `n` elements taken from the end. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to query. + * @param {number} [n=1] The number of elements to take. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.takeRight([1, 2, 3]); + * // => [3] + * + * _.takeRight([1, 2, 3], 2); + * // => [2, 3] + * + * _.takeRight([1, 2, 3], 5); + * // => [1, 2, 3] + * + * _.takeRight([1, 2, 3], 0); + * // => [] + */ + function takeRight(array, n, guard) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + n = (guard || n === undefined) ? 1 : toInteger(n); + n = length - n; + return baseSlice(array, n < 0 ? 0 : n, length); + } -function d3_interpolateArray(a, b) { - var x = [], - c = [], - na = a.length, - nb = b.length, - n0 = Math.min(a.length, b.length), - i; - for (i = 0; i < n0; ++i) x.push(d3_interpolate(a[i], b[i])); - for (; i < na; ++i) c[i] = a[i]; - for (; i < nb; ++i) c[i] = b[i]; - return function(t) { - for (i = 0; i < n0; ++i) c[i] = x[i](t); - return c; - }; -} -d3.interpolateNumber = d3_interpolateNumber; - -function d3_interpolateNumber(a, b) { - a = +a, b = +b; - return function(t) { return a * (1 - t) + b * t; }; -} - -d3.interpolateString = d3_interpolateString; - -function d3_interpolateString(a, b) { - var bi = d3_interpolate_numberA.lastIndex = d3_interpolate_numberB.lastIndex = 0, // scan index for next number in b - am, // current match in a - bm, // current match in b - bs, // string preceding current number in b, if any - i = -1, // index in s - s = [], // string constants and placeholders - q = []; // number interpolators - - // Coerce inputs to strings. - a = a + "", b = b + ""; - - // Interpolate pairs of numbers in a & b. - while ((am = d3_interpolate_numberA.exec(a)) - && (bm = d3_interpolate_numberB.exec(b))) { - if ((bs = bm.index) > bi) { // a string precedes the next number in b - bs = b.slice(bi, bs); - if (s[i]) s[i] += bs; // coalesce with previous string - else s[++i] = bs; - } - if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match - if (s[i]) s[i] += bm; // coalesce with previous string - else s[++i] = bm; - } else { // interpolate non-matching numbers - s[++i] = null; - q.push({i: i, x: d3_interpolateNumber(am, bm)}); + /** + * Creates a slice of `array` with elements taken from the end. Elements are + * taken until `predicate` returns falsey. The predicate is invoked with + * three arguments: (value, index, array). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to query. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the slice of `array`. + * @example + * + * var users = [ + * { 'user': 'barney', 'active': true }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': false } + * ]; + * + * _.takeRightWhile(users, function(o) { return !o.active; }); + * // => objects for ['fred', 'pebbles'] + * + * // The `_.matches` iteratee shorthand. + * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false }); + * // => objects for ['pebbles'] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.takeRightWhile(users, ['active', false]); + * // => objects for ['fred', 'pebbles'] + * + * // The `_.property` iteratee shorthand. + * _.takeRightWhile(users, 'active'); + * // => [] + */ + function takeRightWhile(array, predicate) { + return (array && array.length) + ? baseWhile(array, getIteratee(predicate, 3), false, true) + : []; } - bi = d3_interpolate_numberB.lastIndex; - } - - // Add remains of b. - if (bi < b.length) { - bs = b.slice(bi); - if (s[i]) s[i] += bs; // coalesce with previous string - else s[++i] = bs; - } - - // Special optimization for only a single match. - // Otherwise, interpolate each of the numbers and rejoin the string. - return s.length < 2 - ? (q[0] ? (b = q[0].x, function(t) { return b(t) + ""; }) - : function() { return b; }) - : (b = q.length, function(t) { - for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t); - return s.join(""); - }); -} -var d3_interpolate_numberA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g, - d3_interpolate_numberB = new RegExp(d3_interpolate_numberA.source, "g"); + /** + * Creates a slice of `array` with elements taken from the beginning. Elements + * are taken until `predicate` returns falsey. The predicate is invoked with + * three arguments: (value, index, array). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to query. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the slice of `array`. + * @example + * + * var users = [ + * { 'user': 'barney', 'active': false }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': true } + * ]; + * + * _.takeWhile(users, function(o) { return !o.active; }); + * // => objects for ['barney', 'fred'] + * + * // The `_.matches` iteratee shorthand. + * _.takeWhile(users, { 'user': 'barney', 'active': false }); + * // => objects for ['barney'] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.takeWhile(users, ['active', false]); + * // => objects for ['barney', 'fred'] + * + * // The `_.property` iteratee shorthand. + * _.takeWhile(users, 'active'); + * // => [] + */ + function takeWhile(array, predicate) { + return (array && array.length) + ? baseWhile(array, getIteratee(predicate, 3)) + : []; + } -d3.interpolate = d3_interpolate; + /** + * Creates an array of unique values, in order, from all given arrays using + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @returns {Array} Returns the new array of combined values. + * @example + * + * _.union([2], [1, 2]); + * // => [2, 1] + */ + var union = baseRest(function(arrays) { + return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true)); + }); -function d3_interpolate(a, b) { - var i = d3.interpolators.length, f; - while (--i >= 0 && !(f = d3.interpolators[i](a, b))); - return f; -} + /** + * This method is like `_.union` except that it accepts `iteratee` which is + * invoked for each element of each `arrays` to generate the criterion by + * which uniqueness is computed. Result values are chosen from the first + * array in which the value occurs. The iteratee is invoked with one argument: + * (value). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {Array} Returns the new array of combined values. + * @example + * + * _.unionBy([2.1], [1.2, 2.3], Math.floor); + * // => [2.1, 1.2] + * + * // The `_.property` iteratee shorthand. + * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x'); + * // => [{ 'x': 1 }, { 'x': 2 }] + */ + var unionBy = baseRest(function(arrays) { + var iteratee = last(arrays); + if (isArrayLikeObject(iteratee)) { + iteratee = undefined; + } + return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2)); + }); -d3.interpolators = [ - function(a, b) { - var t = typeof b; - return (t === "string" ? (d3_rgb_names.has(b) || /^(#|rgb\(|hsl\()/.test(b) ? d3_interpolateRgb : d3_interpolateString) - : b instanceof d3_color ? d3_interpolateRgb - : Array.isArray(b) ? d3_interpolateArray - : t === "object" && isNaN(b) ? d3_interpolateObject - : d3_interpolateNumber)(a, b); - } -]; + /** + * This method is like `_.union` except that it accepts `comparator` which + * is invoked to compare elements of `arrays`. Result values are chosen from + * the first array in which the value occurs. The comparator is invoked + * with two arguments: (arrVal, othVal). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of combined values. + * @example + * + * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]; + * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }]; + * + * _.unionWith(objects, others, _.isEqual); + * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }] + */ + var unionWith = baseRest(function(arrays) { + var comparator = last(arrays); + comparator = typeof comparator == 'function' ? comparator : undefined; + return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined, comparator); + }); -d3.transform = function(string) { - var g = d3_document.createElementNS(d3.ns.prefix.svg, "g"); - return (d3.transform = function(string) { - if (string != null) { - g.setAttribute("transform", string); - var t = g.transform.baseVal.consolidate(); + /** + * Creates a duplicate-free version of an array, using + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons, in which only the first occurrence of each element + * is kept. The order of result values is determined by the order they occur + * in the array. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to inspect. + * @returns {Array} Returns the new duplicate free array. + * @example + * + * _.uniq([2, 1, 2]); + * // => [2, 1] + */ + function uniq(array) { + return (array && array.length) ? baseUniq(array) : []; } - return new d3_transform(t ? t.matrix : d3_transformIdentity); - })(string); -}; -// Compute x-scale and normalize the first row. -// Compute shear and make second row orthogonal to first. -// Compute y-scale and normalize the second row. -// Finally, compute the rotation. -function d3_transform(m) { - var r0 = [m.a, m.b], - r1 = [m.c, m.d], - kx = d3_transformNormalize(r0), - kz = d3_transformDot(r0, r1), - ky = d3_transformNormalize(d3_transformCombine(r1, r0, -kz)) || 0; - if (r0[0] * r1[1] < r1[0] * r0[1]) { - r0[0] *= -1; - r0[1] *= -1; - kx *= -1; - kz *= -1; - } - this.rotate = (kx ? Math.atan2(r0[1], r0[0]) : Math.atan2(-r1[0], r1[1])) * d3_degrees; - this.translate = [m.e, m.f]; - this.scale = [kx, ky]; - this.skew = ky ? Math.atan2(kz, ky) * d3_degrees : 0; -}; + /** + * This method is like `_.uniq` except that it accepts `iteratee` which is + * invoked for each element in `array` to generate the criterion by which + * uniqueness is computed. The order of result values is determined by the + * order they occur in the array. The iteratee is invoked with one argument: + * (value). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {Array} Returns the new duplicate free array. + * @example + * + * _.uniqBy([2.1, 1.2, 2.3], Math.floor); + * // => [2.1, 1.2] + * + * // The `_.property` iteratee shorthand. + * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x'); + * // => [{ 'x': 1 }, { 'x': 2 }] + */ + function uniqBy(array, iteratee) { + return (array && array.length) ? baseUniq(array, getIteratee(iteratee, 2)) : []; + } -d3_transform.prototype.toString = function() { - return "translate(" + this.translate - + ")rotate(" + this.rotate - + ")skewX(" + this.skew - + ")scale(" + this.scale - + ")"; -}; + /** + * This method is like `_.uniq` except that it accepts `comparator` which + * is invoked to compare elements of `array`. The order of result values is + * determined by the order they occur in the array.The comparator is invoked + * with two arguments: (arrVal, othVal). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new duplicate free array. + * @example + * + * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }]; + * + * _.uniqWith(objects, _.isEqual); + * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }] + */ + function uniqWith(array, comparator) { + comparator = typeof comparator == 'function' ? comparator : undefined; + return (array && array.length) ? baseUniq(array, undefined, comparator) : []; + } -function d3_transformDot(a, b) { - return a[0] * b[0] + a[1] * b[1]; -} + /** + * This method is like `_.zip` except that it accepts an array of grouped + * elements and creates an array regrouping the elements to their pre-zip + * configuration. + * + * @static + * @memberOf _ + * @since 1.2.0 + * @category Array + * @param {Array} array The array of grouped elements to process. + * @returns {Array} Returns the new array of regrouped elements. + * @example + * + * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]); + * // => [['a', 1, true], ['b', 2, false]] + * + * _.unzip(zipped); + * // => [['a', 'b'], [1, 2], [true, false]] + */ + function unzip(array) { + if (!(array && array.length)) { + return []; + } + var length = 0; + array = arrayFilter(array, function(group) { + if (isArrayLikeObject(group)) { + length = nativeMax(group.length, length); + return true; + } + }); + return baseTimes(length, function(index) { + return arrayMap(array, baseProperty(index)); + }); + } -function d3_transformNormalize(a) { - var k = Math.sqrt(d3_transformDot(a, a)); - if (k) { - a[0] /= k; - a[1] /= k; - } - return k; -} + /** + * This method is like `_.unzip` except that it accepts `iteratee` to specify + * how regrouped values should be combined. The iteratee is invoked with the + * elements of each group: (...group). + * + * @static + * @memberOf _ + * @since 3.8.0 + * @category Array + * @param {Array} array The array of grouped elements to process. + * @param {Function} [iteratee=_.identity] The function to combine + * regrouped values. + * @returns {Array} Returns the new array of regrouped elements. + * @example + * + * var zipped = _.zip([1, 2], [10, 20], [100, 200]); + * // => [[1, 10, 100], [2, 20, 200]] + * + * _.unzipWith(zipped, _.add); + * // => [3, 30, 300] + */ + function unzipWith(array, iteratee) { + if (!(array && array.length)) { + return []; + } + var result = unzip(array); + if (iteratee == null) { + return result; + } + return arrayMap(result, function(group) { + return apply(iteratee, undefined, group); + }); + } -function d3_transformCombine(a, b, k) { - a[0] += k * b[0]; - a[1] += k * b[1]; - return a; -} + /** + * Creates an array excluding all given values using + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. + * + * **Note:** Unlike `_.pull`, this method returns a new array. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {...*} [values] The values to exclude. + * @returns {Array} Returns the new array of filtered values. + * @see _.difference, _.xor + * @example + * + * _.without([2, 1, 2, 3], 1, 2); + * // => [3] + */ + var without = baseRest(function(array, values) { + return isArrayLikeObject(array) + ? baseDifference(array, values) + : []; + }); -var d3_transformIdentity = {a: 1, b: 0, c: 0, d: 1, e: 0, f: 0}; + /** + * Creates an array of unique values that is the + * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference) + * of the given arrays. The order of result values is determined by the order + * they occur in the arrays. + * + * @static + * @memberOf _ + * @since 2.4.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @returns {Array} Returns the new array of filtered values. + * @see _.difference, _.without + * @example + * + * _.xor([2, 1], [2, 3]); + * // => [1, 3] + */ + var xor = baseRest(function(arrays) { + return baseXor(arrayFilter(arrays, isArrayLikeObject)); + }); -d3.interpolateTransform = d3_interpolateTransform; + /** + * This method is like `_.xor` except that it accepts `iteratee` which is + * invoked for each element of each `arrays` to generate the criterion by + * which by which they're compared. The order of result values is determined + * by the order they occur in the arrays. The iteratee is invoked with one + * argument: (value). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {Array} Returns the new array of filtered values. + * @example + * + * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor); + * // => [1.2, 3.4] + * + * // The `_.property` iteratee shorthand. + * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x'); + * // => [{ 'x': 2 }] + */ + var xorBy = baseRest(function(arrays) { + var iteratee = last(arrays); + if (isArrayLikeObject(iteratee)) { + iteratee = undefined; + } + return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2)); + }); -function d3_interpolateTransform(a, b) { - var s = [], // string constants and placeholders - q = [], // number interpolators - n, - A = d3.transform(a), - B = d3.transform(b), - ta = A.translate, - tb = B.translate, - ra = A.rotate, - rb = B.rotate, - wa = A.skew, - wb = B.skew, - ka = A.scale, - kb = B.scale; - - if (ta[0] != tb[0] || ta[1] != tb[1]) { - s.push("translate(", null, ",", null, ")"); - q.push({i: 1, x: d3_interpolateNumber(ta[0], tb[0])}, {i: 3, x: d3_interpolateNumber(ta[1], tb[1])}); - } else if (tb[0] || tb[1]) { - s.push("translate(" + tb + ")"); - } else { - s.push(""); - } + /** + * This method is like `_.xor` except that it accepts `comparator` which is + * invoked to compare elements of `arrays`. The order of result values is + * determined by the order they occur in the arrays. The comparator is invoked + * with two arguments: (arrVal, othVal). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of filtered values. + * @example + * + * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]; + * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }]; + * + * _.xorWith(objects, others, _.isEqual); + * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }] + */ + var xorWith = baseRest(function(arrays) { + var comparator = last(arrays); + comparator = typeof comparator == 'function' ? comparator : undefined; + return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined, comparator); + }); - if (ra != rb) { - if (ra - rb > 180) rb += 360; else if (rb - ra > 180) ra += 360; // shortest path - q.push({i: s.push(s.pop() + "rotate(", null, ")") - 2, x: d3_interpolateNumber(ra, rb)}); - } else if (rb) { - s.push(s.pop() + "rotate(" + rb + ")"); - } + /** + * Creates an array of grouped elements, the first of which contains the + * first elements of the given arrays, the second of which contains the + * second elements of the given arrays, and so on. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {...Array} [arrays] The arrays to process. + * @returns {Array} Returns the new array of grouped elements. + * @example + * + * _.zip(['a', 'b'], [1, 2], [true, false]); + * // => [['a', 1, true], ['b', 2, false]] + */ + var zip = baseRest(unzip); - if (wa != wb) { - q.push({i: s.push(s.pop() + "skewX(", null, ")") - 2, x: d3_interpolateNumber(wa, wb)}); - } else if (wb) { - s.push(s.pop() + "skewX(" + wb + ")"); - } + /** + * This method is like `_.fromPairs` except that it accepts two arrays, + * one of property identifiers and one of corresponding values. + * + * @static + * @memberOf _ + * @since 0.4.0 + * @category Array + * @param {Array} [props=[]] The property identifiers. + * @param {Array} [values=[]] The property values. + * @returns {Object} Returns the new object. + * @example + * + * _.zipObject(['a', 'b'], [1, 2]); + * // => { 'a': 1, 'b': 2 } + */ + function zipObject(props, values) { + return baseZipObject(props || [], values || [], assignValue); + } - if (ka[0] != kb[0] || ka[1] != kb[1]) { - n = s.push(s.pop() + "scale(", null, ",", null, ")"); - q.push({i: n - 4, x: d3_interpolateNumber(ka[0], kb[0])}, {i: n - 2, x: d3_interpolateNumber(ka[1], kb[1])}); - } else if (kb[0] != 1 || kb[1] != 1) { - s.push(s.pop() + "scale(" + kb + ")"); - } + /** + * This method is like `_.zipObject` except that it supports property paths. + * + * @static + * @memberOf _ + * @since 4.1.0 + * @category Array + * @param {Array} [props=[]] The property identifiers. + * @param {Array} [values=[]] The property values. + * @returns {Object} Returns the new object. + * @example + * + * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]); + * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } } + */ + function zipObjectDeep(props, values) { + return baseZipObject(props || [], values || [], baseSet); + } - n = q.length; - return function(t) { - var i = -1, o; - while (++i < n) s[(o = q[i]).i] = o.x(t); - return s.join(""); - }; -} + /** + * This method is like `_.zip` except that it accepts `iteratee` to specify + * how grouped values should be combined. The iteratee is invoked with the + * elements of each group: (...group). + * + * @static + * @memberOf _ + * @since 3.8.0 + * @category Array + * @param {...Array} [arrays] The arrays to process. + * @param {Function} [iteratee=_.identity] The function to combine + * grouped values. + * @returns {Array} Returns the new array of grouped elements. + * @example + * + * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) { + * return a + b + c; + * }); + * // => [111, 222] + */ + var zipWith = baseRest(function(arrays) { + var length = arrays.length, + iteratee = length > 1 ? arrays[length - 1] : undefined; -d3_transitionPrototype.tween = function(name, tween) { - var id = this.id, ns = this.namespace; - if (arguments.length < 2) return this.node()[ns][id].tween.get(name); - return d3_selection_each(this, tween == null - ? function(node) { node[ns][id].tween.remove(name); } - : function(node) { node[ns][id].tween.set(name, tween); }); -}; + iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined; + return unzipWith(arrays, iteratee); + }); -function d3_transition_tween(groups, name, value, tween) { - var id = groups.id, ns = groups.namespace; - return d3_selection_each(groups, typeof value === "function" - ? function(node, i, j) { node[ns][id].tween.set(name, tween(value.call(node, node.__data__, i, j))); } - : (value = tween(value), function(node) { node[ns][id].tween.set(name, value); })); -} + /*------------------------------------------------------------------------*/ -d3_transitionPrototype.attr = function(nameNS, value) { - if (arguments.length < 2) { + /** + * Creates a `lodash` wrapper instance that wraps `value` with explicit method + * chain sequences enabled. The result of such sequences must be unwrapped + * with `_#value`. + * + * @static + * @memberOf _ + * @since 1.3.0 + * @category Seq + * @param {*} value The value to wrap. + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36 }, + * { 'user': 'fred', 'age': 40 }, + * { 'user': 'pebbles', 'age': 1 } + * ]; + * + * var youngest = _ + * .chain(users) + * .sortBy('age') + * .map(function(o) { + * return o.user + ' is ' + o.age; + * }) + * .head() + * .value(); + * // => 'pebbles is 1' + */ + function chain(value) { + var result = lodash(value); + result.__chain__ = true; + return result; + } - // For attr(object), the object specifies the names and values of the - // attributes to transition. The values may be functions that are - // evaluated for each element. - for (value in nameNS) this.attr(value, nameNS[value]); - return this; - } + /** + * This method invokes `interceptor` and returns `value`. The interceptor + * is invoked with one argument; (value). The purpose of this method is to + * "tap into" a method chain sequence in order to modify intermediate results. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Seq + * @param {*} value The value to provide to `interceptor`. + * @param {Function} interceptor The function to invoke. + * @returns {*} Returns `value`. + * @example + * + * _([1, 2, 3]) + * .tap(function(array) { + * // Mutate input array. + * array.pop(); + * }) + * .reverse() + * .value(); + * // => [2, 1] + */ + function tap(value, interceptor) { + interceptor(value); + return value; + } - var interpolate = nameNS == "transform" ? d3_interpolateTransform : d3_interpolate, - name = d3.ns.qualify(nameNS); + /** + * This method is like `_.tap` except that it returns the result of `interceptor`. + * The purpose of this method is to "pass thru" values replacing intermediate + * results in a method chain sequence. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Seq + * @param {*} value The value to provide to `interceptor`. + * @param {Function} interceptor The function to invoke. + * @returns {*} Returns the result of `interceptor`. + * @example + * + * _(' abc ') + * .chain() + * .trim() + * .thru(function(value) { + * return [value]; + * }) + * .value(); + * // => ['abc'] + */ + function thru(value, interceptor) { + return interceptor(value); + } - // For attr(string, null), remove the attribute with the specified name. - function attrNull() { - this.removeAttribute(name); - } - function attrNullNS() { - this.removeAttributeNS(name.space, name.local); - } + /** + * This method is the wrapper version of `_.at`. + * + * @name at + * @memberOf _ + * @since 1.0.0 + * @category Seq + * @param {...(string|string[])} [paths] The property paths to pick. + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] }; + * + * _(object).at(['a[0].b.c', 'a[1]']).value(); + * // => [3, 4] + */ + var wrapperAt = flatRest(function(paths) { + var length = paths.length, + start = length ? paths[0] : 0, + value = this.__wrapped__, + interceptor = function(object) { return baseAt(object, paths); }; - // For attr(string, string), set the attribute with the specified name. - function attrTween(b) { - return b == null ? attrNull : (b += "", function() { - var a = this.getAttribute(name), i; - return a !== b && (i = interpolate(a, b), function(t) { this.setAttribute(name, i(t)); }); - }); - } - function attrTweenNS(b) { - return b == null ? attrNullNS : (b += "", function() { - var a = this.getAttributeNS(name.space, name.local), i; - return a !== b && (i = interpolate(a, b), function(t) { this.setAttributeNS(name.space, name.local, i(t)); }); + if (length > 1 || this.__actions__.length || + !(value instanceof LazyWrapper) || !isIndex(start)) { + return this.thru(interceptor); + } + value = value.slice(start, +start + (length ? 1 : 0)); + value.__actions__.push({ + 'func': thru, + 'args': [interceptor], + 'thisArg': undefined + }); + return new LodashWrapper(value, this.__chain__).thru(function(array) { + if (length && !array.length) { + array.push(undefined); + } + return array; + }); }); - } - - return d3_transition_tween(this, "attr." + nameNS, value, name.local ? attrTweenNS : attrTween); -}; - -d3_transitionPrototype.attrTween = function(nameNS, tween) { - var name = d3.ns.qualify(nameNS); - function attrTween(d, i) { - var f = tween.call(this, d, i, this.getAttribute(name)); - return f && function(t) { this.setAttribute(name, f(t)); }; - } - function attrTweenNS(d, i) { - var f = tween.call(this, d, i, this.getAttributeNS(name.space, name.local)); - return f && function(t) { this.setAttributeNS(name.space, name.local, f(t)); }; - } + /** + * Creates a `lodash` wrapper instance with explicit method chain sequences enabled. + * + * @name chain + * @memberOf _ + * @since 0.1.0 + * @category Seq + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36 }, + * { 'user': 'fred', 'age': 40 } + * ]; + * + * // A sequence without explicit chaining. + * _(users).head(); + * // => { 'user': 'barney', 'age': 36 } + * + * // A sequence with explicit chaining. + * _(users) + * .chain() + * .head() + * .pick('user') + * .value(); + * // => { 'user': 'barney' } + */ + function wrapperChain() { + return chain(this); + } - return this.tween("attr." + nameNS, name.local ? attrTweenNS : attrTween); -}; + /** + * Executes the chain sequence and returns the wrapped result. + * + * @name commit + * @memberOf _ + * @since 3.2.0 + * @category Seq + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * var array = [1, 2]; + * var wrapped = _(array).push(3); + * + * console.log(array); + * // => [1, 2] + * + * wrapped = wrapped.commit(); + * console.log(array); + * // => [1, 2, 3] + * + * wrapped.last(); + * // => 3 + * + * console.log(array); + * // => [1, 2, 3] + */ + function wrapperCommit() { + return new LodashWrapper(this.value(), this.__chain__); + } -d3_transitionPrototype.style = function(name, value, priority) { - var n = arguments.length; - if (n < 3) { + /** + * Gets the next value on a wrapped object following the + * [iterator protocol](https://mdn.io/iteration_protocols#iterator). + * + * @name next + * @memberOf _ + * @since 4.0.0 + * @category Seq + * @returns {Object} Returns the next iterator value. + * @example + * + * var wrapped = _([1, 2]); + * + * wrapped.next(); + * // => { 'done': false, 'value': 1 } + * + * wrapped.next(); + * // => { 'done': false, 'value': 2 } + * + * wrapped.next(); + * // => { 'done': true, 'value': undefined } + */ + function wrapperNext() { + if (this.__values__ === undefined) { + this.__values__ = toArray(this.value()); + } + var done = this.__index__ >= this.__values__.length, + value = done ? undefined : this.__values__[this.__index__++]; - // For style(object) or style(object, string), the object specifies the - // names and values of the attributes to set or remove. The values may be - // functions that are evaluated for each element. The optional string - // specifies the priority. - if (typeof name !== "string") { - if (n < 2) value = ""; - for (priority in name) this.style(priority, name[priority], value); - return this; + return { 'done': done, 'value': value }; } - // For style(string, string) or style(string, function), use the default - // priority. The priority is ignored for style(string, null). - priority = ""; - } - - // For style(name, null) or style(name, null, priority), remove the style - // property with the specified name. The priority is ignored. - function styleNull() { - this.style.removeProperty(name); - } - - // For style(name, string) or style(name, string, priority), set the style - // property with the specified name, using the specified priority. - // Otherwise, a name, value and priority are specified, and handled as below. - function styleString(b) { - return b == null ? styleNull : (b += "", function() { - var a = d3_window(this).getComputedStyle(this, null).getPropertyValue(name), i; - return a !== b && (i = d3_interpolate(a, b), function(t) { this.style.setProperty(name, i(t), priority); }); - }); - } - - return d3_transition_tween(this, "style." + name, value, styleString); -}; - -d3_transitionPrototype.styleTween = function(name, tween, priority) { - if (arguments.length < 3) priority = ""; - - function styleTween(d, i) { - var f = tween.call(this, d, i, d3_window(this).getComputedStyle(this, null).getPropertyValue(name)); - return f && function(t) { this.style.setProperty(name, f(t), priority); }; - } - - return this.tween("style." + name, styleTween); -}; - -d3_transitionPrototype.text = function(value) { - return d3_transition_tween(this, "text", value, d3_transition_text); -}; - -function d3_transition_text(b) { - if (b == null) b = ""; - return function() { this.textContent = b; }; -} - -d3_transitionPrototype.remove = function() { - var ns = this.namespace; - return this.each("end.transition", function() { - var p; - if (this[ns].count < 2 && (p = this.parentNode)) p.removeChild(this); - }); -}; - -var d3_ease_default = function() { return d3_identity; }; - -var d3_ease = d3.map({ - linear: d3_ease_default, - poly: d3_ease_poly, - quad: function() { return d3_ease_quad; }, - cubic: function() { return d3_ease_cubic; }, - sin: function() { return d3_ease_sin; }, - exp: function() { return d3_ease_exp; }, - circle: function() { return d3_ease_circle; }, - elastic: d3_ease_elastic, - back: d3_ease_back, - bounce: function() { return d3_ease_bounce; } -}); - -var d3_ease_mode = d3.map({ - "in": d3_identity, - "out": d3_ease_reverse, - "in-out": d3_ease_reflect, - "out-in": function(f) { return d3_ease_reflect(d3_ease_reverse(f)); } -}); - -d3.ease = function(name) { - var i = name.indexOf("-"), - t = i >= 0 ? name.slice(0, i) : name, - m = i >= 0 ? name.slice(i + 1) : "in"; - t = d3_ease.get(t) || d3_ease_default; - m = d3_ease_mode.get(m) || d3_identity; - return d3_ease_clamp(m(t.apply(null, d3_arraySlice.call(arguments, 1)))); -}; - -function d3_ease_clamp(f) { - return function(t) { - return t <= 0 ? 0 : t >= 1 ? 1 : f(t); - }; -} - -function d3_ease_reverse(f) { - return function(t) { - return 1 - f(1 - t); - }; -} - -function d3_ease_reflect(f) { - return function(t) { - return .5 * (t < .5 ? f(2 * t) : (2 - f(2 - 2 * t))); - }; -} + /** + * Enables the wrapper to be iterable. + * + * @name Symbol.iterator + * @memberOf _ + * @since 4.0.0 + * @category Seq + * @returns {Object} Returns the wrapper object. + * @example + * + * var wrapped = _([1, 2]); + * + * wrapped[Symbol.iterator]() === wrapped; + * // => true + * + * Array.from(wrapped); + * // => [1, 2] + */ + function wrapperToIterator() { + return this; + } -function d3_ease_quad(t) { - return t * t; -} + /** + * Creates a clone of the chain sequence planting `value` as the wrapped value. + * + * @name plant + * @memberOf _ + * @since 3.2.0 + * @category Seq + * @param {*} value The value to plant. + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * function square(n) { + * return n * n; + * } + * + * var wrapped = _([1, 2]).map(square); + * var other = wrapped.plant([3, 4]); + * + * other.value(); + * // => [9, 16] + * + * wrapped.value(); + * // => [1, 4] + */ + function wrapperPlant(value) { + var result, + parent = this; + + while (parent instanceof baseLodash) { + var clone = wrapperClone(parent); + clone.__index__ = 0; + clone.__values__ = undefined; + if (result) { + previous.__wrapped__ = clone; + } else { + result = clone; + } + var previous = clone; + parent = parent.__wrapped__; + } + previous.__wrapped__ = value; + return result; + } -function d3_ease_cubic(t) { - return t * t * t; -} + /** + * This method is the wrapper version of `_.reverse`. + * + * **Note:** This method mutates the wrapped array. + * + * @name reverse + * @memberOf _ + * @since 0.1.0 + * @category Seq + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * var array = [1, 2, 3]; + * + * _(array).reverse().value() + * // => [3, 2, 1] + * + * console.log(array); + * // => [3, 2, 1] + */ + function wrapperReverse() { + var value = this.__wrapped__; + if (value instanceof LazyWrapper) { + var wrapped = value; + if (this.__actions__.length) { + wrapped = new LazyWrapper(this); + } + wrapped = wrapped.reverse(); + wrapped.__actions__.push({ + 'func': thru, + 'args': [reverse], + 'thisArg': undefined + }); + return new LodashWrapper(wrapped, this.__chain__); + } + return this.thru(reverse); + } -// Optimized clamp(reflect(poly(3))). -function d3_ease_cubicInOut(t) { - if (t <= 0) return 0; - if (t >= 1) return 1; - var t2 = t * t, t3 = t2 * t; - return 4 * (t < .5 ? t3 : 3 * (t - t2) + t3 - .75); -} + /** + * Executes the chain sequence to resolve the unwrapped value. + * + * @name value + * @memberOf _ + * @since 0.1.0 + * @alias toJSON, valueOf + * @category Seq + * @returns {*} Returns the resolved unwrapped value. + * @example + * + * _([1, 2, 3]).value(); + * // => [1, 2, 3] + */ + function wrapperValue() { + return baseWrapperValue(this.__wrapped__, this.__actions__); + } -function d3_ease_poly(e) { - return function(t) { - return Math.pow(t, e); - }; -} + /*------------------------------------------------------------------------*/ -function d3_ease_sin(t) { - return 1 - Math.cos(t * halfπ); -} + /** + * Creates an object composed of keys generated from the results of running + * each element of `collection` thru `iteratee`. The corresponding value of + * each key is the number of times the key was returned by `iteratee`. The + * iteratee is invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 0.5.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The iteratee to transform keys. + * @returns {Object} Returns the composed aggregate object. + * @example + * + * _.countBy([6.1, 4.2, 6.3], Math.floor); + * // => { '4': 1, '6': 2 } + * + * // The `_.property` iteratee shorthand. + * _.countBy(['one', 'two', 'three'], 'length'); + * // => { '3': 2, '5': 1 } + */ + var countBy = createAggregator(function(result, value, key) { + if (hasOwnProperty.call(result, key)) { + ++result[key]; + } else { + baseAssignValue(result, key, 1); + } + }); -function d3_ease_exp(t) { - return Math.pow(2, 10 * (t - 1)); -} + /** + * Checks if `predicate` returns truthy for **all** elements of `collection`. + * Iteration is stopped once `predicate` returns falsey. The predicate is + * invoked with three arguments: (value, index|key, collection). + * + * **Note:** This method returns `true` for + * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because + * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of + * elements of empty collections. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {boolean} Returns `true` if all elements pass the predicate check, + * else `false`. + * @example + * + * _.every([true, 1, null, 'yes'], Boolean); + * // => false + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': false }, + * { 'user': 'fred', 'age': 40, 'active': false } + * ]; + * + * // The `_.matches` iteratee shorthand. + * _.every(users, { 'user': 'barney', 'active': false }); + * // => false + * + * // The `_.matchesProperty` iteratee shorthand. + * _.every(users, ['active', false]); + * // => true + * + * // The `_.property` iteratee shorthand. + * _.every(users, 'active'); + * // => false + */ + function every(collection, predicate, guard) { + var func = isArray(collection) ? arrayEvery : baseEvery; + if (guard && isIterateeCall(collection, predicate, guard)) { + predicate = undefined; + } + return func(collection, getIteratee(predicate, 3)); + } -function d3_ease_circle(t) { - return 1 - Math.sqrt(1 - t * t); -} + /** + * Iterates over elements of `collection`, returning an array of all elements + * `predicate` returns truthy for. The predicate is invoked with three + * arguments: (value, index|key, collection). + * + * **Note:** Unlike `_.remove`, this method returns a new array. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new filtered array. + * @see _.reject + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': true }, + * { 'user': 'fred', 'age': 40, 'active': false } + * ]; + * + * _.filter(users, function(o) { return !o.active; }); + * // => objects for ['fred'] + * + * // The `_.matches` iteratee shorthand. + * _.filter(users, { 'age': 36, 'active': true }); + * // => objects for ['barney'] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.filter(users, ['active', false]); + * // => objects for ['fred'] + * + * // The `_.property` iteratee shorthand. + * _.filter(users, 'active'); + * // => objects for ['barney'] + */ + function filter(collection, predicate) { + var func = isArray(collection) ? arrayFilter : baseFilter; + return func(collection, getIteratee(predicate, 3)); + } -function d3_ease_elastic(a, p) { - var s; - if (arguments.length < 2) p = 0.45; - if (arguments.length) s = p / τ * Math.asin(1 / a); - else a = 1, s = p / 4; - return function(t) { - return 1 + a * Math.pow(2, -10 * t) * Math.sin((t - s) * τ / p); - }; -} + /** + * Iterates over elements of `collection`, returning the first element + * `predicate` returns truthy for. The predicate is invoked with three + * arguments: (value, index|key, collection). + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to inspect. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param {number} [fromIndex=0] The index to search from. + * @returns {*} Returns the matched element, else `undefined`. + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': true }, + * { 'user': 'fred', 'age': 40, 'active': false }, + * { 'user': 'pebbles', 'age': 1, 'active': true } + * ]; + * + * _.find(users, function(o) { return o.age < 40; }); + * // => object for 'barney' + * + * // The `_.matches` iteratee shorthand. + * _.find(users, { 'age': 1, 'active': true }); + * // => object for 'pebbles' + * + * // The `_.matchesProperty` iteratee shorthand. + * _.find(users, ['active', false]); + * // => object for 'fred' + * + * // The `_.property` iteratee shorthand. + * _.find(users, 'active'); + * // => object for 'barney' + */ + var find = createFind(findIndex); -function d3_ease_back(s) { - if (!s) s = 1.70158; - return function(t) { - return t * t * ((s + 1) * t - s); - }; -} + /** + * This method is like `_.find` except that it iterates over elements of + * `collection` from right to left. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Collection + * @param {Array|Object} collection The collection to inspect. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param {number} [fromIndex=collection.length-1] The index to search from. + * @returns {*} Returns the matched element, else `undefined`. + * @example + * + * _.findLast([1, 2, 3, 4], function(n) { + * return n % 2 == 1; + * }); + * // => 3 + */ + var findLast = createFind(findLastIndex); -function d3_ease_bounce(t) { - return t < 1 / 2.75 ? 7.5625 * t * t - : t < 2 / 2.75 ? 7.5625 * (t -= 1.5 / 2.75) * t + .75 - : t < 2.5 / 2.75 ? 7.5625 * (t -= 2.25 / 2.75) * t + .9375 - : 7.5625 * (t -= 2.625 / 2.75) * t + .984375; -} + /** + * Creates a flattened array of values by running each element in `collection` + * thru `iteratee` and flattening the mapped results. The iteratee is invoked + * with three arguments: (value, index|key, collection). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new flattened array. + * @example + * + * function duplicate(n) { + * return [n, n]; + * } + * + * _.flatMap([1, 2], duplicate); + * // => [1, 1, 2, 2] + */ + function flatMap(collection, iteratee) { + return baseFlatten(map(collection, iteratee), 1); + } -d3_transitionPrototype.ease = function(value) { - var id = this.id, ns = this.namespace; - if (arguments.length < 1) return this.node()[ns][id].ease; - if (typeof value !== "function") value = d3.ease.apply(d3, arguments); - return d3_selection_each(this, function(node) { node[ns][id].ease = value; }); -}; + /** + * This method is like `_.flatMap` except that it recursively flattens the + * mapped results. + * + * @static + * @memberOf _ + * @since 4.7.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new flattened array. + * @example + * + * function duplicate(n) { + * return [[[n, n]]]; + * } + * + * _.flatMapDeep([1, 2], duplicate); + * // => [1, 1, 2, 2] + */ + function flatMapDeep(collection, iteratee) { + return baseFlatten(map(collection, iteratee), INFINITY); + } -d3_transitionPrototype.delay = function(value) { - var id = this.id, ns = this.namespace; - if (arguments.length < 1) return this.node()[ns][id].delay; - return d3_selection_each(this, typeof value === "function" - ? function(node, i, j) { node[ns][id].delay = +value.call(node, node.__data__, i, j); } - : (value = +value, function(node) { node[ns][id].delay = value; })); -}; + /** + * This method is like `_.flatMap` except that it recursively flattens the + * mapped results up to `depth` times. + * + * @static + * @memberOf _ + * @since 4.7.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @param {number} [depth=1] The maximum recursion depth. + * @returns {Array} Returns the new flattened array. + * @example + * + * function duplicate(n) { + * return [[[n, n]]]; + * } + * + * _.flatMapDepth([1, 2], duplicate, 2); + * // => [[1, 1], [2, 2]] + */ + function flatMapDepth(collection, iteratee, depth) { + depth = depth === undefined ? 1 : toInteger(depth); + return baseFlatten(map(collection, iteratee), depth); + } -d3_transitionPrototype.duration = function(value) { - var id = this.id, ns = this.namespace; - if (arguments.length < 1) return this.node()[ns][id].duration; - return d3_selection_each(this, typeof value === "function" - ? function(node, i, j) { node[ns][id].duration = Math.max(1, value.call(node, node.__data__, i, j)); } - : (value = Math.max(1, value), function(node) { node[ns][id].duration = value; })); -}; + /** + * Iterates over elements of `collection` and invokes `iteratee` for each element. + * The iteratee is invoked with three arguments: (value, index|key, collection). + * Iteratee functions may exit iteration early by explicitly returning `false`. + * + * **Note:** As with other "Collections" methods, objects with a "length" + * property are iterated like arrays. To avoid this behavior use `_.forIn` + * or `_.forOwn` for object iteration. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @alias each + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Array|Object} Returns `collection`. + * @see _.forEachRight + * @example + * + * _.forEach([1, 2], function(value) { + * console.log(value); + * }); + * // => Logs `1` then `2`. + * + * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) { + * console.log(key); + * }); + * // => Logs 'a' then 'b' (iteration order is not guaranteed). + */ + function forEach(collection, iteratee) { + var func = isArray(collection) ? arrayEach : baseEach; + return func(collection, getIteratee(iteratee, 3)); + } -d3_transitionPrototype.each = function(type, listener) { - var id = this.id, ns = this.namespace; - if (arguments.length < 2) { - var inherit = d3_transitionInherit, - inheritId = d3_transitionInheritId; - try { - d3_transitionInheritId = id; - d3_selection_each(this, function(node, i, j) { - d3_transitionInherit = node[ns][id]; - type.call(node, node.__data__, i, j); - }); - } finally { - d3_transitionInherit = inherit; - d3_transitionInheritId = inheritId; + /** + * This method is like `_.forEach` except that it iterates over elements of + * `collection` from right to left. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @alias eachRight + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Array|Object} Returns `collection`. + * @see _.forEach + * @example + * + * _.forEachRight([1, 2], function(value) { + * console.log(value); + * }); + * // => Logs `2` then `1`. + */ + function forEachRight(collection, iteratee) { + var func = isArray(collection) ? arrayEachRight : baseEachRight; + return func(collection, getIteratee(iteratee, 3)); } - } else { - d3_selection_each(this, function(node) { - var transition = node[ns][id]; - (transition.event || (transition.event = d3.dispatch("start", "end", "interrupt"))).on(type, listener); + + /** + * Creates an object composed of keys generated from the results of running + * each element of `collection` thru `iteratee`. The order of grouped values + * is determined by the order they occur in `collection`. The corresponding + * value of each key is an array of elements responsible for generating the + * key. The iteratee is invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The iteratee to transform keys. + * @returns {Object} Returns the composed aggregate object. + * @example + * + * _.groupBy([6.1, 4.2, 6.3], Math.floor); + * // => { '4': [4.2], '6': [6.1, 6.3] } + * + * // The `_.property` iteratee shorthand. + * _.groupBy(['one', 'two', 'three'], 'length'); + * // => { '3': ['one', 'two'], '5': ['three'] } + */ + var groupBy = createAggregator(function(result, value, key) { + if (hasOwnProperty.call(result, key)) { + result[key].push(value); + } else { + baseAssignValue(result, key, [value]); + } }); - } - return this; -}; -d3_transitionPrototype.transition = function() { - var id0 = this.id, - id1 = ++d3_transitionId, - ns = this.namespace, - subgroups = [], - subgroup, - group, - node, - transition; + /** + * Checks if `value` is in `collection`. If `collection` is a string, it's + * checked for a substring of `value`, otherwise + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * is used for equality comparisons. If `fromIndex` is negative, it's used as + * the offset from the end of `collection`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object|string} collection The collection to inspect. + * @param {*} value The value to search for. + * @param {number} [fromIndex=0] The index to search from. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`. + * @returns {boolean} Returns `true` if `value` is found, else `false`. + * @example + * + * _.includes([1, 2, 3], 1); + * // => true + * + * _.includes([1, 2, 3], 1, 2); + * // => false + * + * _.includes({ 'a': 1, 'b': 2 }, 1); + * // => true + * + * _.includes('abcd', 'bc'); + * // => true + */ + function includes(collection, value, fromIndex, guard) { + collection = isArrayLike(collection) ? collection : values(collection); + fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0; - for (var j = 0, m = this.length; j < m; j++) { - subgroups.push(subgroup = []); - for (var group = this[j], i = 0, n = group.length; i < n; i++) { - if (node = group[i]) { - transition = node[ns][id0]; - d3_transitionNode(node, i, ns, id1, {time: transition.time, ease: transition.ease, delay: transition.delay + transition.duration, duration: transition.duration}); + var length = collection.length; + if (fromIndex < 0) { + fromIndex = nativeMax(length + fromIndex, 0); } - subgroup.push(node); + return isString(collection) + ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1) + : (!!length && baseIndexOf(collection, value, fromIndex) > -1); } - } - return d3_transition(subgroups, ns, id1); -}; + /** + * Invokes the method at `path` of each element in `collection`, returning + * an array of the results of each invoked method. Any additional arguments + * are provided to each invoked method. If `path` is a function, it's invoked + * for, and `this` bound to, each element in `collection`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Array|Function|string} path The path of the method to invoke or + * the function invoked per iteration. + * @param {...*} [args] The arguments to invoke each method with. + * @returns {Array} Returns the array of results. + * @example + * + * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort'); + * // => [[1, 5, 7], [1, 2, 3]] + * + * _.invokeMap([123, 456], String.prototype.split, ''); + * // => [['1', '2', '3'], ['4', '5', '6']] + */ + var invokeMap = baseRest(function(collection, path, args) { + var index = -1, + isFunc = typeof path == 'function', + result = isArrayLike(collection) ? Array(collection.length) : []; -function d3_transitionNamespace(name) { - return name == null ? "__transition__" : "__transition_" + name + "__"; -} + baseEach(collection, function(value) { + result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args); + }); + return result; + }); -function d3_transitionNode(node, i, ns, id, inherit) { - var lock = node[ns] || (node[ns] = {active: 0, count: 0}), - transition = lock[id]; + /** + * Creates an object composed of keys generated from the results of running + * each element of `collection` thru `iteratee`. The corresponding value of + * each key is the last element responsible for generating the key. The + * iteratee is invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The iteratee to transform keys. + * @returns {Object} Returns the composed aggregate object. + * @example + * + * var array = [ + * { 'dir': 'left', 'code': 97 }, + * { 'dir': 'right', 'code': 100 } + * ]; + * + * _.keyBy(array, function(o) { + * return String.fromCharCode(o.code); + * }); + * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } } + * + * _.keyBy(array, 'dir'); + * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } } + */ + var keyBy = createAggregator(function(result, value, key) { + baseAssignValue(result, key, value); + }); - if (!transition) { - var time = inherit.time; + /** + * Creates an array of values by running each element in `collection` thru + * `iteratee`. The iteratee is invoked with three arguments: + * (value, index|key, collection). + * + * Many lodash methods are guarded to work as iteratees for methods like + * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`. + * + * The guarded methods are: + * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`, + * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`, + * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`, + * `template`, `trim`, `trimEnd`, `trimStart`, and `words` + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new mapped array. + * @example + * + * function square(n) { + * return n * n; + * } + * + * _.map([4, 8], square); + * // => [16, 64] + * + * _.map({ 'a': 4, 'b': 8 }, square); + * // => [16, 64] (iteration order is not guaranteed) + * + * var users = [ + * { 'user': 'barney' }, + * { 'user': 'fred' } + * ]; + * + * // The `_.property` iteratee shorthand. + * _.map(users, 'user'); + * // => ['barney', 'fred'] + */ + function map(collection, iteratee) { + var func = isArray(collection) ? arrayMap : baseMap; + return func(collection, getIteratee(iteratee, 3)); + } - transition = lock[id] = { - tween: new d3_Map, - time: time, - delay: inherit.delay, - duration: inherit.duration, - ease: inherit.ease, - index: i - }; + /** + * This method is like `_.sortBy` except that it allows specifying the sort + * orders of the iteratees to sort by. If `orders` is unspecified, all values + * are sorted in ascending order. Otherwise, specify an order of "desc" for + * descending or "asc" for ascending sort order of corresponding values. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]] + * The iteratees to sort by. + * @param {string[]} [orders] The sort orders of `iteratees`. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`. + * @returns {Array} Returns the new sorted array. + * @example + * + * var users = [ + * { 'user': 'fred', 'age': 48 }, + * { 'user': 'barney', 'age': 34 }, + * { 'user': 'fred', 'age': 40 }, + * { 'user': 'barney', 'age': 36 } + * ]; + * + * // Sort by `user` in ascending order and by `age` in descending order. + * _.orderBy(users, ['user', 'age'], ['asc', 'desc']); + * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]] + */ + function orderBy(collection, iteratees, orders, guard) { + if (collection == null) { + return []; + } + if (!isArray(iteratees)) { + iteratees = iteratees == null ? [] : [iteratees]; + } + orders = guard ? undefined : orders; + if (!isArray(orders)) { + orders = orders == null ? [] : [orders]; + } + return baseOrderBy(collection, iteratees, orders); + } - inherit = null; // allow gc + /** + * Creates an array of elements split into two groups, the first of which + * contains elements `predicate` returns truthy for, the second of which + * contains elements `predicate` returns falsey for. The predicate is + * invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the array of grouped elements. + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': false }, + * { 'user': 'fred', 'age': 40, 'active': true }, + * { 'user': 'pebbles', 'age': 1, 'active': false } + * ]; + * + * _.partition(users, function(o) { return o.active; }); + * // => objects for [['fred'], ['barney', 'pebbles']] + * + * // The `_.matches` iteratee shorthand. + * _.partition(users, { 'age': 1, 'active': false }); + * // => objects for [['pebbles'], ['barney', 'fred']] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.partition(users, ['active', false]); + * // => objects for [['barney', 'pebbles'], ['fred']] + * + * // The `_.property` iteratee shorthand. + * _.partition(users, 'active'); + * // => objects for [['fred'], ['barney', 'pebbles']] + */ + var partition = createAggregator(function(result, value, key) { + result[key ? 0 : 1].push(value); + }, function() { return [[], []]; }); - ++lock.count; + /** + * Reduces `collection` to a value which is the accumulated result of running + * each element in `collection` thru `iteratee`, where each successive + * invocation is supplied the return value of the previous. If `accumulator` + * is not given, the first element of `collection` is used as the initial + * value. The iteratee is invoked with four arguments: + * (accumulator, value, index|key, collection). + * + * Many lodash methods are guarded to work as iteratees for methods like + * `_.reduce`, `_.reduceRight`, and `_.transform`. + * + * The guarded methods are: + * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`, + * and `sortBy` + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @param {*} [accumulator] The initial value. + * @returns {*} Returns the accumulated value. + * @see _.reduceRight + * @example + * + * _.reduce([1, 2], function(sum, n) { + * return sum + n; + * }, 0); + * // => 3 + * + * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) { + * (result[value] || (result[value] = [])).push(key); + * return result; + * }, {}); + * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed) + */ + function reduce(collection, iteratee, accumulator) { + var func = isArray(collection) ? arrayReduce : baseReduce, + initAccum = arguments.length < 3; - d3.timer(function(elapsed) { - var delay = transition.delay, - duration, - ease, - timer = d3_timer_active, - tweened = []; + return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach); + } - timer.t = delay + time; - if (delay <= elapsed) return start(elapsed - delay); - timer.c = start; + /** + * This method is like `_.reduce` except that it iterates over elements of + * `collection` from right to left. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @param {*} [accumulator] The initial value. + * @returns {*} Returns the accumulated value. + * @see _.reduce + * @example + * + * var array = [[0, 1], [2, 3], [4, 5]]; + * + * _.reduceRight(array, function(flattened, other) { + * return flattened.concat(other); + * }, []); + * // => [4, 5, 2, 3, 0, 1] + */ + function reduceRight(collection, iteratee, accumulator) { + var func = isArray(collection) ? arrayReduceRight : baseReduce, + initAccum = arguments.length < 3; - function start(elapsed) { - if (lock.active > id) return stop(); + return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight); + } - var active = lock[lock.active]; - if (active) { - --lock.count; - delete lock[lock.active]; - active.event && active.event.interrupt.call(node, node.__data__, active.index); - } - - lock.active = id; - - transition.event && transition.event.start.call(node, node.__data__, i); - - transition.tween.forEach(function(key, value) { - if (value = value.call(node, node.__data__, i)) { - tweened.push(value); - } - }); + /** + * The opposite of `_.filter`; this method returns the elements of `collection` + * that `predicate` does **not** return truthy for. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new filtered array. + * @see _.filter + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': false }, + * { 'user': 'fred', 'age': 40, 'active': true } + * ]; + * + * _.reject(users, function(o) { return !o.active; }); + * // => objects for ['fred'] + * + * // The `_.matches` iteratee shorthand. + * _.reject(users, { 'age': 40, 'active': true }); + * // => objects for ['barney'] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.reject(users, ['active', false]); + * // => objects for ['fred'] + * + * // The `_.property` iteratee shorthand. + * _.reject(users, 'active'); + * // => objects for ['barney'] + */ + function reject(collection, predicate) { + var func = isArray(collection) ? arrayFilter : baseFilter; + return func(collection, negate(getIteratee(predicate, 3))); + } - // Deferred capture to allow tweens to initialize ease & duration. - ease = transition.ease; - duration = transition.duration; + /** + * Gets a random element from `collection`. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Collection + * @param {Array|Object} collection The collection to sample. + * @returns {*} Returns the random element. + * @example + * + * _.sample([1, 2, 3, 4]); + * // => 2 + */ + function sample(collection) { + var func = isArray(collection) ? arraySample : baseSample; + return func(collection); + } - d3.timer(function() { // defer to end of current frame - timer.c = tick(elapsed || 1) ? d3_true : tick; - return 1; - }, 0, time); + /** + * Gets `n` random elements at unique keys from `collection` up to the + * size of `collection`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Collection + * @param {Array|Object} collection The collection to sample. + * @param {number} [n=1] The number of elements to sample. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Array} Returns the random elements. + * @example + * + * _.sampleSize([1, 2, 3], 2); + * // => [3, 1] + * + * _.sampleSize([1, 2, 3], 4); + * // => [2, 3, 1] + */ + function sampleSize(collection, n, guard) { + if ((guard ? isIterateeCall(collection, n, guard) : n === undefined)) { + n = 1; + } else { + n = toInteger(n); } + var func = isArray(collection) ? arraySampleSize : baseSampleSize; + return func(collection, n); + } - function tick(elapsed) { - if (lock.active !== id) return 1; - - var t = elapsed / duration, - e = ease(t), - n = tweened.length; + /** + * Creates an array of shuffled values, using a version of the + * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle). + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to shuffle. + * @returns {Array} Returns the new shuffled array. + * @example + * + * _.shuffle([1, 2, 3, 4]); + * // => [4, 1, 3, 2] + */ + function shuffle(collection) { + var func = isArray(collection) ? arrayShuffle : baseShuffle; + return func(collection); + } - while (n > 0) { - tweened[--n].call(node, e); - } + /** + * Gets the size of `collection` by returning its length for array-like + * values or the number of own enumerable string keyed properties for objects. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object|string} collection The collection to inspect. + * @returns {number} Returns the collection size. + * @example + * + * _.size([1, 2, 3]); + * // => 3 + * + * _.size({ 'a': 1, 'b': 2 }); + * // => 2 + * + * _.size('pebbles'); + * // => 7 + */ + function size(collection) { + if (collection == null) { + return 0; + } + if (isArrayLike(collection)) { + return isString(collection) ? stringSize(collection) : collection.length; + } + var tag = getTag(collection); + if (tag == mapTag || tag == setTag) { + return collection.size; + } + return baseKeys(collection).length; + } - if (t >= 1) { - transition.event && transition.event.end.call(node, node.__data__, i); - return stop(); - } + /** + * Checks if `predicate` returns truthy for **any** element of `collection`. + * Iteration is stopped once `predicate` returns truthy. The predicate is + * invoked with three arguments: (value, index|key, collection). + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {boolean} Returns `true` if any element passes the predicate check, + * else `false`. + * @example + * + * _.some([null, 0, 'yes', false], Boolean); + * // => true + * + * var users = [ + * { 'user': 'barney', 'active': true }, + * { 'user': 'fred', 'active': false } + * ]; + * + * // The `_.matches` iteratee shorthand. + * _.some(users, { 'user': 'barney', 'active': false }); + * // => false + * + * // The `_.matchesProperty` iteratee shorthand. + * _.some(users, ['active', false]); + * // => true + * + * // The `_.property` iteratee shorthand. + * _.some(users, 'active'); + * // => true + */ + function some(collection, predicate, guard) { + var func = isArray(collection) ? arraySome : baseSome; + if (guard && isIterateeCall(collection, predicate, guard)) { + predicate = undefined; } + return func(collection, getIteratee(predicate, 3)); + } - function stop() { - if (--lock.count) delete lock[id]; - else delete node[ns]; - return 1; + /** + * Creates an array of elements, sorted in ascending order by the results of + * running each element in a collection thru each iteratee. This method + * performs a stable sort, that is, it preserves the original sort order of + * equal elements. The iteratees are invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {...(Function|Function[])} [iteratees=[_.identity]] + * The iteratees to sort by. + * @returns {Array} Returns the new sorted array. + * @example + * + * var users = [ + * { 'user': 'fred', 'age': 48 }, + * { 'user': 'barney', 'age': 36 }, + * { 'user': 'fred', 'age': 40 }, + * { 'user': 'barney', 'age': 34 } + * ]; + * + * _.sortBy(users, [function(o) { return o.user; }]); + * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]] + * + * _.sortBy(users, ['user', 'age']); + * // => objects for [['barney', 34], ['barney', 36], ['fred', 40], ['fred', 48]] + */ + var sortBy = baseRest(function(collection, iteratees) { + if (collection == null) { + return []; } - }, 0, time); - } -} + var length = iteratees.length; + if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) { + iteratees = []; + } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) { + iteratees = [iteratees[0]]; + } + return baseOrderBy(collection, baseFlatten(iteratees, 1), []); + }); -d3.xhr = d3_xhrType(d3_identity); + /*------------------------------------------------------------------------*/ -function d3_xhrType(response) { - return function(url, mimeType, callback) { - if (arguments.length === 2 && typeof mimeType === "function") callback = mimeType, mimeType = null; - return d3_xhr(url, mimeType, response, callback); - }; -} + /** + * Gets the timestamp of the number of milliseconds that have elapsed since + * the Unix epoch (1 January 1970 00:00:00 UTC). + * + * @static + * @memberOf _ + * @since 2.4.0 + * @category Date + * @returns {number} Returns the timestamp. + * @example + * + * _.defer(function(stamp) { + * console.log(_.now() - stamp); + * }, _.now()); + * // => Logs the number of milliseconds it took for the deferred invocation. + */ + var now = ctxNow || function() { + return root.Date.now(); + }; -function d3_xhr(url, mimeType, response, callback) { - var xhr = {}, - dispatch = d3.dispatch("beforesend", "progress", "load", "error"), - headers = {}, - request = new XMLHttpRequest, - responseType = null; + /*------------------------------------------------------------------------*/ - // If IE does not support CORS, use XDomainRequest. - if (this.XDomainRequest - && !("withCredentials" in request) - && /^(http(s)?:)?\/\//.test(url)) request = new XDomainRequest; + /** + * The opposite of `_.before`; this method creates a function that invokes + * `func` once it's called `n` or more times. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {number} n The number of calls before `func` is invoked. + * @param {Function} func The function to restrict. + * @returns {Function} Returns the new restricted function. + * @example + * + * var saves = ['profile', 'settings']; + * + * var done = _.after(saves.length, function() { + * console.log('done saving!'); + * }); + * + * _.forEach(saves, function(type) { + * asyncSave({ 'type': type, 'complete': done }); + * }); + * // => Logs 'done saving!' after the two async saves have completed. + */ + function after(n, func) { + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + n = toInteger(n); + return function() { + if (--n < 1) { + return func.apply(this, arguments); + } + }; + } - "onload" in request - ? request.onload = request.onerror = respond - : request.onreadystatechange = function() { request.readyState > 3 && respond(); }; + /** + * Creates a function that invokes `func`, with up to `n` arguments, + * ignoring any additional arguments. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Function + * @param {Function} func The function to cap arguments for. + * @param {number} [n=func.length] The arity cap. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Function} Returns the new capped function. + * @example + * + * _.map(['6', '8', '10'], _.ary(parseInt, 1)); + * // => [6, 8, 10] + */ + function ary(func, n, guard) { + n = guard ? undefined : n; + n = (func && n == null) ? func.length : n; + return createWrap(func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n); + } - function respond() { - var status = request.status, result; - if (!status && d3_xhrHasResponse(request) || status >= 200 && status < 300 || status === 304) { - try { - result = response.call(xhr, request); - } catch (e) { - dispatch.error.call(xhr, e); - return; + /** + * Creates a function that invokes `func`, with the `this` binding and arguments + * of the created function, while it's called less than `n` times. Subsequent + * calls to the created function return the result of the last `func` invocation. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Function + * @param {number} n The number of calls at which `func` is no longer invoked. + * @param {Function} func The function to restrict. + * @returns {Function} Returns the new restricted function. + * @example + * + * jQuery(element).on('click', _.before(5, addContactToList)); + * // => Allows adding up to 4 contacts to the list. + */ + function before(n, func) { + var result; + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); } - dispatch.load.call(xhr, result); - } else { - dispatch.error.call(xhr, request); + n = toInteger(n); + return function() { + if (--n > 0) { + result = func.apply(this, arguments); + } + if (n <= 1) { + func = undefined; + } + return result; + }; } - } - request.onprogress = function(event) { - var o = d3.event; - d3.event = event; - try { dispatch.progress.call(xhr, request); } - finally { d3.event = o; } - }; + /** + * Creates a function that invokes `func` with the `this` binding of `thisArg` + * and `partials` prepended to the arguments it receives. + * + * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds, + * may be used as a placeholder for partially applied arguments. + * + * **Note:** Unlike native `Function#bind`, this method doesn't set the "length" + * property of bound functions. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to bind. + * @param {*} thisArg The `this` binding of `func`. + * @param {...*} [partials] The arguments to be partially applied. + * @returns {Function} Returns the new bound function. + * @example + * + * function greet(greeting, punctuation) { + * return greeting + ' ' + this.user + punctuation; + * } + * + * var object = { 'user': 'fred' }; + * + * var bound = _.bind(greet, object, 'hi'); + * bound('!'); + * // => 'hi fred!' + * + * // Bound with placeholders. + * var bound = _.bind(greet, object, _, '!'); + * bound('hi'); + * // => 'hi fred!' + */ + var bind = baseRest(function(func, thisArg, partials) { + var bitmask = WRAP_BIND_FLAG; + if (partials.length) { + var holders = replaceHolders(partials, getHolder(bind)); + bitmask |= WRAP_PARTIAL_FLAG; + } + return createWrap(func, bitmask, thisArg, partials, holders); + }); - xhr.header = function(name, value) { - name = (name + "").toLowerCase(); - if (arguments.length < 2) return headers[name]; - if (value == null) delete headers[name]; - else headers[name] = value + ""; - return xhr; - }; + /** + * Creates a function that invokes the method at `object[key]` with `partials` + * prepended to the arguments it receives. + * + * This method differs from `_.bind` by allowing bound functions to reference + * methods that may be redefined or don't yet exist. See + * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern) + * for more details. + * + * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic + * builds, may be used as a placeholder for partially applied arguments. + * + * @static + * @memberOf _ + * @since 0.10.0 + * @category Function + * @param {Object} object The object to invoke the method on. + * @param {string} key The key of the method. + * @param {...*} [partials] The arguments to be partially applied. + * @returns {Function} Returns the new bound function. + * @example + * + * var object = { + * 'user': 'fred', + * 'greet': function(greeting, punctuation) { + * return greeting + ' ' + this.user + punctuation; + * } + * }; + * + * var bound = _.bindKey(object, 'greet', 'hi'); + * bound('!'); + * // => 'hi fred!' + * + * object.greet = function(greeting, punctuation) { + * return greeting + 'ya ' + this.user + punctuation; + * }; + * + * bound('!'); + * // => 'hiya fred!' + * + * // Bound with placeholders. + * var bound = _.bindKey(object, 'greet', _, '!'); + * bound('hi'); + * // => 'hiya fred!' + */ + var bindKey = baseRest(function(object, key, partials) { + var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG; + if (partials.length) { + var holders = replaceHolders(partials, getHolder(bindKey)); + bitmask |= WRAP_PARTIAL_FLAG; + } + return createWrap(key, bitmask, object, partials, holders); + }); - // If mimeType is non-null and no Accept header is set, a default is used. - xhr.mimeType = function(value) { - if (!arguments.length) return mimeType; - mimeType = value == null ? null : value + ""; - return xhr; - }; + /** + * Creates a function that accepts arguments of `func` and either invokes + * `func` returning its result, if at least `arity` number of arguments have + * been provided, or returns a function that accepts the remaining `func` + * arguments, and so on. The arity of `func` may be specified if `func.length` + * is not sufficient. + * + * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds, + * may be used as a placeholder for provided arguments. + * + * **Note:** This method doesn't set the "length" property of curried functions. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Function + * @param {Function} func The function to curry. + * @param {number} [arity=func.length] The arity of `func`. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Function} Returns the new curried function. + * @example + * + * var abc = function(a, b, c) { + * return [a, b, c]; + * }; + * + * var curried = _.curry(abc); + * + * curried(1)(2)(3); + * // => [1, 2, 3] + * + * curried(1, 2)(3); + * // => [1, 2, 3] + * + * curried(1, 2, 3); + * // => [1, 2, 3] + * + * // Curried with placeholders. + * curried(1)(_, 3)(2); + * // => [1, 2, 3] + */ + function curry(func, arity, guard) { + arity = guard ? undefined : arity; + var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity); + result.placeholder = curry.placeholder; + return result; + } - // Specifies what type the response value should take; - // for instance, arraybuffer, blob, document, or text. - xhr.responseType = function(value) { - if (!arguments.length) return responseType; - responseType = value; - return xhr; - }; + /** + * This method is like `_.curry` except that arguments are applied to `func` + * in the manner of `_.partialRight` instead of `_.partial`. + * + * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic + * builds, may be used as a placeholder for provided arguments. + * + * **Note:** This method doesn't set the "length" property of curried functions. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Function + * @param {Function} func The function to curry. + * @param {number} [arity=func.length] The arity of `func`. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Function} Returns the new curried function. + * @example + * + * var abc = function(a, b, c) { + * return [a, b, c]; + * }; + * + * var curried = _.curryRight(abc); + * + * curried(3)(2)(1); + * // => [1, 2, 3] + * + * curried(2, 3)(1); + * // => [1, 2, 3] + * + * curried(1, 2, 3); + * // => [1, 2, 3] + * + * // Curried with placeholders. + * curried(3)(1, _)(2); + * // => [1, 2, 3] + */ + function curryRight(func, arity, guard) { + arity = guard ? undefined : arity; + var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity); + result.placeholder = curryRight.placeholder; + return result; + } - // Specify how to convert the response content to a specific type; - // changes the callback value on "load" events. - xhr.response = function(value) { - response = value; - return xhr; - }; + /** + * Creates a debounced function that delays invoking `func` until after `wait` + * milliseconds have elapsed since the last time the debounced function was + * invoked. The debounced function comes with a `cancel` method to cancel + * delayed `func` invocations and a `flush` method to immediately invoke them. + * Provide `options` to indicate whether `func` should be invoked on the + * leading and/or trailing edge of the `wait` timeout. The `func` is invoked + * with the last arguments provided to the debounced function. Subsequent + * calls to the debounced function return the result of the last `func` + * invocation. + * + * **Note:** If `leading` and `trailing` options are `true`, `func` is + * invoked on the trailing edge of the timeout only if the debounced function + * is invoked more than once during the `wait` timeout. + * + * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred + * until to the next tick, similar to `setTimeout` with a timeout of `0`. + * + * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/) + * for details over the differences between `_.debounce` and `_.throttle`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to debounce. + * @param {number} [wait=0] The number of milliseconds to delay. + * @param {Object} [options={}] The options object. + * @param {boolean} [options.leading=false] + * Specify invoking on the leading edge of the timeout. + * @param {number} [options.maxWait] + * The maximum time `func` is allowed to be delayed before it's invoked. + * @param {boolean} [options.trailing=true] + * Specify invoking on the trailing edge of the timeout. + * @returns {Function} Returns the new debounced function. + * @example + * + * // Avoid costly calculations while the window size is in flux. + * jQuery(window).on('resize', _.debounce(calculateLayout, 150)); + * + * // Invoke `sendMail` when clicked, debouncing subsequent calls. + * jQuery(element).on('click', _.debounce(sendMail, 300, { + * 'leading': true, + * 'trailing': false + * })); + * + * // Ensure `batchLog` is invoked once after 1 second of debounced calls. + * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 }); + * var source = new EventSource('/stream'); + * jQuery(source).on('message', debounced); + * + * // Cancel the trailing debounced invocation. + * jQuery(window).on('popstate', debounced.cancel); + */ + function debounce(func, wait, options) { + var lastArgs, + lastThis, + maxWait, + result, + timerId, + lastCallTime, + lastInvokeTime = 0, + leading = false, + maxing = false, + trailing = true; + + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + wait = toNumber(wait) || 0; + if (isObject(options)) { + leading = !!options.leading; + maxing = 'maxWait' in options; + maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait; + trailing = 'trailing' in options ? !!options.trailing : trailing; + } - // Convenience methods. - ["get", "post"].forEach(function(method) { - xhr[method] = function() { - return xhr.send.apply(xhr, [method].concat(d3_array(arguments))); - }; - }); + function invokeFunc(time) { + var args = lastArgs, + thisArg = lastThis; - // If callback is non-null, it will be used for error and load events. - xhr.send = function(method, data, callback) { - if (arguments.length === 2 && typeof data === "function") callback = data, data = null; - request.open(method, url, true); - if (mimeType != null && !("accept" in headers)) headers["accept"] = mimeType + ",*/*"; - if (request.setRequestHeader) for (var name in headers) request.setRequestHeader(name, headers[name]); - if (mimeType != null && request.overrideMimeType) request.overrideMimeType(mimeType); - if (responseType != null) request.responseType = responseType; - if (callback != null) xhr.on("error", callback).on("load", function(request) { callback(null, request); }); - dispatch.beforesend.call(xhr, request); - request.send(data == null ? null : data); - return xhr; - }; + lastArgs = lastThis = undefined; + lastInvokeTime = time; + result = func.apply(thisArg, args); + return result; + } - xhr.abort = function() { - request.abort(); - return xhr; - }; + function leadingEdge(time) { + // Reset any `maxWait` timer. + lastInvokeTime = time; + // Start the timer for the trailing edge. + timerId = setTimeout(timerExpired, wait); + // Invoke the leading edge. + return leading ? invokeFunc(time) : result; + } - d3.rebind(xhr, dispatch, "on"); + function remainingWait(time) { + var timeSinceLastCall = time - lastCallTime, + timeSinceLastInvoke = time - lastInvokeTime, + result = wait - timeSinceLastCall; - return callback == null ? xhr : xhr.get(d3_xhr_fixCallback(callback)); -}; + return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result; + } -function d3_xhr_fixCallback(callback) { - return callback.length === 1 - ? function(error, request) { callback(error == null ? request : null); } - : callback; -} + function shouldInvoke(time) { + var timeSinceLastCall = time - lastCallTime, + timeSinceLastInvoke = time - lastInvokeTime; -function d3_xhrHasResponse(request) { - var type = request.responseType; - return type && type !== "text" - ? request.response // null on error - : request.responseText; // "" on error -} + // Either this is the first call, activity has stopped and we're at the + // trailing edge, the system time has gone backwards and we're treating + // it as the trailing edge, or we've hit the `maxWait` limit. + return (lastCallTime === undefined || (timeSinceLastCall >= wait) || + (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait)); + } -d3.text = d3_xhrType(function(request) { - return request.responseText; -}); + function timerExpired() { + var time = now(); + if (shouldInvoke(time)) { + return trailingEdge(time); + } + // Restart the timer. + timerId = setTimeout(timerExpired, remainingWait(time)); + } -d3.json = function(url, callback) { - return d3_xhr(url, "application/json", d3_json, callback); -}; + function trailingEdge(time) { + timerId = undefined; -function d3_json(request) { - return JSON.parse(request.responseText); -} + // Only invoke if we have `lastArgs` which means `func` has been + // debounced at least once. + if (trailing && lastArgs) { + return invokeFunc(time); + } + lastArgs = lastThis = undefined; + return result; + } -d3.html = function(url, callback) { - return d3_xhr(url, "text/html", d3_html, callback); -}; + function cancel() { + if (timerId !== undefined) { + clearTimeout(timerId); + } + lastInvokeTime = 0; + lastArgs = lastCallTime = lastThis = timerId = undefined; + } -function d3_html(request) { - var range = d3_document.createRange(); - range.selectNode(d3_document.body); - return range.createContextualFragment(request.responseText); -} + function flush() { + return timerId === undefined ? result : trailingEdge(now()); + } -d3.xml = d3_xhrType(function(request) { - return request.responseXML; -}); - if (typeof define === "function" && define.amd) define(d3); - else if (typeof module === "object" && module.exports) module.exports = d3; - this.d3 = d3; -}(); -d3.combobox = function() { - var event = d3.dispatch('accept'), - data = [], - suggestions = [], - minItems = 2; + function debounced() { + var time = now(), + isInvoking = shouldInvoke(time); - var fetcher = function(val, cb) { - cb(data.filter(function(d) { - return d.value - .toString() - .toLowerCase() - .indexOf(val.toLowerCase()) !== -1; - })); - }; + lastArgs = arguments; + lastThis = this; + lastCallTime = time; - var combobox = function(input) { - var idx = -1, - container = d3.select(document.body) - .selectAll('div.combobox') - .filter(function(d) { return d === input.node(); }), - shown = !container.empty(); + if (isInvoking) { + if (timerId === undefined) { + return leadingEdge(lastCallTime); + } + if (maxing) { + // Handle invocations in a tight loop. + timerId = setTimeout(timerExpired, wait); + return invokeFunc(lastCallTime); + } + } + if (timerId === undefined) { + timerId = setTimeout(timerExpired, wait); + } + return result; + } + debounced.cancel = cancel; + debounced.flush = flush; + return debounced; + } - input - .classed('combobox-input', true) - .on('focus.typeahead', focus) - .on('blur.typeahead', blur) - .on('keydown.typeahead', keydown) - .on('keyup.typeahead', keyup) - .on('input.typeahead', change) - .each(function() { - var parent = this.parentNode, - sibling = this.nextSibling; + /** + * Defers invoking the `func` until the current call stack has cleared. Any + * additional arguments are provided to `func` when it's invoked. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to defer. + * @param {...*} [args] The arguments to invoke `func` with. + * @returns {number} Returns the timer id. + * @example + * + * _.defer(function(text) { + * console.log(text); + * }, 'deferred'); + * // => Logs 'deferred' after one millisecond. + */ + var defer = baseRest(function(func, args) { + return baseDelay(func, 1, args); + }); - var caret = d3.select(parent).selectAll('.combobox-caret') - .filter(function(d) { return d === input.node(); }) - .data([input.node()]); + /** + * Invokes `func` after `wait` milliseconds. Any additional arguments are + * provided to `func` when it's invoked. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to delay. + * @param {number} wait The number of milliseconds to delay invocation. + * @param {...*} [args] The arguments to invoke `func` with. + * @returns {number} Returns the timer id. + * @example + * + * _.delay(function(text) { + * console.log(text); + * }, 1000, 'later'); + * // => Logs 'later' after one second. + */ + var delay = baseRest(function(func, wait, args) { + return baseDelay(func, toNumber(wait) || 0, args); + }); - caret.enter().insert('div', function() { return sibling; }) - .attr('class', 'combobox-caret'); + /** + * Creates a function that invokes `func` with arguments reversed. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Function + * @param {Function} func The function to flip arguments for. + * @returns {Function} Returns the new flipped function. + * @example + * + * var flipped = _.flip(function() { + * return _.toArray(arguments); + * }); + * + * flipped('a', 'b', 'c', 'd'); + * // => ['d', 'c', 'b', 'a'] + */ + function flip(func) { + return createWrap(func, WRAP_FLIP_FLAG); + } - caret - .on('mousedown', function () { - // prevent the form element from blurring. it blurs - // on mousedown - d3.event.stopPropagation(); - d3.event.preventDefault(); - if (!shown) { - input.node().focus(); - fetch('', render); - } else { - hide(); - } - }); - }); - - function focus() { - fetch(value(), render); - } + /** + * Creates a function that memoizes the result of `func`. If `resolver` is + * provided, it determines the cache key for storing the result based on the + * arguments provided to the memoized function. By default, the first argument + * provided to the memoized function is used as the map cache key. The `func` + * is invoked with the `this` binding of the memoized function. + * + * **Note:** The cache is exposed as the `cache` property on the memoized + * function. Its creation may be customized by replacing the `_.memoize.Cache` + * constructor with one whose instances implement the + * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object) + * method interface of `clear`, `delete`, `get`, `has`, and `set`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to have its output memoized. + * @param {Function} [resolver] The function to resolve the cache key. + * @returns {Function} Returns the new memoized function. + * @example + * + * var object = { 'a': 1, 'b': 2 }; + * var other = { 'c': 3, 'd': 4 }; + * + * var values = _.memoize(_.values); + * values(object); + * // => [1, 2] + * + * values(other); + * // => [3, 4] + * + * object.a = 2; + * values(object); + * // => [1, 2] + * + * // Modify the result cache. + * values.cache.set(object, ['a', 'b']); + * values(object); + * // => ['a', 'b'] + * + * // Replace `_.memoize.Cache`. + * _.memoize.Cache = WeakMap; + */ + function memoize(func, resolver) { + if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) { + throw new TypeError(FUNC_ERROR_TEXT); + } + var memoized = function() { + var args = arguments, + key = resolver ? resolver.apply(this, args) : args[0], + cache = memoized.cache; - function blur() { - window.setTimeout(hide, 150); + if (cache.has(key)) { + return cache.get(key); } + var result = func.apply(this, args); + memoized.cache = cache.set(key, result) || cache; + return result; + }; + memoized.cache = new (memoize.Cache || MapCache); + return memoized; + } - function show() { - if (!shown) { - container = d3.select(document.body) - .insert('div', ':first-child') - .datum(input.node()) - .attr('class', 'combobox') - .style({ - position: 'absolute', - display: 'block', - left: '0px' - }) - .on('mousedown', function () { - // prevent moving focus out of the text field - d3.event.preventDefault(); - }); - - d3.select(document.body) - .on('scroll.combobox', render, true); + // Expose `MapCache`. + memoize.Cache = MapCache; - shown = true; - } - } + /** + * Creates a function that negates the result of the predicate `func`. The + * `func` predicate is invoked with the `this` binding and arguments of the + * created function. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Function + * @param {Function} predicate The predicate to negate. + * @returns {Function} Returns the new negated function. + * @example + * + * function isEven(n) { + * return n % 2 == 0; + * } + * + * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven)); + * // => [1, 3, 5] + */ + function negate(predicate) { + if (typeof predicate != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + return function() { + var args = arguments; + switch (args.length) { + case 0: return !predicate.call(this); + case 1: return !predicate.call(this, args[0]); + case 2: return !predicate.call(this, args[0], args[1]); + case 3: return !predicate.call(this, args[0], args[1], args[2]); + } + return !predicate.apply(this, args); + }; + } - function hide() { - if (shown) { - idx = -1; - container.remove(); + /** + * Creates a function that is restricted to invoking `func` once. Repeat calls + * to the function return the value of the first invocation. The `func` is + * invoked with the `this` binding and arguments of the created function. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to restrict. + * @returns {Function} Returns the new restricted function. + * @example + * + * var initialize = _.once(createApplication); + * initialize(); + * initialize(); + * // => `createApplication` is invoked once + */ + function once(func) { + return before(2, func); + } - d3.select(document.body) - .on('scroll.combobox', null); + /** + * Creates a function that invokes `func` with its arguments transformed. + * + * @static + * @since 4.0.0 + * @memberOf _ + * @category Function + * @param {Function} func The function to wrap. + * @param {...(Function|Function[])} [transforms=[_.identity]] + * The argument transforms. + * @returns {Function} Returns the new function. + * @example + * + * function doubled(n) { + * return n * 2; + * } + * + * function square(n) { + * return n * n; + * } + * + * var func = _.overArgs(function(x, y) { + * return [x, y]; + * }, [square, doubled]); + * + * func(9, 3); + * // => [81, 6] + * + * func(10, 5); + * // => [100, 10] + */ + var overArgs = castRest(function(func, transforms) { + transforms = (transforms.length == 1 && isArray(transforms[0])) + ? arrayMap(transforms[0], baseUnary(getIteratee())) + : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee())); - shown = false; - } - } + var funcsLength = transforms.length; + return baseRest(function(args) { + var index = -1, + length = nativeMin(args.length, funcsLength); - function keydown() { - switch (d3.event.keyCode) { - // backspace, delete - case 8: - case 46: - input.on('input.typeahead', function() { - idx = -1; - render(); - var start = input.property('selectionStart'); - input.node().setSelectionRange(start, start); - input.on('input.typeahead', change); - }); - break; - // tab - case 9: - container.selectAll('a.selected').each(event.accept); - break; - // return - case 13: - d3.event.preventDefault(); - break; - // up arrow - case 38: - nav(-1); - d3.event.preventDefault(); - break; - // down arrow - case 40: - nav(+1); - d3.event.preventDefault(); - break; - } - d3.event.stopPropagation(); + while (++index < length) { + args[index] = transforms[index].call(this, args[index]); } + return apply(func, this, args); + }); + }); - function keyup() { - switch (d3.event.keyCode) { - // escape - case 27: - hide(); - break; - // return - case 13: - container.selectAll('a.selected').each(event.accept); - hide(); - break; - } - } + /** + * Creates a function that invokes `func` with `partials` prepended to the + * arguments it receives. This method is like `_.bind` except it does **not** + * alter the `this` binding. + * + * The `_.partial.placeholder` value, which defaults to `_` in monolithic + * builds, may be used as a placeholder for partially applied arguments. + * + * **Note:** This method doesn't set the "length" property of partially + * applied functions. + * + * @static + * @memberOf _ + * @since 0.2.0 + * @category Function + * @param {Function} func The function to partially apply arguments to. + * @param {...*} [partials] The arguments to be partially applied. + * @returns {Function} Returns the new partially applied function. + * @example + * + * function greet(greeting, name) { + * return greeting + ' ' + name; + * } + * + * var sayHelloTo = _.partial(greet, 'hello'); + * sayHelloTo('fred'); + * // => 'hello fred' + * + * // Partially applied with placeholders. + * var greetFred = _.partial(greet, _, 'fred'); + * greetFred('hi'); + * // => 'hi fred' + */ + var partial = baseRest(function(func, partials) { + var holders = replaceHolders(partials, getHolder(partial)); + return createWrap(func, WRAP_PARTIAL_FLAG, undefined, partials, holders); + }); - function change() { - fetch(value(), function() { - autocomplete(); - render(); - }); - } + /** + * This method is like `_.partial` except that partially applied arguments + * are appended to the arguments it receives. + * + * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic + * builds, may be used as a placeholder for partially applied arguments. + * + * **Note:** This method doesn't set the "length" property of partially + * applied functions. + * + * @static + * @memberOf _ + * @since 1.0.0 + * @category Function + * @param {Function} func The function to partially apply arguments to. + * @param {...*} [partials] The arguments to be partially applied. + * @returns {Function} Returns the new partially applied function. + * @example + * + * function greet(greeting, name) { + * return greeting + ' ' + name; + * } + * + * var greetFred = _.partialRight(greet, 'fred'); + * greetFred('hi'); + * // => 'hi fred' + * + * // Partially applied with placeholders. + * var sayHelloTo = _.partialRight(greet, 'hello', _); + * sayHelloTo('fred'); + * // => 'hello fred' + */ + var partialRight = baseRest(function(func, partials) { + var holders = replaceHolders(partials, getHolder(partialRight)); + return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined, partials, holders); + }); - function nav(dir) { - idx = Math.max(Math.min(idx + dir, suggestions.length - 1), 0); - input.property('value', suggestions[idx].value); - render(); - ensureVisible(); - } + /** + * Creates a function that invokes `func` with arguments arranged according + * to the specified `indexes` where the argument value at the first index is + * provided as the first argument, the argument value at the second index is + * provided as the second argument, and so on. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Function + * @param {Function} func The function to rearrange arguments for. + * @param {...(number|number[])} indexes The arranged argument indexes. + * @returns {Function} Returns the new function. + * @example + * + * var rearged = _.rearg(function(a, b, c) { + * return [a, b, c]; + * }, [2, 0, 1]); + * + * rearged('b', 'c', 'a') + * // => ['a', 'b', 'c'] + */ + var rearg = flatRest(function(func, indexes) { + return createWrap(func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes); + }); - function value() { - var value = input.property('value'), - start = input.property('selectionStart'), - end = input.property('selectionEnd'); + /** + * Creates a function that invokes `func` with the `this` binding of the + * created function and arguments from `start` and beyond provided as + * an array. + * + * **Note:** This method is based on the + * [rest parameter](https://mdn.io/rest_parameters). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Function + * @param {Function} func The function to apply a rest parameter to. + * @param {number} [start=func.length-1] The start position of the rest parameter. + * @returns {Function} Returns the new function. + * @example + * + * var say = _.rest(function(what, names) { + * return what + ' ' + _.initial(names).join(', ') + + * (_.size(names) > 1 ? ', & ' : '') + _.last(names); + * }); + * + * say('hello', 'fred', 'barney', 'pebbles'); + * // => 'hello fred, barney, & pebbles' + */ + function rest(func, start) { + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + start = start === undefined ? start : toInteger(start); + return baseRest(func, start); + } - if (start && end) { - value = value.substring(0, start); - } + /** + * Creates a function that invokes `func` with the `this` binding of the + * create function and an array of arguments much like + * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply). + * + * **Note:** This method is based on the + * [spread operator](https://mdn.io/spread_operator). + * + * @static + * @memberOf _ + * @since 3.2.0 + * @category Function + * @param {Function} func The function to spread arguments over. + * @param {number} [start=0] The start position of the spread. + * @returns {Function} Returns the new function. + * @example + * + * var say = _.spread(function(who, what) { + * return who + ' says ' + what; + * }); + * + * say(['fred', 'hello']); + * // => 'fred says hello' + * + * var numbers = Promise.all([ + * Promise.resolve(40), + * Promise.resolve(36) + * ]); + * + * numbers.then(_.spread(function(x, y) { + * return x + y; + * })); + * // => a Promise of 76 + */ + function spread(func, start) { + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + start = start == null ? 0 : nativeMax(toInteger(start), 0); + return baseRest(function(args) { + var array = args[start], + otherArgs = castSlice(args, 0, start); - return value; + if (array) { + arrayPush(otherArgs, array); } + return apply(func, this, otherArgs); + }); + } - function fetch(v, cb) { - fetcher.call(input, v, function(_) { - suggestions = _; - cb(); - }); - } + /** + * Creates a throttled function that only invokes `func` at most once per + * every `wait` milliseconds. The throttled function comes with a `cancel` + * method to cancel delayed `func` invocations and a `flush` method to + * immediately invoke them. Provide `options` to indicate whether `func` + * should be invoked on the leading and/or trailing edge of the `wait` + * timeout. The `func` is invoked with the last arguments provided to the + * throttled function. Subsequent calls to the throttled function return the + * result of the last `func` invocation. + * + * **Note:** If `leading` and `trailing` options are `true`, `func` is + * invoked on the trailing edge of the timeout only if the throttled function + * is invoked more than once during the `wait` timeout. + * + * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred + * until to the next tick, similar to `setTimeout` with a timeout of `0`. + * + * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/) + * for details over the differences between `_.throttle` and `_.debounce`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to throttle. + * @param {number} [wait=0] The number of milliseconds to throttle invocations to. + * @param {Object} [options={}] The options object. + * @param {boolean} [options.leading=true] + * Specify invoking on the leading edge of the timeout. + * @param {boolean} [options.trailing=true] + * Specify invoking on the trailing edge of the timeout. + * @returns {Function} Returns the new throttled function. + * @example + * + * // Avoid excessively updating the position while scrolling. + * jQuery(window).on('scroll', _.throttle(updatePosition, 100)); + * + * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes. + * var throttled = _.throttle(renewToken, 300000, { 'trailing': false }); + * jQuery(element).on('click', throttled); + * + * // Cancel the trailing throttled invocation. + * jQuery(window).on('popstate', throttled.cancel); + */ + function throttle(func, wait, options) { + var leading = true, + trailing = true; - function autocomplete() { - var v = value(); + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + if (isObject(options)) { + leading = 'leading' in options ? !!options.leading : leading; + trailing = 'trailing' in options ? !!options.trailing : trailing; + } + return debounce(func, wait, { + 'leading': leading, + 'maxWait': wait, + 'trailing': trailing + }); + } - idx = -1; + /** + * Creates a function that accepts up to one argument, ignoring any + * additional arguments. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Function + * @param {Function} func The function to cap arguments for. + * @returns {Function} Returns the new capped function. + * @example + * + * _.map(['6', '8', '10'], _.unary(parseInt)); + * // => [6, 8, 10] + */ + function unary(func) { + return ary(func, 1); + } - if (!v) return; + /** + * Creates a function that provides `value` to `wrapper` as its first + * argument. Any additional arguments provided to the function are appended + * to those provided to the `wrapper`. The wrapper is invoked with the `this` + * binding of the created function. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {*} value The value to wrap. + * @param {Function} [wrapper=identity] The wrapper function. + * @returns {Function} Returns the new function. + * @example + * + * var p = _.wrap(_.escape, function(func, text) { + * return '

    ' + func(text) + '

    '; + * }); + * + * p('fred, barney, & pebbles'); + * // => '

    fred, barney, & pebbles

    ' + */ + function wrap(value, wrapper) { + return partial(castFunction(wrapper), value); + } - for (var i = 0; i < suggestions.length; i++) { - if (suggestions[i].value.toLowerCase().indexOf(v.toLowerCase()) === 0) { - var completion = v + suggestions[i].value.substr(v.length); - idx = i; - input.property('value', completion); - input.node().setSelectionRange(v.length, completion.length); - return; - } - } - } + /*------------------------------------------------------------------------*/ - function render() { - if (suggestions.length >= minItems && document.activeElement === input.node()) { - show(); - } else { - hide(); - return; - } + /** + * Casts `value` as an array if it's not one. + * + * @static + * @memberOf _ + * @since 4.4.0 + * @category Lang + * @param {*} value The value to inspect. + * @returns {Array} Returns the cast array. + * @example + * + * _.castArray(1); + * // => [1] + * + * _.castArray({ 'a': 1 }); + * // => [{ 'a': 1 }] + * + * _.castArray('abc'); + * // => ['abc'] + * + * _.castArray(null); + * // => [null] + * + * _.castArray(undefined); + * // => [undefined] + * + * _.castArray(); + * // => [] + * + * var array = [1, 2, 3]; + * console.log(_.castArray(array) === array); + * // => true + */ + function castArray() { + if (!arguments.length) { + return []; + } + var value = arguments[0]; + return isArray(value) ? value : [value]; + } - var options = container - .selectAll('a.combobox-option') - .data(suggestions, function(d) { return d.value; }); + /** + * Creates a shallow clone of `value`. + * + * **Note:** This method is loosely based on the + * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm) + * and supports cloning arrays, array buffers, booleans, date objects, maps, + * numbers, `Object` objects, regexes, sets, strings, symbols, and typed + * arrays. The own enumerable properties of `arguments` objects are cloned + * as plain objects. An empty object is returned for uncloneable values such + * as error objects, functions, DOM nodes, and WeakMaps. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to clone. + * @returns {*} Returns the cloned value. + * @see _.cloneDeep + * @example + * + * var objects = [{ 'a': 1 }, { 'b': 2 }]; + * + * var shallow = _.clone(objects); + * console.log(shallow[0] === objects[0]); + * // => true + */ + function clone(value) { + return baseClone(value, CLONE_SYMBOLS_FLAG); + } - options.enter().append('a') - .attr('class', 'combobox-option') - .text(function(d) { return d.value; }); + /** + * This method is like `_.clone` except that it accepts `customizer` which + * is invoked to produce the cloned value. If `customizer` returns `undefined`, + * cloning is handled by the method instead. The `customizer` is invoked with + * up to four arguments; (value [, index|key, object, stack]). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to clone. + * @param {Function} [customizer] The function to customize cloning. + * @returns {*} Returns the cloned value. + * @see _.cloneDeepWith + * @example + * + * function customizer(value) { + * if (_.isElement(value)) { + * return value.cloneNode(false); + * } + * } + * + * var el = _.cloneWith(document.body, customizer); + * + * console.log(el === document.body); + * // => false + * console.log(el.nodeName); + * // => 'BODY' + * console.log(el.childNodes.length); + * // => 0 + */ + function cloneWith(value, customizer) { + customizer = typeof customizer == 'function' ? customizer : undefined; + return baseClone(value, CLONE_SYMBOLS_FLAG, customizer); + } - options - .attr('title', function(d) { return d.title; }) - .classed('selected', function(d, i) { return i == idx; }) - .on('mouseover', select) - .on('click', accept) - .order(); - - options.exit() - .remove(); - - var rect = input.node().getBoundingClientRect(); - - container.style({ - 'left': rect.left + 'px', - 'width': rect.width + 'px', - 'top': rect.height + rect.top + 'px' - }); - } - - function select(d, i) { - idx = i; - render(); - } - - function ensureVisible() { - var node = container.selectAll('a.selected').node(); - if (node) node.scrollIntoView(); - } - - function accept(d) { - if (!shown) return; - input - .property('value', d.value) - .trigger('change'); - event.accept(d); - hide(); - } - }; - - combobox.fetcher = function(_) { - if (!arguments.length) return fetcher; - fetcher = _; - return combobox; - }; - - combobox.data = function(_) { - if (!arguments.length) return data; - data = _; - return combobox; - }; + /** + * This method is like `_.clone` except that it recursively clones `value`. + * + * @static + * @memberOf _ + * @since 1.0.0 + * @category Lang + * @param {*} value The value to recursively clone. + * @returns {*} Returns the deep cloned value. + * @see _.clone + * @example + * + * var objects = [{ 'a': 1 }, { 'b': 2 }]; + * + * var deep = _.cloneDeep(objects); + * console.log(deep[0] === objects[0]); + * // => false + */ + function cloneDeep(value) { + return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG); + } - combobox.minItems = function(_) { - if (!arguments.length) return minItems; - minItems = _; - return combobox; - }; + /** + * This method is like `_.cloneWith` except that it recursively clones `value`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to recursively clone. + * @param {Function} [customizer] The function to customize cloning. + * @returns {*} Returns the deep cloned value. + * @see _.cloneWith + * @example + * + * function customizer(value) { + * if (_.isElement(value)) { + * return value.cloneNode(true); + * } + * } + * + * var el = _.cloneDeepWith(document.body, customizer); + * + * console.log(el === document.body); + * // => false + * console.log(el.nodeName); + * // => 'BODY' + * console.log(el.childNodes.length); + * // => 20 + */ + function cloneDeepWith(value, customizer) { + customizer = typeof customizer == 'function' ? customizer : undefined; + return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer); + } - return d3.rebind(combobox, event, 'on'); -}; -d3.geo.tile = function() { - var size = [960, 500], - scale = 256, - scaleExtent = [0, 20], - translate = [size[0] / 2, size[1] / 2], - zoomDelta = 0; + /** + * Checks if `object` conforms to `source` by invoking the predicate + * properties of `source` with the corresponding property values of `object`. + * + * **Note:** This method is equivalent to `_.conforms` when `source` is + * partially applied. + * + * @static + * @memberOf _ + * @since 4.14.0 + * @category Lang + * @param {Object} object The object to inspect. + * @param {Object} source The object of property predicates to conform to. + * @returns {boolean} Returns `true` if `object` conforms, else `false`. + * @example + * + * var object = { 'a': 1, 'b': 2 }; + * + * _.conformsTo(object, { 'b': function(n) { return n > 1; } }); + * // => true + * + * _.conformsTo(object, { 'b': function(n) { return n > 2; } }); + * // => false + */ + function conformsTo(object, source) { + return source == null || baseConformsTo(object, source, keys(source)); + } - function bound(_) { - return Math.min(scaleExtent[1], Math.max(scaleExtent[0], _)); - } + /** + * Performs a + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * comparison between two values to determine if they are equivalent. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + * @example + * + * var object = { 'a': 1 }; + * var other = { 'a': 1 }; + * + * _.eq(object, object); + * // => true + * + * _.eq(object, other); + * // => false + * + * _.eq('a', 'a'); + * // => true + * + * _.eq('a', Object('a')); + * // => false + * + * _.eq(NaN, NaN); + * // => true + */ + function eq(value, other) { + return value === other || (value !== value && other !== other); + } - function tile() { - var z = Math.max(Math.log(scale) / Math.LN2 - 8, 0), - z0 = bound(Math.round(z + zoomDelta)), - k = Math.pow(2, z - z0 + 8), - origin = [(translate[0] - scale / 2) / k, (translate[1] - scale / 2) / k], - tiles = [], - cols = d3.range(Math.max(0, Math.floor(-origin[0])), Math.max(0, Math.ceil(size[0] / k - origin[0]))), - rows = d3.range(Math.max(0, Math.floor(-origin[1])), Math.max(0, Math.ceil(size[1] / k - origin[1]))); + /** + * Checks if `value` is greater than `other`. + * + * @static + * @memberOf _ + * @since 3.9.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is greater than `other`, + * else `false`. + * @see _.lt + * @example + * + * _.gt(3, 1); + * // => true + * + * _.gt(3, 3); + * // => false + * + * _.gt(1, 3); + * // => false + */ + var gt = createRelationalOperation(baseGt); - rows.forEach(function(y) { - cols.forEach(function(x) { - tiles.push([x, y, z0]); - }); + /** + * Checks if `value` is greater than or equal to `other`. + * + * @static + * @memberOf _ + * @since 3.9.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is greater than or equal to + * `other`, else `false`. + * @see _.lte + * @example + * + * _.gte(3, 1); + * // => true + * + * _.gte(3, 3); + * // => true + * + * _.gte(1, 3); + * // => false + */ + var gte = createRelationalOperation(function(value, other) { + return value >= other; }); - tiles.translate = origin; - tiles.scale = k; - - return tiles; - } - - tile.scaleExtent = function(_) { - if (!arguments.length) return scaleExtent; - scaleExtent = _; - return tile; - }; - - tile.size = function(_) { - if (!arguments.length) return size; - size = _; - return tile; - }; + /** + * Checks if `value` is likely an `arguments` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an `arguments` object, + * else `false`. + * @example + * + * _.isArguments(function() { return arguments; }()); + * // => true + * + * _.isArguments([1, 2, 3]); + * // => false + */ + var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) { + return isObjectLike(value) && hasOwnProperty.call(value, 'callee') && + !propertyIsEnumerable.call(value, 'callee'); + }; - tile.scale = function(_) { - if (!arguments.length) return scale; - scale = _; - return tile; - }; + /** + * Checks if `value` is classified as an `Array` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array, else `false`. + * @example + * + * _.isArray([1, 2, 3]); + * // => true + * + * _.isArray(document.body.children); + * // => false + * + * _.isArray('abc'); + * // => false + * + * _.isArray(_.noop); + * // => false + */ + var isArray = Array.isArray; - tile.translate = function(_) { - if (!arguments.length) return translate; - translate = _; - return tile; - }; + /** + * Checks if `value` is classified as an `ArrayBuffer` object. + * + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`. + * @example + * + * _.isArrayBuffer(new ArrayBuffer(2)); + * // => true + * + * _.isArrayBuffer(new Array(2)); + * // => false + */ + var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer; - tile.zoomDelta = function(_) { - if (!arguments.length) return zoomDelta; - zoomDelta = +_; - return tile; - }; + /** + * Checks if `value` is array-like. A value is considered array-like if it's + * not a function and has a `value.length` that's an integer greater than or + * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is array-like, else `false`. + * @example + * + * _.isArrayLike([1, 2, 3]); + * // => true + * + * _.isArrayLike(document.body.children); + * // => true + * + * _.isArrayLike('abc'); + * // => true + * + * _.isArrayLike(_.noop); + * // => false + */ + function isArrayLike(value) { + return value != null && isLength(value.length) && !isFunction(value); + } - return tile; -}; -d3.jsonp = function (url, callback) { - function rand() { - var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', - c = '', i = -1; - while (++i < 15) c += chars.charAt(Math.floor(Math.random() * 52)); - return c; - } + /** + * This method is like `_.isArrayLike` except that it also checks if `value` + * is an object. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array-like object, + * else `false`. + * @example + * + * _.isArrayLikeObject([1, 2, 3]); + * // => true + * + * _.isArrayLikeObject(document.body.children); + * // => true + * + * _.isArrayLikeObject('abc'); + * // => false + * + * _.isArrayLikeObject(_.noop); + * // => false + */ + function isArrayLikeObject(value) { + return isObjectLike(value) && isArrayLike(value); + } - function create(url) { - var e = url.match(/callback=d3.jsonp.(\w+)/), - c = e ? e[1] : rand(); - d3.jsonp[c] = function(data) { - callback(data); - delete d3.jsonp[c]; - script.remove(); - }; - return 'd3.jsonp.' + c; - } + /** + * Checks if `value` is classified as a boolean primitive or object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a boolean, else `false`. + * @example + * + * _.isBoolean(false); + * // => true + * + * _.isBoolean(null); + * // => false + */ + function isBoolean(value) { + return value === true || value === false || + (isObjectLike(value) && baseGetTag(value) == boolTag); + } - var cb = create(url), - script = d3.select('head') - .append('script') - .attr('type', 'text/javascript') - .attr('src', url.replace(/(\{|%7B)callback(\}|%7D)/, cb)); -}; -/* - * This code is licensed under the MIT license. - * - * Copyright © 2013, iD authors. - * - * Portions copyright © 2011, Keith Cirkel - * See https://github.com/keithamus/jwerty - * - */ -d3.keybinding = function(namespace) { - var bindings = []; + /** + * Checks if `value` is a buffer. + * + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a buffer, else `false`. + * @example + * + * _.isBuffer(new Buffer(2)); + * // => true + * + * _.isBuffer(new Uint8Array(2)); + * // => false + */ + var isBuffer = nativeIsBuffer || stubFalse; - function matches(binding, event) { - for (var p in binding.event) { - if (event[p] != binding.event[p]) - return false; - } + /** + * Checks if `value` is classified as a `Date` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a date object, else `false`. + * @example + * + * _.isDate(new Date); + * // => true + * + * _.isDate('Mon April 23 2012'); + * // => false + */ + var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate; - return (!binding.capture) === (event.eventPhase !== Event.CAPTURING_PHASE); + /** + * Checks if `value` is likely a DOM element. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`. + * @example + * + * _.isElement(document.body); + * // => true + * + * _.isElement(''); + * // => false + */ + function isElement(value) { + return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value); } - function capture() { - for (var i = 0; i < bindings.length; i++) { - var binding = bindings[i]; - if (matches(binding, d3.event)) { - binding.callback(); - } + /** + * Checks if `value` is an empty object, collection, map, or set. + * + * Objects are considered empty if they have no own enumerable string keyed + * properties. + * + * Array-like values such as `arguments` objects, arrays, buffers, strings, or + * jQuery-like collections are considered empty if they have a `length` of `0`. + * Similarly, maps and sets are considered empty if they have a `size` of `0`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is empty, else `false`. + * @example + * + * _.isEmpty(null); + * // => true + * + * _.isEmpty(true); + * // => true + * + * _.isEmpty(1); + * // => true + * + * _.isEmpty([1, 2, 3]); + * // => false + * + * _.isEmpty({ 'a': 1 }); + * // => false + */ + function isEmpty(value) { + if (value == null) { + return true; + } + if (isArrayLike(value) && + (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' || + isBuffer(value) || isTypedArray(value) || isArguments(value))) { + return !value.length; + } + var tag = getTag(value); + if (tag == mapTag || tag == setTag) { + return !value.size; + } + if (isPrototype(value)) { + return !baseKeys(value).length; + } + for (var key in value) { + if (hasOwnProperty.call(value, key)) { + return false; } + } + return true; } - function bubble() { - var tagName = d3.select(d3.event.target).node().tagName; - if (tagName == 'INPUT' || tagName == 'SELECT' || tagName == 'TEXTAREA') { - return; - } - capture(); + /** + * Performs a deep comparison between two values to determine if they are + * equivalent. + * + * **Note:** This method supports comparing arrays, array buffers, booleans, + * date objects, error objects, maps, numbers, `Object` objects, regexes, + * sets, strings, symbols, and typed arrays. `Object` objects are compared + * by their own, not inherited, enumerable properties. Functions and DOM + * nodes are compared by strict equality, i.e. `===`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + * @example + * + * var object = { 'a': 1 }; + * var other = { 'a': 1 }; + * + * _.isEqual(object, other); + * // => true + * + * object === other; + * // => false + */ + function isEqual(value, other) { + return baseIsEqual(value, other); } - function keybinding(selection) { - selection = selection || d3.select(document); - selection.on('keydown.capture' + namespace, capture, true); - selection.on('keydown.bubble' + namespace, bubble, false); - return keybinding; + /** + * This method is like `_.isEqual` except that it accepts `customizer` which + * is invoked to compare values. If `customizer` returns `undefined`, comparisons + * are handled by the method instead. The `customizer` is invoked with up to + * six arguments: (objValue, othValue [, index|key, object, other, stack]). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @param {Function} [customizer] The function to customize comparisons. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + * @example + * + * function isGreeting(value) { + * return /^h(?:i|ello)$/.test(value); + * } + * + * function customizer(objValue, othValue) { + * if (isGreeting(objValue) && isGreeting(othValue)) { + * return true; + * } + * } + * + * var array = ['hello', 'goodbye']; + * var other = ['hi', 'goodbye']; + * + * _.isEqualWith(array, other, customizer); + * // => true + */ + function isEqualWith(value, other, customizer) { + customizer = typeof customizer == 'function' ? customizer : undefined; + var result = customizer ? customizer(value, other) : undefined; + return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result; } - keybinding.off = function(selection) { - selection = selection || d3.select(document); - selection.on('keydown.capture' + namespace, null); - selection.on('keydown.bubble' + namespace, null); - return keybinding; - }; + /** + * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`, + * `SyntaxError`, `TypeError`, or `URIError` object. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an error object, else `false`. + * @example + * + * _.isError(new Error); + * // => true + * + * _.isError(Error); + * // => false + */ + function isError(value) { + if (!isObjectLike(value)) { + return false; + } + var tag = baseGetTag(value); + return tag == errorTag || tag == domExcTag || + (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value)); + } - keybinding.on = function(code, callback, capture) { - var binding = { - event: { - keyCode: 0, - shiftKey: false, - ctrlKey: false, - altKey: false, - metaKey: false - }, - capture: capture, - callback: callback - }; + /** + * Checks if `value` is a finite primitive number. + * + * **Note:** This method is based on + * [`Number.isFinite`](https://mdn.io/Number/isFinite). + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a finite number, else `false`. + * @example + * + * _.isFinite(3); + * // => true + * + * _.isFinite(Number.MIN_VALUE); + * // => true + * + * _.isFinite(Infinity); + * // => false + * + * _.isFinite('3'); + * // => false + */ + function isFinite(value) { + return typeof value == 'number' && nativeIsFinite(value); + } - code = code.toLowerCase().match(/(?:(?:[^+⇧⌃⌥⌘])+|[⇧⌃⌥⌘]|\+\+|^\+$)/g); + /** + * Checks if `value` is classified as a `Function` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a function, else `false`. + * @example + * + * _.isFunction(_); + * // => true + * + * _.isFunction(/abc/); + * // => false + */ + function isFunction(value) { + if (!isObject(value)) { + return false; + } + // The use of `Object#toString` avoids issues with the `typeof` operator + // in Safari 9 which returns 'object' for typed arrays and other constructors. + var tag = baseGetTag(value); + return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag; + } - for (var i = 0; i < code.length; i++) { - // Normalise matching errors - if (code[i] === '++') code[i] = '+'; + /** + * Checks if `value` is an integer. + * + * **Note:** This method is based on + * [`Number.isInteger`](https://mdn.io/Number/isInteger). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an integer, else `false`. + * @example + * + * _.isInteger(3); + * // => true + * + * _.isInteger(Number.MIN_VALUE); + * // => false + * + * _.isInteger(Infinity); + * // => false + * + * _.isInteger('3'); + * // => false + */ + function isInteger(value) { + return typeof value == 'number' && value == toInteger(value); + } - if (code[i] in d3.keybinding.modifierCodes) { - binding.event[d3.keybinding.modifierProperties[d3.keybinding.modifierCodes[code[i]]]] = true; - } else if (code[i] in d3.keybinding.keyCodes) { - binding.event.keyCode = d3.keybinding.keyCodes[code[i]]; - } - } + /** + * Checks if `value` is a valid array-like length. + * + * **Note:** This method is loosely based on + * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. + * @example + * + * _.isLength(3); + * // => true + * + * _.isLength(Number.MIN_VALUE); + * // => false + * + * _.isLength(Infinity); + * // => false + * + * _.isLength('3'); + * // => false + */ + function isLength(value) { + return typeof value == 'number' && + value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; + } - bindings.push(binding); + /** + * Checks if `value` is the + * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) + * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an object, else `false`. + * @example + * + * _.isObject({}); + * // => true + * + * _.isObject([1, 2, 3]); + * // => true + * + * _.isObject(_.noop); + * // => true + * + * _.isObject(null); + * // => false + */ + function isObject(value) { + var type = typeof value; + return value != null && (type == 'object' || type == 'function'); + } - return keybinding; - }; + /** + * Checks if `value` is object-like. A value is object-like if it's not `null` + * and has a `typeof` result of "object". + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is object-like, else `false`. + * @example + * + * _.isObjectLike({}); + * // => true + * + * _.isObjectLike([1, 2, 3]); + * // => true + * + * _.isObjectLike(_.noop); + * // => false + * + * _.isObjectLike(null); + * // => false + */ + function isObjectLike(value) { + return value != null && typeof value == 'object'; + } - return keybinding; -}; + /** + * Checks if `value` is classified as a `Map` object. + * + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a map, else `false`. + * @example + * + * _.isMap(new Map); + * // => true + * + * _.isMap(new WeakMap); + * // => false + */ + var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap; -(function () { - d3.keybinding.modifierCodes = { - // Shift key, ⇧ - '⇧': 16, shift: 16, - // CTRL key, on Mac: ⌃ - '⌃': 17, ctrl: 17, - // ALT key, on Mac: ⌥ (Alt) - '⌥': 18, alt: 18, option: 18, - // META, on Mac: ⌘ (CMD), on Windows (Win), on Linux (Super) - '⌘': 91, meta: 91, cmd: 91, 'super': 91, win: 91 - }; - - d3.keybinding.modifierProperties = { - 16: 'shiftKey', - 17: 'ctrlKey', - 18: 'altKey', - 91: 'metaKey' - }; - - d3.keybinding.keyCodes = { - // Backspace key, on Mac: ⌫ (Backspace) - '⌫': 8, backspace: 8, - // Tab Key, on Mac: ⇥ (Tab), on Windows ⇥⇥ - '⇥': 9, '⇆': 9, tab: 9, - // Return key, ↩ - '↩': 13, 'return': 13, enter: 13, '⌅': 13, - // Pause/Break key - 'pause': 19, 'pause-break': 19, - // Caps Lock key, ⇪ - '⇪': 20, caps: 20, 'caps-lock': 20, - // Escape key, on Mac: ⎋, on Windows: Esc - '⎋': 27, escape: 27, esc: 27, - // Space key - space: 32, - // Page-Up key, or pgup, on Mac: ↖ - '↖': 33, pgup: 33, 'page-up': 33, - // Page-Down key, or pgdown, on Mac: ↘ - '↘': 34, pgdown: 34, 'page-down': 34, - // END key, on Mac: ⇟ - '⇟': 35, end: 35, - // HOME key, on Mac: ⇞ - '⇞': 36, home: 36, - // Insert key, or ins - ins: 45, insert: 45, - // Delete key, on Mac: ⌦ (Delete) - '⌦': 46, del: 46, 'delete': 46, - // Left Arrow Key, or ← - '←': 37, left: 37, 'arrow-left': 37, - // Up Arrow Key, or ↑ - '↑': 38, up: 38, 'arrow-up': 38, - // Right Arrow Key, or → - '→': 39, right: 39, 'arrow-right': 39, - // Up Arrow Key, or ↓ - '↓': 40, down: 40, 'arrow-down': 40, - // odities, printing characters that come out wrong: - // Firefox Equals - 'ffequals': 61, - // Num-Multiply, or * - '*': 106, star: 106, asterisk: 106, multiply: 106, - // Num-Plus or + - '+': 107, 'plus': 107, - // Num-Subtract, or - - '-': 109, subtract: 109, - // Firefox Minus - 'ffplus': 171, - // Firefox Minus - 'ffminus': 173, - // Semicolon - ';': 186, semicolon: 186, - // = or equals - '=': 187, 'equals': 187, - // Comma, or , - ',': 188, comma: 188, - 'dash': 189, //??? - // Period, or ., or full-stop - '.': 190, period: 190, 'full-stop': 190, - // Slash, or /, or forward-slash - '/': 191, slash: 191, 'forward-slash': 191, - // Tick, or `, or back-quote - '`': 192, tick: 192, 'back-quote': 192, - // Open bracket, or [ - '[': 219, 'open-bracket': 219, - // Back slash, or \ - '\\': 220, 'back-slash': 220, - // Close backet, or ] - ']': 221, 'close-bracket': 221, - // Apostrophe, or Quote, or ' - '\'': 222, quote: 222, apostrophe: 222 - }; - - // NUMPAD 0-9 - var i = 95, n = 0; - while (++i < 106) { - d3.keybinding.keyCodes['num-' + n] = i; - ++n; - } - - // 0-9 - i = 47; n = 0; - while (++i < 58) { - d3.keybinding.keyCodes[n] = i; - ++n; - } - - // F1-F25 - i = 111; n = 1; - while (++i < 136) { - d3.keybinding.keyCodes['f' + n] = i; - ++n; - } - - // a-z - i = 64; - while (++i < 91) { - d3.keybinding.keyCodes[String.fromCharCode(i).toLowerCase()] = i; - } -})(); -d3.selection.prototype.one = function (type, listener, capture) { - var target = this, typeOnce = type + ".once"; - function one() { - target.on(typeOnce, null); - listener.apply(this, arguments); - } - target.on(typeOnce, one, capture); - return this; -}; -d3.selection.prototype.dimensions = function (dimensions) { - if (!arguments.length) { - var node = this.node(); - return [node.offsetWidth, - node.offsetHeight]; + /** + * Performs a partial deep comparison between `object` and `source` to + * determine if `object` contains equivalent property values. + * + * **Note:** This method is equivalent to `_.matches` when `source` is + * partially applied. + * + * Partial comparisons will match empty array and empty object `source` + * values against any array or object value, respectively. See `_.isEqual` + * for a list of supported value comparisons. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Lang + * @param {Object} object The object to inspect. + * @param {Object} source The object of property values to match. + * @returns {boolean} Returns `true` if `object` is a match, else `false`. + * @example + * + * var object = { 'a': 1, 'b': 2 }; + * + * _.isMatch(object, { 'b': 2 }); + * // => true + * + * _.isMatch(object, { 'b': 1 }); + * // => false + */ + function isMatch(object, source) { + return object === source || baseIsMatch(object, source, getMatchData(source)); } - return this.attr({width: dimensions[0], height: dimensions[1]}); -}; -d3.selection.prototype.trigger = function (type) { - this.each(function() { - var evt = document.createEvent('HTMLEvents'); - evt.initEvent(type, true, true); - this.dispatchEvent(evt); - }); -}; -d3.typeahead = function() { - var event = d3.dispatch('accept'), - autohighlight = false, - data; - - var typeahead = function(selection) { - var container, - hidden, - idx = autohighlight ? 0 : -1; - - function setup() { - var rect = selection.node().getBoundingClientRect(); - container = d3.select(document.body) - .append('div').attr('class', 'typeahead') - .style({ - position: 'absolute', - left: rect.left + 'px', - top: rect.bottom + 'px' - }); - selection - .on('keyup.typeahead', key); - hidden = false; - } - - function hide() { - container.remove(); - idx = autohighlight ? 0 : -1; - hidden = true; - } - function slowHide() { - if (autohighlight) { - if (container.select('a.selected').node()) { - select(container.select('a.selected').datum()); - event.accept(); - } - } - window.setTimeout(hide, 150); - } + /** + * This method is like `_.isMatch` except that it accepts `customizer` which + * is invoked to compare values. If `customizer` returns `undefined`, comparisons + * are handled by the method instead. The `customizer` is invoked with five + * arguments: (objValue, srcValue, index|key, object, source). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {Object} object The object to inspect. + * @param {Object} source The object of property values to match. + * @param {Function} [customizer] The function to customize comparisons. + * @returns {boolean} Returns `true` if `object` is a match, else `false`. + * @example + * + * function isGreeting(value) { + * return /^h(?:i|ello)$/.test(value); + * } + * + * function customizer(objValue, srcValue) { + * if (isGreeting(objValue) && isGreeting(srcValue)) { + * return true; + * } + * } + * + * var object = { 'greeting': 'hello' }; + * var source = { 'greeting': 'hi' }; + * + * _.isMatchWith(object, source, customizer); + * // => true + */ + function isMatchWith(object, source, customizer) { + customizer = typeof customizer == 'function' ? customizer : undefined; + return baseIsMatch(object, source, getMatchData(source), customizer); + } - selection - .on('focus.typeahead', setup) - .on('blur.typeahead', slowHide); - - function key() { - var len = container.selectAll('a').data().length; - if (d3.event.keyCode === 40) { - idx = Math.min(idx + 1, len - 1); - return highlight(); - } else if (d3.event.keyCode === 38) { - idx = Math.max(idx - 1, 0); - return highlight(); - } else if (d3.event.keyCode === 13) { - if (container.select('a.selected').node()) { - select(container.select('a.selected').datum()); - } - event.accept(); - hide(); - } else { - update(); - } - } + /** + * Checks if `value` is `NaN`. + * + * **Note:** This method is based on + * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as + * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for + * `undefined` and other non-number values. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`. + * @example + * + * _.isNaN(NaN); + * // => true + * + * _.isNaN(new Number(NaN)); + * // => true + * + * isNaN(undefined); + * // => true + * + * _.isNaN(undefined); + * // => false + */ + function isNaN(value) { + // An `NaN` primitive is the only value that is not equal to itself. + // Perform the `toStringTag` check first to avoid errors with some + // ActiveX objects in IE. + return isNumber(value) && value != +value; + } - function highlight() { - container - .selectAll('a') - .classed('selected', function(d, i) { return i == idx; }); - } + /** + * Checks if `value` is a pristine native function. + * + * **Note:** This method can't reliably detect native functions in the presence + * of the core-js package because core-js circumvents this kind of detection. + * Despite multiple requests, the core-js maintainer has made it clear: any + * attempt to fix the detection will be obstructed. As a result, we're left + * with little choice but to throw an error. Unfortunately, this also affects + * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill), + * which rely on core-js. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a native function, + * else `false`. + * @example + * + * _.isNative(Array.prototype.push); + * // => true + * + * _.isNative(_); + * // => false + */ + function isNative(value) { + if (isMaskable(value)) { + throw new Error(CORE_ERROR_TEXT); + } + return baseIsNative(value); + } - function update() { - if (hidden) setup(); + /** + * Checks if `value` is `null`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is `null`, else `false`. + * @example + * + * _.isNull(null); + * // => true + * + * _.isNull(void 0); + * // => false + */ + function isNull(value) { + return value === null; + } - data(selection, function(data) { - container.style('display', function() { - return data.length ? 'block' : 'none'; - }); + /** + * Checks if `value` is `null` or `undefined`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is nullish, else `false`. + * @example + * + * _.isNil(null); + * // => true + * + * _.isNil(void 0); + * // => true + * + * _.isNil(NaN); + * // => false + */ + function isNil(value) { + return value == null; + } - var options = container - .selectAll('a') - .data(data, function(d) { return d.value; }); + /** + * Checks if `value` is classified as a `Number` primitive or object. + * + * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are + * classified as numbers, use the `_.isFinite` method. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a number, else `false`. + * @example + * + * _.isNumber(3); + * // => true + * + * _.isNumber(Number.MIN_VALUE); + * // => true + * + * _.isNumber(Infinity); + * // => true + * + * _.isNumber('3'); + * // => false + */ + function isNumber(value) { + return typeof value == 'number' || + (isObjectLike(value) && baseGetTag(value) == numberTag); + } - options.enter() - .append('a') - .text(function(d) { return d.value; }) - .attr('title', function(d) { return d.title; }) - .on('click', select); + /** + * Checks if `value` is a plain object, that is, an object created by the + * `Object` constructor or one with a `[[Prototype]]` of `null`. + * + * @static + * @memberOf _ + * @since 0.8.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a plain object, else `false`. + * @example + * + * function Foo() { + * this.a = 1; + * } + * + * _.isPlainObject(new Foo); + * // => false + * + * _.isPlainObject([1, 2, 3]); + * // => false + * + * _.isPlainObject({ 'x': 0, 'y': 0 }); + * // => true + * + * _.isPlainObject(Object.create(null)); + * // => true + */ + function isPlainObject(value) { + if (!isObjectLike(value) || baseGetTag(value) != objectTag) { + return false; + } + var proto = getPrototype(value); + if (proto === null) { + return true; + } + var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor; + return typeof Ctor == 'function' && Ctor instanceof Ctor && + funcToString.call(Ctor) == objectCtorString; + } - options.exit().remove(); + /** + * Checks if `value` is classified as a `RegExp` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a regexp, else `false`. + * @example + * + * _.isRegExp(/abc/); + * // => true + * + * _.isRegExp('/abc/'); + * // => false + */ + var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp; - options - .classed('selected', function(d, i) { return i == idx; }); - }); - } + /** + * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754 + * double precision number which isn't the result of a rounded unsafe integer. + * + * **Note:** This method is based on + * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`. + * @example + * + * _.isSafeInteger(3); + * // => true + * + * _.isSafeInteger(Number.MIN_VALUE); + * // => false + * + * _.isSafeInteger(Infinity); + * // => false + * + * _.isSafeInteger('3'); + * // => false + */ + function isSafeInteger(value) { + return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER; + } - function select(d) { - selection - .property('value', d.value) - .trigger('change'); - } + /** + * Checks if `value` is classified as a `Set` object. + * + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a set, else `false`. + * @example + * + * _.isSet(new Set); + * // => true + * + * _.isSet(new WeakSet); + * // => false + */ + var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet; - }; + /** + * Checks if `value` is classified as a `String` primitive or object. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a string, else `false`. + * @example + * + * _.isString('abc'); + * // => true + * + * _.isString(1); + * // => false + */ + function isString(value) { + return typeof value == 'string' || + (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag); + } - typeahead.data = function(_) { - if (!arguments.length) return data; - data = _; - return typeahead; - }; + /** + * Checks if `value` is classified as a `Symbol` primitive or object. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a symbol, else `false`. + * @example + * + * _.isSymbol(Symbol.iterator); + * // => true + * + * _.isSymbol('abc'); + * // => false + */ + function isSymbol(value) { + return typeof value == 'symbol' || + (isObjectLike(value) && baseGetTag(value) == symbolTag); + } - typeahead.autohighlight = function(_) { - if (!arguments.length) return autohighlight; - autohighlight = _; - return typeahead; - }; + /** + * Checks if `value` is classified as a typed array. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. + * @example + * + * _.isTypedArray(new Uint8Array); + * // => true + * + * _.isTypedArray([]); + * // => false + */ + var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray; - return d3.rebind(typeahead, event, 'on'); -}; -// Tooltips and svg mask used to highlight certain features -d3.curtain = function() { + /** + * Checks if `value` is `undefined`. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`. + * @example + * + * _.isUndefined(void 0); + * // => true + * + * _.isUndefined(null); + * // => false + */ + function isUndefined(value) { + return value === undefined; + } - var event = d3.dispatch(), - surface, - tooltip, - darkness; + /** + * Checks if `value` is classified as a `WeakMap` object. + * + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a weak map, else `false`. + * @example + * + * _.isWeakMap(new WeakMap); + * // => true + * + * _.isWeakMap(new Map); + * // => false + */ + function isWeakMap(value) { + return isObjectLike(value) && getTag(value) == weakMapTag; + } - function curtain(selection) { + /** + * Checks if `value` is classified as a `WeakSet` object. + * + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a weak set, else `false`. + * @example + * + * _.isWeakSet(new WeakSet); + * // => true + * + * _.isWeakSet(new Set); + * // => false + */ + function isWeakSet(value) { + return isObjectLike(value) && baseGetTag(value) == weakSetTag; + } - surface = selection.append('svg') - .attr('id', 'curtain') - .style({ - 'z-index': 1000, - 'pointer-events': 'none', - 'position': 'absolute', - 'top': 0, - 'left': 0 - }); + /** + * Checks if `value` is less than `other`. + * + * @static + * @memberOf _ + * @since 3.9.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is less than `other`, + * else `false`. + * @see _.gt + * @example + * + * _.lt(1, 3); + * // => true + * + * _.lt(3, 3); + * // => false + * + * _.lt(3, 1); + * // => false + */ + var lt = createRelationalOperation(baseLt); - darkness = surface.append('path') - .attr({ - x: 0, - y: 0, - 'class': 'curtain-darkness' - }); - - d3.select(window).on('resize.curtain', resize); - - tooltip = selection.append('div') - .attr('class', 'tooltip') - .style('z-index', 1002); + /** + * Checks if `value` is less than or equal to `other`. + * + * @static + * @memberOf _ + * @since 3.9.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is less than or equal to + * `other`, else `false`. + * @see _.gte + * @example + * + * _.lte(1, 3); + * // => true + * + * _.lte(3, 3); + * // => true + * + * _.lte(3, 1); + * // => false + */ + var lte = createRelationalOperation(function(value, other) { + return value <= other; + }); - tooltip.append('div').attr('class', 'tooltip-arrow'); - tooltip.append('div').attr('class', 'tooltip-inner'); + /** + * Converts `value` to an array. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Lang + * @param {*} value The value to convert. + * @returns {Array} Returns the converted array. + * @example + * + * _.toArray({ 'a': 1, 'b': 2 }); + * // => [1, 2] + * + * _.toArray('abc'); + * // => ['a', 'b', 'c'] + * + * _.toArray(1); + * // => [] + * + * _.toArray(null); + * // => [] + */ + function toArray(value) { + if (!value) { + return []; + } + if (isArrayLike(value)) { + return isString(value) ? stringToArray(value) : copyArray(value); + } + if (symIterator && value[symIterator]) { + return iteratorToArray(value[symIterator]()); + } + var tag = getTag(value), + func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values); - resize(); + return func(value); + } - function resize() { - surface.attr({ - width: window.innerWidth, - height: window.innerHeight - }); - curtain.cut(darkness.datum()); - } + /** + * Converts `value` to a finite number. + * + * @static + * @memberOf _ + * @since 4.12.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {number} Returns the converted number. + * @example + * + * _.toFinite(3.2); + * // => 3.2 + * + * _.toFinite(Number.MIN_VALUE); + * // => 5e-324 + * + * _.toFinite(Infinity); + * // => 1.7976931348623157e+308 + * + * _.toFinite('3.2'); + * // => 3.2 + */ + function toFinite(value) { + if (!value) { + return value === 0 ? value : 0; + } + value = toNumber(value); + if (value === INFINITY || value === -INFINITY) { + var sign = (value < 0 ? -1 : 1); + return sign * MAX_INTEGER; + } + return value === value ? value : 0; } - curtain.reveal = function(box, text, tooltipclass, duration) { - if (typeof box === 'string') box = d3.select(box).node(); - if (box.getBoundingClientRect) box = box.getBoundingClientRect(); + /** + * Converts `value` to an integer. + * + * **Note:** This method is loosely based on + * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {number} Returns the converted integer. + * @example + * + * _.toInteger(3.2); + * // => 3 + * + * _.toInteger(Number.MIN_VALUE); + * // => 0 + * + * _.toInteger(Infinity); + * // => 1.7976931348623157e+308 + * + * _.toInteger('3.2'); + * // => 3 + */ + function toInteger(value) { + var result = toFinite(value), + remainder = result % 1; - curtain.cut(box, duration); + return result === result ? (remainder ? result - remainder : result) : 0; + } - if (text) { - // pseudo markdown bold text hack - var parts = text.split('**'); - var html = parts[0] ? '' + parts[0] + '' : ''; - if (parts[1]) html += '' + parts[1] + ''; + /** + * Converts `value` to an integer suitable for use as the length of an + * array-like object. + * + * **Note:** This method is based on + * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {number} Returns the converted integer. + * @example + * + * _.toLength(3.2); + * // => 3 + * + * _.toLength(Number.MIN_VALUE); + * // => 0 + * + * _.toLength(Infinity); + * // => 4294967295 + * + * _.toLength('3.2'); + * // => 3 + */ + function toLength(value) { + return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0; + } - var dimensions = tooltip.classed('in', true) - .select('.tooltip-inner') - .html(html) - .dimensions(); + /** + * Converts `value` to a number. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to process. + * @returns {number} Returns the number. + * @example + * + * _.toNumber(3.2); + * // => 3.2 + * + * _.toNumber(Number.MIN_VALUE); + * // => 5e-324 + * + * _.toNumber(Infinity); + * // => Infinity + * + * _.toNumber('3.2'); + * // => 3.2 + */ + function toNumber(value) { + if (typeof value == 'number') { + return value; + } + if (isSymbol(value)) { + return NAN; + } + if (isObject(value)) { + var other = typeof value.valueOf == 'function' ? value.valueOf() : value; + value = isObject(other) ? (other + '') : other; + } + if (typeof value != 'string') { + return value === 0 ? value : +value; + } + value = value.replace(reTrim, ''); + var isBinary = reIsBinary.test(value); + return (isBinary || reIsOctal.test(value)) + ? freeParseInt(value.slice(2), isBinary ? 2 : 8) + : (reIsBadHex.test(value) ? NAN : +value); + } - var pos; + /** + * Converts `value` to a plain object flattening inherited enumerable string + * keyed properties of `value` to own properties of the plain object. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {Object} Returns the converted plain object. + * @example + * + * function Foo() { + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.assign({ 'a': 1 }, new Foo); + * // => { 'a': 1, 'b': 2 } + * + * _.assign({ 'a': 1 }, _.toPlainObject(new Foo)); + * // => { 'a': 1, 'b': 2, 'c': 3 } + */ + function toPlainObject(value) { + return copyObject(value, keysIn(value)); + } - var w = window.innerWidth, - h = window.innerHeight; + /** + * Converts `value` to a safe integer. A safe integer can be compared and + * represented correctly. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {number} Returns the converted integer. + * @example + * + * _.toSafeInteger(3.2); + * // => 3 + * + * _.toSafeInteger(Number.MIN_VALUE); + * // => 0 + * + * _.toSafeInteger(Infinity); + * // => 9007199254740991 + * + * _.toSafeInteger('3.2'); + * // => 3 + */ + function toSafeInteger(value) { + return value + ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER) + : (value === 0 ? value : 0); + } - if (box.top + box.height < Math.min(100, box.width + box.left)) { - side = 'bottom'; - pos = [box.left + box.width / 2 - dimensions[0]/ 2, box.top + box.height]; + /** + * Converts `value` to a string. An empty string is returned for `null` + * and `undefined` values. The sign of `-0` is preserved. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {string} Returns the converted string. + * @example + * + * _.toString(null); + * // => '' + * + * _.toString(-0); + * // => '-0' + * + * _.toString([1, 2, 3]); + * // => '1,2,3' + */ + function toString(value) { + return value == null ? '' : baseToString(value); + } - } else if (box.left + box.width + 300 < window.innerWidth) { - side = 'right'; - pos = [box.left + box.width, box.top + box.height / 2 - dimensions[1] / 2]; + /*------------------------------------------------------------------------*/ - } else if (box.left > 300) { - side = 'left'; - pos = [box.left - 200, box.top + box.height / 2 - dimensions[1] / 2]; - } else { - side = 'bottom'; - pos = [box.left, box.top + box.height]; - } + /** + * Assigns own enumerable string keyed properties of source objects to the + * destination object. Source objects are applied from left to right. + * Subsequent sources overwrite property assignments of previous sources. + * + * **Note:** This method mutates `object` and is loosely based on + * [`Object.assign`](https://mdn.io/Object/assign). + * + * @static + * @memberOf _ + * @since 0.10.0 + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @returns {Object} Returns `object`. + * @see _.assignIn + * @example + * + * function Foo() { + * this.a = 1; + * } + * + * function Bar() { + * this.c = 3; + * } + * + * Foo.prototype.b = 2; + * Bar.prototype.d = 4; + * + * _.assign({ 'a': 0 }, new Foo, new Bar); + * // => { 'a': 1, 'c': 3 } + */ + var assign = createAssigner(function(object, source) { + if (isPrototype(source) || isArrayLike(source)) { + copyObject(source, keys(source), object); + return; + } + for (var key in source) { + if (hasOwnProperty.call(source, key)) { + assignValue(object, key, source[key]); + } + } + }); - pos = [ - Math.min(Math.max(10, pos[0]), w - dimensions[0] - 10), - Math.min(Math.max(10, pos[1]), h - dimensions[1] - 10) - ]; + /** + * This method is like `_.assign` except that it iterates over own and + * inherited source properties. + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @alias extend + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @returns {Object} Returns `object`. + * @see _.assign + * @example + * + * function Foo() { + * this.a = 1; + * } + * + * function Bar() { + * this.c = 3; + * } + * + * Foo.prototype.b = 2; + * Bar.prototype.d = 4; + * + * _.assignIn({ 'a': 0 }, new Foo, new Bar); + * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 } + */ + var assignIn = createAssigner(function(object, source) { + copyObject(source, keysIn(source), object); + }); + /** + * This method is like `_.assignIn` except that it accepts `customizer` + * which is invoked to produce the assigned values. If `customizer` returns + * `undefined`, assignment is handled by the method instead. The `customizer` + * is invoked with five arguments: (objValue, srcValue, key, object, source). + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @alias extendWith + * @category Object + * @param {Object} object The destination object. + * @param {...Object} sources The source objects. + * @param {Function} [customizer] The function to customize assigned values. + * @returns {Object} Returns `object`. + * @see _.assignWith + * @example + * + * function customizer(objValue, srcValue) { + * return _.isUndefined(objValue) ? srcValue : objValue; + * } + * + * var defaults = _.partialRight(_.assignInWith, customizer); + * + * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 }); + * // => { 'a': 1, 'b': 2 } + */ + var assignInWith = createAssigner(function(object, source, srcIndex, customizer) { + copyObject(source, keysIn(source), object, customizer); + }); - if (duration !== 0 || !tooltip.classed(side)) tooltip.call(iD.ui.Toggle(true)); + /** + * This method is like `_.assign` except that it accepts `customizer` + * which is invoked to produce the assigned values. If `customizer` returns + * `undefined`, assignment is handled by the method instead. The `customizer` + * is invoked with five arguments: (objValue, srcValue, key, object, source). + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The destination object. + * @param {...Object} sources The source objects. + * @param {Function} [customizer] The function to customize assigned values. + * @returns {Object} Returns `object`. + * @see _.assignInWith + * @example + * + * function customizer(objValue, srcValue) { + * return _.isUndefined(objValue) ? srcValue : objValue; + * } + * + * var defaults = _.partialRight(_.assignWith, customizer); + * + * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 }); + * // => { 'a': 1, 'b': 2 } + */ + var assignWith = createAssigner(function(object, source, srcIndex, customizer) { + copyObject(source, keys(source), object, customizer); + }); - tooltip - .style('top', pos[1] + 'px') - .style('left', pos[0] + 'px') - .attr('class', 'curtain-tooltip tooltip in ' + side + ' ' + tooltipclass) - .select('.tooltip-inner') - .html(html); + /** + * Creates an array of values corresponding to `paths` of `object`. + * + * @static + * @memberOf _ + * @since 1.0.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {...(string|string[])} [paths] The property paths to pick. + * @returns {Array} Returns the picked values. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] }; + * + * _.at(object, ['a[0].b.c', 'a[1]']); + * // => [3, 4] + */ + var at = flatRest(baseAt); - } else { - tooltip.call(iD.ui.Toggle(false)); - } - }; + /** + * Creates an object that inherits from the `prototype` object. If a + * `properties` object is given, its own enumerable string keyed properties + * are assigned to the created object. + * + * @static + * @memberOf _ + * @since 2.3.0 + * @category Object + * @param {Object} prototype The object to inherit from. + * @param {Object} [properties] The properties to assign to the object. + * @returns {Object} Returns the new object. + * @example + * + * function Shape() { + * this.x = 0; + * this.y = 0; + * } + * + * function Circle() { + * Shape.call(this); + * } + * + * Circle.prototype = _.create(Shape.prototype, { + * 'constructor': Circle + * }); + * + * var circle = new Circle; + * circle instanceof Circle; + * // => true + * + * circle instanceof Shape; + * // => true + */ + function create(prototype, properties) { + var result = baseCreate(prototype); + return properties == null ? result : baseAssign(result, properties); + } - curtain.cut = function(datum, duration) { - darkness.datum(datum); + /** + * Assigns own and inherited enumerable string keyed properties of source + * objects to the destination object for all destination properties that + * resolve to `undefined`. Source objects are applied from left to right. + * Once a property is set, additional values of the same property are ignored. + * + * **Note:** This method mutates `object`. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @returns {Object} Returns `object`. + * @see _.defaultsDeep + * @example + * + * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 }); + * // => { 'a': 1, 'b': 2 } + */ + var defaults = baseRest(function(args) { + args.push(undefined, customDefaultsAssignIn); + return apply(assignInWith, undefined, args); + }); - (duration === 0 ? darkness : darkness.transition().duration(duration || 600)) - .attr('d', function(d) { - var string = "M 0,0 L 0," + window.innerHeight + " L " + - window.innerWidth + "," + window.innerHeight + "L" + - window.innerWidth + ",0 Z"; + /** + * This method is like `_.defaults` except that it recursively assigns + * default properties. + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 3.10.0 + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @returns {Object} Returns `object`. + * @see _.defaults + * @example + * + * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } }); + * // => { 'a': { 'b': 2, 'c': 3 } } + */ + var defaultsDeep = baseRest(function(args) { + args.push(undefined, customDefaultsMerge); + return apply(mergeWith, undefined, args); + }); - if (!d) return string; - return string + 'M' + - d.left + ',' + d.top + 'L' + - d.left + ',' + (d.top + d.height) + 'L' + - (d.left + d.width) + ',' + (d.top + d.height) + 'L' + - (d.left + d.width) + ',' + (d.top) + 'Z'; + /** + * This method is like `_.find` except that it returns the key of the first + * element `predicate` returns truthy for instead of the element itself. + * + * @static + * @memberOf _ + * @since 1.1.0 + * @category Object + * @param {Object} object The object to inspect. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {string|undefined} Returns the key of the matched element, + * else `undefined`. + * @example + * + * var users = { + * 'barney': { 'age': 36, 'active': true }, + * 'fred': { 'age': 40, 'active': false }, + * 'pebbles': { 'age': 1, 'active': true } + * }; + * + * _.findKey(users, function(o) { return o.age < 40; }); + * // => 'barney' (iteration order is not guaranteed) + * + * // The `_.matches` iteratee shorthand. + * _.findKey(users, { 'age': 1, 'active': true }); + * // => 'pebbles' + * + * // The `_.matchesProperty` iteratee shorthand. + * _.findKey(users, ['active', false]); + * // => 'fred' + * + * // The `_.property` iteratee shorthand. + * _.findKey(users, 'active'); + * // => 'barney' + */ + function findKey(object, predicate) { + return baseFindKey(object, getIteratee(predicate, 3), baseForOwn); + } - }); - }; + /** + * This method is like `_.findKey` except that it iterates over elements of + * a collection in the opposite order. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Object + * @param {Object} object The object to inspect. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {string|undefined} Returns the key of the matched element, + * else `undefined`. + * @example + * + * var users = { + * 'barney': { 'age': 36, 'active': true }, + * 'fred': { 'age': 40, 'active': false }, + * 'pebbles': { 'age': 1, 'active': true } + * }; + * + * _.findLastKey(users, function(o) { return o.age < 40; }); + * // => returns 'pebbles' assuming `_.findKey` returns 'barney' + * + * // The `_.matches` iteratee shorthand. + * _.findLastKey(users, { 'age': 36, 'active': true }); + * // => 'barney' + * + * // The `_.matchesProperty` iteratee shorthand. + * _.findLastKey(users, ['active', false]); + * // => 'fred' + * + * // The `_.property` iteratee shorthand. + * _.findLastKey(users, 'active'); + * // => 'pebbles' + */ + function findLastKey(object, predicate) { + return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight); + } - curtain.remove = function() { - surface.remove(); - tooltip.remove(); - }; + /** + * Iterates over own and inherited enumerable string keyed properties of an + * object and invokes `iteratee` for each property. The iteratee is invoked + * with three arguments: (value, key, object). Iteratee functions may exit + * iteration early by explicitly returning `false`. + * + * @static + * @memberOf _ + * @since 0.3.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Object} Returns `object`. + * @see _.forInRight + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.forIn(new Foo, function(value, key) { + * console.log(key); + * }); + * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed). + */ + function forIn(object, iteratee) { + return object == null + ? object + : baseFor(object, getIteratee(iteratee, 3), keysIn); + } - return d3.rebind(curtain, event, 'on'); -}; -// Like selection.property('value', ...), but avoids no-op value sets, -// which can result in layout/repaint thrashing in some situations. -d3.selection.prototype.value = function(value) { - function d3_selection_value(value) { - function valueNull() { - delete this.value; - } + /** + * This method is like `_.forIn` except that it iterates over properties of + * `object` in the opposite order. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Object} Returns `object`. + * @see _.forIn + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.forInRight(new Foo, function(value, key) { + * console.log(key); + * }); + * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'. + */ + function forInRight(object, iteratee) { + return object == null + ? object + : baseForRight(object, getIteratee(iteratee, 3), keysIn); + } - function valueConstant() { - if (this.value !== value) this.value = value; - } + /** + * Iterates over own enumerable string keyed properties of an object and + * invokes `iteratee` for each property. The iteratee is invoked with three + * arguments: (value, key, object). Iteratee functions may exit iteration + * early by explicitly returning `false`. + * + * @static + * @memberOf _ + * @since 0.3.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Object} Returns `object`. + * @see _.forOwnRight + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.forOwn(new Foo, function(value, key) { + * console.log(key); + * }); + * // => Logs 'a' then 'b' (iteration order is not guaranteed). + */ + function forOwn(object, iteratee) { + return object && baseForOwn(object, getIteratee(iteratee, 3)); + } - function valueFunction() { - var x = value.apply(this, arguments); - if (x == null) delete this.value; - else if (this.value !== x) this.value = x; - } + /** + * This method is like `_.forOwn` except that it iterates over properties of + * `object` in the opposite order. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Object} Returns `object`. + * @see _.forOwn + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.forOwnRight(new Foo, function(value, key) { + * console.log(key); + * }); + * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'. + */ + function forOwnRight(object, iteratee) { + return object && baseForOwnRight(object, getIteratee(iteratee, 3)); + } - return value == null - ? valueNull : (typeof value === "function" - ? valueFunction : valueConstant); + /** + * Creates an array of function property names from own enumerable properties + * of `object`. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The object to inspect. + * @returns {Array} Returns the function names. + * @see _.functionsIn + * @example + * + * function Foo() { + * this.a = _.constant('a'); + * this.b = _.constant('b'); + * } + * + * Foo.prototype.c = _.constant('c'); + * + * _.functions(new Foo); + * // => ['a', 'b'] + */ + function functions(object) { + return object == null ? [] : baseFunctions(object, keys(object)); } - if (!arguments.length) return this.property('value'); - return this.each(d3_selection_value(value)); -}; -// Copyright (c) 2006, 2008 Tony Garnock-Jones -// Copyright (c) 2006, 2008 LShift Ltd. -// -// Permission is hereby granted, free of charge, to any person -// obtaining a copy of this software and associated documentation files -// (the "Software"), to deal in the Software without restriction, -// including without limitation the rights to use, copy, modify, merge, -// publish, distribute, sublicense, and/or sell copies of the Software, -// and to permit persons to whom the Software is furnished to do so, -// subject to the following conditions: -// -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -// BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. - -// source: https://bitbucket.org/lshift/synchrotron/src - -Diff3 = (function() { - 'use strict'; - - var diff3 = { - longest_common_subsequence: function(file1, file2) { - /* Text diff algorithm following Hunt and McIlroy 1976. - * J. W. Hunt and M. D. McIlroy, An algorithm for differential file - * comparison, Bell Telephone Laboratories CSTR #41 (1976) - * http://www.cs.dartmouth.edu/~doug/ - * - * Expects two arrays of strings. - */ - var equivalenceClasses; - var file2indices; - var newCandidate; - var candidates; - var line; - var c, i, j, jX, r, s; - - equivalenceClasses = {}; - for (j = 0; j < file2.length; j++) { - line = file2[j]; - if (equivalenceClasses[line]) { - equivalenceClasses[line].push(j); - } else { - equivalenceClasses[line] = [j]; - } - } + /** + * Creates an array of function property names from own and inherited + * enumerable properties of `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The object to inspect. + * @returns {Array} Returns the function names. + * @see _.functions + * @example + * + * function Foo() { + * this.a = _.constant('a'); + * this.b = _.constant('b'); + * } + * + * Foo.prototype.c = _.constant('c'); + * + * _.functionsIn(new Foo); + * // => ['a', 'b', 'c'] + */ + function functionsIn(object) { + return object == null ? [] : baseFunctions(object, keysIn(object)); + } - candidates = [{file1index: -1, - file2index: -1, - chain: null}]; + /** + * Gets the value at `path` of `object`. If the resolved value is + * `undefined`, the `defaultValue` is returned in its place. + * + * @static + * @memberOf _ + * @since 3.7.0 + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path of the property to get. + * @param {*} [defaultValue] The value returned for `undefined` resolved values. + * @returns {*} Returns the resolved value. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 3 } }] }; + * + * _.get(object, 'a[0].b.c'); + * // => 3 + * + * _.get(object, ['a', '0', 'b', 'c']); + * // => 3 + * + * _.get(object, 'a.b.c', 'default'); + * // => 'default' + */ + function get(object, path, defaultValue) { + var result = object == null ? undefined : baseGet(object, path); + return result === undefined ? defaultValue : result; + } - for (i = 0; i < file1.length; i++) { - line = file1[i]; - file2indices = equivalenceClasses[line] || []; + /** + * Checks if `path` is a direct property of `object`. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path to check. + * @returns {boolean} Returns `true` if `path` exists, else `false`. + * @example + * + * var object = { 'a': { 'b': 2 } }; + * var other = _.create({ 'a': _.create({ 'b': 2 }) }); + * + * _.has(object, 'a'); + * // => true + * + * _.has(object, 'a.b'); + * // => true + * + * _.has(object, ['a', 'b']); + * // => true + * + * _.has(other, 'a'); + * // => false + */ + function has(object, path) { + return object != null && hasPath(object, path, baseHas); + } - r = 0; - c = candidates[0]; + /** + * Checks if `path` is a direct or inherited property of `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path to check. + * @returns {boolean} Returns `true` if `path` exists, else `false`. + * @example + * + * var object = _.create({ 'a': _.create({ 'b': 2 }) }); + * + * _.hasIn(object, 'a'); + * // => true + * + * _.hasIn(object, 'a.b'); + * // => true + * + * _.hasIn(object, ['a', 'b']); + * // => true + * + * _.hasIn(object, 'b'); + * // => false + */ + function hasIn(object, path) { + return object != null && hasPath(object, path, baseHasIn); + } - for (jX = 0; jX < file2indices.length; jX++) { - j = file2indices[jX]; + /** + * Creates an object composed of the inverted keys and values of `object`. + * If `object` contains duplicate values, subsequent values overwrite + * property assignments of previous values. + * + * @static + * @memberOf _ + * @since 0.7.0 + * @category Object + * @param {Object} object The object to invert. + * @returns {Object} Returns the new inverted object. + * @example + * + * var object = { 'a': 1, 'b': 2, 'c': 1 }; + * + * _.invert(object); + * // => { '1': 'c', '2': 'b' } + */ + var invert = createInverter(function(result, value, key) { + result[value] = key; + }, constant(identity)); - for (s = 0; s < candidates.length; s++) { - if ((candidates[s].file2index < j) && - ((s == candidates.length - 1) || - (candidates[s + 1].file2index > j))) - break; - } + /** + * This method is like `_.invert` except that the inverted object is generated + * from the results of running each element of `object` thru `iteratee`. The + * corresponding inverted value of each inverted key is an array of keys + * responsible for generating the inverted value. The iteratee is invoked + * with one argument: (value). + * + * @static + * @memberOf _ + * @since 4.1.0 + * @category Object + * @param {Object} object The object to invert. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {Object} Returns the new inverted object. + * @example + * + * var object = { 'a': 1, 'b': 2, 'c': 1 }; + * + * _.invertBy(object); + * // => { '1': ['a', 'c'], '2': ['b'] } + * + * _.invertBy(object, function(value) { + * return 'group' + value; + * }); + * // => { 'group1': ['a', 'c'], 'group2': ['b'] } + */ + var invertBy = createInverter(function(result, value, key) { + if (hasOwnProperty.call(result, value)) { + result[value].push(key); + } else { + result[value] = [key]; + } + }, getIteratee); - if (s < candidates.length) { - newCandidate = {file1index: i, - file2index: j, - chain: candidates[s]}; - if (r == candidates.length) { - candidates.push(c); - } else { - candidates[r] = c; - } - r = s + 1; - c = newCandidate; - if (r == candidates.length) { - break; // no point in examining further (j)s - } - } - } + /** + * Invokes the method at `path` of `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path of the method to invoke. + * @param {...*} [args] The arguments to invoke the method with. + * @returns {*} Returns the result of the invoked method. + * @example + * + * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] }; + * + * _.invoke(object, 'a[0].b.c.slice', 1, 3); + * // => [2, 3] + */ + var invoke = baseRest(baseInvoke); - candidates[r] = c; - } + /** + * Creates an array of the own enumerable property names of `object`. + * + * **Note:** Non-object values are coerced to objects. See the + * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) + * for more details. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.keys(new Foo); + * // => ['a', 'b'] (iteration order is not guaranteed) + * + * _.keys('hi'); + * // => ['0', '1'] + */ + function keys(object) { + return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object); + } - // At this point, we know the LCS: it's in the reverse of the - // linked-list through .chain of - // candidates[candidates.length - 1]. + /** + * Creates an array of the own and inherited enumerable property names of `object`. + * + * **Note:** Non-object values are coerced to objects. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.keysIn(new Foo); + * // => ['a', 'b', 'c'] (iteration order is not guaranteed) + */ + function keysIn(object) { + return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object); + } - return candidates[candidates.length - 1]; - }, + /** + * The opposite of `_.mapValues`; this method creates an object with the + * same values as `object` and keys generated by running each own enumerable + * string keyed property of `object` thru `iteratee`. The iteratee is invoked + * with three arguments: (value, key, object). + * + * @static + * @memberOf _ + * @since 3.8.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Object} Returns the new mapped object. + * @see _.mapValues + * @example + * + * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) { + * return key + value; + * }); + * // => { 'a1': 1, 'b2': 2 } + */ + function mapKeys(object, iteratee) { + var result = {}; + iteratee = getIteratee(iteratee, 3); - diff_comm: function(file1, file2) { - // We apply the LCS to build a "comm"-style picture of the - // differences between file1 and file2. + baseForOwn(object, function(value, key, object) { + baseAssignValue(result, iteratee(value, key, object), value); + }); + return result; + } - var result = []; - var tail1 = file1.length; - var tail2 = file2.length; - var common = {common: []}; + /** + * Creates an object with the same keys as `object` and values generated + * by running each own enumerable string keyed property of `object` thru + * `iteratee`. The iteratee is invoked with three arguments: + * (value, key, object). + * + * @static + * @memberOf _ + * @since 2.4.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Object} Returns the new mapped object. + * @see _.mapKeys + * @example + * + * var users = { + * 'fred': { 'user': 'fred', 'age': 40 }, + * 'pebbles': { 'user': 'pebbles', 'age': 1 } + * }; + * + * _.mapValues(users, function(o) { return o.age; }); + * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed) + * + * // The `_.property` iteratee shorthand. + * _.mapValues(users, 'age'); + * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed) + */ + function mapValues(object, iteratee) { + var result = {}; + iteratee = getIteratee(iteratee, 3); - function processCommon() { - if (common.common.length) { - common.common.reverse(); - result.push(common); - common = {common: []}; - } - } + baseForOwn(object, function(value, key, object) { + baseAssignValue(result, key, iteratee(value, key, object)); + }); + return result; + } - for (var candidate = Diff3.longest_common_subsequence(file1, file2); - candidate !== null; - candidate = candidate.chain) - { - var different = {file1: [], file2: []}; + /** + * This method is like `_.assign` except that it recursively merges own and + * inherited enumerable string keyed properties of source objects into the + * destination object. Source properties that resolve to `undefined` are + * skipped if a destination value exists. Array and plain object properties + * are merged recursively. Other objects and value types are overridden by + * assignment. Source objects are applied from left to right. Subsequent + * sources overwrite property assignments of previous sources. + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 0.5.0 + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @returns {Object} Returns `object`. + * @example + * + * var object = { + * 'a': [{ 'b': 2 }, { 'd': 4 }] + * }; + * + * var other = { + * 'a': [{ 'c': 3 }, { 'e': 5 }] + * }; + * + * _.merge(object, other); + * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] } + */ + var merge = createAssigner(function(object, source, srcIndex) { + baseMerge(object, source, srcIndex); + }); - while (--tail1 > candidate.file1index) { - different.file1.push(file1[tail1]); - } + /** + * This method is like `_.merge` except that it accepts `customizer` which + * is invoked to produce the merged values of the destination and source + * properties. If `customizer` returns `undefined`, merging is handled by the + * method instead. The `customizer` is invoked with six arguments: + * (objValue, srcValue, key, object, source, stack). + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The destination object. + * @param {...Object} sources The source objects. + * @param {Function} customizer The function to customize assigned values. + * @returns {Object} Returns `object`. + * @example + * + * function customizer(objValue, srcValue) { + * if (_.isArray(objValue)) { + * return objValue.concat(srcValue); + * } + * } + * + * var object = { 'a': [1], 'b': [2] }; + * var other = { 'a': [3], 'b': [4] }; + * + * _.mergeWith(object, other, customizer); + * // => { 'a': [1, 3], 'b': [2, 4] } + */ + var mergeWith = createAssigner(function(object, source, srcIndex, customizer) { + baseMerge(object, source, srcIndex, customizer); + }); - while (--tail2 > candidate.file2index) { - different.file2.push(file2[tail2]); - } + /** + * The opposite of `_.pick`; this method creates an object composed of the + * own and inherited enumerable property paths of `object` that are not omitted. + * + * **Note:** This method is considerably slower than `_.pick`. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The source object. + * @param {...(string|string[])} [paths] The property paths to omit. + * @returns {Object} Returns the new object. + * @example + * + * var object = { 'a': 1, 'b': '2', 'c': 3 }; + * + * _.omit(object, ['a', 'c']); + * // => { 'b': '2' } + */ + var omit = flatRest(function(object, paths) { + var result = {}; + if (object == null) { + return result; + } + var isDeep = false; + paths = arrayMap(paths, function(path) { + path = castPath(path, object); + isDeep || (isDeep = path.length > 1); + return path; + }); + copyObject(object, getAllKeysIn(object), result); + if (isDeep) { + result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone); + } + var length = paths.length; + while (length--) { + baseUnset(result, paths[length]); + } + return result; + }); - if (different.file1.length || different.file2.length) { - processCommon(); - different.file1.reverse(); - different.file2.reverse(); - result.push(different); - } + /** + * The opposite of `_.pickBy`; this method creates an object composed of + * the own and inherited enumerable string keyed properties of `object` that + * `predicate` doesn't return truthy for. The predicate is invoked with two + * arguments: (value, key). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The source object. + * @param {Function} [predicate=_.identity] The function invoked per property. + * @returns {Object} Returns the new object. + * @example + * + * var object = { 'a': 1, 'b': '2', 'c': 3 }; + * + * _.omitBy(object, _.isNumber); + * // => { 'b': '2' } + */ + function omitBy(object, predicate) { + return pickBy(object, negate(getIteratee(predicate))); + } - if (tail1 >= 0) { - common.common.push(file1[tail1]); - } - } + /** + * Creates an object composed of the picked `object` properties. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The source object. + * @param {...(string|string[])} [paths] The property paths to pick. + * @returns {Object} Returns the new object. + * @example + * + * var object = { 'a': 1, 'b': '2', 'c': 3 }; + * + * _.pick(object, ['a', 'c']); + * // => { 'a': 1, 'c': 3 } + */ + var pick = flatRest(function(object, paths) { + return object == null ? {} : basePick(object, paths); + }); - processCommon(); + /** + * Creates an object composed of the `object` properties `predicate` returns + * truthy for. The predicate is invoked with two arguments: (value, key). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The source object. + * @param {Function} [predicate=_.identity] The function invoked per property. + * @returns {Object} Returns the new object. + * @example + * + * var object = { 'a': 1, 'b': '2', 'c': 3 }; + * + * _.pickBy(object, _.isNumber); + * // => { 'a': 1, 'c': 3 } + */ + function pickBy(object, predicate) { + if (object == null) { + return {}; + } + var props = arrayMap(getAllKeysIn(object), function(prop) { + return [prop]; + }); + predicate = getIteratee(predicate); + return basePickBy(object, props, function(value, path) { + return predicate(value, path[0]); + }); + } - result.reverse(); - return result; - }, + /** + * This method is like `_.get` except that if the resolved value is a + * function it's invoked with the `this` binding of its parent object and + * its result is returned. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path of the property to resolve. + * @param {*} [defaultValue] The value returned for `undefined` resolved values. + * @returns {*} Returns the resolved value. + * @example + * + * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] }; + * + * _.result(object, 'a[0].b.c1'); + * // => 3 + * + * _.result(object, 'a[0].b.c2'); + * // => 4 + * + * _.result(object, 'a[0].b.c3', 'default'); + * // => 'default' + * + * _.result(object, 'a[0].b.c3', _.constant('default')); + * // => 'default' + */ + function result(object, path, defaultValue) { + path = castPath(path, object); - diff_patch: function(file1, file2) { - // We apply the LCD to build a JSON representation of a - // diff(1)-style patch. + var index = -1, + length = path.length; - var result = []; - var tail1 = file1.length; - var tail2 = file2.length; + // Ensure the loop is entered when path is empty. + if (!length) { + length = 1; + object = undefined; + } + while (++index < length) { + var value = object == null ? undefined : object[toKey(path[index])]; + if (value === undefined) { + index = length; + value = defaultValue; + } + object = isFunction(value) ? value.call(object) : value; + } + return object; + } - function chunkDescription(file, offset, length) { - var chunk = []; - for (var i = 0; i < length; i++) { - chunk.push(file[offset + i]); - } - return {offset: offset, - length: length, - chunk: chunk}; - } - - for (var candidate = Diff3.longest_common_subsequence(file1, file2); - candidate !== null; - candidate = candidate.chain) - { - var mismatchLength1 = tail1 - candidate.file1index - 1; - var mismatchLength2 = tail2 - candidate.file2index - 1; - tail1 = candidate.file1index; - tail2 = candidate.file2index; - - if (mismatchLength1 || mismatchLength2) { - result.push({file1: chunkDescription(file1, - candidate.file1index + 1, - mismatchLength1), - file2: chunkDescription(file2, - candidate.file2index + 1, - mismatchLength2)}); - } - } + /** + * Sets the value at `path` of `object`. If a portion of `path` doesn't exist, + * it's created. Arrays are created for missing index properties while objects + * are created for all other missing properties. Use `_.setWith` to customize + * `path` creation. + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 3.7.0 + * @category Object + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to set. + * @param {*} value The value to set. + * @returns {Object} Returns `object`. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 3 } }] }; + * + * _.set(object, 'a[0].b.c', 4); + * console.log(object.a[0].b.c); + * // => 4 + * + * _.set(object, ['x', '0', 'y', 'z'], 5); + * console.log(object.x[0].y.z); + * // => 5 + */ + function set(object, path, value) { + return object == null ? object : baseSet(object, path, value); + } - result.reverse(); - return result; - }, + /** + * This method is like `_.set` except that it accepts `customizer` which is + * invoked to produce the objects of `path`. If `customizer` returns `undefined` + * path creation is handled by the method instead. The `customizer` is invoked + * with three arguments: (nsValue, key, nsObject). + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to set. + * @param {*} value The value to set. + * @param {Function} [customizer] The function to customize assigned values. + * @returns {Object} Returns `object`. + * @example + * + * var object = {}; + * + * _.setWith(object, '[0][1]', 'a', Object); + * // => { '0': { '1': 'a' } } + */ + function setWith(object, path, value, customizer) { + customizer = typeof customizer == 'function' ? customizer : undefined; + return object == null ? object : baseSet(object, path, value, customizer); + } - strip_patch: function(patch) { - // Takes the output of Diff3.diff_patch(), and removes - // information from it. It can still be used by patch(), - // below, but can no longer be inverted. - var newpatch = []; - for (var i = 0; i < patch.length; i++) { - var chunk = patch[i]; - newpatch.push({file1: {offset: chunk.file1.offset, - length: chunk.file1.length}, - file2: {chunk: chunk.file2.chunk}}); - } - return newpatch; - }, + /** + * Creates an array of own enumerable string keyed-value pairs for `object` + * which can be consumed by `_.fromPairs`. If `object` is a map or set, its + * entries are returned. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @alias entries + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the key-value pairs. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.toPairs(new Foo); + * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed) + */ + var toPairs = createToPairs(keys); - invert_patch: function(patch) { - // Takes the output of Diff3.diff_patch(), and inverts the - // sense of it, so that it can be applied to file2 to give - // file1 rather than the other way around. + /** + * Creates an array of own and inherited enumerable string keyed-value pairs + * for `object` which can be consumed by `_.fromPairs`. If `object` is a map + * or set, its entries are returned. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @alias entriesIn + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the key-value pairs. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.toPairsIn(new Foo); + * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed) + */ + var toPairsIn = createToPairs(keysIn); - for (var i = 0; i < patch.length; i++) { - var chunk = patch[i]; - var tmp = chunk.file1; - chunk.file1 = chunk.file2; - chunk.file2 = tmp; - } - }, + /** + * An alternative to `_.reduce`; this method transforms `object` to a new + * `accumulator` object which is the result of running each of its own + * enumerable string keyed properties thru `iteratee`, with each invocation + * potentially mutating the `accumulator` object. If `accumulator` is not + * provided, a new object with the same `[[Prototype]]` will be used. The + * iteratee is invoked with four arguments: (accumulator, value, key, object). + * Iteratee functions may exit iteration early by explicitly returning `false`. + * + * @static + * @memberOf _ + * @since 1.3.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @param {*} [accumulator] The custom accumulator value. + * @returns {*} Returns the accumulated value. + * @example + * + * _.transform([2, 3, 4], function(result, n) { + * result.push(n *= n); + * return n % 2 == 0; + * }, []); + * // => [4, 9] + * + * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) { + * (result[value] || (result[value] = [])).push(key); + * }, {}); + * // => { '1': ['a', 'c'], '2': ['b'] } + */ + function transform(object, iteratee, accumulator) { + var isArr = isArray(object), + isArrLike = isArr || isBuffer(object) || isTypedArray(object); - patch: function (file, patch) { - // Applies a patch to a file. - // - // Given file1 and file2, Diff3.patch(file1, - // Diff3.diff_patch(file1, file2)) should give file2. + iteratee = getIteratee(iteratee, 4); + if (accumulator == null) { + var Ctor = object && object.constructor; + if (isArrLike) { + accumulator = isArr ? new Ctor : []; + } + else if (isObject(object)) { + accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {}; + } + else { + accumulator = {}; + } + } + (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) { + return iteratee(accumulator, value, index, object); + }); + return accumulator; + } - var result = []; - var commonOffset = 0; + /** + * Removes the property at `path` of `object`. + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to unset. + * @returns {boolean} Returns `true` if the property is deleted, else `false`. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 7 } }] }; + * _.unset(object, 'a[0].b.c'); + * // => true + * + * console.log(object); + * // => { 'a': [{ 'b': {} }] }; + * + * _.unset(object, ['a', '0', 'b', 'c']); + * // => true + * + * console.log(object); + * // => { 'a': [{ 'b': {} }] }; + */ + function unset(object, path) { + return object == null ? true : baseUnset(object, path); + } - function copyCommon(targetOffset) { - while (commonOffset < targetOffset) { - result.push(file[commonOffset]); - commonOffset++; - } - } + /** + * This method is like `_.set` except that accepts `updater` to produce the + * value to set. Use `_.updateWith` to customize `path` creation. The `updater` + * is invoked with one argument: (value). + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.6.0 + * @category Object + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to set. + * @param {Function} updater The function to produce the updated value. + * @returns {Object} Returns `object`. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 3 } }] }; + * + * _.update(object, 'a[0].b.c', function(n) { return n * n; }); + * console.log(object.a[0].b.c); + * // => 9 + * + * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; }); + * console.log(object.x[0].y.z); + * // => 0 + */ + function update(object, path, updater) { + return object == null ? object : baseUpdate(object, path, castFunction(updater)); + } - for (var chunkIndex = 0; chunkIndex < patch.length; chunkIndex++) { - var chunk = patch[chunkIndex]; - copyCommon(chunk.file1.offset); - for (var lineIndex = 0; lineIndex < chunk.file2.chunk.length; lineIndex++) { - result.push(chunk.file2.chunk[lineIndex]); - } - commonOffset += chunk.file1.length; - } + /** + * This method is like `_.update` except that it accepts `customizer` which is + * invoked to produce the objects of `path`. If `customizer` returns `undefined` + * path creation is handled by the method instead. The `customizer` is invoked + * with three arguments: (nsValue, key, nsObject). + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.6.0 + * @category Object + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to set. + * @param {Function} updater The function to produce the updated value. + * @param {Function} [customizer] The function to customize assigned values. + * @returns {Object} Returns `object`. + * @example + * + * var object = {}; + * + * _.updateWith(object, '[0][1]', _.constant('a'), Object); + * // => { '0': { '1': 'a' } } + */ + function updateWith(object, path, updater, customizer) { + customizer = typeof customizer == 'function' ? customizer : undefined; + return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer); + } - copyCommon(file.length); - return result; - }, + /** + * Creates an array of the own enumerable string keyed property values of `object`. + * + * **Note:** Non-object values are coerced to objects. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property values. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.values(new Foo); + * // => [1, 2] (iteration order is not guaranteed) + * + * _.values('hi'); + * // => ['h', 'i'] + */ + function values(object) { + return object == null ? [] : baseValues(object, keys(object)); + } - diff_indices: function(file1, file2) { - // We apply the LCS to give a simple representation of the - // offsets and lengths of mismatched chunks in the input - // files. This is used by diff3_merge_indices below. - - var result = []; - var tail1 = file1.length; - var tail2 = file2.length; - - for (var candidate = Diff3.longest_common_subsequence(file1, file2); - candidate !== null; - candidate = candidate.chain) - { - var mismatchLength1 = tail1 - candidate.file1index - 1; - var mismatchLength2 = tail2 - candidate.file2index - 1; - tail1 = candidate.file1index; - tail2 = candidate.file2index; - - if (mismatchLength1 || mismatchLength2) { - result.push({file1: [tail1 + 1, mismatchLength1], - file2: [tail2 + 1, mismatchLength2]}); - } - } + /** + * Creates an array of the own and inherited enumerable string keyed property + * values of `object`. + * + * **Note:** Non-object values are coerced to objects. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property values. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.valuesIn(new Foo); + * // => [1, 2, 3] (iteration order is not guaranteed) + */ + function valuesIn(object) { + return object == null ? [] : baseValues(object, keysIn(object)); + } - result.reverse(); - return result; - }, + /*------------------------------------------------------------------------*/ - diff3_merge_indices: function (a, o, b) { - // Given three files, A, O, and B, where both A and B are - // independently derived from O, returns a fairly complicated - // internal representation of merge decisions it's taken. The - // interested reader may wish to consult - // - // Sanjeev Khanna, Keshav Kunal, and Benjamin C. Pierce. "A - // Formal Investigation of Diff3." In Arvind and Prasad, - // editors, Foundations of Software Technology and Theoretical - // Computer Science (FSTTCS), December 2007. - // - // (http://www.cis.upenn.edu/~bcpierce/papers/diff3-short.pdf) - var i; - - var m1 = Diff3.diff_indices(o, a); - var m2 = Diff3.diff_indices(o, b); - - var hunks = []; - function addHunk(h, side) { - hunks.push([h.file1[0], side, h.file1[1], h.file2[0], h.file2[1]]); - } - for (i = 0; i < m1.length; i++) { addHunk(m1[i], 0); } - for (i = 0; i < m2.length; i++) { addHunk(m2[i], 2); } - hunks.sort(); - - var result = []; - var commonOffset = 0; - function copyCommon(targetOffset) { - if (targetOffset > commonOffset) { - result.push([1, commonOffset, targetOffset - commonOffset]); - commonOffset = targetOffset; - } - } + /** + * Clamps `number` within the inclusive `lower` and `upper` bounds. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Number + * @param {number} number The number to clamp. + * @param {number} [lower] The lower bound. + * @param {number} upper The upper bound. + * @returns {number} Returns the clamped number. + * @example + * + * _.clamp(-10, -5, 5); + * // => -5 + * + * _.clamp(10, -5, 5); + * // => 5 + */ + function clamp(number, lower, upper) { + if (upper === undefined) { + upper = lower; + lower = undefined; + } + if (upper !== undefined) { + upper = toNumber(upper); + upper = upper === upper ? upper : 0; + } + if (lower !== undefined) { + lower = toNumber(lower); + lower = lower === lower ? lower : 0; + } + return baseClamp(toNumber(number), lower, upper); + } - for (var hunkIndex = 0; hunkIndex < hunks.length; hunkIndex++) { - var firstHunkIndex = hunkIndex; - var hunk = hunks[hunkIndex]; - var regionLhs = hunk[0]; - var regionRhs = regionLhs + hunk[2]; - while (hunkIndex < hunks.length - 1) { - var maybeOverlapping = hunks[hunkIndex + 1]; - var maybeLhs = maybeOverlapping[0]; - if (maybeLhs > regionRhs) break; - regionRhs = maybeLhs + maybeOverlapping[2]; - hunkIndex++; - } + /** + * Checks if `n` is between `start` and up to, but not including, `end`. If + * `end` is not specified, it's set to `start` with `start` then set to `0`. + * If `start` is greater than `end` the params are swapped to support + * negative ranges. + * + * @static + * @memberOf _ + * @since 3.3.0 + * @category Number + * @param {number} number The number to check. + * @param {number} [start=0] The start of the range. + * @param {number} end The end of the range. + * @returns {boolean} Returns `true` if `number` is in the range, else `false`. + * @see _.range, _.rangeRight + * @example + * + * _.inRange(3, 2, 4); + * // => true + * + * _.inRange(4, 8); + * // => true + * + * _.inRange(4, 2); + * // => false + * + * _.inRange(2, 2); + * // => false + * + * _.inRange(1.2, 2); + * // => true + * + * _.inRange(5.2, 4); + * // => false + * + * _.inRange(-3, -2, -6); + * // => true + */ + function inRange(number, start, end) { + start = toFinite(start); + if (end === undefined) { + end = start; + start = 0; + } else { + end = toFinite(end); + } + number = toNumber(number); + return baseInRange(number, start, end); + } - copyCommon(regionLhs); - if (firstHunkIndex == hunkIndex) { - // The "overlap" was only one hunk long, meaning that - // there's no conflict here. Either a and o were the - // same, or b and o were the same. - if (hunk[4] > 0) { - result.push([hunk[1], hunk[3], hunk[4]]); - } - } else { - // A proper conflict. Determine the extents of the - // regions involved from a, o and b. Effectively merge - // all the hunks on the left into one giant hunk, and - // do the same for the right; then, correct for skew - // in the regions of o that each side changed, and - // report appropriate spans for the three sides. - var regions = { - 0: [a.length, -1, o.length, -1], - 2: [b.length, -1, o.length, -1] - }; - for (i = firstHunkIndex; i <= hunkIndex; i++) { - hunk = hunks[i]; - var side = hunk[1]; - var r = regions[side]; - var oLhs = hunk[0]; - var oRhs = oLhs + hunk[2]; - var abLhs = hunk[3]; - var abRhs = abLhs + hunk[4]; - r[0] = Math.min(abLhs, r[0]); - r[1] = Math.max(abRhs, r[1]); - r[2] = Math.min(oLhs, r[2]); - r[3] = Math.max(oRhs, r[3]); - } - var aLhs = regions[0][0] + (regionLhs - regions[0][2]); - var aRhs = regions[0][1] + (regionRhs - regions[0][3]); - var bLhs = regions[2][0] + (regionLhs - regions[2][2]); - var bRhs = regions[2][1] + (regionRhs - regions[2][3]); - result.push([-1, - aLhs, aRhs - aLhs, - regionLhs, regionRhs - regionLhs, - bLhs, bRhs - bLhs]); - } - commonOffset = regionRhs; - } + /** + * Produces a random number between the inclusive `lower` and `upper` bounds. + * If only one argument is provided a number between `0` and the given number + * is returned. If `floating` is `true`, or either `lower` or `upper` are + * floats, a floating-point number is returned instead of an integer. + * + * **Note:** JavaScript follows the IEEE-754 standard for resolving + * floating-point values which can produce unexpected results. + * + * @static + * @memberOf _ + * @since 0.7.0 + * @category Number + * @param {number} [lower=0] The lower bound. + * @param {number} [upper=1] The upper bound. + * @param {boolean} [floating] Specify returning a floating-point number. + * @returns {number} Returns the random number. + * @example + * + * _.random(0, 5); + * // => an integer between 0 and 5 + * + * _.random(5); + * // => also an integer between 0 and 5 + * + * _.random(5, true); + * // => a floating-point number between 0 and 5 + * + * _.random(1.2, 5.2); + * // => a floating-point number between 1.2 and 5.2 + */ + function random(lower, upper, floating) { + if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) { + upper = floating = undefined; + } + if (floating === undefined) { + if (typeof upper == 'boolean') { + floating = upper; + upper = undefined; + } + else if (typeof lower == 'boolean') { + floating = lower; + lower = undefined; + } + } + if (lower === undefined && upper === undefined) { + lower = 0; + upper = 1; + } + else { + lower = toFinite(lower); + if (upper === undefined) { + upper = lower; + lower = 0; + } else { + upper = toFinite(upper); + } + } + if (lower > upper) { + var temp = lower; + lower = upper; + upper = temp; + } + if (floating || lower % 1 || upper % 1) { + var rand = nativeRandom(); + return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper); + } + return baseRandom(lower, upper); + } - copyCommon(o.length); - return result; - }, + /*------------------------------------------------------------------------*/ - diff3_merge: function (a, o, b, excludeFalseConflicts) { - // Applies the output of Diff3.diff3_merge_indices to actually - // construct the merged file; the returned result alternates - // between "ok" and "conflict" blocks. + /** + * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to convert. + * @returns {string} Returns the camel cased string. + * @example + * + * _.camelCase('Foo Bar'); + * // => 'fooBar' + * + * _.camelCase('--foo-bar--'); + * // => 'fooBar' + * + * _.camelCase('__FOO_BAR__'); + * // => 'fooBar' + */ + var camelCase = createCompounder(function(result, word, index) { + word = word.toLowerCase(); + return result + (index ? capitalize(word) : word); + }); - var result = []; - var files = [a, o, b]; - var indices = Diff3.diff3_merge_indices(a, o, b); + /** + * Converts the first character of `string` to upper case and the remaining + * to lower case. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to capitalize. + * @returns {string} Returns the capitalized string. + * @example + * + * _.capitalize('FRED'); + * // => 'Fred' + */ + function capitalize(string) { + return upperFirst(toString(string).toLowerCase()); + } - var okLines = []; - function flushOk() { - if (okLines.length) { - result.push({ok: okLines}); - } - okLines = []; - } - function pushOk(xs) { - for (var j = 0; j < xs.length; j++) { - okLines.push(xs[j]); - } - } + /** + * Deburrs `string` by converting + * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table) + * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A) + * letters to basic Latin letters and removing + * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to deburr. + * @returns {string} Returns the deburred string. + * @example + * + * _.deburr('déjà vu'); + * // => 'deja vu' + */ + function deburr(string) { + string = toString(string); + return string && string.replace(reLatin, deburrLetter).replace(reComboMark, ''); + } - function isTrueConflict(rec) { - if (rec[2] != rec[6]) return true; - var aoff = rec[1]; - var boff = rec[5]; - for (var j = 0; j < rec[2]; j++) { - if (a[j + aoff] != b[j + boff]) return true; - } - return false; - } + /** + * Checks if `string` ends with the given target string. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to inspect. + * @param {string} [target] The string to search for. + * @param {number} [position=string.length] The position to search up to. + * @returns {boolean} Returns `true` if `string` ends with `target`, + * else `false`. + * @example + * + * _.endsWith('abc', 'c'); + * // => true + * + * _.endsWith('abc', 'b'); + * // => false + * + * _.endsWith('abc', 'b', 2); + * // => true + */ + function endsWith(string, target, position) { + string = toString(string); + target = baseToString(target); - for (var i = 0; i < indices.length; i++) { - var x = indices[i]; - var side = x[0]; - if (side == -1) { - if (excludeFalseConflicts && !isTrueConflict(x)) { - pushOk(files[0].slice(x[1], x[1] + x[2])); - } else { - flushOk(); - result.push({conflict: {a: a.slice(x[1], x[1] + x[2]), - aIndex: x[1], - o: o.slice(x[3], x[3] + x[4]), - oIndex: x[3], - b: b.slice(x[5], x[5] + x[6]), - bIndex: x[5]}}); - } - } else { - pushOk(files[side].slice(x[1], x[1] + x[2])); - } - } + var length = string.length; + position = position === undefined + ? length + : baseClamp(toInteger(position), 0, length); - flushOk(); - return result; - } - }; - return diff3; -})(); + var end = position; + position -= target.length; + return position >= 0 && string.slice(position, end) == target; + } -if (typeof module !== 'undefined') module.exports = Diff3; -var JXON = new (function () { - var - sValueProp = "keyValue", sAttributesProp = "keyAttributes", sAttrPref = "@", /* you can customize these values */ - aCache = [], rIsNull = /^\s*$/, rIsBool = /^(?:true|false)$/i; + /** + * Converts the characters "&", "<", ">", '"', and "'" in `string` to their + * corresponding HTML entities. + * + * **Note:** No other characters are escaped. To escape additional + * characters use a third-party library like [_he_](https://mths.be/he). + * + * Though the ">" character is escaped for symmetry, characters like + * ">" and "/" don't need escaping in HTML and have no special meaning + * unless they're part of a tag or unquoted attribute value. See + * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands) + * (under "semi-related fun fact") for more details. + * + * When working with HTML you should always + * [quote attribute values](http://wonko.com/post/html-escaping) to reduce + * XSS vectors. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category String + * @param {string} [string=''] The string to escape. + * @returns {string} Returns the escaped string. + * @example + * + * _.escape('fred, barney, & pebbles'); + * // => 'fred, barney, & pebbles' + */ + function escape(string) { + string = toString(string); + return (string && reHasUnescapedHtml.test(string)) + ? string.replace(reUnescapedHtml, escapeHtmlChar) + : string; + } - function parseText (sValue) { - if (rIsNull.test(sValue)) { return null; } - if (rIsBool.test(sValue)) { return sValue.toLowerCase() === "true"; } - if (isFinite(sValue)) { return parseFloat(sValue); } - if (isFinite(Date.parse(sValue))) { return new Date(sValue); } - return sValue; - } + /** + * Escapes the `RegExp` special characters "^", "$", "\", ".", "*", "+", + * "?", "(", ")", "[", "]", "{", "}", and "|" in `string`. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to escape. + * @returns {string} Returns the escaped string. + * @example + * + * _.escapeRegExp('[lodash](https://lodash.com/)'); + * // => '\[lodash\]\(https://lodash\.com/\)' + */ + function escapeRegExp(string) { + string = toString(string); + return (string && reHasRegExpChar.test(string)) + ? string.replace(reRegExpChar, '\\$&') + : string; + } - function EmptyTree () { } - EmptyTree.prototype.toString = function () { return "null"; }; - EmptyTree.prototype.valueOf = function () { return null; }; + /** + * Converts `string` to + * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to convert. + * @returns {string} Returns the kebab cased string. + * @example + * + * _.kebabCase('Foo Bar'); + * // => 'foo-bar' + * + * _.kebabCase('fooBar'); + * // => 'foo-bar' + * + * _.kebabCase('__FOO_BAR__'); + * // => 'foo-bar' + */ + var kebabCase = createCompounder(function(result, word, index) { + return result + (index ? '-' : '') + word.toLowerCase(); + }); - function objectify (vValue) { - return vValue === null ? new EmptyTree() : vValue instanceof Object ? vValue : new vValue.constructor(vValue); - } + /** + * Converts `string`, as space separated words, to lower case. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category String + * @param {string} [string=''] The string to convert. + * @returns {string} Returns the lower cased string. + * @example + * + * _.lowerCase('--Foo-Bar--'); + * // => 'foo bar' + * + * _.lowerCase('fooBar'); + * // => 'foo bar' + * + * _.lowerCase('__FOO_BAR__'); + * // => 'foo bar' + */ + var lowerCase = createCompounder(function(result, word, index) { + return result + (index ? ' ' : '') + word.toLowerCase(); + }); - function createObjTree (oParentNode, nVerb, bFreeze, bNesteAttr) { - var - nLevelStart = aCache.length, bChildren = oParentNode.hasChildNodes(), - bAttributes = oParentNode.hasAttributes(), bHighVerb = Boolean(nVerb & 2); + /** + * Converts the first character of `string` to lower case. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category String + * @param {string} [string=''] The string to convert. + * @returns {string} Returns the converted string. + * @example + * + * _.lowerFirst('Fred'); + * // => 'fred' + * + * _.lowerFirst('FRED'); + * // => 'fRED' + */ + var lowerFirst = createCaseFirst('toLowerCase'); - var - sProp, vContent, nLength = 0, sCollectedTxt = "", - vResult = bHighVerb ? {} : /* put here the default value for empty nodes: */ true; + /** + * Pads `string` on the left and right sides if it's shorter than `length`. + * Padding characters are truncated if they can't be evenly divided by `length`. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to pad. + * @param {number} [length=0] The padding length. + * @param {string} [chars=' '] The string used as padding. + * @returns {string} Returns the padded string. + * @example + * + * _.pad('abc', 8); + * // => ' abc ' + * + * _.pad('abc', 8, '_-'); + * // => '_-abc_-_' + * + * _.pad('abc', 3); + * // => 'abc' + */ + function pad(string, length, chars) { + string = toString(string); + length = toInteger(length); - if (bChildren) { - for (var oNode, nItem = 0; nItem < oParentNode.childNodes.length; nItem++) { - oNode = oParentNode.childNodes.item(nItem); - if (oNode.nodeType === 4) { sCollectedTxt += oNode.nodeValue; } /* nodeType is "CDATASection" (4) */ - else if (oNode.nodeType === 3) { sCollectedTxt += oNode.nodeValue.trim(); } /* nodeType is "Text" (3) */ - else if (oNode.nodeType === 1 && !oNode.prefix) { aCache.push(oNode); } /* nodeType is "Element" (1) */ + var strLength = length ? stringSize(string) : 0; + if (!length || strLength >= length) { + return string; } + var mid = (length - strLength) / 2; + return ( + createPadding(nativeFloor(mid), chars) + + string + + createPadding(nativeCeil(mid), chars) + ); } - var nLevelEnd = aCache.length, vBuiltVal = parseText(sCollectedTxt); - - if (!bHighVerb && (bChildren || bAttributes)) { vResult = nVerb === 0 ? objectify(vBuiltVal) : {}; } + /** + * Pads `string` on the right side if it's shorter than `length`. Padding + * characters are truncated if they exceed `length`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category String + * @param {string} [string=''] The string to pad. + * @param {number} [length=0] The padding length. + * @param {string} [chars=' '] The string used as padding. + * @returns {string} Returns the padded string. + * @example + * + * _.padEnd('abc', 6); + * // => 'abc ' + * + * _.padEnd('abc', 6, '_-'); + * // => 'abc_-_' + * + * _.padEnd('abc', 3); + * // => 'abc' + */ + function padEnd(string, length, chars) { + string = toString(string); + length = toInteger(length); - for (var nElId = nLevelStart; nElId < nLevelEnd; nElId++) { - sProp = aCache[nElId].nodeName.toLowerCase(); - vContent = createObjTree(aCache[nElId], nVerb, bFreeze, bNesteAttr); - if (vResult.hasOwnProperty(sProp)) { - if (vResult[sProp].constructor !== Array) { vResult[sProp] = [vResult[sProp]]; } - vResult[sProp].push(vContent); - } else { - vResult[sProp] = vContent; - nLength++; - } + var strLength = length ? stringSize(string) : 0; + return (length && strLength < length) + ? (string + createPadding(length - strLength, chars)) + : string; } - if (bAttributes) { - var - nAttrLen = oParentNode.attributes.length, - sAPrefix = bNesteAttr ? "" : sAttrPref, oAttrParent = bNesteAttr ? {} : vResult; + /** + * Pads `string` on the left side if it's shorter than `length`. Padding + * characters are truncated if they exceed `length`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category String + * @param {string} [string=''] The string to pad. + * @param {number} [length=0] The padding length. + * @param {string} [chars=' '] The string used as padding. + * @returns {string} Returns the padded string. + * @example + * + * _.padStart('abc', 6); + * // => ' abc' + * + * _.padStart('abc', 6, '_-'); + * // => '_-_abc' + * + * _.padStart('abc', 3); + * // => 'abc' + */ + function padStart(string, length, chars) { + string = toString(string); + length = toInteger(length); - for (var oAttrib, nAttrib = 0; nAttrib < nAttrLen; nLength++, nAttrib++) { - oAttrib = oParentNode.attributes.item(nAttrib); - oAttrParent[sAPrefix + oAttrib.name.toLowerCase()] = parseText(oAttrib.value.trim()); - } + var strLength = length ? stringSize(string) : 0; + return (length && strLength < length) + ? (createPadding(length - strLength, chars) + string) + : string; + } - if (bNesteAttr) { - if (bFreeze) { Object.freeze(oAttrParent); } - vResult[sAttributesProp] = oAttrParent; - nLength -= nAttrLen - 1; + /** + * Converts `string` to an integer of the specified radix. If `radix` is + * `undefined` or `0`, a `radix` of `10` is used unless `value` is a + * hexadecimal, in which case a `radix` of `16` is used. + * + * **Note:** This method aligns with the + * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`. + * + * @static + * @memberOf _ + * @since 1.1.0 + * @category String + * @param {string} string The string to convert. + * @param {number} [radix=10] The radix to interpret `value` by. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {number} Returns the converted integer. + * @example + * + * _.parseInt('08'); + * // => 8 + * + * _.map(['6', '08', '10'], _.parseInt); + * // => [6, 8, 10] + */ + function parseInt(string, radix, guard) { + if (guard || radix == null) { + radix = 0; + } else if (radix) { + radix = +radix; } + return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0); } - if (nVerb === 3 || (nVerb === 2 || nVerb === 1 && nLength > 0) && sCollectedTxt) { - vResult[sValueProp] = vBuiltVal; - } else if (!bHighVerb && nLength === 0 && sCollectedTxt) { - vResult = vBuiltVal; + /** + * Repeats the given string `n` times. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to repeat. + * @param {number} [n=1] The number of times to repeat the string. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {string} Returns the repeated string. + * @example + * + * _.repeat('*', 3); + * // => '***' + * + * _.repeat('abc', 2); + * // => 'abcabc' + * + * _.repeat('abc', 0); + * // => '' + */ + function repeat(string, n, guard) { + if ((guard ? isIterateeCall(string, n, guard) : n === undefined)) { + n = 1; + } else { + n = toInteger(n); + } + return baseRepeat(toString(string), n); } - if (bFreeze && (bHighVerb || nLength > 0)) { Object.freeze(vResult); } - - aCache.length = nLevelStart; + /** + * Replaces matches for `pattern` in `string` with `replacement`. + * + * **Note:** This method is based on + * [`String#replace`](https://mdn.io/String/replace). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category String + * @param {string} [string=''] The string to modify. + * @param {RegExp|string} pattern The pattern to replace. + * @param {Function|string} replacement The match replacement. + * @returns {string} Returns the modified string. + * @example + * + * _.replace('Hi Fred', 'Fred', 'Barney'); + * // => 'Hi Barney' + */ + function replace() { + var args = arguments, + string = toString(args[0]); - return vResult; - } + return args.length < 3 ? string : string.replace(args[1], args[2]); + } - function loadObjTree (oXMLDoc, oParentEl, oParentObj) { - var vValue, oChild; + /** + * Converts `string` to + * [snake case](https://en.wikipedia.org/wiki/Snake_case). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to convert. + * @returns {string} Returns the snake cased string. + * @example + * + * _.snakeCase('Foo Bar'); + * // => 'foo_bar' + * + * _.snakeCase('fooBar'); + * // => 'foo_bar' + * + * _.snakeCase('--FOO-BAR--'); + * // => 'foo_bar' + */ + var snakeCase = createCompounder(function(result, word, index) { + return result + (index ? '_' : '') + word.toLowerCase(); + }); - if (oParentObj instanceof String || oParentObj instanceof Number || oParentObj instanceof Boolean) { - oParentEl.appendChild(oXMLDoc.createTextNode(oParentObj.toString())); /* verbosity level is 0 */ - } else if (oParentObj.constructor === Date) { - oParentEl.appendChild(oXMLDoc.createTextNode(oParentObj.toGMTString())); + /** + * Splits `string` by `separator`. + * + * **Note:** This method is based on + * [`String#split`](https://mdn.io/String/split). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category String + * @param {string} [string=''] The string to split. + * @param {RegExp|string} separator The separator pattern to split by. + * @param {number} [limit] The length to truncate results to. + * @returns {Array} Returns the string segments. + * @example + * + * _.split('a-b-c', '-', 2); + * // => ['a', 'b'] + */ + function split(string, separator, limit) { + if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) { + separator = limit = undefined; + } + limit = limit === undefined ? MAX_ARRAY_LENGTH : limit >>> 0; + if (!limit) { + return []; + } + string = toString(string); + if (string && ( + typeof separator == 'string' || + (separator != null && !isRegExp(separator)) + )) { + separator = baseToString(separator); + if (!separator && hasUnicode(string)) { + return castSlice(stringToArray(string), 0, limit); + } + } + return string.split(separator, limit); } - for (var sName in oParentObj) { - vValue = oParentObj[sName]; - if (isFinite(sName) || vValue instanceof Function) { continue; } /* verbosity level is 0 */ - if (sName === sValueProp) { - if (vValue !== null && vValue !== true) { oParentEl.appendChild(oXMLDoc.createTextNode(vValue.constructor === Date ? vValue.toGMTString() : String(vValue))); } - } else if (sName === sAttributesProp) { /* verbosity level is 3 */ - for (var sAttrib in vValue) { oParentEl.setAttribute(sAttrib, vValue[sAttrib]); } - } else if (sName.charAt(0) === sAttrPref) { - oParentEl.setAttribute(sName.slice(1), vValue); - } else if (vValue.constructor === Array) { - for (var nItem = 0; nItem < vValue.length; nItem++) { - oChild = oXMLDoc.createElement(sName); - loadObjTree(oXMLDoc, oChild, vValue[nItem]); - oParentEl.appendChild(oChild); - } - } else { - oChild = oXMLDoc.createElement(sName); - if (vValue instanceof Object) { - loadObjTree(oXMLDoc, oChild, vValue); - } else if (vValue !== null && vValue !== true) { - oChild.appendChild(oXMLDoc.createTextNode(vValue.toString())); - } - oParentEl.appendChild(oChild); - } - } - } + /** + * Converts `string` to + * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage). + * + * @static + * @memberOf _ + * @since 3.1.0 + * @category String + * @param {string} [string=''] The string to convert. + * @returns {string} Returns the start cased string. + * @example + * + * _.startCase('--foo-bar--'); + * // => 'Foo Bar' + * + * _.startCase('fooBar'); + * // => 'Foo Bar' + * + * _.startCase('__FOO_BAR__'); + * // => 'FOO BAR' + */ + var startCase = createCompounder(function(result, word, index) { + return result + (index ? ' ' : '') + upperFirst(word); + }); - this.build = function (oXMLParent, nVerbosity /* optional */, bFreeze /* optional */, bNesteAttributes /* optional */) { - var _nVerb = arguments.length > 1 && typeof nVerbosity === "number" ? nVerbosity & 3 : /* put here the default verbosity level: */ 1; - return createObjTree(oXMLParent, _nVerb, bFreeze || false, arguments.length > 3 ? bNesteAttributes : _nVerb === 3); - }; + /** + * Checks if `string` starts with the given target string. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to inspect. + * @param {string} [target] The string to search for. + * @param {number} [position=0] The position to search from. + * @returns {boolean} Returns `true` if `string` starts with `target`, + * else `false`. + * @example + * + * _.startsWith('abc', 'a'); + * // => true + * + * _.startsWith('abc', 'b'); + * // => false + * + * _.startsWith('abc', 'b', 1); + * // => true + */ + function startsWith(string, target, position) { + string = toString(string); + position = position == null + ? 0 + : baseClamp(toInteger(position), 0, string.length); - this.unbuild = function (oObjTree) { - var oNewDoc = document.implementation.createDocument("", "", null); - loadObjTree(oNewDoc, oNewDoc, oObjTree); - return oNewDoc; - }; + target = baseToString(target); + return string.slice(position, position + target.length) == target; + } - this.stringify = function (oObjTree) { - return (new XMLSerializer()).serializeToString(JXON.unbuild(oObjTree)); - }; -})(); -// var myObject = JXON.build(doc); -// we got our javascript object! try: alert(JSON.stringify(myObject)); + /** + * Creates a compiled template function that can interpolate data properties + * in "interpolate" delimiters, HTML-escape interpolated data properties in + * "escape" delimiters, and execute JavaScript in "evaluate" delimiters. Data + * properties may be accessed as free variables in the template. If a setting + * object is given, it takes precedence over `_.templateSettings` values. + * + * **Note:** In the development build `_.template` utilizes + * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl) + * for easier debugging. + * + * For more information on precompiling templates see + * [lodash's custom builds documentation](https://lodash.com/custom-builds). + * + * For more information on Chrome extension sandboxes see + * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval). + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category String + * @param {string} [string=''] The template string. + * @param {Object} [options={}] The options object. + * @param {RegExp} [options.escape=_.templateSettings.escape] + * The HTML "escape" delimiter. + * @param {RegExp} [options.evaluate=_.templateSettings.evaluate] + * The "evaluate" delimiter. + * @param {Object} [options.imports=_.templateSettings.imports] + * An object to import into the template as free variables. + * @param {RegExp} [options.interpolate=_.templateSettings.interpolate] + * The "interpolate" delimiter. + * @param {string} [options.sourceURL='lodash.templateSources[n]'] + * The sourceURL of the compiled template. + * @param {string} [options.variable='obj'] + * The data object variable name. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Function} Returns the compiled template function. + * @example + * + * // Use the "interpolate" delimiter to create a compiled template. + * var compiled = _.template('hello <%= user %>!'); + * compiled({ 'user': 'fred' }); + * // => 'hello fred!' + * + * // Use the HTML "escape" delimiter to escape data property values. + * var compiled = _.template('<%- value %>'); + * compiled({ 'value': ' + + + +
    +
    +

    traffico contains 164 glyphs:

    + Toggle Preview Characters +
    + + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + +
    +
    + PpPpPpPpPpPpPpPpPpPp +
    +
    + 12141618212436486072 +
    +
    + + +
    +
    + + + +
    + + diff --git a/vendor/assets/iD/iD/traffico/fonts/traffico_d596ae6150aa5c55ac14b1e060efc523.eot b/vendor/assets/iD/iD/traffico/fonts/traffico_d596ae6150aa5c55ac14b1e060efc523.eot new file mode 100644 index 000000000..d52dfc203 Binary files /dev/null and b/vendor/assets/iD/iD/traffico/fonts/traffico_d596ae6150aa5c55ac14b1e060efc523.eot differ diff --git a/vendor/assets/iD/iD/traffico/fonts/traffico_d596ae6150aa5c55ac14b1e060efc523.svg b/vendor/assets/iD/iD/traffico/fonts/traffico_d596ae6150aa5c55ac14b1e060efc523.svg new file mode 100644 index 000000000..834f334d5 --- /dev/null +++ b/vendor/assets/iD/iD/traffico/fonts/traffico_d596ae6150aa5c55ac14b1e060efc523.svg @@ -0,0 +1,1610 @@ + + + + + +Created by FontForge 20120731 at Mon Jan 25 11:17:45 2016 + By Travis CI User +Created by Travis CI User with FontForge 2.0 (http://fontforge.sf.net) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vendor/assets/iD/iD/traffico/fonts/traffico_d596ae6150aa5c55ac14b1e060efc523.ttf b/vendor/assets/iD/iD/traffico/fonts/traffico_d596ae6150aa5c55ac14b1e060efc523.ttf new file mode 100644 index 000000000..60b6f568d Binary files /dev/null and b/vendor/assets/iD/iD/traffico/fonts/traffico_d596ae6150aa5c55ac14b1e060efc523.ttf differ diff --git a/vendor/assets/iD/iD/traffico/fonts/traffico_d596ae6150aa5c55ac14b1e060efc523.woff b/vendor/assets/iD/iD/traffico/fonts/traffico_d596ae6150aa5c55ac14b1e060efc523.woff new file mode 100644 index 000000000..80ed017d3 Binary files /dev/null and b/vendor/assets/iD/iD/traffico/fonts/traffico_d596ae6150aa5c55ac14b1e060efc523.woff differ diff --git a/vendor/assets/iD/iD/traffico/global.json b/vendor/assets/iD/iD/traffico/global.json new file mode 100644 index 000000000..1882864fc --- /dev/null +++ b/vendor/assets/iD/iD/traffico/global.json @@ -0,0 +1 @@ +{"information_border_at":"ÖSTERREICH","level-crossing":"","priority-road-end":"","railway-crossing-unsecured":"","maximum-speed-limit_10":"10","maximum-speed-limit_20":"20","maximum-speed-limit_25":"25","maximum-speed-limit_30":"30","maximum-speed-limit_35":"35","maximum-speed-limit_50":"50","maximum-speed-limit_60":"60","maximum-speed-limit_70":"70","maximum-speed-limit_75":"75","maximum-speed-limit_80":"80","maximum-speed-limit_90":"90","maximum-speed-limit_100":"100","maximum-speed-limit_110":"110","maximum-speed-limit_120":"120","maximum-speed-limit_130":"130","yield":"YIELD","yield-to-oncoming-traffic":"GIVEWAY","no-bicycles":"","no-entry":"","no-heavy-goods-vehicles":"","no-left-turn":"","no-pedestrians":"","no-right-turn":"","no-u-turn":"","stop":"","added-lane-left":"","added-lane-right":"","bump-in-road":"","children":"","crossroads-ahead":"","curve-left-ahead":"","curve-right-ahead":"","cyclists-crossing":"","dip-in-road":"DIP","divided-highway-ahead":"","divided-highway-ends":"","domestic-animals":"","equestrians":"","falling-rocks-or-debris-left":"","farm-vehicles":"","hairpin-curve-left-ahead":"","hairpin-curve-right-ahead":"","horizontal-alignment-left":"","horizontal-alignment-right":"","koala":"","koala-crossing":"","narrow-bridge-ahead":"","pedestrian-crossing":"","pedestrian-crossing_v2":"","pedestrians-cyclists":"","railway-level-crossing-with-flashing-signals-ahead":"","curve-first-left-ahead":"","double-curve-first-right-ahead":"","double-curve-first-left-ahead":"","double-turn-first-left-ahead":"","double-turn-first-right-ahead":"","road-narrows-ahead":"","roundabout-ahead":"","junction-with-a-side-road-perpendicular-left-ahead":"","junction-with-a-side-road-perpendicular-right-ahead":"","slippery-road-surface":"","steep-hill-downwards":"","steep-hill-upwards":"","stop-ahead":"","traffic-signals-ahead":"","truck-crossing":"","turn-left":"","turn-right":"","two-way-traffic-ahead":"","uncontrolled-railroad-crossing-ahead":"","wild-animals":"","winding-road-first-left-ahead":"","winding-road-first-right-ahead":"","yield-ahead":"","emu-crossing":"","emu-crossing_v2":"","slippery-motorcycles":"","traffic-merges-left-ahead":"","traffic-merges-right-ahead":"","wombat-crossing":"","wombat-crossing_v2":"","information_border_be_nl":"België","information_border_be_fr":"Belgique","bicycles-only":"","proceed-straight":"","keep-left":"","keep-right":"","transit-only":"","parking":"","two-way-traffic":"","no-motor-vehicles":"","no-motorcycles":"","no-overtaking":"","no-parking":"","no-stopping":"","no-left-or-u-turn":"","no-straight-through":"","no_trucks":"","falling-rocks-or-debris-right":"","loose-road-surface":"","workers-in-road-ahead":"","school-zone":"","uneven-road":"","y-roads":"","warning--added-lane-left":"","double-reverse-curve":"","flaggers-in-road-ahead":"","loop-pretzel":"","pass-left-or-right":"","playground-ahead":"","road-narrows-left-ahead":"","road-narrows-right-ahead":"","junction-with-a-side-road-acute-left-ahead":"","t-roads":"","triple-reverse-curve":"","trucks-rollover":"","turn-curve-left":"","turn-curve-right":"","turn-right_v2":"","pass-on-either-side":"","crossroads-ahead_v2":"","curve-left-ahead_v2":"","curve-right-ahead_v2":"","emergency-vehicles":"","hairpin-curve-right-ahead_v2":"","level-railroad-crossing-with-barriers-ahead":"","opening-or-swing-bridge":"","pavement-ends":"","shared-road-motocycles-cyclists":"","junction-with-a-side-road-perpendicular-left-ahead_v2":"","junction-with-a-side-road-perpendicular-right-ahead_v2":"","stop-ahead_v2":"","traffic-merges-left-ahead_v2":"","traffic-merges-right-ahead_v2":"","tunnel-ahead":"","information_border_cz":"Českérepublika","falling-rocks":"","unprotected-quayside-or-riverbank":"","double-curve-first-left":"","double-curve-first-right":"","curve-left":"","curve-right":"","crossroads-with-priority-to-the-right":"","cyclists-crossing-ahead":"","cyclists-crossing-ahead_v2":"","other-danger":"","other-danger_v2":"","junction-with-a-side-road-perpendicular-left":"","junction-with-a-side-road-perpendicular-right":"","railway-crossing-secured":"","snow":"","low-flying-aircraft":"","strong-sidewind":"","road-bump":"","roadworks-ahead":"","roundabout":"","uneven-road-ahead":"","border":"Bundes-republikDeutschland","deadend":"","first-aid":"","limited-access-road":"","parking-left":"","parking-right":"","bus-stop":"","disabled-persons":"","pedestrian-crossing_v3":"","minimum-speed_10":"10","minimum-speed_20":"20","minimum-speed_25":"25","minimum-speed_30":"30","minimum-speed_35":"35","minimum-speed_50":"50","minimum-speed_60":"60","minimum-speed_70":"70","minimum-speed_75":"75","minimum-speed_80":"80","minimum-speed_90":"90","minimum-speed_100":"100","minimum-speed_110":"110","minimum-speed_120":"120","minimum-speed_130":"130","minimum-speed-end_10":"10","minimum-speed-end_20":"20","minimum-speed-end_25":"25","minimum-speed-end_30":"30","minimum-speed-end_35":"35","minimum-speed-end_50":"50","minimum-speed-end_60":"60","minimum-speed-end_70":"70","minimum-speed-end_75":"75","minimum-speed-end_80":"80","minimum-speed-end_90":"90","minimum-speed-end_100":"100","minimum-speed-end_110":"110","minimum-speed-end_120":"120","minimum-speed-end_130":"130","pedestrian-bicycle-dual-track":"","dual-path-pedestrians-and-cyclists":"","dual-path-cyclists-and-pedestrians":"","pedestrians-only":"","proceed-straight-or-turn-left":"","proceed-straight-or-turn-right":"","procced-straight":"","pass-on-this-side-left":"","pass-on-this-side-right":"","shared-path-pedestrians-and-cyclists":"","roundabout_v2":"","turn-left-ahead":"","turn-right-ahead":"","narrow-location-priority":"","narrow-location-no-priority":"","give-way":"","no-pedestrians-or-bicycles":"","no-mopeds":"","no-slow-vehicles":"","no-trailers":"","no-buses":"","no-trucks-and-buses":"","no-parking-or-stopping-left":"","no-parking-or-stopping-left-and-right":"","no-parking-or-stopping-right":"","no-parking-left":"","no-parking-left-and-right":"","no-parking-right":"","priority-road":"","give-way-to-oncoming-traffic":"","end-of-limits":"","low-emission-zone":"UmweltZONE","low-emission-zone-end":"UmweltZONE","no-moped-vehicles":"","no-stopping-or-parking":"","no-traffic-both-ways":"","no-vehicles-carrying-dangerous-goods":"","no-overtaking-by-heavy-goods-vehicles":"","destination":"Anliegerfrei","disabled":"","glaze":"","left-pointing":"","both-directions":"","pedestrians-use-opposite-sidewalk":"","pedestrians-use-opposite-sidewalk_v2":"","railway-only":"","right-pointing":"","entry":"","priority-road-bends-left-3way":"","priority-road-bends-left-3way_v2":"","priority-road-bends-left-4way":"","priority-road-bends-right-3way":"","priority-road-bends-right-3way_v2":"","priority-road-bends-right-4way":"","priority-road-from-left-3way":"","priority-road-from-left-4way":"","priority-road-from-right-3way":"","priority-road-from-right-4way":"","danger_level_crossing":"","information_border_dk":"Danmark","information_border_ee":"EESTI","information_border_es":"ESPAÑA","information_border_fi":"SUOMIFINLANDSUOPMA","information_border_fr":"FRANCE","information_city_entrance":"some city","information_city_exit":"some city","information_border_gr":"EΛΛAΣGREECE","information_border_hu":"Magyarország","information_border_it":"ITALIA","information_border_lt":"LietuvosRespublika","information_border_lu_fr":"Luxembourg","information_border_lu_de":"Luxemburg","information_border_lv":"LATVIJA","information_border_nl":"Nederland","information_cycleway":"fietspad","information_border_pl":"RzeczpospolitaPolska","information_border_se":"SVERIGE","information_border_si":"SLOVENIA","information_border_sk":"SLOVENSKO","danger_contraflow":"","mandatory_roundabout":"","prohibitory_overtaking":"","added-lane-from-entering-roadway":"","slippery-bicycles":"","tram-crossing":"","loop-270-degrees":"","motorcycle-crossing":"","offset-roads":"","uncontroller-railroad-crossing-ahead":"","junction-with-a-side-road-acute-right-ahead":"","horizontal-traffic-signals-ahead":"","dead-end":"","no-hitch-hiking":"","share-roads":"","end":"","skewed-railroad-crossing":"","lightground-railroad-crossing":"","national-network-lane":"","national-network-prohibited":"","hazardous-material-prohibited":"","truck-rollover-with-speed":"","no-rollerblading":"","one-way-left":"ONEWAY","one-way-right":"ONEWAY","one-way-left_v2":"ONEWAY","one-way-right_v2":"ONEWAY","single-reverse-curve":"","school":"","school_v2":"","turn-curve-left-with-speed":"","turn-curve-right-with-speed":"","merging-traffic":""} \ No newline at end of file diff --git a/vendor/assets/iD/iD/traffico/glyphs.json b/vendor/assets/iD/iD/traffico/glyphs.json new file mode 100644 index 000000000..3f5d800da --- /dev/null +++ b/vendor/assets/iD/iD/traffico/glyphs.json @@ -0,0 +1,169 @@ +{ + "name": "traffico", + "glyphs": { + "DE-arrow-up":"\uf100", + "US-arrow-oneway":"\uf101", + "US-arrow-up":"\uf102", + "added-lane":"\uf103", + "added-lane-entering-roadway":"\uf104", + "airplane":"\uf105", + "arrow-l":"\uf106", + "arrow-oneway":"\uf107", + "arrow-s-l":"\uf108", + "arrows_both_bra":"\uf109", + "bending-priority":"\uf10a", + "bicycle":"\uf10b", + "bicycle-slippery":"\uf10c", + "bump":"\uf10d", + "bump_bra":"\uf10e", + "bump_road_bra":"\uf10f", + "bumps":"\uf110", + "bus":"\uf111", + "car":"\uf112", + "children":"\uf113", + "children-au":"\uf114", + "circle-bar-rounded":"\uf115", + "circle-bg":"\uf116", + "circle-o":"\uf117", + "circle-separator":"\uf118", + "cliff":"\uf119", + "cross-roads":"\uf11a", + "crossroads-ahead":"\uf11b", + "crossroads-ahead-ontario":"\uf11c", + "curve-r-l":"\uf11d", + "cyclists_crossing_bra":"\uf11e", + "d-curve-l":"\uf11f", + "dead-end":"\uf120", + "descent":"\uf121", + "disabled-p":"\uf122", + "divided-highway":"\uf123", + "domestic-animal":"\uf124", + "domestic-animals-au":"\uf125", + "emu":"\uf126", + "end":"\uf127", + "equestrian":"\uf128", + "europe_stars":"\uf129", + "exclamation":"\uf12a", + "falling-rocks-EU":"\uf12b", + "falling-rocks-US":"\uf12c", + "falling-rocks-au":"\uf12d", + "fire-station":"\uf12e", + "firemans-car":"\uf12f", + "flaggers":"\uf130", + "footpath":"\uf131", + "h":"\uf132", + "h-align-l":"\uf133", + "hairpin-curve":"\uf134", + "hairpin-curve-au":"\uf135", + "hazardous-material":"\uf136", + "height":"\uf137", + "height-restriction-ca":"\uf138", + "highway-divided":"\uf139", + "hitch-hiking":"\uf13a", + "kangaroo":"\uf13b", + "koala-ugly":"\uf13c", + "koalas":"\uf13d", + "level-crossing":"\uf13e", + "light-rail":"\uf13f", + "lightground-railroad-crossing":"\uf140", + "loop-270":"\uf141", + "loose_road_surface_bra":"\uf142", + "lorry":"\uf143", + "lorry-left":"\uf144", + "low-clearance":"\uf145", + "merge":"\uf146", + "metric-clearance":"\uf147", + "moped":"\uf148", + "motorbike":"\uf149", + "narrow-bridge-au":"\uf14a", + "narrow-bridge-us":"\uf14b", + "narrow-road-both":"\uf14c", + "narrow-road-l":"\uf14d", + "no-l-or-u-turn":"\uf14e", + "octagon":"\uf14f", + "offset-roads":"\uf150", + "opening-swing-bridge-ca":"\uf151", + "parking":"\uf152", + "pass-either-us":"\uf153", + "pass-l-r":"\uf154", + "pavement-ends":"\uf155", + "pedestrian":"\uf156", + "pedestrian-crossing":"\uf157", + "pedestrian-crossing-au":"\uf158", + "pedestrian_bra":"\uf159", + "pedestrian_crossing_bra":"\uf15a", + "pedestrians":"\uf15b", + "play-ground":"\uf15c", + "playground-ahead-ca":"\uf15d", + "playground-br":"\uf15e", + "pretzel-loop":"\uf15f", + "railroad":"\uf160", + "railroad-barriers":"\uf161", + "railway-flashing-au":"\uf162", + "railway-xing-secured":"\uf163", + "railway-xing-unsecured":"\uf164", + "reverse-curve-au":"\uf165", + "reverse-curve-ontario":"\uf166", + "right-of-way":"\uf167", + "right-of-way-l":"\uf168", + "roadworks":"\uf169", + "roadworks_bra":"\uf16a", + "rollerblading":"\uf16b", + "roundabout":"\uf16c", + "school":"\uf16d", + "school_zone_bra":"\uf16e", + "series-of-curves-left":"\uf16f", + "share-road":"\uf170", + "share-roads":"\uf171", + "side-road-a-a-l":"\uf172", + "side-road-a-a-r":"\uf173", + "side-road-p-l":"\uf174", + "side-road-p-r":"\uf175", + "side-road-perpendicular":"\uf176", + "single-2-reverse-curve":"\uf177", + "skewed-railroads":"\uf178", + "slippery":"\uf179", + "slippery-motorcycle":"\uf17a", + "slippery-road":"\uf17b", + "small-arrow-au":"\uf17c", + "snowflake":"\uf17d", + "square-angular":"\uf17e", + "square-diagonal-bar":"\uf17f", + "square-rounded":"\uf180", + "steep-hill":"\uf181", + "steep-hill-downwards":"\uf182", + "steep-hill-upwards":"\uf183", + "stop":"\uf184", + "t-roads":"\uf185", + "tractor":"\uf186", + "traffic-signal-au":"\uf187", + "trailer":"\uf188", + "train-au":"\uf189", + "train-electric":"\uf18a", + "tram":"\uf18b", + "transit_bra":"\uf18c", + "tri-angular":"\uf18d", + "tri-rounded":"\uf18e", + "truck":"\uf18f", + "truck-rollover-speed":"\uf190", + "trucks-rollover":"\uf191", + "tunnel":"\uf192", + "turn-90-l":"\uf193", + "turn-curve-speed":"\uf194", + "turn-l":"\uf195", + "turn-l-aus":"\uf196", + "turn-l-curve":"\uf197", + "turn-reverse-left":"\uf198", + "turn-right-curve-ontario":"\uf199", + "turnaround":"\uf19a", + "turnaround2":"\uf19b", + "two_way_arrows_bra":"\uf19c", + "u-turn":"\uf19d", + "u-turn-au":"\uf19e", + "wild-animal":"\uf19f", + "windbag":"\uf1a0", + "winding-road-left":"\uf1a1", + "wombat":"\uf1a2", + "y-roads":"\uf1a3" + } +} diff --git a/vendor/assets/iD/iD/traffico/mapillary-mappings/au.json b/vendor/assets/iD/iD/traffico/mapillary-mappings/au.json new file mode 100644 index 000000000..1bc46f47c --- /dev/null +++ b/vendor/assets/iD/iD/traffico/mapillary-mappings/au.json @@ -0,0 +1 @@ +{"prohibitory_speed_limit_10":"prohibitory--maximum-speed-limit-10--au","prohibitory_speed_limit_100":"prohibitory--maximum-speed-limit-100--au","prohibitory_speed_limit_110":"prohibitory--maximum-speed-limit-110--au","prohibitory_speed_limit_120":"prohibitory--maximum-speed-limit-120--au","prohibitory_speed_limit_130":"prohibitory--maximum-speed-limit-130--au","prohibitory_speed_limit_20":"prohibitory--maximum-speed-limit-20--au","prohibitory_speed_limit_30":"prohibitory--maximum-speed-limit-30--au","prohibitory_speed_limit_40":"prohibitory--maximum-speed-limit-40--au","prohibitory_speed_limit_50":"prohibitory--maximum-speed-limit-50--au","prohibitory_speed_limit_60":"prohibitory--maximum-speed-limit-60--au","prohibitory_speed_limit_70":"prohibitory--maximum-speed-limit-70--au","prohibitory_speed_limit_80":"prohibitory--maximum-speed-limit-80--au","prohibitory_speed_limit_90":"prohibitory--maximum-speed-limit-90--au","regulatory--give_way--c-australia":"regulatory--yield--au","regulatory--no_bicycles--c-australia":"regulatory--no-bicycles--au","regulatory--no_entry--c-australia":"regulatory--no-entry--au","regulatory--no_heavy_goods_vehicles--c-australia":"regulatory--no-heavy-goods-vehicles--au","regulatory--no_left_turn--c-australia":"regulatory--no-left-turn--au","regulatory--no_pedestrians--c-australia":"regulatory--no-pedestrians--au","regulatory--no_right_turn--c-australia":"regulatory--no-right-turn--au","regulatory--no_u_turn--c-australia":"regulatory--no-u-turn--au","regulatory--stop--c-australia":"regulatory--stop--au","regulatory--yield_to_oncoming_traffic--c-australia":"regulatory--yield-to-oncoming-traffic--au","warning--added_lane_left--c-australia":"warning--added-lane-left--au","warning--added_lane_right--c-australia":"warning--added-lane-right--au","warning--bump_in_road--c-australia":"warning--bump-in-road--au","warning--children--c-australia":"warning--children--au","warning--crossroads_ahead--c-australia":"warning--crossroads-ahead--au","warning--curve_left--c-australia":"warning--curve-left-ahead--au","warning--curve_right--c-australia":"warning--curve-right-ahead--au","warning--cyclists_crossing--c-australia":"warning--cyclists-crossing--au","warning--dip_in_road--c-australia":"warning--dip-in-road--au","warning--divided_highway_ahead--c-australia":"warning--divided-highway-ahead--au","warning--divided_highway_ends--c-australia":"warning--divided-highway-ends--au","warning--domestic_animals--c-australia":"warning--domestic-animals--au","warning--equestrians--c-australia":"warning--equestrians--au","warning--falling_rocks_or_debris_left--c-australia":"warning--falling-rocks-or-debris-left--au","warning--farm_vehicles--c-australia":"warning--farm-vehicles--au","warning--hairpin_curve_left--c-australia":"warning--hairpin-curve-left-ahead--au","warning--hairpin_curve_right--c-australia":"warning--hairpin-curve-right-ahead--au","warning--horizontal_alignment_left":"warning--horizontal-alignment-left--au","warning--horizontal_alignment_right":"warning--horizontal-alignment-right--au","warning--koala--c-australia":"warning--koala--au","warning--koala_crossing--c-australia":"warning--koala-crossing--au","warning--narrow_bridge_ahead--c-australia":"warning--narrow-bridge-ahead--au","warning--pedestrian_crossing--c-australia":"warning--pedestrian-crossing--au","warning--pedestrian_crossing__retired--c-australia":"warning--pedestrian-crossing--au--retired","warning--pedestrians_cyclists--c-australia":"warning--pedestrians-cyclists--au","warning--railway_level_crossing_with_flashing_signals_ahead--c-australia":"warning--railway-level-crossing-with-flashing-signals-ahead--au","warning--reverse_curve_first_left--c-australia":"warning--double-curve-first-left-ahead--au","warning--reverse_curve_first_right--c-australia":"warning--double-curve-first-right-ahead--au","warning--reverse_turn_first_left--c-australia":"warning--double-turn-first-left-ahead--au","warning--reverse_turn_first_right--c-australia":"warning--double-turn-first-right-ahead--au","warning--road_narrows_both_sides--c-australia":"warning--road-narrows-ahead--au","warning--roundabout_ahead--c-australia":"warning--roundabout-ahead--au","warning--side_road_perpendicular_left":"warning--junction-with-a-side-road-perpendicular-left-ahead--au","warning--side_road_perpendicular_right":"warning--junction-with-a-side-road-perpendicular-right-ahead--au","warning--slippery_road_surface--c-australia":"warning--slippery-road-surface--au","warning--steep_hill_downwards--c-australia":"warning--steep-hill-downwards--au","warning--steep_hill_upwards--c-australia":"warning--steep-hill-upwards--au","warning--stop_ahead--c-australia":"warning--stop-ahead--au","warning--traffic_signals_ahead--c-australia":"warning--traffic-signals-ahead--au","warning--truck_crossing--c-australia":"warning--truck-crossing--au","warning--turn_left--c-australia":"warning--turn-left--au","warning--turn_right--c-australia":"warning--turn-right--au","warning--two_way_traffic_ahead--c-australia":"warning--two-way-traffic-ahead--au","warning--uncontrolled_railroad_crossing_ahead--c-australia":"warning--uncontrolled-railroad-crossing-ahead--au","warning--wild_animals--c-australia":"warning--wild-animals--au","warning--winding_road_left--c-australia":"warning--winding-road-first-left-ahead--au","warning--yield_ahead--c-australia":"warning--yield-ahead--au"} \ No newline at end of file diff --git a/vendor/assets/iD/iD/traffico/mapillary-mappings/br.json b/vendor/assets/iD/iD/traffico/mapillary-mappings/br.json new file mode 100644 index 000000000..dfbff0044 --- /dev/null +++ b/vendor/assets/iD/iD/traffico/mapillary-mappings/br.json @@ -0,0 +1 @@ +{"mandatory--bicycles_only--c-brazil":"mandatory--bicycles-only--br","mandatory--keep_right_or_left--c-brazil":"mandatory--keep-right--br","mandatory--proceed_straight_no_turns--c-brazil":"mandatory--proceed-straight--br","mandatory--transit_only--c-brazil":"mandatory--transit-only--br","mandatory--turn_right--c-brazil":"mandatory--turn-right--br","other--parking_zone--c-brazil":"information--parking--br","other--two-way_traffic--c-brazil":"information--two-way-traffic--br","prohibitory_speed_limit_10":"prohibitory--maximum-speed-limit-10--br","prohibitory_speed_limit_100":"prohibitory--maximum-speed-limit-100--br","prohibitory_speed_limit_110":"prohibitory--maximum-speed-limit-110--br","prohibitory_speed_limit_120":"prohibitory--maximum-speed-limit-120--br","prohibitory_speed_limit_130":"prohibitory--maximum-speed-limit-130--br","prohibitory_speed_limit_20":"prohibitory--maximum-speed-limit-20--br","prohibitory_speed_limit_30":"prohibitory--maximum-speed-limit-30--br","prohibitory_speed_limit_40":"prohibitory--maximum-speed-limit-40--br","prohibitory_speed_limit_50":"prohibitory--maximum-speed-limit-50--br","prohibitory_speed_limit_60":"prohibitory--maximum-speed-limit-60--br","prohibitory_speed_limit_70":"prohibitory--maximum-speed-limit-70--br","prohibitory_speed_limit_80":"prohibitory--maximum-speed-limit-80--br","prohibitory_speed_limit_90":"prohibitory--maximum-speed-limit-90--br","regulatory--give_way--c-brazil":"regulatory--yield--br","regulatory--no_bicycles--c-brazil":"regulatory--no-bicycles--br","regulatory--no_entry--c-brazil":"regulatory--no-entry--br","regulatory--no_heavy_goods_vehicles--c-brazil":"regulatory--no-heavy-goods-vehicles--br","regulatory--no_motor_vehicles--c-brazil":"regulatory--no-motor-vehicles--br","regulatory--no_motorcycles--c-brazil":"regulatory--no-motorcycles--br","regulatory--no_overtaking--c-brazil":"regulatory--no-overtaking--br","regulatory--no_parking--c-brazil":"regulatory--no-parking--br","regulatory--no_pedestrians--c-brazil":"regulatory--no-pedestrians--br","regulatory--no_stopping--c-brazil":"regulatory--no-stopping--br","regulatory--stop--c-brazil":"regulatory--stop--br","regulatory_national_network_lane":"regulatory--national-network-lane--br","regulatory_no_left_or_u_turn":"regulatory--no-left-or-u-turn--br","regulatory_no_left_turn":"regulatory--no-left-turn--br","regulatory_no_parking":"regulatory--no-parking--br--v1","regulatory_no_pedestrian_crossing":"regulatory--no-pedestrians--br","regulatory_no_rollerblading":"regulatory--no-rollerblading--br","regulatory_no_straight_through":"regulatory--no-straight-through--br","regulatory_no_trucks":"regulatory--no-heavy-goods-vehicles--br--v1","regulatory_no_turn_right":"regulatory--no-right-turn--br","regulatory_no_u_turn":"regulatory--no-u-turn--br","regulatory_stop":"regulatory--stop--br","school_school":"school--school--br","school_school_obsolete":"school--school-obsolete--br","warning--bump_in_road--c-brazil":"warning--bump-in-road--br","warning--cyclists_crossing--c-brazil":"warning--cyclists-crossing--br","warning--domestic_animals--c-brazil":"warning--domestic-animals--br","warning--falling_rocks_or_debris--c-brazil":"warning--falling-rocks-or-debris-right--br","warning--farm_vehicles--c-brazil":"warning--farm-vehicles--br","warning--loose_road_surface--c-brazil":"warning--loose-road-surface--br","warning--pedestrian_crossing--c-brazil":"warning--pedestrian-crossing--br","warning--road_narrows_ahead--c-brazil":"warning--road-narrows-ahead--br","warning--roadworks--c-brazil":"warning--workers-in-road-ahead--br","warning--school_zone--c-brazil":"warning--school-zone--br","warning--slippery_road_surface--c-brazil":"warning--slippery-road-surface--br","warning--stop_ahead--c-brazil":"warning--stop-ahead--br","warning--two-way_traffic_ahead--c-brazil":"warning--two-way-traffic-ahead--br","warning--uneven_road--c-brazil":"warning--uneven-road--br","warning--wild_animals--c-brazil":"warning--wild-animals--br","warning_Y_roads":"warning--y-roads--br","warning_added_lanes":"warning--added-lane-right--br","warning_bicycles":"warning--cyclists-crossing--br","warning_cross_roads":"warning--crossroads-ahead--br","warning_curve_reverse_left":"warning--double-curve-first-left-ahead--br","warning_curve_reverse_right":"warning--double-curve-first-right-ahead--br","warning_double_reverse_curve":"warning--double-reverse-curve--br","warning_flaggers_in_road_ahead":"warning--flaggers-in-road-ahead--br","warning_highway_divided":"warning--divided-highway-ahead--br","warning_horizontal_alignment_right":"warning--horizontal-alignment-right--br","warning_intersection_circular":"warning--roundabout-ahead--br","warning_loop_pretzel":"warning--loop-pretzel--br","warning_low_clearance":"warning--height-restriction-ahead--br--feet","warning_merge":"warning--traffic-merges-right-ahead--br","warning_pass_left_or_right":"warning--pass-left-or-right--br","warning_pedestrian_crossing":"warning--pedestrian-crossing--br","warning_play_ground":"warning--playground-ahead--br","warning_road_narrows_both_sides":"warning--road-narrows-ahead--br","warning_road_narrows_left":"warning--road-narrows-left-ahead--br","warning_road_narrows_right":"warning--road-narrows-right-ahead--br","warning_side_road_acute_angle_left":"warning--junction-with-a-side-road-acute-left-ahead--br","warning_side_road_perpendicular_left":"warning--junction-with-a-side-road-perpendicular-left-ahead--br","warning_side_road_perpendicular_right":"warning--junction-with-a-side-road-perpendicular-right-ahead--br","warning_slippery":"warning--slippery-road-surface--br","warning_t_roads":"warning--t-roads--br","warning_traffic_light":"warning--traffic-signals-ahead--br","warning_triple_2_reverse_curve":"warning--triple-reverse-curve--br","warning_trucks_rollover":"warning--trucks-rollover--br","warning_turn_curve_left":"warning--turn-curve-left--br","warning_turn_curve_right":"warning--turn-curve-right--br","warning_turn_left":"warning--turn-left--br","warning_turn_reverse_left":"warning--double-turn-first-left-ahead--br","warning_turn_reverse_right":"warning--double-turn-first-right-ahead--br","warning_turn_right":"warning--turn-right--br","warning_winding_road":"warning--winding-road-first-right-ahead--br","warning_winding_road_left":"warning--winding-road-first-left-ahead--br","warning_winding_road_right":"warning--winding-road-first-right-ahead--br","warning_workers_in_road_ahead":"warning--workers-in-road-ahead--br"} \ No newline at end of file diff --git a/vendor/assets/iD/iD/traffico/mapillary-mappings/ca.json b/vendor/assets/iD/iD/traffico/mapillary-mappings/ca.json new file mode 100644 index 000000000..368e03391 --- /dev/null +++ b/vendor/assets/iD/iD/traffico/mapillary-mappings/ca.json @@ -0,0 +1 @@ +{"mandatory--pass_either_side--c-canada":"mandatory--pass-on-either-side--ca","regulatory--no_bicycles--c-canada":"regulatory--no-bicycles--ca","regulatory--no_entry--c-canada":"regulatory--no-entry--ca","regulatory--no_heavy_goods_vehicles--c-canada":"regulatory--no-heavy-goods-vehicles--ca","regulatory--no_left_turn--c-canada":"regulatory--no-left-turn--ca","regulatory--no_motor_vehicles--c-canada":"regulatory--no-motor-vehicles--ca","regulatory--no_motorcycles--c-canada":"regulatory--no-motorcycles--ca","regulatory--no_overtaking--c-canada":"regulatory--no-overtaking--ca","regulatory--no_parking--c-canada":"regulatory--no-parking--ca","regulatory--no_pedestrians--c-canada":"regulatory--no-pedestrians--ca","regulatory--no_right_turn--c-canada":"regulatory--no-right-turn--ca","regulatory--no_stopping--c-canada":"regulatory--no-stopping--ca","regulatory--no_u_turn--c-canada":"regulatory--no-u-turn--ca","regulatory--speed_limit_10--c-canada":"regulatory--maximum-speed-limit-10--ca","regulatory--speed_limit_100--c-canada":"regulatory--maximum-speed-limit-100--ca","regulatory--speed_limit_110--c-canada":"regulatory--maximum-speed-limit-110--ca","regulatory--speed_limit_120--c-canada":"regulatory--maximum-speed-limit-120--ca","regulatory--speed_limit_15--c-canada":"regulatory--maximum-speed-limit-15--ca","regulatory--speed_limit_20--c-canada":"regulatory--maximum-speed-limit-20--ca","regulatory--speed_limit_25--c-canada":"regulatory--maximum-speed-limit-25--ca","regulatory--speed_limit_30--c-canada":"regulatory--maximum-speed-limit-30--ca","regulatory--speed_limit_35--c-canada":"regulatory--maximum-speed-limit-35--ca","regulatory--speed_limit_40--c-canada":"regulatory--maximum-speed-limit-40--ca","regulatory--speed_limit_45--c-canada":"regulatory--maximum-speed-limit-45--ca","regulatory--speed_limit_5--c-canada":"regulatory--maximum-speed-limit-5--ca","regulatory--speed_limit_50--c-canada":"regulatory--maximum-speed-limit-50--ca","regulatory--speed_limit_55--c-canada":"regulatory--maximum-speed-limit-55--ca","regulatory--speed_limit_60--c-canada":"regulatory--maximum-speed-limit-60--ca","regulatory--speed_limit_65--c-canada":"regulatory--maximum-speed-limit-65--ca","regulatory--speed_limit_70--c-canada":"regulatory--maximum-speed-limit-70--ca","regulatory--speed_limit_75--c-canada":"regulatory--maximum-speed-limit-75--ca","regulatory--speed_limit_80--c-canada":"regulatory--maximum-speed-limit-80--ca","regulatory--speed_limit_85--c-canada":"regulatory--maximum-speed-limit-85--ca","regulatory--speed_limit_90--c-canada":"regulatory--maximum-speed-limit-90--ca","regulatory--stop--c-canada":"regulatory--stop--ca","warning--bump_in_road--c-canada":"warning--bump-in-road--ca","warning--crossroads_ahead--c-canada":"warning--crossroads-ahead--ca","warning--crossroads_ahead--c-canada_ontario":"warning--crossroads-ahead--ca--ontario","warning--curve_left--c-canada":"warning--curve-left-ahead--ca","warning--curve_left--c-canada_ontario":"warning--curve-left-ahead--ca--ontario","warning--curve_reverse_left--c-canada_ontario":"warning--double-curve-first-left-ahead--ca--ontario","warning--curve_reverse_right--c-canada_ontario":"warning--double-curve-first-right-ahead--ca--ontario","warning--curve_right--c-canada":"warning--curve-right-ahead--ca","warning--curve_right--c-canada_ontario":"warning--curve-right-ahead--ca--ontario","warning--cyclists_crossing--c-canada":"warning--cyclists-crossing--ca","warning--dip_in_road--c-canada":"warning--dip-in-road--ca","warning--divided_highway_ahead--c-canada":"warning--divided-highway-ahead--ca","warning--divided_highway_ends--c-canada":"warning--divided-highway-ends--ca","warning--domestic_animals--c-canada":"warning--domestic-animals--ca","warning--emergency_vehicles--c-canada":"warning--emergency-vehicles--ca","warning--equestrians--c-canada":"warning--equestrians--ca","warning--falling_rocks--c-canada":"warning--falling-rocks-or-debris-right--ca","warning--farm_vehicles--c-canada":"warning--farm-vehicles--ca","warning--hairpin_curve_right_ahead--c-canada":"warning--hairpin-curve-right-ahead--ca","warning--hairpin_curve_right_ahead--c-canada_ontario":"warning--hairpin-curve-right-ahead--ca--ontario","warning--level_railroad_crossing_with_barriers_ahead--c-canada":"warning--level-railroad-crossing-with-barriers-ahead--ca","warning--loose_road_surface--c-canada":"warning--loose-road-surface--ca","warning--low_clearance--c-canada":"warning--height-restriction-ahead--ca--feet","warning--metric_clearance--c-canada":"warning--height-restriction-ahead--ca--meters","warning--narrow_bridge_ahead--c-canada":"warning--narrow-bridge-ahead--ca","warning--opening_or_swing_bridge--c-canada":"warning--opening-or-swing-bridge--ca","warning--pavement_ends--c-canada":"warning--pavement-ends--ca","warning--pedestrian_crossing--c-canada":"warning--pedestrian-crossing--ca","warning--pedestrian_crossing--c-canada_quebec":"warning--pedestrian-crossing--ca--quebec","warning--play_ground--c-canada":"warning--playground-ahead--ca","warning--road_narrows_both_sides--c-canada":"warning--road-narrows-ahead--ca","warning--road_narrows_left--c-canada":"warning--road-narrows-left-ahead--ca","warning--road_narrows_right--c-canada":"warning--road-narrows-right-ahead--ca","warning--roundabout_ahead--c-canada":"warning--roundabout-ahead--ca","warning--shared_road_motocycles_cyclists--c-canada":"warning--shared-road-motocycles-cyclists--ca","warning--side_road_perpendicular_left--c-canada":"warning--junction-with-a-side-road-perpendicular-left-ahead--ca","warning--side_road_perpendicular_left--c-canada_ontario":"warning--junction-with-a-side-road-perpendicular-left-ahead--ca--ontario","warning--side_road_perpendicular_right--c-canada":"warning--junction-with-a-side-road-perpendicular-right-ahead--ca","warning--side_road_perpendicular_right--c-canada_ontario":"warning--junction-with-a-side-road-perpendicular-right-ahead--ca--ontario","warning--slippery_road_surface--c-canada":"warning--slippery-road-surface--ca","warning--steep_hill_downwards--c-canada":"warning--steep-hill-downwards--ca","warning--steep_hill_upwards--c-canada":"warning--steep-hill-upwards--ca","warning--stop_ahead--c-canada":"warning--stop-ahead--ca","warning--stop_ahead--c-canada_ontario":"warning--stop-ahead--ca--ontario","warning--traffic_merges_left_ahead--c-canada":"warning--traffic-merges-left-ahead--ca","warning--traffic_merges_left_ahead--c-canada_ontario":"warning--traffic-merges-left-ahead--ca--ontario","warning--traffic_merges_right_ahead--c-canada":"warning--traffic-merges-right-ahead--ca","warning--traffic_merges_right_ahead--c-canada_ontario":"warning--traffic-merges-right-ahead--ca--ontario","warning--traffic_signals_ahead--c-canada":"warning--traffic-signals-ahead--ca","warning--tunnel_ahead--c-canada":"warning--tunnel-ahead--ca","warning--turn_left--c-canada":"warning--turn-left--ca","warning--turn_reverse_left--c-canada":"warning--double-turn-first-left-ahead--ca","warning--turn_reverse_right--c-canada":"warning--double-turn-first-right-ahead--ca","warning--turn_right--c-canada":"warning--turn-right--ca","warning--two_way_traffic_ahead--c-canada":"warning--two-way-traffic-ahead--ca","warning--uncontrolled_railroad_crossing_ahead--c-canada":"warning--uncontrolled-railroad-crossing-ahead--ca","warning--uneven_road--c-canada":"warning--uneven-road--ca","warning--wild_animals--c-canada":"warning--wild-animals--ca","warning--winding_road_left--c-canada":"warning--winding-road-first-left-ahead--ca","warning--winding_road_right--c-canada":"warning--winding-road-first-right-ahead--ca","warning--workers_in_road_ahead--c-canada":"warning--workers-in-road-ahead--ca","warning--yield_ahead--c-canada":"warning--yield-ahead--ca"} \ No newline at end of file diff --git a/vendor/assets/iD/iD/traffico/mapillary-mappings/eu.json b/vendor/assets/iD/iD/traffico/mapillary-mappings/eu.json new file mode 100644 index 000000000..32899aba3 --- /dev/null +++ b/vendor/assets/iD/iD/traffico/mapillary-mappings/eu.json @@ -0,0 +1 @@ +{"danger--cycle_crossing--c-finland":"danger--cyclists-crossing-ahead--fi","danger--cycle_crossing--c-italy":"danger--cyclists-crossing-ahead--it","danger--cycle_crossing--c-sweden":"danger--cyclists-crossing-ahead--se","danger--pedestrian_crossing--c-poland":"danger--pedestrian-crossing--pl","danger--pedestrian_crossing--c-spain":"danger--pedestrian-crossing--es","danger--pedestrian_crossing--c-sweden":"danger--pedestrian-crossing--se","danger--quayside_or_ferry_berth--c-germany":"danger--unprotected-quayside-or-riverbank--de","danger--school_crossing--c-england":"danger--children--uk","danger--school_crossing--c-italy":"danger--children--it","danger--school_crossing--c-sweden":"danger--children--se","danger_animals":"danger--wild-animals--de","danger_bend_first_left":"danger--double-curve-first-left--de","danger_bend_first_right":"danger--double-curve-first-right--de","danger_bend_left":"danger--curve-left--de","danger_bend_right":"danger--curve-right--de","danger_construction":"danger--roadworks-ahead--de","danger_crossroads_with_priority_to_the_right":"danger--crossroads-with-priority-to-the-right--de","danger_cycle_crossing":"danger--cyclists-crossing-ahead--de","danger_danger":"danger--other-danger--de","danger_intersection":"danger--crossroads-ahead--de","danger_next_intersection_left":"danger--junction-with-a-side-road-perpendicular-left--de","danger_next_intersection_right":"danger--junction-with-a-side-road-perpendicular-right--de","danger_pedestrian_crossing":"danger--pedestrian-crossing--de","danger_road_bump":"danger--road-bump--de","danger_road_narrows":"danger--road-narrows-ahead--de","danger_road_narrows_left":"danger--road-narrows-left-ahead--de","danger_road_narrows_right":"danger--road-narrows-right-ahead--de","danger_road_works":"danger--roadworks-ahead--de","danger_roundabout_ahead":"danger--roundabout-ahead--de","danger_school_crossing":"danger--children--de","danger_slippery_road":"danger--slippery-road-surface--de","danger_traffic_signal":"danger--traffic-signals-ahead--de","danger_two_way_traffic_ahead":"danger--two-way-traffic-ahead--de","danger_uneven_road":"danger--uneven-road-ahead--de","information--bus_stop--c-germany":"information--bus-stop--de","information_disable_persons":"information--disabled-persons--de","information_parking":"information--parking--de","information_pedestrian_crossing":"information--pedestrian-crossing--de","mandatory--footpath--c-greece":"mandatory--pedestrians-only--gr","mandatory--footpath--c-italy":"mandatory--pedestrians-only--it","mandatory--turn_right--c-italy":"mandatory--turn-right-ahead--it","mandatory_cycle_pedestrian_dual_track":"mandatory--dual-path-pedestrians-and-cyclists--de","mandatory_cycle_track":"mandatory--bicycles-only--de","mandatory_footpath":"mandatory--pedestrians-only--de","mandatory_go_left":"mandatory--turn-left--de","mandatory_go_left_or_right":"mandatory--pass-on-either-side--de","mandatory_go_left_or_straight":"mandatory--proceed-straight-or-turn-left--de","mandatory_go_right":"mandatory--turn-right--de","mandatory_go_right_or_straight":"mandatory--proceed-straight-or-turn-right--de","mandatory_go_straight":"mandatory--proceed-straight--de","mandatory_keep_left":"mandatory--pass-on-this-side-left--de","mandatory_keep_right":"mandatory--pass-on-this-side-right--de","mandatory_pedestrian_cycle_dual_track":"mandatory--dual-path-cyclists-and-pedestrians--de","mandatory_pedestrian_cycle_track":"mandatory--shared-path-pedestrians-and-cyclists--de","mandatory_roundabout":"mandatory--roundabout--de","mandatory_turn_left":"mandatory--turn-left-ahead--de","mandatory_turn_right":"mandatory--turn-right-ahead--de","other_give_way":"priority--give-way--de","other_no_entry":"prohibitory--no-entry--de","other_priority_road":"priority--priority-road--de","priority--give_way_to_oncoming_vehicles--c-sweden":"priority--give-way-to-oncoming-traffic--se","priority_give_way_to_oncoming_vehicles":"priority--give-way-to-oncoming-traffic--de","priority_stop":"priority--stop--de","prohibitory--no_cycles--c-sweden":"prohibitory--no-bicycles--se","prohibitory--no_overtaking--c-russia":"prohibitory--no-overtaking--ru","prohibitory--no_pedestrian--c-sweden":"prohibitory--no-pedestrians--se","prohibitory_no_motor_vehicles":"prohibitory--no-motor-vehicles--de","prohibitory_no_motorcycles":"prohibitory--no-motorcycles--de","prohibitory_no_parking":"prohibitory--no-parking--de","prohibitory_no_parking_or_stopping":"prohibitory--no-stopping-or-parking--de","prohibitory_no_traffic_both_ways":"prohibitory--no-traffic-both-ways--de","prohibitory_no_trucks":"prohibitory--no-heavy-goods-vehicles--de","prohibitory_no_u_turn":"prohibitory--no-u-turn--de","prohibitory_no_vehicle_with_dangerous_goods":"prohibitory--no-vehicles-carrying-dangerous-goods--de","prohibitory_noturn_left":"prohibitory--no-left-turn--de","prohibitory_noturn_right":"prohibitory--no-right-turn--de","prohibitory_on_overtaking":"prohibitory--no-overtaking--de","prohibitory_on_overtaking_trucks":"prohibitory--no-overtaking-by-heavy-goods-vehicles--de","prohibitory_speed_limit_10":"prohibitory--maximum-speed-limit-10--de","prohibitory_speed_limit_100":"prohibitory--maximum-speed-limit-100--de","prohibitory_speed_limit_110":"prohibitory--maximum-speed-limit-110--de","prohibitory_speed_limit_120":"prohibitory--maximum-speed-limit-120--de","prohibitory_speed_limit_130":"prohibitory--maximum-speed-limit-130--de","prohibitory_speed_limit_20":"prohibitory--maximum-speed-limit-20--de","prohibitory_speed_limit_30":"prohibitory--maximum-speed-limit-30--de","prohibitory_speed_limit_40":"prohibitory--maximum-speed-limit-40--de","prohibitory_speed_limit_50":"prohibitory--maximum-speed-limit-50--de","prohibitory_speed_limit_60":"prohibitory--maximum-speed-limit-60--de","prohibitory_speed_limit_70":"prohibitory--maximum-speed-limit-70--de","prohibitory_speed_limit_80":"prohibitory--maximum-speed-limit-80--de","prohibitory_speed_limit_90":"prohibitory--maximum-speed-limit-90--de","prohibitory_vehicle_height_limit":"prohibitory--maximum-height--de","prohibitory_vehicle_width_limit":"prohibitory--maximum-width--de"} \ No newline at end of file diff --git a/vendor/assets/iD/iD/traffico/mapillary-mappings/us.json b/vendor/assets/iD/iD/traffico/mapillary-mappings/us.json new file mode 100644 index 000000000..f2ae81ecb --- /dev/null +++ b/vendor/assets/iD/iD/traffico/mapillary-mappings/us.json @@ -0,0 +1 @@ +{"mandatory_pass_either_side":"mandatory--pass-on-either-side--us","regulatory_give_way":"regulatory--yield--us","regulatory_no_bicycles":"regulatory--no-bicycles--us","regulatory_no_entry":"regulatory--no-entry--us","regulatory_no_left_or_u_turn":"regulatory--no-left-or-u-turn--us","regulatory_no_left_turn":"regulatory--no-left-turn--us","regulatory_no_left_turn__v2":"regulatory--no-left-turn--us--v1","regulatory_no_parking":"regulatory--no-parking--us","regulatory_no_pedestrian_crossing":"regulatory--no-pedestrians--us","regulatory_no_right_turn__v2":"regulatory--no-right-turn--us--v1","regulatory_no_straight_through":"regulatory--no-straight-through--us","regulatory_no_trucks":"regulatory--no-heavy-goods-vehicles--us","regulatory_no_turn_right":"regulatory--no-right-turn--us","regulatory_no_u_turn":"regulatory--no-u-turn--us","regulatory_no_u_turn__v2":"regulatory--no-u-turn--us--v1","regulatory_speed_limit_10":"regulatory--maximum-speed-limit-10--us","regulatory_speed_limit_15":"regulatory--maximum-speed-limit-15--us","regulatory_speed_limit_20":"regulatory--maximum-speed-limit-20--us","regulatory_speed_limit_25":"regulatory--maximum-speed-limit-25--us","regulatory_speed_limit_30":"regulatory--maximum-speed-limit-30--us","regulatory_speed_limit_35":"regulatory--maximum-speed-limit-35--us","regulatory_speed_limit_40":"regulatory--maximum-speed-limit-40--us","regulatory_speed_limit_45":"regulatory--maximum-speed-limit-45--us","regulatory_speed_limit_50":"regulatory--maximum-speed-limit-50--us","regulatory_speed_limit_55":"regulatory--maximum-speed-limit-55--us","regulatory_speed_limit_60":"regulatory--maximum-speed-limit-60--us","regulatory_speed_limit_65":"regulatory--maximum-speed-limit-65--us","regulatory_speed_limit_70":"regulatory--maximum-speed-limit-70--us","regulatory_speed_limit_75":"regulatory--maximum-speed-limit-75--us","regulatory_speed_limit_80":"regulatory--maximum-speed-limit-80--us","regulatory_speed_limit_85":"regulatory--maximum-speed-limit-85--us","regulatory_stop":"regulatory--stop--us","warning_T_roads":"warning--t-roads--us","warning_Y_roads":"warning--y-roads--us","warning_added_lane_from_entering_roadway":"warning--added-lane-from-entering-roadway--us","warning_added_lanes":"warning--added-lane-right--us","warning_bicycle_slippery":"warning--slippery-bicycles--us","warning_crossroads_ahead":"warning--crossroads-ahead--us","warning_curve_reverse_left":"warning--double-curve-first-left-ahead--us","warning_curve_reverse_right":"warning--double-curve-first-right-ahead--us","warning_cyclists_crossing":"warning--cyclists-crossing--us","warning_double_reverse_curve":"warning--double-reverse-curve--us","warning_falling_rocks":"warning--falling-rocks-or-debris-right--us","warning_fire_station":"warning--emergency-vehicles--us","warning_flaggers_in_road_ahead":"warning--flaggers-in-road-ahead--us","warning_hairpin_curve":"warning--hairpin-curve-right-ahead--us","warning_highway_divided":"warning--divided-highway-ahead--us","warning_horizontal_alignment_left":"warning--horizontal-alignment-left--us","warning_horizontal_alignment_right":"warning--horizontal-alignment-right--us","warning_intersection_circular":"warning--roundabout-ahead--us","warning_light_rail_crossing":"warning--tram-crossing--us","warning_loop_270_degree":"warning--loop-270-degree--us","warning_loop_pretzel":"warning--loop-pretzel--us","warning_low_clearance":"warning--height-restriction-ahead--us--feet","warning_merge":"warning--traffic-merges-right-ahead--us","warning_metric_clearance":"warning--height-restriction-ahead--us--meters","warning_motorcycle_crossing":"warning--motorcycle-crossing--us","warning_narrow_bridge_ahead":"warning--narrow-bridge-ahead--us","warning_offset_roads":"warning--offset-roads--us","warning_pass_left_or_right":"warning--pass-left-or-right--us","warning_pedestrian_crossing":"warning--pedestrian-crossing--us","warning_play_ground":"warning--playground-ahead--us","warning_railroad":"warning--uncontrolled-railroad-crossing-ahead--us","warning_road_narrows_both_sides":"warning--road-narrows-ahead--us","warning_road_narrows_left":"warning--road-narrows-left-ahead--us","warning_road_narrows_right":"warning--road-narrows-right-ahead--us","warning_side_road_acute_angle_left":"warning--junction-with-a-side-road-acute-left-ahead--us","warning_side_road_acute_angle_right":"warning--junction-with-a-side-road-acute-right-ahead--us","warning_side_road_perpendicular_left":"warning--junction-with-a-side-road-perpendicular-left-ahead--us","warning_side_road_perpendicular_right":"warning--junction-with-a-side-road-perpendicular-right-ahead--us","warning_slippery":"warning--slippery-road-surface--us","warning_steep_hill_downwards":"warning--steep-hill-downwards--us","warning_stop_ahead":"warning--stop-ahead--us","warning_traffic_light":"warning--traffic-signals-ahead--us","warning_triple_2_reverse_curve":"warning--triple-reverse-curve--us","warning_trucks_rollover":"warning--trucks-rollover--us","warning_turn_curve_left":"warning--turn-curve-left--us","warning_turn_curve_right":"warning--turn-curve-right--us","warning_turn_left":"warning--turn-left--us","warning_turn_reverse_left":"warning--double-turn-first-left-ahead--us","warning_turn_reverse_right":"warning--double-turn-first-right-ahead--us","warning_turn_right":"warning--turn-right--us","warning_two_way_traffic_ahead":"warning--two-way-traffic-ahead--us","warning_winding_road_left":"warning--winding-road-first-left-ahead--us","warning_winding_road_right":"warning--winding-road-first-right-ahead--us","warning_workers_in_road_ahead":"warning--workers-in-road-ahead--us","warning_yield_ahead":"warning--yield-ahead--us"} \ No newline at end of file diff --git a/vendor/assets/iD/iD/traffico/signs/at.json b/vendor/assets/iD/iD/traffico/signs/at.json new file mode 100644 index 000000000..d307e26d0 --- /dev/null +++ b/vendor/assets/iD/iD/traffico/signs/at.json @@ -0,0 +1 @@ +{"information_border_at":{"category":"information","name":"European border crossing into Austria","elements":[{"type":"square-rounded","color":"blue"},{"type":"europe_stars","color":"yellow"},{"type":"content-5","color":"white","content":"ÖSTERREICH","transform":"scale(.75)"}]},"level-crossing":{"category":"danger","name":"Level crossing","variation":"other","elements":[{"type":"level-crossing","color":"red"},{"type":"level-crossing","color":"red","transform":"scale(-1,1)"},{"type":"square-angular","color":"white","transform":"rotate(60deg) scale(.05,1)"},{"type":"square-angular","color":"white","transform":"rotate(-60deg) scale(.05,1)"}]},"priority-road-end":{"category":"priority","name":"end of priority road","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"white","transform":"scale(.98) scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.6) scale(0.707107) rotate(45deg)"},{"type":"square-angular","color":"black","transform":"scale(0.707107) rotate(45deg) scale(.2,1)"}]},"railway-crossing-unsecured":{"category":"danger","name":"unsecured railway crossing","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"white","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"railway-xing-unsecured","color":"black","transform":"translate(0,13%) scale(.4)"}]}} \ No newline at end of file diff --git a/vendor/assets/iD/iD/traffico/signs/au.json b/vendor/assets/iD/iD/traffico/signs/au.json new file mode 100644 index 000000000..1fa222433 --- /dev/null +++ b/vendor/assets/iD/iD/traffico/signs/au.json @@ -0,0 +1 @@ +{"maximum-speed-limit":{"category":"prohibitory","name":"Maximum speed limit","elements":[{"type":"circle-bg","color":"red"},{"type":"circle-bg","color":"white","transform":"scale(.8)"},{"type":"speed_value","color":"black"}]},"yield":{"category":"regulatory","name":"Yield/Give way","elements":[{"type":"tri-rounded","color":"red","transform":"rotate(180deg)"},{"type":"tri-rounded","color":"white","transform":"translate(0,-14.43%) scale(.7) translate(0,14.43%) rotate(180deg)"},{"type":"content-4","content":"GIVE","color":"black","transform":"translate(0,-115%) scale(.6)"},{"type":"content-4","content":"WAY","color":"black","transform":"translate(0,-45%) scale(.6)"}]},"yield-to-oncoming-traffic":{"category":"regulatory","name":"Yield to oncoming traffic","elements":[{"type":"tri-rounded","color":"red","transform":"rotate(180deg)"},{"type":"tri-rounded","color":"white","transform":"translate(0,-14.43%) scale(.7) translate(0,14.43%) rotate(180deg)"},{"type":"content-4","content":"GIVE","color":"black","transform":"translate(0,-115%) scale(.6)"},{"type":"content-4","content":"WAY","color":"black","transform":"translate(0,-45%) scale(.6)"}]},"no-bicycles":{"category":"regulatory","name":"No bicycles","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"bicycle","color":"black"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(-45deg)"}]},"no-entry":{"category":"regulatory","name":"No entry","elements":[{"type":"circle-bg","color":"red"},{"type":"square-angular","color":"white","transform":"scale(.92,.16)"},{"type":"content-3","content":"NO","color":"white","transform":"translate(0,-80%) scale(.5)"},{"type":"content-3","content":"ENTRY","color":"white","transform":"translate(-10%,30%) scale(.5)"}]},"no-heavy-goods-vehicles":{"category":"regulatory","name":"No heavy goods vehicles","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"truck","color":"black","transform":"scale(1.2)"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(-45deg)"}]},"no-left-turn":{"category":"regulatory","name":"No left turn","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"turn-l-aus","color":"black","transform":"scale(0.55) translate(-10%, 5%)"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(-45deg)"}]},"no-pedestrians":{"category":"regulatory","name":"No pedestrians","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"pedestrian_bra","color":"black","transform":"scale(.8)"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(-45deg)"}]},"no-right-turn":{"category":"regulatory","name":"No right turn","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"turn-l-aus","color":"black","transform":"scale(-0.55, 0.55) translate(-10%, 5%)"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(-45deg)"}]},"no-u-turn":{"category":"regulatory","name":"No u turn","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"u-turn-au","color":"black","transform":"scale(.8)"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(45deg)"}]},"stop":{"category":"regulatory","name":"Stop","elements":[{"type":"octagon","color":"red"},{"type":"stop","color":"white"}]},"added-lane-left":{"category":"warning","name":"Added lane left","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"added-lane","color":"black"}]},"added-lane-right":{"category":"warning","name":"Added lane right","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"added-lane","color":"black","transform":"scale(-1,1)"}]},"bump-in-road":{"category":"warning","name":"Bump in road","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"bump_road_bra","color":"black","transform":"scale(.9)"}]},"children":{"category":"warning","name":"Children","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"fluogreen","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"children-au","color":"black","transform":"scale(.8)"}]},"crossroads-ahead":{"category":"warning","name":"Crossroads ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"crossroads-ahead","color":"black"}]},"curve-left-ahead":{"category":"warning","name":"Curve left ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"turn-l-curve","color":"black","transform":"scale(.9)"}]},"curve-right-ahead":{"category":"warning","name":"Curve right ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"turn-l-curve","color":"black","transform":"scale(.9) scale(-1,1)"}]},"cyclists-crossing":{"category":"warning","name":"Cyclists crossing","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"bicycle","color":"black","transform":"scale(.9)"}]},"dip-in-road":{"category":"warning","name":"Dip in road","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"content-3","content":"DIP","color":"black"}]},"divided-highway-ahead":{"category":"warning","name":"Divided highway ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"divided-highway","color":"black"}]},"divided-highway-ends":{"category":"warning","name":"Divided highway ends","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"divided-highway","color":"black","transform":"scale(1,-1)"}]},"domestic-animals":{"category":"warning","name":"Domestic animals","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"domestic-animals-au","color":"black"}]},"equestrians":{"category":"warning","name":"Equestrians","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"equestrian","color":"black","transform":"scale(0.6) scale(.9)"}]},"falling-rocks-or-debris-left":{"category":"warning","name":"Falling rocks or debris left","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"falling-rocks-au","color":"black"}]},"farm-vehicles":{"category":"warning","name":"Farm vehicles","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"tractor","color":"black","transform":"scale(.45)"}]},"hairpin-curve-left-ahead":{"category":"warning","name":"Hairpin curver left ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"hairpin-curve-au","color":"black","transform":" scale(0.85) scale(.9)"}]},"hairpin-curve-right-ahead":{"category":"warning","name":"Hairpin curve right ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"hairpin-curve-au","color":"black","transform":" scale(-0.85, 0.85) scale(.9)"}]},"horizontal-alignment-left":{"category":"warning","name":"Horizontal alighment left","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"h-align-l","color":"black"}]},"horizontal-alignment-right":{"category":"warning","name":"Horizontal alignment right","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"h-align-l","color":"black","transform":"scale(-1,1)"}]},"koala":{"category":"warning","name":"Koala","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"koala-ugly","color":"black","transform":"scale(.9)"}]},"koala-crossing":{"category":"warning","name":"Koala crossing","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"koalas","color":"black","transform":"scale(.9)"}]},"narrow-bridge-ahead":{"category":"warning","name":"Narrow bridge ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"narrow-bridge-au","color":"black","transform":"scale(.9)"}]},"pedestrian-crossing":{"category":"warning","name":"Pedestrian crossing","variation":"retired","elements":[{"type":"circle-bg","color":"black"},{"type":"circle-bg","color":"yellow","transform":"scale(.95)"},{"type":"pedestrian-crossing-au","color":"black"}]},"pedestrian-crossing_v2":{"category":"warning","name":"Pedestrian-crossing","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"school_zone_bra","color":"black","transform":"scale(-1,1)"}]},"pedestrians-cyclists":{"category":"warning","name":"Pedestrians cyclists","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"pedestrian","color":"black","transform":"scale(.8) scale(.6) translate(0,-35%) scale(-1, 1)"},{"type":"bicycle","color":"black","transform":"scale(.8) scale(.6) translate(0,35%)"}]},"railway-level-crossing-with-flashing-signals-ahead":{"category":"warning","name":"Railway level crossing with flashing signals ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"railway-flashing-au","color":"black","transform":"scale(.9) scale(0.8)"}]},"curve-first-left-ahead":{"category":"warning","name":"Double curve first left ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"reverse-curve-au","color":"black","transform":"scale(.9)"}]},"double-curve-first-right-ahead":{"category":"warning","name":"Double curve first right ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"reverse-curve-au","color":"black","transform":"scale(-1,1) scale(.9)"}]},"double-curve-first-left-ahead":{"category":"warning","name":"Double curve first left ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"reverse-curve-au","color":"black","transform":"scale(.9)"}]},"double-turn-first-left-ahead":{"category":"warning","name":"Double turn first left ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"turn-reverse-left","color":"black","transform":"scale(.9)"}]},"double-turn-first-right-ahead":{"category":"warning","name":"Double turn first right ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"turn-reverse-left","color":"black","transform":"scale(-1,1) scale(.9)"}]},"road-narrows-ahead":{"category":"warning","name":"Road narrows ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"narrow-road-both","color":"black","transform":"scale(.9)"}]},"roundabout-ahead":{"category":"warning","name":"Roundabout ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"roundabout","color":"black","transform":"scale(-1, 1)"}]},"junction-with-a-side-road-perpendicular-left-ahead":{"category":"warning","name":"Junction with a side road perpendicular left ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"side-road-perpendicular","color":"black","transform":"scale(.9)"}]},"junction-with-a-side-road-perpendicular-right-ahead":{"category":"warning","name":"Junction with a side road perpendicular right ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"side-road-perpendicular","color":"black","transform":"scale(.9) scale(-1,1)"}]},"slippery-road-surface":{"category":"warning","name":"Slippery road surface","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"slippery","color":"black"}]},"steep-hill-downwards":{"category":"warning","name":"Steep hill downwards","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"steep-hill-downwards","color":"black"}]},"steep-hill-upwards":{"category":"warning","name":"Steep hill upwards","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"steep-hill-upwards","color":"black"}]},"stop-ahead":{"category":"warning","name":"Stop ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"small-arrow-au","color":"black","transform":"translate(0,-25%)"},{"type":"octagon","color":"red","transform":"translate(0,15%) scale(.4)"}]},"traffic-signals-ahead":{"category":"warning","name":"Traffic signals ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"traffic-signal-au","color":"black"}]},"truck-crossing":{"category":"warning","name":"Truck crossing","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"truck","color":"black","transform":"scale(-1,1)"}]},"turn-left":{"category":"warning","name":"turn left","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"turn-90-l","color":"black"}]},"turn-right":{"category":"warning","name":"Turn right","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"turn-90-l","color":"black","transform":"scale(-1,1)"}]},"two-way-traffic-ahead":{"category":"warning","name":"Two way traffic ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"arrows_both_bra","color":"black","transform":"scale(.9)"}]},"uncontrolled-railroad-crossing-ahead":{"category":"warning","name":"Uncontrolled railroad crossing ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"train-au","color":"black","transform":"scale(.9)"}]},"wild-animals":{"category":"warning","name":"Wild animals","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"kangaroo","color":"black"}]},"winding-road-first-left-ahead":{"category":"warning","name":"Winding road first left ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"series-of-curves-left","color":"black"}]},"winding-road-first-right-ahead":{"category":"warning","name":"Winding road first right ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"series-of-curves-left","color":"black","transform":"scale(-1,1)"}]},"yield-ahead":{"category":"warning","name":"Yield ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"small-arrow-au","color":"black","transform":"translate(0,-25%)"},{"type":"tri-rounded","color":"red","transform":"translate(0, 15%) scale(.45) rotate(180deg)"},{"type":"tri-rounded","color":"white","transform":"translate(0, 12%) scale(.25) rotate(180deg)"}]},"emu-crossing":{"category":"warning","name":"Emu crossing","variation":"left","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"emu","color":"black"}]},"emu-crossing_v2":{"category":"warning","name":"Emu crossing right","variation":"right","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"emu","color":"black","transform":"scale(-1,1)"}]},"slippery-motorcycles":{"category":"warning","name":"Slippery motorcycles","variation":"victoria","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"slippery-motorcycle","color":"black"}]},"traffic-merges-left-ahead":{"category":"warning","name":"Traffic merges left ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"merge","color":"black","transform":"scale(-1,1)"}]},"traffic-merges-right-ahead":{"category":"warning","name":"Traffic merges right ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"merge","color":"black"}]},"wombat-crossing":{"category":"warning","name":"Wombat crossing","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"wombat","color":"black"}]},"wombat-crossing_v2":{"category":"warning","name":"Wombat crossing","variation":"victoria","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"wombat","color":"black"}]}} \ No newline at end of file diff --git a/vendor/assets/iD/iD/traffico/signs/be.json b/vendor/assets/iD/iD/traffico/signs/be.json new file mode 100644 index 000000000..a11bda42d --- /dev/null +++ b/vendor/assets/iD/iD/traffico/signs/be.json @@ -0,0 +1 @@ +{"information_border_be_nl":{"category":"information","name":"European border crossing into Belgium from the Netherlands","elements":[{"type":"square-rounded","color":"blue"},{"type":"europe_stars","color":"yellow"},{"type":"content-5","color":"white","content":"België"}]},"information_border_be_fr":{"category":"information","name":"European border crossing into Belgium from France","elements":[{"type":"square-rounded","color":"blue"},{"type":"europe_stars","color":"yellow"},{"type":"content-5","color":"white","content":"Belgique"}]},"priority-road-end":{"category":"priority","name":"end of priority road","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"white","transform":"scale(.98) scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.6) scale(0.707107) rotate(45deg)"},{"type":"square-angular","color":"black","transform":"scale(0.707107) rotate(45deg) scale(.2,1)"}]},"railway-crossing-unsecured":{"category":"danger","name":"unsecured railway crossing","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"white","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"railway-xing-unsecured","color":"black","transform":"translate(0,13%) scale(.4)"}]}} \ No newline at end of file diff --git a/vendor/assets/iD/iD/traffico/signs/br.json b/vendor/assets/iD/iD/traffico/signs/br.json new file mode 100644 index 000000000..f32377d1c --- /dev/null +++ b/vendor/assets/iD/iD/traffico/signs/br.json @@ -0,0 +1 @@ +{"bicycles-only":{"category":"mandatory","name":"Bicycles only","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"bicycle","color":"black"}]},"proceed-straight":{"category":"mandatory","name":"Proceed straight","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"US-arrow-oneway","color":"black","transform":"scale(.6)"}]},"keep-left":{"category":"mandatory","name":"Keep left","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"US-arrow-oneway","color":"black","transform":"rotate(-135deg) scale(.6)"}]},"keep-right":{"category":"mandatory","name":"Keep right","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"US-arrow-oneway","color":"black","transform":"rotate(135deg) scale(.6)"}]},"transit-only":{"category":"mandatory","name":"Transit only","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"transit_bra","color":"black"}]},"turn-right":{"category":"mandatory","name":"Turn right","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"US-arrow-oneway","color":"black","transform":"rotate(90deg) scale(.6)"}]},"parking":{"category":"information","name":"Parking zone","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"content","color":"black","content":"E","transform":"scale(1.5) translate(0,20%)"}]},"two-way-traffic":{"category":"information","name":"Two-way traffic","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"two_way_arrows_bra","color":"black"}]},"maximum-speed-limit":{"category":"prohibitory","name":"Maximum speed limit","elements":[{"type":"circle-bg","color":"red"},{"type":"circle-bg","color":"white","transform":"scale(.8)"},{"type":"content-4","color":"black","content":"km/h","transform":"translate(0,120%) scale(.8)"},{"type":"speed_value","color":"black"}]},"yield":{"category":"regulatory","name":"Yield","elements":[{"type":"tri-rounded","color":"red","transform":"rotate(180deg)"},{"type":"tri-rounded","color":"white","transform":"translate(0,-14.43%) scale(.7) translate(0,14.43%) rotate(180deg)"}]},"no-bicycles":{"category":"regulatory","name":"No bicycles","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"cyclists_crossing_bra","color":"black","transform":"scale(1.2)"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(-45deg)"}]},"no-entry":{"category":"regulatory","name":"No entry","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"US-arrow-oneway","color":"black","transform":"scale(.6)"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(-45deg)"}]},"no-heavy-goods-vehicles":{"category":"regulatory","name":"No heavy goods vehicles","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"truck","color":"black","transform":"scale(1.2)"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(-45deg)"}]},"no-motor-vehicles":{"category":"regulatory","name":"No motor vehicles","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"car","color":"black","transform":"scale(.8) scale(1.3)"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(-45deg)"}]},"no-motorcycles":{"category":"regulatory","name":"No motorcycles","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"motorbike","color":"black","transform":"scale(.8) scale(1.3)"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(-45deg)"}]},"no-overtaking":{"category":"regulatory","name":"No overtaking","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"car","color":"black","transform":"scale(.6) translate(-26%,10%)"},{"type":"car","color":"black","transform":"scale(.6) translate(26%,10%)"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(-45deg)"}]},"no-parking":{"category":"regulatory","name":"No parking","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"content","color":"black","content":"E","transform":"scale(1.5) translate(0,20%)"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(-45deg)"}]},"no-pedestrians":{"category":"regulatory","name":"No pedestrians","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"pedestrian_bra","color":"black","transform":"scale(.8)"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(-45deg)"}]},"no-stopping":{"category":"regulatory","name":"No stopping","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"content","color":"black","content":"E","transform":"scale(1.5) translate(0,20%)"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(-45deg)"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(45deg)"}]},"stop":{"category":"regulatory","name":"Stop","elements":[{"type":"octagon","color":"red"},{"type":"content-4","content":"PARE","color":"white","transform":"scale(1)"}]},"no-left-or-u-turn":{"category":"regulatory","name":"No left or u turn","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"no-l-or-u-turn","color":"black"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(-45deg)"}]},"no-left-turn":{"category":"regulatory","name":"No left turn","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"turn-90-l","color":"black","transform":"scale(.8)"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(-45deg)"}]},"no-straight-through":{"category":"regulatory","name":"No straight through","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"US-arrow-up","color":"black"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(-45deg)"}]},"no_trucks":{"category":"regulatory","name":"no trucks","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"truck","color":"black","transform":"scale(.8)"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(-45deg)"}]},"no-right-turn":{"category":"regulatory","name":"No right turn","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"turn-90-l","color":"black","transform":"scale(.8) scale(-1,1)"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(-45deg)"}]},"no-u-turn":{"category":"regulatory","name":"No u turn","elements":[{"type":"circle-o","color":"red"},{"type":"u-turn","color":"black","transform":"scale(.8)"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(-45deg)"}]},"bump-in-road":{"category":"warning","name":"bump in road","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"bump_road_bra","color":"black","transform":"scale(.9)"}]},"cyclists-crossing":{"category":"warning","name":"Cyclists crossing","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"cyclists_crossing_bra","color":"black","transform":"scale(.9)"}]},"domestic-animals":{"category":"warning","name":"Domestic animals","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"domestic-animal","color":"black","transform":"translate(-10%,0%) scale(.35)"}]},"falling-rocks-or-debris-right":{"category":"warning","name":"Falling rocks or debris","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"falling-rocks-US","color":"black"}]},"farm-vehicles":{"category":"warning","name":"Farm vehicles","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"tractor","color":"black","transform":"scale(.45)"}]},"loose-road-surface":{"category":"warning","name":"Loose road surface","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"loose_road_surface_bra","color":"black","transform":"scale(.9)"}]},"pedestrian-crossing":{"category":"warning","name":"Pedestrian crossing","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"pedestrian_crossing_bra","color":"black","transform":"scale(.9)"}]},"road-narrows-ahead":{"category":"warning","name":"Road narrows ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"narrow-road-both","color":"black","transform":"scale(.9)"}]},"workers-in-road-ahead":{"category":"warning","name":"Workers in road ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"roadworks_bra","color":"black"}]},"school-zone":{"category":"warning","name":"School zone","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"school_zone_bra","color":"black"}]},"slippery-road-surface":{"category":"warning","name":"Slippery road surface","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"slippery","color":"black"}]},"stop-ahead":{"category":"warning","name":"Stop ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"content-4","color":"black","content":"PARE","transform":"scale(.9)"}]},"two-way-traffic-ahead":{"category":"warning","name":"Two-way traffic ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"arrows_both_bra","color":"black","transform":"scale(.9)"}]},"uneven-road":{"category":"warning","name":"Uneven road","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"bump_bra","color":"black","transform":"scale(.9)"}]},"wild-animals":{"category":"warning","name":"Wild animals","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"wild-animal","color":"black","transform":"scale(.9) scale(.9)"}]},"y-roads":{"category":"warning","name":"Y-roads","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"y-roads","color":"black"}]},"added-lane-right":{"category":"warning","name":"Added lane right","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"added-lane","color":"black"}]},"warning--added-lane-left":{"category":"warning","name":"added lane left","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"added-lane","color":"black","transform":"scale(-1,1)"}]},"double-curve-first-left-ahead":{"category":"warning","name":"Double curve first left ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"reverse-curve-au","color":"black","transform":"scale(.9)"}]},"double-curve-first-right-ahead":{"category":"warning","name":"Double curve first right ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"reverse-curve-au","color":"black","transform":"scale(-1,1) scale(.9)"}]},"double-reverse-curve":{"category":"warning","name":"Double reverse curve","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"orange","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"single-2-reverse-curve","color":"black","transform":"scale(.9) translate(-9%)"},{"type":"single-2-reverse-curve","color":"black","transform":"scale(.9) translate(9%)"}]},"flaggers-in-road-ahead":{"category":"warning","name":"Flaggers in road ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"flaggers","color":"black"}]},"divided-highway-ahead":{"category":"warning","name":"Divided highway ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"divided-highway","color":"black"}]},"horizontal-alignment-right":{"category":"warning","name":"Horizontal alignment right","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"h-align-l","color":"black","transform":"scale(-1,1)"}]},"roundabout-ahead":{"category":"warning","name":"Roundabout ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"roundabout","color":"black"}]},"loop-pretzel":{"category":"warning","name":"Loop pretzel","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"pretzel-loop","color":"black","transform":"scale(.9)"}]},"height-restriction-ahead":{"category":"warning","name":"Height restriction ahead","variation":"feet","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"height","color":"black"},{"type":"height_value","color":"black"}]},"traffic-merges-right-ahead":{"category":"warning","name":"Traffic merges right ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"side-road-a-a-r","color":"black","transform":"scale(1, -1)"}]},"pass-left-or-right":{"category":"warning","name":"Pass left or right","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"pass-l-r","color":"black"}]},"playground-ahead":{"category":"warning","name":"Playground ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"playground-br","color":"black"}]},"road-narrows-left-ahead":{"category":"warning","name":"Road narrows left ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"narrow-road-l","color":"black","transform":"scale(.9)"}]},"road-narrows-right-ahead":{"category":"warning","name":"Road narrows right ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"narrow-road-l","color":"black","transform":"scale(.9) scale(-1,1)"}]},"junction-with-a-side-road-acute-left-ahead":{"category":"warning","name":"Junction with a side road acute left ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"side-road-a-a-r","color":"black"}]},"junction-with-a-side-road-perpendicular-left-ahead":{"category":"warning","name":"Junction with a side road perpendicular left ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"side-road-a-a-r","color":"black","transform":"scale(-1,1)"}]},"junction-with-a-side-road-perpendicular-right-ahead":{"category":"warning","name":"Junction with a side road perpendicular right ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"side-road-p-r","color":"black"}]},"t-roads":{"category":"warning","name":"T-roads","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"t-roads","color":"black"}]},"traffic-signals-ahead":{"category":"warning","name":"Traffic signals ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"square-angular","color":"black","transform":"scale(.2,.55)"},{"type":"circle-bg","color":"green","transform":"translate(0,16.5%) scale(.14)"},{"type":"circle-bg","color":"yellow","transform":"scale(.14)"},{"type":"circle-bg","color":"red","transform":"translate(0,-16.5%) scale(.14)"}]},"triple-reverse-curve":{"category":"warning","name":"Triple reverse curve","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"orange","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"single-2-reverse-curve","color":"black","transform":"scale(.9) translate(-18%)"},{"type":"single-2-reverse-curve","color":"black","transform":"scale(.9)"},{"type":"single-2-reverse-curve","color":"black","transform":"scale(.9) translate(18%)"}]},"trucks-rollover":{"category":"warning","name":"Trucks rollover","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"trucks-rollover","color":"black"}]},"turn-curve-left":{"category":"warning","name":"Turn curve left","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"turn-l-curve","color":"black","transform":"scale(.9)"}]},"turn-curve-right":{"category":"warning","name":"Turn curve right","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"turn-l-curve","color":"black","transform":"scale(-1,1) scale(.9)"}]},"turn-left":{"category":"warning","name":"Turn left","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"turn-90-l","color":"black"}]},"turn-right_v2":{"category":"warning","name":"Turn right","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"turn-90-l","color":"black","transform":"scale(-1,1)"}]},"double-turn-first-left-ahead":{"category":"warning","name":"Double turn first left ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"reverse-curve-au","color":"black","transform":"scale(.9)"}]},"double-turn-first-right-ahead":{"category":"warning","name":"double turn first right ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"reverse-curve-au","color":"black","transform":"scale(-1,1) scale(.9)"}]},"winding-road-first-left-ahead":{"category":"warning","name":"Winding road first left ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"winding-road-left","color":"black"}]},"winding-road-first-right-ahead":{"category":"warning","name":"Winding road first right ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"winding-road-left","color":"black","transform":"scale(-1,1)"}]}} \ No newline at end of file diff --git a/vendor/assets/iD/iD/traffico/signs/ca.json b/vendor/assets/iD/iD/traffico/signs/ca.json new file mode 100644 index 000000000..3021a3292 --- /dev/null +++ b/vendor/assets/iD/iD/traffico/signs/ca.json @@ -0,0 +1 @@ +{"pass-on-either-side":{"category":"mandatory","name":"Pass on either side","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"pass-l-r","color":"black"}]},"no-bicycles":{"category":"regulatory","name":"No bicycles","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"bicycle","color":"black"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(-45deg)"}]},"no-entry":{"category":"regulatory","name":"No entry","elements":[{"type":"circle-bg","color":"red"},{"type":"square-angular","color":"white","transform":"scale(.92,.16)"}]},"no-heavy-goods-vehicles":{"category":"regulatory","name":"No heavy goods vehicles","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"truck","color":"black","transform":"scale(1.2)"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(-45deg)"}]},"no-left-turn":{"category":"regulatory","name":"No left turn","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"turn-90-l","color":"black","transform":"scale(.8)"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(-45deg)"}]},"no-motor-vehicles":{"category":"regulatory","name":"No motor vehicles","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"car","color":"black","transform":"scale(.8) scale(1.3)"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(-45deg)"}]},"no-motorcycles":{"category":"regulatory","name":"No motorcycles","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"motorbike","color":"black","transform":"scale(.8) scale(1.3)"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(-45deg)"}]},"no-overtaking":{"category":"regulatory","name":"No overtaking","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"car","color":"black","transform":"scale(.6) translate(26%,10%)"},{"type":"car","color":"black","transform":"scale(.6) translate(-26%,10%)"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(-45deg)"}]},"no-parking":{"category":"regulatory","name":"No parking","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"content","color":"black","content":"P","transform":"scale(1.5) translate(0,20%)"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(-45deg)"}]},"no-pedestrians":{"category":"regulatory","name":"No pedestrians","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"pedestrian_bra","color":"black","transform":"scale(.8)"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(-45deg)"}]},"no-right-turn":{"category":"regulatory","name":"No right turn","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"turn-90-l","color":"black","transform":"scale(.8) scale(-1,1)"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(-45deg)"}]},"no-stopping":{"category":"regulatory","name":"No stopping","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"octagon","color":"black","transform":"scale(.7)"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(-45deg)"}]},"no-u-turn":{"category":"regulatory","name":"No u turn","elements":[{"type":"circle-o","color":"red"},{"type":"u-turn","color":"black","transform":"scale(.8)"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(-45deg)"}]},"maximum-speed-limit":{"category":"regulatory","name":"Maximum speed limit","elements":[{"type":"square-rounded","color":"white","transform":"scale(.9,1)"},{"type":"square-rounded","color":"black","transform":"scale(.9,1) scale(.95)"},{"type":"square-rounded","color":"white","transform":"scale(.9,1) scale(.90)"},{"type":"content-4","color":"black","content":"MAXIMUM","transform":"translate(0,-125%) scale(.5)"},{"type":"speed_value","color":"black","transform":"translate(0,45%)"}]},"stop":{"category":"regulatory","name":"Stop","elements":[{"type":"octagon","color":"red"},{"type":"stop","color":"white"}]},"bump-in-road":{"category":"warning","name":"Bump in road","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"bump_road_bra","color":"black","transform":"scale(.9)"}]},"crossroads-ahead":{"category":"warning","name":"Crossroads ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"crossroads-ahead","color":"black"}]},"crossroads-ahead_v2":{"category":"warning","name":"Crossroads ahead","vartiation":"ontario","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"crossroads-ahead-ontario","color":"black"}]},"curve-left-ahead":{"category":"warning","name":"Curve left ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"turn-l-curve","color":"black","transform":"scale(.9)"}]},"curve-left-ahead_v2":{"category":"warning","name":"Curve left ahead","variation":"ontario","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"turn-right-curve-ontario","color":"black","transform":"scale(.9) scale(-1,1)"}]},"double-curve-first-left-ahead":{"category":"warning","name":"Double curve first left ahead","vartiation":"ontario","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"reverse-curve-ontario","color":"black","transform":"scale(-1,1) scale(.9)"}]},"double-curve-first-right-ahead":{"category":"warning","name":"Double curve first right ahead","variation":"ontario","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"reverse-curve-ontario","color":"black","transform":"scale(.9)"}]},"curve-right-ahead":{"category":"warning","name":"Curve right ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"turn-r-curve","color":"black","transform":"scale(.9)"}]},"curve-right-ahead_v2":{"category":"warning","name":"Curve right ahead","variatio":"ontario","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"turn-right-curve-ontario","color":"black","transform":"scale(.9)"}]},"cyclists-crossing":{"category":"warning","name":"cyclists crossing","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"bicycle","color":"black","transform":"scale(.9)"}]},"dip-in-road":{"category":"warning","name":"Dip in road","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"content-3","content":"DIP","color":"black"}]},"divided-highway-ahead":{"category":"warning","name":"Divided highway ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"divided-highway","color":"black"}]},"divided-highway-ends":{"category":"warning","name":"Divided highway ends","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"divided-highway","color":"black","transform":"scale(1,-1)"}]},"domestic-animals":{"category":"warning","name":"Domestic animals","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"domestic-animal","color":"black","transform":"translate(-10%,0%) scale(.35)"}]},"emergency-vehicles":{"category":"warning","name":"Emergency vehicles","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"firemans-car","color":"black"}]},"equestrians":{"category":"warning","name":"Equestrians","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"equestrian","color":"black","transform":"scale(0.6) scale(.9)"}]},"falling-rocks-or-debris-right":{"category":"warning","name":"Falling rocks or debris right","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"falling-rocks-au","color":"black","transform":"scale(-1,1)"}]},"farm-vehicles":{"category":"warning","name":"Farm vehicles","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"tractor","color":"black","transform":"scale(.45)"}]},"hairpin-curve-right-ahead":{"category":"warning","name":"Hairpin curve right ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"hairpin-curve-au","color":"black","transform":" scale(-0.85, 0.85) scale(.9)"}]},"hairpin-curve-right-ahead_v2":{"category":"warning","name":"Hairpin curve right ahead","variation":"ontario","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"hairpin-curve-au","color":"black","transform":" scale(-0.85, 0.85) scale(.9)"}]},"level-railroad-crossing-with-barriers-ahead":{"category":"warning","name":"Level railroad crossing with barriers ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"railroad-barriers","color":"black"}]},"loose-road-surface":{"category":"warning","name":"Loose road surface","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"loose_road_surface_bra","color":"black","transform":"scale(.9)"}]},"height-restriction-ahead":{"category":"warning","name":"Height restriction ahead","variation":"feet","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"height-restriction-ca","color":"black"},{"type":"height_value","color":"black"}]},"height-restriction-ahead_v2":{"category":"warning","name":"Height restriction ahead","variation":"meters","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"height-restriction-ca","color":"black"},{"type":"height_value","color":"black"}]},"narrow-bridge-ahead":{"category":"warning","name":"Narrow bridge ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"narrow-bridge-au","color":"black","transform":"scale(.9)"}]},"opening-or-swing-bridge":{"category":"warning","name":"Opening or swing bridge","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"opening-swing-bridge-ca","color":"black","transform":"scale(.9)"}]},"pavement-ends":{"category":"warning","name":"Pavement ends","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"pavement-ends","color":"black","transform":"scale(.9)"}]},"pedestrian-crossing":{"category":"warning","name":"Pedestrian crossing","elements":[{"type":"square-rounded","color":"white","transform":"scale(.9,1)"},{"type":"square-rounded","color":"black","transform":"scale(.9,1) scale(.95)"},{"type":"square-rounded","color":"white","transform":"scale(.9,1) scale(.90)"},{"type":"pedestrian","color":"black"}]},"pedestrian-crossing_v2":{"category":"warning","name":"Pedestrian crossing","variation":"quebec","elements":[{"type":"square-rounded","color":"white","transform":"scale(.9,1)"},{"type":"square-rounded","color":"black","transform":"scale(.9,1) scale(.95)"},{"type":"square-rounded","color":"white","transform":"scale(.9,1) scale(.90)"},{"type":"content-4","color":"black","content":"PEDESTRIAN","transform":"translate(-10%,-125%) scale(.5)"},{"type":"content-3","color":"black","content":"X","transform":"translate(0,40%) scale(1.5)"}]},"playground-ahead":{"category":"warning","name":"Playground ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"playground-ahead-ca","color":"black"}]},"road-narrows-ahead":{"category":"warning","name":"Road narrows ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"narrow-road-both","color":"black","transform":"scale(.9)"}]},"road-narrows-left-ahead":{"category":"warning","name":"Road narrows left ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"narrow-road-l","color":"black","transform":"scale(.9)"}]},"road-narrows-right-ahead":{"category":"warning","name":"Road narrows right ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"narrow-road-l","color":"black","transform":"scale(.9) scale(-1,1)"}]},"roundabout-ahead":{"category":"warning","name":"roundabout ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"roundabout","color":"black"}]},"shared-road-motocycles-cyclists":{"category":"warning","name":"Shared road motocycles cyclists","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"share-road","color":"black"}]},"junction-with-a-side-road-perpendicular-left-ahead":{"category":"warning","name":"Junction with a side road perpendicular left ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"side-road-perpendicular","color":"black","transform":"scale(.9)"}]},"junction-with-a-side-road-perpendicular-left-ahead_v2":{"category":"warning","name":"junction with a side road perpendicular left ahead","variation":"ontario","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"side-road-perpendicular","color":"black","transform":"scale(.9)"}]},"junction-with-a-side-road-perpendicular-right-ahead":{"category":"warning","name":"Junction with a side road perpendicular right ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"side-road-perpendicular","color":"black","transform":"scale(.9) scale(-1,1)"}]},"junction-with-a-side-road-perpendicular-right-ahead_v2":{"category":"warning","name":"junction with a side road perpendicular right ahead","vartiation":"ontario","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"side-road-perpendicular","color":"black","transform":"scale(.9) scale(-1,1)"}]},"slippery-road-surface":{"category":"warning","name":"Slippery road surface","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"slippery","color":"black"}]},"steep-hill-downwards":{"category":"warning","name":"Steep hill downwards","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"steep-hill-downwards","color":"black"}]},"steep-hill-upwards":{"category":"warning","name":"Steep hill upwards","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"steep-hill-upwards","color":"black"}]},"stop-ahead":{"category":"warning","name":"Stop ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"small-arrow-au","color":"black","transform":"translate(0,-25%)"},{"type":"octagon","color":"red","transform":"translate(0,15%) scale(.3)"}]},"stop-ahead_v2":{"category":"warning","name":"Stop ahead","variation":"ontario","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"small-arrow-au","color":"black","transform":"translate(0,-25%) scale(1.2)"},{"type":"octagon","color":"red","transform":"translate(0,15%) scale(.4)"}]},"traffic-merges-left-ahead":{"category":"warning","name":"Traffic merges left ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"side-road-a-a-r","color":"black","transform":"scale(1, -1)"}]},"traffic-merges-left-ahead_v2":{"category":"warning","name":"Traffic merges left ahead","variation":"ontario","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"side-road-a-a-r","color":"black","transform":"scale(1, -1)"}]},"traffic-merges-right-ahead":{"category":"warning","name":"Traffic merges right ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"side-road-a-a-r","color":"black"}]},"traffic-merges-right-ahead_v2":{"category":"warning","name":"Traffic mergest right ahead","variation":"ontario","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"side-road-a-a-r","color":"black"}]},"traffic-signals-ahead":{"category":"warning","name":"Traffic signals ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"square-angular","color":"black","transform":"scale(.2,.55)"},{"type":"circle-bg","color":"green","transform":"translate(0,16.5%) scale(.14)"},{"type":"circle-bg","color":"yellow","transform":"scale(.14)"},{"type":"circle-bg","color":"red","transform":"translate(0,-16.5%) scale(.14)"}]},"tunnel-ahead":{"category":"warning","name":"Tunnel ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"tunnel","color":"black"}]},"turn-left":{"category":"warning","name":"Turn left","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"turn-90-l","color":"black"}]},"double-turn-first-left-ahead":{"category":"warning","name":"Double turn first left ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"turn-reverse-left","color":"black","transform":"scale(.9)"}]},"double-turn-first-right-ahead":{"category":"warning","name":"Double turn first right ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"turn-reverse-left","color":"black","transform":"scale(-1,1) scale(.9)"}]},"turn-right":{"category":"warning","name":"turn right","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"turn-90-l","color":"black","transform":"scale(-1,1)"}]},"two-way-traffic-ahead":{"category":"warning","name":"two way traffic ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"arrows_both_bra","color":"black","transform":"scale(.9)"}]},"uncontrolled-railroad-crossing-ahead":{"category":"warning","name":"uncontroller railroad crossing ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"train-au","color":"black","transform":"scale(.9)"}]},"uneven-road":{"category":"warning","name":"uneven road","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"bump_bra","color":"black","transform":"scale(.9)"}]},"wild-animals":{"category":"warning","name":"wild animals","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"wild-animal","color":"black","transform":"scale(.9) scale(.9)"}]},"winding-road-first-left-ahead":{"category":"warning","name":"Winding road first left ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"winding-road-left","color":"black"}]},"winding-road-first-right-ahead":{"category":"warning","name":"winding road first right ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"winding-road-left","color":"black","transform":"scale(-1,1)"}]},"workers-in-road-ahead":{"category":"warning","name":"workers in road ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"roadworks_bra","color":"black"}]},"yield-ahead":{"category":"warning","name":"yield ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"small-arrow-au","color":"black","transform":"translate(0,-25%)"},{"type":"tri-rounded","color":"red","transform":"translate(0, 15%) scale(.45) rotate(180deg)"},{"type":"tri-rounded","color":"white","transform":"translate(0, 12%) scale(.25) rotate(180deg)"}]},"yield":{"category":"regulatory","name":"Yield","elements":[{"type":"tri-rounded","color":"red","transform":"rotate(180deg)"},{"type":"tri-rounded","color":"white","transform":"translate(0,-14.43%) scale(.55) translate(0,14.43%) rotate(180deg)"}]}} \ No newline at end of file diff --git a/vendor/assets/iD/iD/traffico/signs/ch.json b/vendor/assets/iD/iD/traffico/signs/ch.json new file mode 100644 index 000000000..30ec1a2f2 --- /dev/null +++ b/vendor/assets/iD/iD/traffico/signs/ch.json @@ -0,0 +1 @@ +{"level-crossing":{"category":"danger","name":"Level crossing","variation":"other","elements":[{"type":"level-crossing","color":"red"},{"type":"level-crossing","color":"red","transform":"scale(-1,1)"},{"type":"square-angular","color":"white","transform":"rotate(60deg) scale(.05,1)"},{"type":"square-angular","color":"white","transform":"rotate(-60deg) scale(.05,1)"}]},"priority-road-end":{"category":"priority","name":"end of priority road","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"white","transform":"scale(.98) scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.6) scale(0.707107) rotate(45deg)"},{"type":"square-angular","color":"black","transform":"scale(0.707107) rotate(45deg) scale(.2,1)"}]},"railway-crossing-unsecured":{"category":"danger","name":"unsecured railway crossing","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"white","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"railway-xing-unsecured","color":"black","transform":"translate(0,13%) scale(.4)"}]}} \ No newline at end of file diff --git a/vendor/assets/iD/iD/traffico/signs/cz.json b/vendor/assets/iD/iD/traffico/signs/cz.json new file mode 100644 index 000000000..5de791a55 --- /dev/null +++ b/vendor/assets/iD/iD/traffico/signs/cz.json @@ -0,0 +1 @@ +{"information_border_cz":{"category":"information","name":"European border crossing into Czech Republic","elements":[{"type":"square-rounded","color":"blue"},{"type":"europe_stars","color":"yellow"},{"type":"content-5","color":"white","content":"České","transform":"translate(0,-50%)"},{"type":"content-5","color":"white","content":"republika","transform":"translate(0,50%)"}]},"priority-road-end":{"category":"priority","name":"end of priority road","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"white","transform":"scale(0.707107) rotate(45deg) scale(.98)"},{"type":"square-rounded","color":"yellow","transform":"scale(.6) scale(0.707107) rotate(45deg)"},{"type":"square-angular","color":"black","transform":"scale(0.707107) rotate(45deg) scale(.05,1)"},{"type":"square-angular","color":"black","transform":"scale(0.707107) rotate(45deg) scale(.05,1) translate(150%,0)"},{"type":"square-angular","color":"black","transform":"scale(0.707107) rotate(45deg) scale(.05,1) translate(-150%,0)"}]},"railway-crossing-unsecured":{"category":"danger","name":"unsecured railway crossing","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"white","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"railway-xing-unsecured","color":"black","transform":"translate(0,13%) scale(.4)"}]}} \ No newline at end of file diff --git a/vendor/assets/iD/iD/traffico/signs/de.json b/vendor/assets/iD/iD/traffico/signs/de.json new file mode 100644 index 000000000..b35e320bc --- /dev/null +++ b/vendor/assets/iD/iD/traffico/signs/de.json @@ -0,0 +1 @@ +{"ascent":{"category":"danger","name":"steep ascent","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"white","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"descent","color":"black","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%) scale(-1,1)"},{"type":"incline_value","content":"10%","color":"black","transform":"translate(0,-25%) translate(0,14.43%) scale(.4) rotate(-30deg)"}]},"descent":{"category":"danger","name":"steep descent","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"white","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"descent","color":"black","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"incline_value","content":"10%","color":"black","transform":"translate(0,-25%) translate(0,14.43%) scale(.4) rotate(30deg)"}]},"domestic-animals":{"category":"danger","name":"Domestic animals","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"white","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"domestic-animal","color":"black","transform":"translate(0,14.43%) translate(-6%,4%) scale(.25)"}]},"falling-rocks":{"category":"danger","name":"Falling rocks","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"white","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"falling-rocks-EU","color":"black","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"}]},"level-crossing":{"category":"danger","name":"level crossing","elements":[{"type":"square-angular","color":"black","transform":"rotate(30deg) scale(.15,1)"},{"type":"square-angular","color":"black","transform":"rotate(-30deg) scale(.15,1)"},{"type":"square-angular","color":"red","transform":"rotate(30deg) scale(.14,.99)"},{"type":"square-angular","color":"red","transform":"rotate(-30deg) scale(.14,.99)"},{"type":"square-angular","color":"white","transform":"rotate(30deg) scale(.14,.6)"},{"type":"square-angular","color":"white","transform":"rotate(-30deg) scale(.14,.6)"}]},"unprotected-quayside-or-riverbank":{"category":"danger","name":"Unprotected quayside or ferry berth","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"white","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"cliff","color":"black","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"}]},"wild-animals":{"category":"danger","name":"wild animals crossing","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"white","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"wild-animal","color":"black","transform":"translate(0,14.43%) scale(.7)"}]},"double-curve-first-left":{"category":"danger","name":"Double curve first left","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"white","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"d-curve-l","color":"black","transform":"translate(0,14.43%) scale(.6)"}]},"double-curve-first-right":{"category":"danger","name":"Double curve first right","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"white","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"d-curve-l","color":"black","transform":"translate(0,14.43%) scale(-.6,.6)"}]},"curve-left":{"category":"danger","name":"Curve left","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"white","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"turn-l","color":"black","transform":"translate(0,14.43%) scale(.6)"}]},"curve-right":{"category":"danger","name":"Curve right","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"white","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"turn-l","color":"black","transform":"translate(0,14.43%) scale(-.6,.6)"}]},"crossroads-with-priority-to-the-right":{"category":"danger","name":"Crossroads w priority to the right ahead","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"white","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"square-angular","color":"black","transform":"translate(0,14.43%) rotate(45deg) scale(.06,.32)"},{"type":"square-angular","color":"black","transform":"translate(0,14.43%) rotate(-45deg) scale(.06,.32)"}]},"cyclists-crossing-ahead":{"category":"danger","name":"Cyclists crossing ahead","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"white","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"bicycle","color":"black","transform":"scale(.65) translate(0,25%)"}]},"cyclists-crossing-ahead_v2":{"category":"danger","name":"Cyclists crossing ahead right","variation":"right","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"white","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"bicycle","color":"black","transform":"scale(.65) translate(0,25%)"}]},"other-danger":{"category":"danger","name":"danger","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"white","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"exclamation","color":"black","transform":"scale(.65) translate(0,14.43%)"}]},"other-danger_v2":{"category":"danger","name":"danger","variation":"temporary","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"yellow","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"exclamation","color":"black","transform":"scale(.65) translate(0,14.43%)"}]},"crossroads-ahead":{"category":"danger","name":"Danger at next intersection","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"white","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"right-of-way","color":"black","transform":"scale(.7) translate(0,14.43%)"}]},"junction-with-a-side-road-perpendicular-left":{"category":"danger","name":"Junction with a side road perpendicular","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"white","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"right-of-way-l fit","color":"black","transform":"scale(.7) translate(0,14.43%)"}]},"junction-with-a-side-road-perpendicular-right":{"category":"danger","name":"Junction with a side road perpendicular right","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"white","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"right-of-way-l fit","color":"black","transform":"scale(.7) translate(0,14.43%) scale(-1,1)"}]},"pedestrian-crossing":{"category":"danger","name":"Pedestrian crossing","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"white","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"pedestrian","color":"black","transform":"scale(.7) translate(0,14.43%)"}]},"railway-crossing-unsecured":{"category":"danger","name":"unsecured railway crossing","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"white","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"train-electric","color":"black","transform":"scale(.4) translate(10%,40%)"}]},"railway-crossing-secured":{"category":"danger","name":"secured railway crossing","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"white","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"railway-xing-secured","color":"black","transform":"translate(0,14.43%) translate(0,4%) scale(.35)"}]},"snow":{"category":"danger","name":"snow","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"white","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"snowflake","color":"black","transform":"translate(0,14.43%) scale(.7)"}]},"low-flying-aircraft":{"category":"danger","name":"low flying aircraft","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"white","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"airplane","color":"black","transform":"translate(0,14.43%) scale(.4)"}]},"strong-sidewind":{"category":"danger","name":"strong sidewind","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"white","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"windbag","color":"black","transform":"translate(0,14.43%) scale(.3)"}]},"road-bump":{"category":"danger","name":"road bump","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"white","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"bump","color":"black","transform":"translate(0,14.43%) scale(.45)"}]},"road-narrows-ahead":{"category":"danger","name":"Road narrows","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"white","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"narrow-road-both","color":"black","transform":"translate(0,14.43%) scale(.6)"}]},"road-narrows-left-ahead":{"category":"danger","name":"Road narrows left","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"white","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"narrow-road-l","color":"black","transform":"translate(0,14.43%) scale(.6)"}]},"road-narrows-right-ahead":{"category":"danger","name":"road narrows right","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"white","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"narrow-road-l","color":"black","transform":"translate(0,14.43%) scale(-.6,.6)"}]},"roadworks-ahead":{"category":"danger","name":"Roadworks ahead","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"white","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"roadworks","color":"black","transform":"scale(.7) translate(0,20%)"}]},"roundabout":{"category":"danger","name":"roundabout ahead","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"white","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"roundabout","color":"black","transform":"translate(0,14.43%) scale(.55)"}]},"children":{"category":"danger","name":"children","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"white","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"children","color":"black","transform":"translate(0,14.43%) scale(.75)"}]},"slippery-road-surface":{"category":"danger","name":"slippery road surface","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"white","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"slippery-road","color":"black","transform":"translate(0,14.43%) scale(.75)"}]},"traffic-signals-ahead":{"category":"danger","name":"traffic signal","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"white","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"circle-bg","color":"red","transform":"translate(0,14.43%) translate(0,-20%) scale(.13)"},{"type":"circle-bg","color":"yellow","transform":"translate(0,14.43%) translate(0,-5%) scale(.13)"},{"type":"circle-bg","color":"green","transform":"translate(0,14.43%) translate(0,10%) scale(.13)"}]},"two-way-traffic-ahead":{"category":"danger","name":"Two-way traffic ahead","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"white","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"DE-arrow-up","color":"black","transform":"translate(0,14.43%) scale(.35) translate(-25%,5%) rotate(180deg)"},{"type":"DE-arrow-up","color":"black","transform":"translate(0,14.43%) scale(.35) translate(25%,-5%)"}]},"uneven-road-ahead":{"category":"danger","name":"uneven road ahead","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"white","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"bumps","color":"black","transform":"translate(0,14.43%) scale(.45)"}]},"border":{"category":"information","name":"European border crossing into Germany","elements":[{"type":"square-rounded","color":"blue"},{"type":"europe_stars","color":"yellow"},{"type":"content-5","color":"white","content":"Bundes-","transform":"scale(.9) translate(0,-130%)"},{"type":"content-5","color":"white","content":"republik","transform":"scale(.9) translate(0,-30%)"},{"type":"content-5","color":"white","content":"Deutschland","transform":"scale(.9) translate(0,70%)"}]},"pedestrian-crossing_v2":{"category":"information","name":"pedestrian crossing","elements":[{"type":"square-rounded","color":"blue"},{"type":"tri-angular","color":"white","transform":"scale(.8)"},{"type":"pedestrian-crossing","color":"black"}]},"deadend":{"category":"information","name":"deadend","elements":[{"type":"square-rounded","color":"blue"},{"type":"square-angular","color":"white","transform":"translate(0,20%) scale(.15,.6)"},{"type":"square-angular","color":"red","transform":"translate(0,-15%) scale(.5,.15)"}]},"first-aid":{"category":"information","name":"first aid","elements":[{"type":"square-rounded","color":"blue"},{"type":"square-rounded","color":"white","transform":"scale(.7)"},{"type":"square-angular","color":"red","transform":"scale(.15,.5)"},{"type":"square-angular","color":"red","transform":"scale(.5,.15)"}]},"limited-access-road":{"category":"information","name":"limited-access road","elements":[{"type":"square-rounded","color":"blue"},{"type":"car","color":"white","transform":"scale(1.5)"}]},"parking-left":{"category":"information","name":"parking (left of this sign)","elements":[{"type":"square-rounded","color":"blue"},{"type":"parking","color":"white"},{"type":"DE-arrow-up","color":"white","transform":"translate(25%,30%) rotate(-90deg) scale(.33)"}]},"parking-right":{"category":"information","name":"parking (right of this sign)","elements":[{"type":"square-rounded","color":"blue"},{"type":"parking","color":"white"},{"type":"DE-arrow-up","color":"white","transform":"translate(25%,30%) rotate(90deg) scale(.33)"}]},"bus-stop":{"category":"information","name":"bus stop (also used for tram)","elements":[{"type":"circle-bg","color":"yellow"},{"type":"circle-o","color":"green"},{"type":"h","color":"green","transform":"scale(.8)"}]},"disabled-persons":{"category":"information","name":"disabled parking","elements":[{"type":"square-rounded","color":"blue"},{"type":"disabled-p","color":"white"}]},"parking":{"category":"information","name":"parking","elements":[{"type":"square-rounded","color":"blue"},{"type":"parking","color":"white"}]},"pedestrian-crossing_v3":{"category":"information","name":"pedestrian crossing","elements":[{"type":"square-rounded","color":"blue"},{"type":"tri-angular","color":"white","transform":"scale(.8)"},{"type":"pedestrian-crossing","color":"black"}]},"equestrians":{"category":"mandatory","name":"equestrian track","elements":[{"type":"circle-bg","color":"blue"},{"type":"equestrian","color":"white","transform":"scale(.7)"}]},"minimum-speed":{"category":"mandatory","name":"minimum speed","elements":[{"type":"circle-bg","color":"blue"},{"type":"speed_value","color":"white"}]},"minimum-speed-end":{"category":"mandatory","name":"end of minimum speed limit","elements":[{"type":"circle-bg","color":"blue"},{"type":"speed_value","color":"white"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(45deg)"}]},"pedestrian-bicycle-dual-track":{"category":"mandatory","name":"pedestrian/bicycle dual track","elements":[{"type":"circle-bg","color":"blue"},{"type":"bicycle","color":"white","transform":"scale(.6) translate(-40%,0)"},{"type":"footpath","color":"white","transform":"scale(.6) translate(40%,0)"},{"type":"circle-separator","color":"white"}]},"dual-path-pedestrians-and-cyclists":{"category":"mandatory","name":"bicycle/pedestrian dual track","elements":[{"type":"circle-bg","color":"blue"},{"type":"bicycle","color":"white","transform":"scale(.6) translate(40%,0)"},{"type":"footpath","color":"white","transform":"scale(.6) translate(-40%,0)"},{"type":"circle-separator","color":"white"}]},"dual-path-cyclists-and-pedestrians":{"category":"mandatory","name":"bicycle/pedestrian dual track","elements":[{"type":"circle-bg","color":"blue"},{"type":"footpath","color":"white","transform":"scale(.6) translate(40%,0)"},{"type":"bicycle","color":"white","transform":"scale(.6) translate(-40%,0)"},{"type":"circle-separator","color":"white"}]},"bicycles-only":{"category":"mandatory","name":"Bicycles only","elements":[{"type":"circle-bg","color":"blue"},{"type":"bicycle","color":"white"}]},"pedestrians-only":{"category":"mandatory","name":"Pedestrians only","elements":[{"type":"circle-bg","color":"blue"},{"type":"footpath","color":"white"}]},"turn-left":{"category":"mandatory","name":"Turn left","elements":[{"type":"circle-bg","color":"blue"},{"type":"DE-arrow-up","color":"white","transform":"rotate(-90deg)"}]},"turn-right":{"category":"mandatory","name":"Turn right","elements":[{"type":"circle-bg","color":"blue"},{"type":"DE-arrow-up","color":"white","transform":"rotate(90deg)"}]},"pass-on-either-side":{"category":"mandatory","name":"Pass on either side","elements":[{"type":"circle-bg","color":"blue"},{"type":"DE-arrow-up","color":"white","transform":"translate(0,-15%) rotate(135deg) scale(.6) translate(0,-32%)"},{"type":"DE-arrow-up","color":"white","transform":"translate(0,-15%) rotate(-135deg) scale(.6) translate(0,-32%)"}]},"proceed-straight":{"category":"mandatory","name":"Proceed straight or turn left","elements":[{"type":"circle-bg","color":"blue"},{"type":"DE-arrow-up","color":"white"}]},"proceed-straight-or-turn-left":{"category":"mandatory","name":"Proceed straight or turn left","elements":[{"type":"circle-bg","color":"blue"},{"type":"arrow-s-l","color":"white"}]},"proceed-straight-or-turn-right":{"category":"mandatory","name":"Proceed straight or turn right","elements":[{"type":"circle-bg","color":"blue"},{"type":"arrow-s-l","color":"white","transform":"scale(-1,1)"}]},"procced-straight":{"category":"mandatory","name":"go straight","elements":[{"type":"circle-bg","color":"blue"},{"type":"DE-arrow-up","color":"white"}]},"pass-on-this-side-left":{"category":"mandatory","name":"Pass on this side left","elements":[{"type":"circle-bg","color":"blue"},{"type":"DE-arrow-up","color":"white","transform":"rotate(-135deg)"}]},"pass-on-this-side-right":{"category":"mandatory","name":"Pass on this side right","elements":[{"type":"circle-bg","color":"blue"},{"type":"DE-arrow-up","color":"white","transform":"rotate(135deg)"}]},"shared-path-pedestrians-and-cyclists":{"category":"mandatory","name":"pedestrian cycle track","elements":[{"type":"circle-bg","color":"blue"},{"type":"footpath","color":"white","transform":"scale(.6) translate(0,-35%)"},{"type":"bicycle","color":"white","transform":"scale(.6) translate(0,35%)"},{"type":"circle-separator","color":"white","transform":"rotate(90deg)"}]},"roundabout_v2":{"category":"mandatory","name":"roundabout","elements":[{"type":"circle-bg","color":"blue"},{"type":"roundabout","color":"white","transform":"scale(1.25)"}]},"turn-left-ahead":{"category":"mandatory","name":"Turn left ahead","elements":[{"type":"circle-bg","color":"blue"},{"type":"arrow-l","color":"white","transform":"scale(1.25)"}]},"turn-right-ahead":{"category":"mandatory","name":"Turn right ahead","elements":[{"type":"circle-bg","color":"blue"},{"type":"arrow-l","color":"white","transform":"scale(-1.25, 1.25)"}]},"narrow-location-priority":{"category":"priority","name":"priority at narrow location","elements":[{"type":"square-rounded","color":"blue"},{"type":"DE-arrow-up","color":"red","transform":"scale(.8) translate(-25%,5%) rotate(180deg)"},{"type":"DE-arrow-up","color":"white","transform":"scale(.8) translate(25%,-5%)"}]},"narrow-location-no-priority":{"category":"priority","name":"no priority at narrow location","variation":"other","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"DE-arrow-up","color":"black","transform":"scale(.8) scale(.7) translate(-25%,5%) rotate(180deg)"},{"type":"DE-arrow-up","color":"red","transform":"scale(.8) scale(.7) translate(25%,-5%)"}]},"priority-road-end":{"category":"priority","name":"end of priority road","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"white","transform":"scale(0.707107) rotate(45deg) scale(.98)"},{"type":"square-rounded","color":"yellow","transform":"scale(.6) scale(0.707107) rotate(45deg)"},{"type":"square-angular","color":"black","transform":"scale(0.707107) rotate(45deg) scale(.05,1)"},{"type":"square-angular","color":"black","transform":"scale(0.707107) rotate(45deg) scale(.05,1) translate(150%,0)"},{"type":"square-angular","color":"black","transform":"scale(0.707107) rotate(45deg) scale(.05,1) translate(-150%,0)"}]},"give-way":{"category":"priority","name":"give way","elements":[{"type":"tri-rounded","color":"red","transform":"rotate(180deg)"},{"type":"tri-angular","color":"white","transform":"translate(0,-14.43%) scale(.7) translate(0,14.43%) rotate(180deg)"}]},"no-pedestrians":{"category":"prohibitory","name":"pedestrians prohibited","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"pedestrian","color":"black","transform":"scale(.8)"}]},"no-pedestrians-or-bicycles":{"category":"prohibitory","name":"pedestrians and bicycles prohibited","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"footpath","color":"black","transform":"scale(.8) scale(.6) translate(0,-35%)"},{"type":"bicycle","color":"black","transform":"scale(.8) scale(.6) translate(0,35%)"}]},"no-bicycles":{"category":"prohibitory","name":"cycling prohibited","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"bicycle","color":"black","transform":"scale(.8)"}]},"no-mopeds":{"category":"prohibitory","name":"mopeds prohibited","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"moped","color":"black","transform":"scale(.8) scale(.7)"}]},"no-motor-vehicles":{"category":"prohibitory","name":"motor vehicles prohibited","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"motorbike","color":"black","transform":"scale(.8) scale(.6) translate(0,-35%)"},{"type":"car","color":"black","transform":"scale(.8) scale(.6) translate(0,35%)"},{"type":"circle-separator","color":"black","transform":"rotate(90deg) scale(.8)"}]},"no-slow-vehicles":{"category":"prohibitory","name":"slow motorized vehicles prohibited","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"tractor","color":"black","transform":"scale(.8) scale(.7)"}]},"no-trailers":{"category":"prohibitory","name":"no trailers allowed","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"trailer","color":"black","transform":"scale(.8) scale(.8)"}]},"no-buses":{"category":"prohibitory","name":"no buses","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"bus","color":"black","transform":"scale(.8)"}]},"no-heavy-goods-vehicles":{"category":"prohibitory","name":"no heavy goods vehicles","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"truck","color":"black"}]},"no-trucks-and-buses":{"category":"prohibitory","name":"buses and trucks prohibited","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"truck","color":"black","transform":"scale(.8) scale(.6) translate(0,-35%)"},{"type":"bus","color":"black","transform":"scale(.8) scale(.6) translate(0,35%)"},{"type":"circle-separator","color":"black","transform":"rotate(90deg) scale(.8)"}]},"no-parking-or-stopping-left":{"category":"prohibitory","name":"no parking or stopping","elements":[{"type":"circle-bg","color":"blue"},{"type":"circle-o","color":"red"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(-45deg)"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(45deg)"},{"type":"DE-arrow-up","color":"white","transform":"rotate(-90deg) scale(.3) translate(95%)"}]},"no-parking-or-stopping-left-and-right":{"category":"prohibitory","name":"no parking or stopping","elements":[{"type":"circle-bg","color":"blue"},{"type":"circle-o","color":"red"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(-45deg)"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(45deg)"},{"type":"DE-arrow-up","color":"white","transform":"rotate(-90deg) scale(.3) translate(95%)"},{"type":"DE-arrow-up","color":"white","transform":"rotate(90deg) scale(.3) translate(95%)"}]},"no-parking-or-stopping-right":{"category":"prohibitory","name":"no parking or stopping","elements":[{"type":"circle-bg","color":"blue"},{"type":"circle-o","color":"red"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(-45deg)"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(45deg)"},{"type":"DE-arrow-up","color":"white","transform":"rotate(90deg) scale(.3) translate(95%)"}]},"no-parking-left":{"category":"prohibitory","name":"No parking","elements":[{"type":"circle-bg","color":"blue"},{"type":"circle-o","color":"red"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(-45deg)"},{"type":"DE-arrow-up","color":"white","transform":"rotate(90deg) scale(.3) translate(95%)"}]},"no-parking-left-and-right":{"category":"prohibitory","name":"no_parking","elements":[{"type":"circle-bg","color":"blue"},{"type":"circle-o","color":"red"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(-45deg)"},{"type":"DE-arrow-up","color":"white","transform":"rotate(90deg) scale(.3) translate(95%)"},{"type":"DE-arrow-up","color":"white","transform":"rotate(-90deg) scale(.3) translate(95%)"}]},"no-parking-right":{"category":"prohibitory","name":"no_parking","elements":[{"type":"circle-bg","color":"blue"},{"type":"circle-o","color":"red"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(-45deg)"},{"type":"DE-arrow-up","color":"white","transform":"rotate(-90deg) scale(.3) translate(95%)"}]},"speed-limit-zone":{"category":"prohibitory","name":"speed limit","elements":[{"type":"square-rounded","color":"black"},{"type":"square-rounded","color":"white","transform":"scale(.95)"},{"type":"circle-bg","color":"red","transform":"translate(0,-10%) scale(.65)"},{"type":"circle-bg","color":"white","transform":"translate(0,-10%) scale(.65) scale(.8)"},{"type":"speed_zone_value","color":"black","transform":"translate(0,-30%) scale(.7)"},{"type":"content-4","content":"ZONE","color":"black","transform":"translate(0,150%) scale(.8)"}]},"vehicle-weight-limit":{"category":"prohibitory","name":"vehicle weight limit","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"weight_value","color":"black"}]},"no-entry":{"category":"prohibitory","name":"no entry, one way street","elements":[{"type":"circle-bg","color":"red"},{"type":"square-angular","color":"white","transform":"scale(.92,.16)"}]},"priority-road":{"category":"priority","name":"Priority road","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"white","transform":"scale(.98) scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.6) scale(0.707107) rotate(45deg)"}]},"give-way-to-oncoming-traffic":{"category":"priority","name":"Give way to oncoming traffic","elements":[{"type":"circle-bg","color":"red"},{"type":"circle-bg","color":"white","transform":"scale(0.8)"},{"type":"DE-arrow-up","color":"black","transform":"scale(.7) translate(-25%,5%) rotate(180deg)"},{"type":"DE-arrow-up","color":"red","transform":"scale(.7) translate(25%,-5%)"}]},"stop":{"category":"priority","name":"stop","elements":[{"type":"octagon","color":"red"},{"type":"stop","color":"white"}]},"end-of-limits":{"category":"prohibitory","name":"end of all speed and passing limits","elements":[{"type":"circle-bg","color":"black"},{"type":"circle-bg","color":"white","transform":"scale(.95)"},{"type":"square-angular","color":"black","transform":"rotate(45deg) scale(.025,.99)"},{"type":"square-angular","color":"black","transform":"rotate(45deg) scale(.025,.98) translate(150%,0)"},{"type":"square-angular","color":"black","transform":"rotate(45deg) scale(.025,.97) translate(300%,0)"},{"type":"square-angular","color":"black","transform":"rotate(45deg) scale(.025,.98) translate(-150%,0)"},{"type":"square-angular","color":"black","transform":"rotate(45deg) scale(.025,.97) translate(-300%,0)"}]},"low-emission-zone":{"category":"prohibitory","name":"low-emission zone","elements":[{"type":"square-rounded","color":"black"},{"type":"square-rounded","color":"white","transform":"scale(.95)"},{"type":"circle-bg","color":"red","transform":"translate(0,-8%) scale(.7)"},{"type":"circle-bg","color":"white","transform":"translate(0,-8%) scale(.7) scale(.8)"},{"type":"content-4","content":"Umwelt","color":"black","transform":"translate(0,-50%) scale(.8) scale(.8)"},{"type":"content-4","content":"ZONE","color":"black","transform":"translate(0,150%) scale(.8)"}]},"low-emission-zone-end":{"category":"prohibitory","name":"end of low-emission zone","elements":[{"type":"square-rounded","color":"black"},{"type":"square-rounded","color":"white","transform":"scale(.95)"},{"type":"circle-bg","color":"grey","transform":"translate(0,-8%) scale(.7)"},{"type":"circle-bg","color":"white","transform":"translate(0,-8%) scale(.7) scale(.8)"},{"type":"content-4","content":"Umwelt","color":"grey","transform":"translate(0,-50%) scale(.8) scale(.8)"},{"type":"content-4","content":"ZONE","color":"grey","transform":"translate(0,150%) scale(.8)"},{"type":"square-angular","color":"black","transform":"rotate(45deg) scale(.02,1.35)"},{"type":"square-angular","color":"black","transform":"rotate(45deg) scale(.02,1.3) translate(-150%, 0)"},{"type":"square-angular","color":"black","transform":"rotate(45deg) scale(.02,1.3) translate(150%, 0)"},{"type":"square-angular","color":"black","transform":"rotate(45deg) scale(.02,1.25) translate(-300%, 0)"},{"type":"square-angular","color":"black","transform":"rotate(45deg) scale(.02,1.25) translate(300%, 0)"}]},"no-moped-vehicles":{"category":"prohibitory","name":"No moped vehicles","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"moped","color":"black","transform":"scale(.8) scale(.6) translate(0,-35%) scale(.7)"},{"type":"bicycle","color":"black","transform":"scale(.8) scale(.6) translate(0,35%)"}]},"no-motorcycles":{"category":"prohibitory","name":"No motorcycles","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"motorbike","color":"black","transform":"scale(.8)"}]},"no-parking":{"category":"prohibitory","name":"no parking","elements":[{"type":"circle-bg","color":"blue"},{"type":"circle-o","color":"red"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(-45deg)"}]},"no-stopping-or-parking":{"category":"prohibitory","name":"no parking or stopping","elements":[{"type":"circle-bg","color":"blue"},{"type":"circle-o","color":"red"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(-45deg)"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(45deg)"}]},"no-traffic-both-ways":{"category":"prohibitory","name":"no traffic both ways","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"}]},"no-u-turn":{"category":"prohibitory","name":"no u-turn","elements":[{"type":"circle-bg","color":"red"},{"type":"circle-bg","color":"white","transform":"scale(.8)"},{"type":"turnaround","color":"black"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(-55deg)"},{"type":"turnaround2","color":"black"}]},"no-vehicles-carrying-dangerous-goods":{"category":"prohibitory","name":"no vehicles with dangerous goods","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"square-rounded","color":"orange","transform":"scale(.25) translate(0,-25%)"},{"type":"lorry","color":"black"}]},"no-left-turn":{"category":"prohibitory","name":"no turn left","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"turn-l","color":"black"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(45deg)"}]},"no-right-turn":{"category":"prohibitory","name":"no turn right","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"turn-l","color":"black","transform":"scale(-1,1)"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(-45deg)"}]},"no-overtaking":{"category":"prohibitory","name":"no overtaking","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"car","color":"red","transform":"scale(.6) translate(-26%,10%)"},{"type":"car","color":"black","transform":"scale(.6) translate(26%,10%)"}]},"no-overtaking-by-heavy-goods-vehicles":{"category":"prohibitory","name":"no overtaking by heavy goods vehicles","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"lorry-left","color":"red"},{"type":"car","color":"black","transform":"scale(.6) translate(26%,10%)"}]},"maximum-speed-limit":{"category":"prohibitory","name":"Maximum speed limit","elements":[{"type":"circle-bg","color":"red"},{"type":"circle-bg","color":"white","transform":"scale(.8)"},{"type":"speed_value","color":"black"}]},"maximum-height":{"category":"prohibitory","name":"Maximum height","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"height","color":"black"},{"type":"height_value","color":"black"}]},"maximum-width":{"category":"prohibitory","name":"Maximum width","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"height","color":"black","transform":"rotate(90deg)"},{"type":"width_value","color":"black"}]},"destination":{"category":"supplementary","name":"destination traffic excluded","elements":[{"type":"square-rounded","color":"black","transform":"scale(1,.5)"},{"type":"square-rounded","color":"white","transform":"scale(.95, .45)"},{"type":"content-4","color":"black","content":"Anlieger","transform":"translate(0,-45%) scale(.8)"},{"type":"content-4","color":"black","content":"frei","transform":"translate(0,45%) scale(.8)"}]},"disabled":{"category":"supplementary","name":"for disabled people","elements":[{"type":"square-rounded","color":"black","transform":"scale(1,.5)"},{"type":"square-rounded","color":"white","transform":"scale(.95, .45)"},{"type":"disabled-p","color":"black","transform":"scale(.6)"}]},"glaze":{"category":"supplementary","name":"glaze","elements":[{"type":"square-rounded","color":"black","transform":"scale(1,.5)"},{"type":"square-rounded","color":"white","transform":"scale(.95, .45)"},{"type":"snowflake","color":"black","transform":"scale(.8)"}]},"left-pointing":{"category":"supplementary","name":"left pointing","elements":[{"type":"square-rounded","color":"black","transform":"scale(1,.5)"},{"type":"square-rounded","color":"white","transform":"scale(.95, .45)"},{"type":"DE-arrow-up","color":"black","transform":"scale(.6) rotate(-90deg)"}]},"both-directions":{"category":"supplementary","name":"both directions","elements":[{"type":"square-rounded","color":"black","transform":"scale(1,.5)"},{"type":"square-rounded","color":"white","transform":"scale(.95, .45)"},{"type":"DE-arrow-up","color":"black","transform":"translate(-15%,0) scale(.5) rotate(180deg)"},{"type":"DE-arrow-up","color":"black","transform":"translate(15%,0) scale(.5)"}]},"pedestrians-use-opposite-sidewalk":{"category":"supplementary","name":"pedestrians should use opposite sidewalk","variation":"left","elements":[{"type":"square-rounded","color":"black","transform":"scale(1,.5)"},{"type":"square-rounded","color":"white","transform":"scale(.95, .45)"},{"type":"DE-arrow-up","color":"black","transform":"translate(-20%,0) scale(.5) rotate(-90deg)"},{"type":"pedestrians","color":"black","transform":"translate(25%,0) scale(.6)"}]},"pedestrians-use-opposite-sidewalk_v2":{"category":"supplementary","name":"pedestrians should use opposite sidewalk","variation":"right","elements":[{"type":"square-rounded","color":"black","transform":"scale(1,.5)"},{"type":"square-rounded","color":"white","transform":"scale(.95, .45)"},{"type":"DE-arrow-up","color":"black","transform":"translate(20%,0) scale(.5) rotate(90deg)"},{"type":"pedestrians","color":"black","transform":"translate(-25%,0) scale(.6)"}]},"railway-only":{"category":"supplementary","name":"railway only","elements":[{"type":"square-rounded","color":"black","transform":"scale(1,.5)"},{"type":"square-rounded","color":"white","transform":"scale(.95, .45)"},{"type":"train-electric","color":"black","transform":"scale(.45)"}]},"right-pointing":{"category":"supplementary","name":"right pointing","elements":[{"type":"square-rounded","color":"black","transform":"scale(1,.5)"},{"type":"square-rounded","color":"white","transform":"scale(.95, .45)"},{"type":"DE-arrow-up","color":"black","transform":"scale(.6) rotate(90deg)"}]},"entry":{"category":"other","name":"entry, one way street","elements":[{"type":"square-rounded","color":"blue"},{"type":"arrow-oneway","color":"white","transform":"scale(.75)"}]},"priority-road-bends-left-3way":{"category":"supplementary","name":"priority road bends to the left at a 3-way intersection","variation":"1","elements":[{"type":"square-rounded","color":"black"},{"type":"square-rounded","color":"white","transform":"scale(.95, .95)"},{"type":"square-angular","color":"black","transform":"translate(0,-30%) scale(.1,.25)"},{"type":"bending-priority","color":"black","transform":"scale(-.85,.85)"}]},"priority-road-bends-left-3way_v2":{"category":"supplementary","name":"priority road bends to the left at a 3-way intersection","variation":"2","elements":[{"type":"square-rounded","color":"black"},{"type":"square-rounded","color":"white","transform":"scale(.95, .95)"},{"type":"square-angular","color":"black","transform":"rotate(-90deg) translate(0,30%) scale(.1,.25)"},{"type":"bending-priority","color":"black","transform":"scale(-.85,.85)"}]},"priority-road-bends-left-4way":{"category":"supplementary","name":"priority road bends to the left at a 4-way intersection","elements":[{"type":"square-rounded","color":"black"},{"type":"square-rounded","color":"white","transform":"scale(.95, .95)"},{"type":"square-angular","color":"black","transform":"translate(0,-30%) scale(.1,.25)"},{"type":"square-angular","color":"black","transform":"rotate(-90deg) translate(0,30%) scale(.1,.25)"},{"type":"bending-priority","color":"black","transform":"scale(-.85,.85)"}]},"priority-road-bends-right-3way":{"category":"supplementary","name":"priority road bends to the right at a 3-way intersection","variation":"1","elements":[{"type":"square-rounded","color":"black"},{"type":"square-rounded","color":"white","transform":"scale(.95, .95)"},{"type":"square-angular","color":"black","transform":"translate(0,-30%) scale(.1,.25)"},{"type":"bending-priority","color":"black","transform":"scale(.85)"}]},"priority-road-bends-right-3way_v2":{"category":"supplementary","name":"priority road bends to the right at a 3-way intersection","variation":"2","elements":[{"type":"square-rounded","color":"black"},{"type":"square-rounded","color":"white","transform":"scale(.95, .95)"},{"type":"square-angular","color":"black","transform":"rotate(90deg) translate(0,30%) scale(.1,.25)"},{"type":"bending-priority","color":"black","transform":"scale(.85)"}]},"priority-road-bends-right-4way":{"category":"supplementary","name":"priority road bends to the right at a 4-way intersection","elements":[{"type":"square-rounded","color":"black"},{"type":"square-rounded","color":"white","transform":"scale(.95, .95)"},{"type":"square-angular","color":"black","transform":"translate(0,-30%) scale(.1,.25)"},{"type":"square-angular","color":"black","transform":"rotate(90deg) translate(0,30%) scale(.1,.25)"},{"type":"bending-priority","color":"black","transform":"scale(.85)"}]},"priority-road-from-left-3way":{"category":"supplementary","name":"priority road comes from the left and continues straight at a 3-way intersection","elements":[{"type":"square-rounded","color":"black"},{"type":"square-rounded","color":"white","transform":"scale(.95, .95)"},{"type":"square-angular","color":"black","transform":"translate(0,30%) scale(.1,.25)"},{"type":"bending-priority","color":"black","transform":"scale(-.85,-.85)"}]},"priority-road-from-left-4way":{"category":"supplementary","name":"priority road comes from the left and continues straight at a 4-way intersection","elements":[{"type":"square-rounded","color":"black"},{"type":"square-rounded","color":"white","transform":"scale(.95, .95)"},{"type":"square-angular","color":"black","transform":"translate(0,30%) scale(.1,.25)"},{"type":"square-angular","color":"black","transform":"rotate(-90deg) translate(0,30%) scale(.1,.25)"},{"type":"bending-priority","color":"black","transform":"scale(-.85,-.85)"}]},"priority-road-from-right-3way":{"category":"supplementary","name":"priority road comes from the right and continues straight at a 3-way intersection","elements":[{"type":"square-rounded","color":"black"},{"type":"square-rounded","color":"white","transform":"scale(.95, .95)"},{"type":"square-angular","color":"black","transform":"translate(0,30%) scale(.1,.25)"},{"type":"bending-priority","color":"black","transform":"scale(.85,-.85)"}]},"priority-road-from-right-4way":{"category":"supplementary","name":"priority road comes from the right and continues straight at a 4-way intersection","elements":[{"type":"square-rounded","color":"black"},{"type":"square-rounded","color":"white","transform":"scale(.95, .95)"},{"type":"square-angular","color":"black","transform":"translate(0,30%) scale(.1,.25)"},{"type":"square-angular","color":"black","transform":"rotate(90deg) translate(0,30%) scale(.1,.25)"},{"type":"bending-priority","color":"black","transform":"scale(.85,-.85)"}]}} \ No newline at end of file diff --git a/vendor/assets/iD/iD/traffico/signs/dk.json b/vendor/assets/iD/iD/traffico/signs/dk.json new file mode 100644 index 000000000..6ef80de13 --- /dev/null +++ b/vendor/assets/iD/iD/traffico/signs/dk.json @@ -0,0 +1 @@ +{"danger_level_crossing":{"category":"danger","name":"level crossing","elements":[{"type":"square-angular","color":"red","transform":"rotate(60deg) scale(.2,1)"},{"type":"square-angular","color":"red","transform":"rotate(-60deg) scale(.2,1)"},{"type":"square-angular","color":"white","transform":"rotate(60deg) scale(.1,.5) translate(50%,50%)"},{"type":"square-angular","color":"white","transform":"rotate(-60deg) scale(.1,.5) translate(-50%,50%)"},{"type":"square-angular","color":"white","transform":"rotate(60deg) scale(.1,.5) translate(-50%,-50%)"},{"type":"square-angular","color":"white","transform":"rotate(-60deg) scale(.1,.5) translate(50%,-50%)"}]},"information_border_dk":{"category":"information","name":"European border crossing into Denmark","elements":[{"type":"square-rounded","color":"blue"},{"type":"europe_stars","color":"yellow"},{"type":"content-5","color":"white","content":"Danmark"}]},"no_trucks":{"category":"prohibitory","name":"no trucks","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"truck","color":"black"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(-45deg)"}]},"priority-road-end":{"category":"priority","name":"end of priority road","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"white","transform":"scale(.98) scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.6) scale(0.707107) rotate(45deg)"},{"type":"square-angular","color":"black","transform":"scale(0.707107) rotate(45deg) scale(.2,1)"}]},"railway-crossing-unsecured":{"category":"danger","name":"unsecured railway crossing","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"white","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"railway-xing-unsecured","color":"black","transform":"translate(0,13%) scale(.4)"}]}} \ No newline at end of file diff --git a/vendor/assets/iD/iD/traffico/signs/ee.json b/vendor/assets/iD/iD/traffico/signs/ee.json new file mode 100644 index 000000000..cd83633da --- /dev/null +++ b/vendor/assets/iD/iD/traffico/signs/ee.json @@ -0,0 +1 @@ +{"information_border_ee":{"category":"information","name":"European border crossing into Estonia","elements":[{"type":"square-rounded","color":"blue"},{"type":"europe_stars","color":"yellow"},{"type":"content-5","color":"white","content":"EESTI"}]}} \ No newline at end of file diff --git a/vendor/assets/iD/iD/traffico/signs/es.json b/vendor/assets/iD/iD/traffico/signs/es.json new file mode 100644 index 000000000..2510621fd --- /dev/null +++ b/vendor/assets/iD/iD/traffico/signs/es.json @@ -0,0 +1 @@ +{"information_border_es":{"category":"information","name":"European border crossing into Spain","elements":[{"type":"square-rounded","color":"blue"},{"type":"europe_stars","color":"yellow"},{"type":"content-5","color":"white","content":"ESPAÑA"}]},"pedestrian-crossing":{"category":"danger","name":"pedestrian crossing","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"white","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"pedestrian","color":"black","transform":"scale(.8) translate(0,5%)"}]},"road-narrows-ahead":{"category":"danger","name":"Road narrows","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"white","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"narrow-road-both","color":"black","transform":"translate(0,14.43%) scale(.6)"}]},"priority-road-end":{"category":"priority","name":"end of priority road","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"white","transform":"scale(.98) scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.6) scale(0.707107) rotate(45deg)"},{"type":"square-angular","color":"black","transform":"scale(0.707107) rotate(45deg) scale(.2,1)"}]},"railway-crossing-unsecured":{"category":"danger","name":"unsecured railway crossing","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"white","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"railway-xing-unsecured","color":"black","transform":"translate(0,13%) scale(.4)"}]}} \ No newline at end of file diff --git a/vendor/assets/iD/iD/traffico/signs/fi.json b/vendor/assets/iD/iD/traffico/signs/fi.json new file mode 100644 index 000000000..d53f0fa2d --- /dev/null +++ b/vendor/assets/iD/iD/traffico/signs/fi.json @@ -0,0 +1 @@ +{"information_border_fi":{"category":"information","name":"European border crossing into Finland","elements":[{"type":"square-rounded","color":"blue"},{"type":"europe_stars","color":"yellow"},{"type":"content-5","color":"white","content":"SUOMI","transform":"translate(0,-100%)"},{"type":"content-5","color":"white","content":"FINLAND","transform":"translate(0,0)"},{"type":"content-5","color":"white","content":"SUOPMA","transform":"translate(0,100%)"}]},"cyclists-crossing-ahead":{"category":"danger","name":"cyclists crossing ahead","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"yellow","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"bicycle","color":"black","transform":"scale(.65) translate(0,25%)"}]},"priority-road-end":{"category":"priority","name":"end of priority road","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"white","transform":"scale(.98) scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.6) scale(0.707107) rotate(45deg)"},{"type":"square-angular","color":"black","transform":"scale(0.707107) rotate(45deg) scale(.2,1)"}]},"railway-crossing-unsecured":{"category":"danger","name":"unsecured railway crossing","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"yellow","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"railway-xing-unsecured","color":"black","transform":"translate(0,13%) scale(.4)"}]}} \ No newline at end of file diff --git a/vendor/assets/iD/iD/traffico/signs/fr.json b/vendor/assets/iD/iD/traffico/signs/fr.json new file mode 100644 index 000000000..c65d5931b --- /dev/null +++ b/vendor/assets/iD/iD/traffico/signs/fr.json @@ -0,0 +1 @@ +{"information_border_fr":{"category":"information","name":"European border crossing into France","elements":[{"type":"square-rounded","color":"blue"},{"type":"europe_stars","color":"yellow"},{"type":"content-5","color":"white","content":"FRANCE"}]},"information_city_entrance":{"category":"information","name":"entrée commune ref:EB10","elements":[{"type":"square-angular","color":"white","transform":"scale(1,.5)"},{"type":"square-angular","color":"red","transform":"scale(.95,.45)"},{"type":"square-angular","color":"white","transform":"scale(.9,.4)"},{"type":"content-5","color":"black","content":"some city"}]},"information_city_exit":{"category":"information","name":"sortie commune ref:EB20","elements":[{"type":"square-angular","color":"white","transform":"scale(1,.5)"},{"type":"square-angular","color":"black","transform":"scale(.95,.45)"},{"type":"square-angular","color":"white","transform":"scale(.9,.4)"},{"type":"content-5","color":"black","content":"some city"},{"type":"square-diagonal-bar","color":"red","transform":"scale(.9,.4)"}]},"priority-road-end":{"category":"priority","name":"end of priority road","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"white","transform":"scale(.98) scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.6) scale(0.707107) rotate(45deg)"},{"type":"square-angular","color":"black","transform":"scale(0.707107) rotate(45deg) scale(.2,1)"}]},"railway-crossing-unsecured":{"category":"danger","name":"unsecured railway crossing","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"white","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"railway-xing-unsecured","color":"black","transform":"translate(0,13%) scale(.4)"}]}} \ No newline at end of file diff --git a/vendor/assets/iD/iD/traffico/signs/gr.json b/vendor/assets/iD/iD/traffico/signs/gr.json new file mode 100644 index 000000000..7f66bdc99 --- /dev/null +++ b/vendor/assets/iD/iD/traffico/signs/gr.json @@ -0,0 +1 @@ +{"information_border_gr":{"category":"information","name":"European border crossing into Greece","elements":[{"type":"square-rounded","color":"blue"},{"type":"europe_stars","color":"yellow"},{"type":"content-5","color":"yellow","content":"EΛΛAΣ","transform":"translate(0,-50%)"},{"type":"content-5","color":"white","content":"GREECE","transform":"translate(0,50%)"}]},"priority-road-end":{"category":"priority","name":"end of priority road","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"white","transform":"scale(.98) scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.6) scale(0.707107) rotate(45deg)"},{"type":"square-angular","color":"black","transform":"scale(0.707107) rotate(45deg) scale(.2,1)"}]},"railway-crossing-unsecured":{"category":"danger","name":"unsecured railway crossing","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"yellow","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"railway-xing-unsecured","color":"black","transform":"translate(0,13%) scale(.4)"}]}} \ No newline at end of file diff --git a/vendor/assets/iD/iD/traffico/signs/hu.json b/vendor/assets/iD/iD/traffico/signs/hu.json new file mode 100644 index 000000000..7f0f9f2ad --- /dev/null +++ b/vendor/assets/iD/iD/traffico/signs/hu.json @@ -0,0 +1 @@ +{"information_border_hu":{"category":"information","name":"European border crossing into Hungary","elements":[{"type":"square-rounded","color":"blue"},{"type":"europe_stars","color":"yellow"},{"type":"content-5","color":"white","content":"Magyarország","transform":"scale(.75)"}]},"priority-road-end":{"category":"priority","name":"end of priority road","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"white","transform":"scale(.98) scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.6) scale(0.707107) rotate(45deg)"},{"type":"square-angular","color":"black","transform":"scale(0.707107) rotate(45deg) scale(.2,1)"}]},"railway-crossing-unsecured":{"category":"danger","name":"unsecured railway crossing","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"white","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"railway-xing-unsecured","color":"black","transform":"translate(0,13%) scale(.4)"}]}} \ No newline at end of file diff --git a/vendor/assets/iD/iD/traffico/signs/it.json b/vendor/assets/iD/iD/traffico/signs/it.json new file mode 100644 index 000000000..96f44a889 --- /dev/null +++ b/vendor/assets/iD/iD/traffico/signs/it.json @@ -0,0 +1 @@ +{"information_border_it":{"category":"information","name":"European border crossing into Italy","elements":[{"type":"square-rounded","color":"blue"},{"type":"europe_stars","color":"yellow"},{"type":"content-5","color":"white","content":"ITALIA"}]},"cyclists-crossing-ahead":{"category":"danger","name":"cyclists crossing ahead","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"yellow","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"bicycle","color":"black","transform":"scale(.65) translate(0,25%)"}]},"children":{"category":"danger","name":"children","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"white","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"children","color":"black","transform":"translate(0,14.43%) scale(.75)"}]},"level-crossing":{"category":"danger","name":"Level crossing","variation":"other","elements":[{"type":"level-crossing","color":"red"},{"type":"level-crossing","color":"red","transform":"scale(-1,1)"},{"type":"square-angular","color":"white","transform":"rotate(60deg) scale(.05,1)"},{"type":"square-angular","color":"white","transform":"rotate(-60deg) scale(.05,1)"}]},"pedestrians-only":{"category":"mandatory","name":"pedestrians only","elements":[{"type":"circle-bg","color":"blue"},{"type":"pedestrian","color":"white","transform":""}]},"priority-road-end":{"category":"priority","name":"end of priority road","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"white","transform":"scale(.98) scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.6) scale(0.707107) rotate(45deg)"},{"type":"square-angular","color":"black","transform":"scale(0.707107) rotate(45deg) scale(.2,1)"}]},"railway-crossing-unsecured":{"category":"danger","name":"unsecured railway crossing","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"white","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"railway-xing-unsecured","color":"black","transform":"translate(0,13%) scale(.4)"}]},"turn-right-ahead":{"category":"mandatory","name":"turn right ahead","elements":[{"type":"circle-bg","color":"blue"},{"type":"arrow-l","color":"white","transform":"scale(-1,1)"}]}} \ No newline at end of file diff --git a/vendor/assets/iD/iD/traffico/signs/lt.json b/vendor/assets/iD/iD/traffico/signs/lt.json new file mode 100644 index 000000000..72a351c61 --- /dev/null +++ b/vendor/assets/iD/iD/traffico/signs/lt.json @@ -0,0 +1 @@ +{"information_border_lt":{"category":"information","name":"European border crossing into Lithuania","elements":[{"type":"square-rounded","color":"blue"},{"type":"europe_stars","color":"yellow"},{"type":"content-5","color":"white","content":"Lietuvos","transform":"translate(0,-80%)"},{"type":"content-5","color":"white","content":"Respublika","transform":"translate(0,20%)"}]}} \ No newline at end of file diff --git a/vendor/assets/iD/iD/traffico/signs/lu.json b/vendor/assets/iD/iD/traffico/signs/lu.json new file mode 100644 index 000000000..0be6c4286 --- /dev/null +++ b/vendor/assets/iD/iD/traffico/signs/lu.json @@ -0,0 +1 @@ +{"information_border_lu_fr":{"category":"information","name":"European border crossing into Luxembourg from France","elements":[{"type":"square-rounded","color":"blue"},{"type":"europe_stars","color":"yellow"},{"type":"content-5","color":"white","content":"Luxembourg","transform":"scale(.85)"}]},"information_border_lu_de":{"category":"information","name":"European border crossing into Luxembourg from Germany","elements":[{"type":"square-rounded","color":"blue"},{"type":"europe_stars","color":"yellow"},{"type":"content-5","color":"white","content":"Luxemburg","transform":"scale(.85)"}]}} \ No newline at end of file diff --git a/vendor/assets/iD/iD/traffico/signs/lv.json b/vendor/assets/iD/iD/traffico/signs/lv.json new file mode 100644 index 000000000..baef29b8c --- /dev/null +++ b/vendor/assets/iD/iD/traffico/signs/lv.json @@ -0,0 +1 @@ +{"information_border_lv":{"category":"information","name":"European border crossing into Latvia","elements":[{"type":"square-rounded","color":"blue"},{"type":"europe_stars","color":"yellow"},{"type":"content-5","color":"white","content":"LATVIJA"}]}} \ No newline at end of file diff --git a/vendor/assets/iD/iD/traffico/signs/nl.json b/vendor/assets/iD/iD/traffico/signs/nl.json new file mode 100644 index 000000000..8f539ce5a --- /dev/null +++ b/vendor/assets/iD/iD/traffico/signs/nl.json @@ -0,0 +1 @@ +{"information_border_nl":{"category":"information","name":"European border crossing into the Netherlands","elements":[{"type":"square-rounded","color":"blue"},{"type":"europe_stars","color":"yellow"},{"type":"content-5","color":"white","content":"Nederland"}]},"information_cycleway":{"category":"information","name":"non-compulsory cycleway","elements":[{"type":"square-rounded","color":"white","transform":"scale(1,.3)"},{"type":"square-rounded","color":"blue","transform":"scale(.95,.25)"},{"type":"content-4","color":"white","content":"fietspad"}]},"priority-road-end":{"category":"priority","name":"end of priority road","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"white","transform":"scale(0.707107) rotate(45deg) scale(.98)"},{"type":"square-rounded","color":"yellow","transform":"scale(.6) scale(0.707107) rotate(45deg)"},{"type":"square-angular","color":"black","transform":"scale(0.707107) rotate(45deg) scale(.05,1)"},{"type":"square-angular","color":"black","transform":"scale(0.707107) rotate(45deg) scale(.05,1) translate(150%,0)"},{"type":"square-angular","color":"black","transform":"scale(0.707107) rotate(45deg) scale(.05,1) translate(-150%,0)"}]},"railway-crossing-unsecured":{"category":"danger","name":"unsecured railway crossing","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"white","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"railway-xing-unsecured","color":"black","transform":"translate(0,13%) scale(.4)"}]}} \ No newline at end of file diff --git a/vendor/assets/iD/iD/traffico/signs/no.json b/vendor/assets/iD/iD/traffico/signs/no.json new file mode 100644 index 000000000..35fe6c3b7 --- /dev/null +++ b/vendor/assets/iD/iD/traffico/signs/no.json @@ -0,0 +1 @@ +{"no_trucks":{"category":"prohibitory","name":"no trucks","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"truck","color":"black"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(-45deg)"}]},"priority-road-end":{"category":"priority","name":"end of priority road","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"white","transform":"scale(.98) scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.6) scale(0.707107) rotate(45deg)"},{"type":"square-angular","color":"black","transform":"scale(0.707107) rotate(45deg) scale(.2,1)"}]},"railway-crossing-unsecured":{"category":"danger","name":"unsecured railway crossing","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"white","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"railway-xing-unsecured","color":"black","transform":"translate(0,13%) scale(.4)"}]}} \ No newline at end of file diff --git a/vendor/assets/iD/iD/traffico/signs/pl.json b/vendor/assets/iD/iD/traffico/signs/pl.json new file mode 100644 index 000000000..d4cc43641 --- /dev/null +++ b/vendor/assets/iD/iD/traffico/signs/pl.json @@ -0,0 +1 @@ +{"information_border_pl":{"category":"information","name":"European border crossing into Poland","elements":[{"type":"square-rounded","color":"blue"},{"type":"europe_stars","color":"yellow"},{"type":"content-5","color":"white","content":"Rzeczpospolita","transform":"translate(0,-70%) scale(.7)"},{"type":"content-5","color":"white","content":"Polska","transform":"translate(0,40%)"}]},"pedestrian-crossing":{"category":"danger","name":"pedestrian crossing","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"yellow","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"pedestrian","color":"black","transform":"scale(.8) translate(0,5%)"}]},"priority-road-end":{"category":"priority","name":"end of priority road","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"white","transform":"scale(.98) scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.6) scale(0.707107) rotate(45deg)"},{"type":"square-angular","color":"black","transform":"scale(0.707107) rotate(45deg) scale(.2,1)"}]},"railway-crossing-unsecured":{"category":"danger","name":"unsecured railway crossing","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"yellow","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"railway-xing-unsecured","color":"black","transform":"translate(0,13%) scale(.4)"}]}} \ No newline at end of file diff --git a/vendor/assets/iD/iD/traffico/signs/se.json b/vendor/assets/iD/iD/traffico/signs/se.json new file mode 100644 index 000000000..7d54d44b2 --- /dev/null +++ b/vendor/assets/iD/iD/traffico/signs/se.json @@ -0,0 +1 @@ +{"information_border_se":{"category":"information","name":"European border crossing into Sweden","elements":[{"type":"square-rounded","color":"blue"},{"type":"europe_stars","color":"yellow"},{"type":"content-5","color":"white","content":"SVERIGE"}]},"cyclists-crossing-ahead":{"category":"danger","name":"cyclists crossing ahead","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"yellow","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"bicycle","color":"black","transform":"scale(.65) translate(0,25%)"}]},"pedestrian-crossing":{"category":"danger","name":"pedestrian crossing","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"yellow","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"pedestrian","color":"black","transform":"scale(.8) translate(0,5%)"}]},"priority-road-end":{"category":"priority","name":"end of priority road","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"white","transform":"scale(.98) scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.6) scale(0.707107) rotate(45deg)"},{"type":"square-angular","color":"black","transform":"scale(0.707107) rotate(45deg) scale(.2,1)"}]},"railway-crossing-unsecured":{"category":"danger","name":"unsecured railway crossing","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"yellow","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"railway-xing-unsecured","color":"black","transform":"translate(0,13%) scale(.4)"}]},"children":{"category":"danger","name":"children","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"yellow","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"children","color":"black","transform":"translate(0,14.43%) scale(.75)"}]},"give-way-to-oncoming-traffic":{"category":"priority","name":"give way to oncoming traffic","elements":[{"type":"circle-bg","color":"red"},{"type":"circle-bg","color":"yellow","transform":"scale(0.8)"},{"type":"DE-arrow-up","color":"black","transform":"scale(.7) translate(-25%,5%) rotate(180deg)"},{"type":"DE-arrow-up","color":"red","transform":"scale(.7) translate(25%,-5%)"}]},"no-bicycles":{"category":"prohibitory","name":"no bicycles","elements":[{"type":"circle-bg","color":"yellow"},{"type":"circle-o","color":"red"},{"type":"bicycle","color":"black","transform":"scale(.8)"}]},"no-pedestrians":{"category":"prohibitory","name":"no pedestrians","elements":[{"type":"circle-bg","color":"yellow"},{"type":"circle-o","color":"red"},{"type":"pedestrian","color":"black","transform":"scale(.8)"}]}} \ No newline at end of file diff --git a/vendor/assets/iD/iD/traffico/signs/si.json b/vendor/assets/iD/iD/traffico/signs/si.json new file mode 100644 index 000000000..63268a788 --- /dev/null +++ b/vendor/assets/iD/iD/traffico/signs/si.json @@ -0,0 +1 @@ +{"information_border_si":{"category":"information","name":"European border crossing into Slovenia","elements":[{"type":"square-rounded","color":"blue"},{"type":"europe_stars","color":"yellow"},{"type":"content-5","color":"white","content":"SLOVENIA","transform":"scale(.85)"}]}} \ No newline at end of file diff --git a/vendor/assets/iD/iD/traffico/signs/sk.json b/vendor/assets/iD/iD/traffico/signs/sk.json new file mode 100644 index 000000000..64db3d750 --- /dev/null +++ b/vendor/assets/iD/iD/traffico/signs/sk.json @@ -0,0 +1 @@ +{"information_border_sk":{"category":"information","name":"European border crossing into Slovakia","elements":[{"type":"square-rounded","color":"blue"},{"type":"europe_stars","color":"yellow"},{"type":"content-5","color":"white","content":"SLOVENSKO","transform":"scale(.8)"}]},"priority-road-end":{"category":"priority","name":"end of priority road","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"white","transform":"scale(0.707107) rotate(45deg) scale(.98)"},{"type":"square-rounded","color":"yellow","transform":"scale(.6) scale(0.707107) rotate(45deg)"},{"type":"square-angular","color":"black","transform":"scale(0.707107) rotate(45deg) scale(.05,1)"},{"type":"square-angular","color":"black","transform":"scale(0.707107) rotate(45deg) scale(.05,1) translate(150%,0)"},{"type":"square-angular","color":"black","transform":"scale(0.707107) rotate(45deg) scale(.05,1) translate(-150%,0)"}]},"railway-crossing-unsecured":{"category":"danger","name":"unsecured railway crossing","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"white","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"railway-xing-unsecured","color":"black","transform":"translate(0,13%) scale(.4)"}]}} \ No newline at end of file diff --git a/vendor/assets/iD/iD/traffico/signs/uk.json b/vendor/assets/iD/iD/traffico/signs/uk.json new file mode 100644 index 000000000..670f728ae --- /dev/null +++ b/vendor/assets/iD/iD/traffico/signs/uk.json @@ -0,0 +1 @@ +{"danger_contraflow":{"category":"danger","name":"contraflow","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"white","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"DE-arrow-up","color":"black","transform":"translate(0,14.43%) scale(.35) translate(-25%,-5%)"},{"type":"DE-arrow-up","color":"black","transform":"translate(0,14.43%) scale(.35) translate(25%,5%) rotate(180deg)"}]},"level-crossing":{"category":"danger","name":"Level crossing","variation":"other","elements":[{"type":"level-crossing","color":"red"},{"type":"level-crossing","color":"red","transform":"scale(-1,1)"},{"type":"square-angular","color":"white","transform":"rotate(60deg) scale(.05,1)"},{"type":"square-angular","color":"white","transform":"rotate(-60deg) scale(.05,1)"}]},"mandatory_roundabout":{"category":"mandatory","name":"roundabout","elements":[{"type":"circle-bg","color":"blue"},{"type":"roundabout","color":"white","transform":"scale(-1.25,1.25)"}]},"prohibitory_overtaking":{"category":"prohibitory","name":"no overtaking","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"car","color":"black","transform":"scale(.6) translate(-26%,10%)"},{"type":"car","color":"red","transform":"scale(.6) translate(26%,10%)"}]},"railway-crossing-unsecured":{"category":"danger","name":"unsecured railway crossing","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"white","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"railway-xing-unsecured","color":"black","transform":"translate(0,13%) scale(-.4,.4)"}]},"children":{"category":"danger","name":"children","elements":[{"type":"tri-rounded","color":"red"},{"type":"tri-angular","color":"white","transform":"translate(0,14.43%) scale(.7) translate(0,-14.43%)"},{"type":"children","color":"black","transform":"translate(0,14.43%) scale(-.75,.75)"}]}} \ No newline at end of file diff --git a/vendor/assets/iD/iD/traffico/signs/us.json b/vendor/assets/iD/iD/traffico/signs/us.json new file mode 100644 index 000000000..844cda893 --- /dev/null +++ b/vendor/assets/iD/iD/traffico/signs/us.json @@ -0,0 +1 @@ +{"pass-on-either-side":{"category":"regulatory","name":"Pass on either side","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"pass-either-us","color":"black"}]},"yield":{"category":"regulatory","name":"Yield","elements":[{"type":"tri-rounded","color":"red","transform":"rotate(180deg)"},{"type":"tri-rounded","color":"white","transform":"translate(0,-14.43%) scale(.55) translate(0,14.43%) rotate(180deg)"},{"type":"content-4","content":"YIELD","color":"red","transform":"translate(0,-115%) scale(.6)"}]},"no-bicycles":{"category":"regulatory","name":"no bicycles","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"bicycle","color":"black","transform":"scale(.8)"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(-45deg)"}]},"no-entry":{"category":"regulatory","name":"No entry","elements":[{"type":"circle-bg","color":"red"},{"type":"square-angular","color":"white","transform":"scale(.92,.16)"}]},"no-left-or-u-turn":{"category":"regulatory","name":"no left or u turn","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"no-l-or-u-turn","color":"black"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(-45deg)"}]},"no-left-turn":{"category":"regulatory","name":"no left turn","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"turn-90-l","color":"black","transform":"scale(.8)"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(-45deg)"}]},"no-parking":{"category":"regulatory","name":"no parking","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"parking","color":"black","transform":"scale(.8)"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(-45deg)"}]},"no-pedestrians":{"category":"regulatory","name":"no pedestrian crossing","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"pedestrian","color":"black"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(-45deg)"}]},"no-straight-through":{"category":"regulatory","name":"no straight through","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"US-arrow-up","color":"black"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(-45deg)"}]},"no-heavy-goods-vehicles":{"category":"regulatory","name":"no trucks","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"truck","color":"black","transform":"scale(.8)"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(-45deg)"}]},"no-right-turn":{"category":"regulatory","name":"no right turn","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"turn-90-l","color":"black","transform":"scale(.8) scale(-1,1)"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(-45deg)"}]},"no-u-turn":{"category":"regulatory","name":"no u turn","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"u-turn","color":"black","transform":"scale(.8)"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(-45deg)"}]},"maximum-speed-limit":{"category":"regulatory","name":"Maximum speed limit","elements":[{"type":"square-rounded","color":"white","transform":"scale(.7,1)"},{"type":"square-rounded","color":"black","transform":"scale(.7,1) scale(.95)"},{"type":"square-rounded","color":"white","transform":"scale(.7,1) scale(.90)"},{"type":"content-4","color":"black","content":"SPEED","transform":"translate(0,-145%) scale(.8)"},{"type":"content-4","color":"black","content":"LIMIT","transform":"translate(0,-60%) scale(.8)"},{"type":"us_speed_value","color":"black","transform":"translate(0,45%)"}]},"stop":{"category":"regulatory","name":"Stop","elements":[{"type":"octagon","color":"red"},{"type":"stop","color":"white"}]},"t-roads":{"category":"warning","name":"T-roads","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"t-roads","color":"black"}]},"y-roads":{"category":"warning","name":"y roads","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"y-roads","color":"black"}]},"added-lane-from-entering-roadway":{"category":"warning","name":"added lane (from entering roadway)","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"added-lane","color":"black","transform":"rotate(45deg) scale(.95)"}]},"added-lane-right":{"category":"warning","name":"added lane","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"added-lane","color":"black"}]},"slippery-bicycles":{"category":"warning","name":"bicycle slippery","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"bicycle-slippery","color":"black"}]},"crossroads-ahead":{"category":"warning","name":"cross roads","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"cross-roads","color":"black"}]},"double-curve-first-right-ahead":{"category":"warning","name":"Double curve first right ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"reverse-curve-au","color":"black","transform":"scale(-1,1) scale(.9)"}]},"double-turn-first-left-ahead":{"category":"warning","name":"turn reverse left","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"turn-reverse-left","color":"black"}]},"cyclists-crossing":{"category":"warning","name":"bicycles","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"bicycle","color":"black","transform":"scale(.9)"}]},"double-reverse-curve":{"category":"warning","name":"double 2 reverse curve","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"orange","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"single-2-reverse-curve","color":"black","transform":"scale(.9) translate(-9%)"},{"type":"single-2-reverse-curve","color":"black","transform":"scale(.9) translate(9%)"}]},"falling-rocks-or-debris-right":{"category":"warning","name":"falling rocks","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"falling-rocks-US","color":"black"}]},"emergency-vehicles":{"category":"warning","name":"fire station","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"fire-station","color":"black"}]},"flaggers-in-road-ahead":{"category":"warning","name":"flaggers in road ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"flaggers","color":"black"}]},"hairpin-curve-right-ahead":{"category":"warning","name":"hairpin curve","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"hairpin-curve","color":"black"}]},"divided-highway-ahead":{"category":"warning","name":"highway divided","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"highway-divided","color":"black"}]},"horizontal-alignment-left":{"category":"warning","name":"horizontal alignment left","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"h-align-l","color":"black"}]},"horizontal-alignment-right":{"category":"warning","name":"horizontal alignment right","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"h-align-l","color":"black","transform":"scale(-1,1)"}]},"roundabout-ahead":{"category":"warning","name":"Roundabout ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"roundabout","color":"black"}]},"tram-crossing":{"category":"warning","name":"light rail crossing","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"light-rail","color":"black"}]},"loop-270-degrees":{"category":"warning","name":"loop 270 degree","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"loop-270","color":"black"}]},"loop-pretzel":{"category":"warning","name":"pretzel_loop","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"pretzel-loop","color":"black","transform":"scale(.9)"}]},"height-restriction-ahead":{"category":"warning","name":"Height restriction ahead","variation":"feet","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"height","color":"black"},{"type":"height_value","color":"black"}]},"height-restriction-ahead_v2":{"category":"warning","name":"Height restriction ahead","variation":"meters","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"height","color":"black"},{"type":"height_value","color":"black"}]},"traffic-merges-right-ahead":{"category":"warning","name":"merge","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"merge","color":"black"}]},"motorcycle-crossing":{"category":"warning","name":"motorcycle crossing","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"motorbike","color":"black"}]},"narrow-bridge-ahead":{"category":"warning","name":"narrow bridge ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"narrow-bridge-us","color":"black","transform":"scale(0.8)"}]},"offset-roads":{"category":"warning","name":"offset roads","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"offset-roads","color":"black"}]},"pass-left-or-right":{"category":"warning","name":"pass left or right","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"pass-l-r","color":"black"}]},"pedestrian-crossing":{"category":"warning","name":"pedestrian crossing","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"pedestrian","color":"black"}]},"playground-ahead":{"category":"warning","name":"Playground ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"play-ground","color":"black"}]},"uncontroller-railroad-crossing-ahead":{"category":"warning","name":"railroad","elements":[{"type":"circle-bg","color":"yellow"},{"type":"circle-bar-rounded","color":"black","transform":"rotate(-45deg)"},{"type":"circle-bar-rounded","color":"black","transform":"rotate(45deg)"},{"type":"railroad","color":"black"}]},"road-narrows-right-ahead":{"category":"warning","name":"road narrows right","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"narrow-road-l","color":"black","transform":"scale(.9) scale(-1,1)"}]},"road-narrows-left-ahead":{"category":"warning","name":"road narrows left","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"narrow-road-l","color":"black","transform":"scale(.9)"}]},"road-narrows-ahead":{"category":"warning","name":"road narrows both","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"narrow-road-both","color":"black","transform":"scale(.9)"}]},"junction-with-a-side-road-acute-left-ahead":{"category":"warning","name":"side road acute angle right","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"side-road-a-a-r","color":"black"}]},"junction-with-a-side-road-acute-right-ahead":{"category":"warning","name":"side road acute angle left","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"side-road-a-a-l","color":"black"}]},"junction-with-a-side-road-perpendicular-right-ahead":{"category":"warning","name":"side road perpendicular right","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"side-road-p-r","color":"black"}]},"junction-with-a-side-road-perpendicular-left-ahead":{"category":"warning","name":"side road perpendicular left","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"side-road-p-l","color":"black"}]},"slippery-road-surface":{"category":"warning","name":"slippery","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"slippery","color":"black"}]},"steep-hill-downwards":{"category":"warning","name":"steep hill","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"steep-hill","color":"black"}]},"stop-ahead":{"category":"warning","name":"Stop ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"small-arrow-au","color":"black","transform":"translate(0,-25%)"},{"type":"octagon","color":"red","transform":"translate(0,15%) scale(.4)"}]},"traffic-signals-ahead":{"category":"warning","name":"traffic light","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"square-angular","color":"black","transform":"scale(.2,.55)"},{"type":"circle-bg","color":"green","transform":"translate(0,16.5%) scale(.14)"},{"type":"circle-bg","color":"yellow","transform":"scale(.14)"},{"type":"circle-bg","color":"red","transform":"translate(0,-16.5%) scale(.14)"}]},"triple-reverse-curve":{"category":"warning","name":"triple 2 reverse curve","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"orange","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"single-2-reverse-curve","color":"black","transform":"scale(.9) translate(-18%)"},{"type":"single-2-reverse-curve","color":"black","transform":"scale(.9)"},{"type":"single-2-reverse-curve","color":"black","transform":"scale(.9) translate(18%)"}]},"trucks-rollover":{"category":"warning","name":"trucks rollover","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"trucks-rollover","color":"black"}]},"turn-curve-left":{"category":"warning","name":"Turn curve left","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"turn-l-curve","color":"black","transform":"scale(.9)"}]},"turn-curve-right":{"category":"warning","name":"Turn curve right","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"turn-l-curve","color":"black","transform":"scale(.9) scale(-1,1)"}]},"turn-right":{"category":"warning","name":"turn right","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"turn-90-l","color":"black","transform":"scale(-1,1)"}]},"turn-left":{"category":"warning","name":"turn left","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"turn-90-l","color":"black"}]},"double-turn-first-right-ahead":{"category":"warning","name":"turn reverse right","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"turn-reverse-left","color":"black","transform":"scale(-1,1)"}]},"two-way-traffic-ahead":{"category":"warning","name":"Two way traffic ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"arrows_both_bra","color":"black","transform":"scale(.9)"}]},"winding-road-first-left-ahead":{"category":"warning","name":"winding road","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"winding-road-left","color":"black"}]},"winding-road-first-right-ahead":{"category":"warning","name":"winding road","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"winding-road-left","color":"black","transform":"scale(-1,1)"}]},"workers-in-road-ahead":{"category":"warning","name":"workers in road ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"roadworks","color":"black","transform":"scale(.9)"}]},"yield-ahead":{"category":"warning","name":"Yield ahead","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"small-arrow-au","color":"black","transform":"translate(0,-25%)"},{"type":"tri-rounded","color":"red","transform":"translate(0, 15%) scale(.45) rotate(180deg)"},{"type":"tri-rounded","color":"white","transform":"translate(0, 12%) scale(.25) rotate(180deg)"}]},"horizontal-traffic-signals-ahead":{"category":"warning","name":"traffic light","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"square-angular","color":"black","transform":"scale(.55,.2)"},{"type":"circle-bg","color":"green","transform":"translate(16.5%,0) scale(.14)"},{"type":"circle-bg","color":"yellow","transform":"scale(.14)"},{"type":"circle-bg","color":"red","transform":"translate(-16.5%,0) scale(.14)"}]},"dead-end":{"category":"warning","name":"dead end","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"dead-end","color":"black"}]},"no-hitch-hiking":{"category":"regulatory","name":"no hitch hiking","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"hitch-hiking","color":"black"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(-45deg)"}]},"share-roads":{"category":"warning","name":"share roads","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"share-roads","color":"black"}]},"end":{"category":"warning","name":"end","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"end","color":"black"}]},"skewed-railroad-crossing":{"category":"warning","name":"skewed railroad crossing","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"skewed-railroads","color":"black"}]},"lightground-railroad-crossing":{"category":"warning","name":"lightground railroad crossing","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"lightground-railroad-crossing","color":"black"}]},"national-network-lane":{"category":"regulatory","name":"national_network_lane","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"green"},{"type":"lorry","color":"black"}]},"national-network-prohibited":{"category":"regulatory","name":"national_network_lane","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"lorry","color":"black"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(-45deg)"}]},"hazardous-material-prohibited":{"category":"regulatory","name":"hazardous material prohibited","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"hazardous-material","color":"black","transform":"scale(.8)"},{"type":"circle-o","color":"red"}]},"truck-rollover-with-speed":{"category":"warning","name":"truck rollover with speed","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"truck-rollover-speed","color":"black"}]},"no-rollerblading":{"category":"regulatory","name":"no rollerblading","elements":[{"type":"circle-bg","color":"white"},{"type":"circle-o","color":"red"},{"type":"rollerblading","color":"black","transform":"scale(.8)"},{"type":"circle-bar-rounded","color":"red","transform":"rotate(-45deg)"}]},"one-way-left":{"category":"regulatory","name":"one way small left","elements":[{"type":"square-rounded","color":"white","transform":"scale(1.1,.33)"},{"type":"square-rounded","color":"black","transform":"scale(1.1,.33) scale(.95)"},{"type":"US-arrow-oneway","color":"white","transform":"scale(.6) scale(1.35,1) rotate(-90deg)"},{"type":"content-4","color":"black","content":"ONE","transform":"scale(.5,.6) translate(-15%,-25%)"},{"type":"content-4","color":"black","content":"WAY","transform":"scale(.5,.6) translate(45%,-25%)"}]},"one-way-right":{"category":"regulatory","name":"one way small right","elements":[{"type":"square-rounded","color":"white","transform":"scale(1.1,.33)"},{"type":"square-rounded","color":"black","transform":"scale(1.1,.33) scale(.95)"},{"type":"US-arrow-oneway","color":"white","transform":"scale(.6) scale(1.35,1) rotate(90deg)"},{"type":"content-4","color":"black","content":"ONE","transform":"scale(.5,.6) translate(-45%,-25%)"},{"type":"content-4","color":"black","content":"WAY","transform":"scale(.5,.6) translate(15%,-25%)"}]},"one-way-left_v2":{"category":"regulatory","name":"one way large left","variation":"alternate","elements":[{"type":"square-rounded","color":"white","transform":"scale(.7,1)"},{"type":"square-rounded","color":"black","transform":"scale(.7,1) scale(.95)"},{"type":"square-rounded","color":"white","transform":"scale(.7,1) scale(.90)"},{"type":"content-4","color":"black","content":"ONE","transform":"scale(1,1.2) translate(0,-90%)"},{"type":"content-4","color":"black","content":"WAY","transform":"scale(1,1.2)"},{"type":"US-arrow-oneway","color":"black","transform":"scale(.5) translate(0,45%) rotate(-90deg)"}]},"one-way-right_v2":{"category":"regulatory","name":"one way large right","variation":"alternate","elements":[{"type":"square-rounded","color":"white","transform":"scale(.7,1)"},{"type":"square-rounded","color":"black","transform":"scale(.7,1) scale(.95)"},{"type":"square-rounded","color":"white","transform":"scale(.7,1) scale(.90)"},{"type":"content-4","color":"black","content":"ONE","transform":"scale(1,1.2) translate(0,-90%)"},{"type":"content-4","color":"black","content":"WAY","transform":"scale(1,1.2)"},{"type":"US-arrow-oneway","color":"black","transform":"scale(.5) translate(0,45%) rotate(90deg)"}]},"single-reverse-curve":{"category":"warning","name":"single 2 reverse curve","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"orange","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"single-2-reverse-curve","color":"black"}]},"school":{"category":"school","name":"school","elements":[{"type":"school","color":"black"},{"type":"school","color":"fluogreen","transform":"scale(.95)"},{"type":"children","color":"black"}]},"school_v2":{"category":"school","name":"school","variation":"obsolete","elements":[{"type":"school","color":"black"},{"type":"school","color":"yellow","transform":"scale(.95)"},{"type":"children","color":"black"}]},"turn-curve-left-with-speed":{"category":"warning","name":"turn left curve with speed","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"turn-l-curve","color":"black","transform":"scale(.9)"},{"type":"turn-curve-speed","color":"black","transform":"scale(.9) scale(-1,1)"}]},"turn-curve-right-with-speed":{"category":"warning","name":"turn right curve with speed","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"turn-l-curve","color":"black","transform":"scale(.9) scale(-1,1)"},{"type":"turn-curve-speed","color":"black","transform":"scale(.9)"}]},"hight-speed-limit":{"category":"regulatory","name":"night_speed_limit","elements":[{"type":"square-rounded","color":"white"},{"type":"square-rounded","color":"black","transform":"scale(.95)"},{"type":"content-4","color":"white","content":"NIGHT","transform":"translate(0,-100%) scale(.8)"},{"type":"us_speed_value","color":"white","transform":"translate(0,35%) scale(1.1)"}]},"truck-speed-limit":{"category":"regulatory","name":"truck_speed_limit","elements":[{"type":"square-rounded","color":"white"},{"type":"square-rounded","color":"black","transform":"scale(.95)"},{"type":"square-rounded","color":"white","transform":"scale(.90)"},{"type":"content-4","color":"black","content":"TRUCKS","transform":"translate(0,-100%) scale(.7,.9)"},{"type":"us_speed_value","color":"black","transform":"translate(0,35%) scale(1.1)"}]},"merging-traffic":{"category":"warning","name":"merging traffic","elements":[{"type":"square-rounded","color":"black","transform":"scale(0.707107) rotate(45deg)"},{"type":"square-rounded","color":"yellow","transform":"scale(.95) scale(0.707107) rotate(45deg)"},{"type":"merge","color":"black","transform":"rotate(45deg)"}]}} \ No newline at end of file diff --git a/vendor/assets/iD/iD/traffico/string-maps/at-map.json b/vendor/assets/iD/iD/traffico/string-maps/at-map.json new file mode 100644 index 000000000..309a1a0e8 --- /dev/null +++ b/vendor/assets/iD/iD/traffico/string-maps/at-map.json @@ -0,0 +1 @@ +{"information--information_border_at--at":"ÖSTERREICH","danger--level-crossing--at--other":"","priority--priority-road-end--at":"","danger--railway-crossing-unsecured--at":""} \ No newline at end of file diff --git a/vendor/assets/iD/iD/traffico/string-maps/au-map.json b/vendor/assets/iD/iD/traffico/string-maps/au-map.json new file mode 100644 index 000000000..639f6e391 --- /dev/null +++ b/vendor/assets/iD/iD/traffico/string-maps/au-map.json @@ -0,0 +1 @@ +{"prohibitory--maximum-speed-limit-5--au":"5","prohibitory--maximum-speed-limit-10--au":"10","prohibitory--maximum-speed-limit-15--au":"15","prohibitory--maximum-speed-limit-20--au":"20","prohibitory--maximum-speed-limit-25--au":"25","prohibitory--maximum-speed-limit-30--au":"30","prohibitory--maximum-speed-limit-35--au":"35","prohibitory--maximum-speed-limit-40--au":"40","prohibitory--maximum-speed-limit-45--au":"45","prohibitory--maximum-speed-limit-50--au":"50","prohibitory--maximum-speed-limit-55--au":"55","prohibitory--maximum-speed-limit-60--au":"60","prohibitory--maximum-speed-limit-65--au":"65","prohibitory--maximum-speed-limit-70--au":"70","prohibitory--maximum-speed-limit-75--au":"75","prohibitory--maximum-speed-limit-80--au":"80","prohibitory--maximum-speed-limit-85--au":"85","prohibitory--maximum-speed-limit-90--au":"90","prohibitory--maximum-speed-limit-100--au":"100","prohibitory--maximum-speed-limit-110--au":"110","prohibitory--maximum-speed-limit-120--au":"120","prohibitory--maximum-speed-limit-130--au":"130","regulatory--yield--au":"GIVEWAY","regulatory--yield-to-oncoming-traffic--au":"GIVEWAY","regulatory--no-bicycles--au":"","regulatory--no-entry--au":"NOENTRY","regulatory--no-heavy-goods-vehicles--au":"","regulatory--no-left-turn--au":"","regulatory--no-pedestrians--au":"","regulatory--no-right-turn--au":"","regulatory--no-u-turn--au":"","regulatory--stop--au":"","warning--added-lane-left--au":"","warning--added-lane-right--au":"","warning--bump-in-road--au":"","warning--children--au":"","warning--crossroads-ahead--au":"","warning--curve-left-ahead--au":"","warning--curve-right-ahead--au":"","warning--cyclists-crossing--au":"","warning--dip-in-road--au":"DIP","warning--divided-highway-ahead--au":"","warning--divided-highway-ends--au":"","warning--domestic-animals--au":"","warning--equestrians--au":"","warning--falling-rocks-or-debris-left--au":"","warning--farm-vehicles--au":"","warning--hairpin-curve-left-ahead--au":"","warning--hairpin-curve-right-ahead--au":"","warning--horizontal-alignment-left--au":"","warning--horizontal-alignment-right--au":"","warning--koala--au":"","warning--koala-crossing--au":"","warning--narrow-bridge-ahead--au":"","warning--pedestrian-crossing--au--retired":"","warning--pedestrian-crossing--au":"","warning--pedestrians-cyclists--au":"","warning--railway-level-crossing-with-flashing-signals-ahead--au":"","warning--curve-first-left-ahead--au":"","warning--double-curve-first-right-ahead--au":"","warning--double-curve-first-left-ahead--au":"","warning--double-turn-first-left-ahead--au":"","warning--double-turn-first-right-ahead--au":"","warning--road-narrows-ahead--au":"","warning--roundabout-ahead--au":"","warning--junction-with-a-side-road-perpendicular-left-ahead--au":"","warning--junction-with-a-side-road-perpendicular-right-ahead--au":"","warning--slippery-road-surface--au":"","warning--steep-hill-downwards--au":"","warning--steep-hill-upwards--au":"","warning--stop-ahead--au":"","warning--traffic-signals-ahead--au":"","warning--truck-crossing--au":"","warning--turn-left--au":"","warning--turn-right--au":"","warning--two-way-traffic-ahead--au":"","warning--uncontrolled-railroad-crossing-ahead--au":"","warning--wild-animals--au":"","warning--winding-road-first-left-ahead--au":"","warning--winding-road-first-right-ahead--au":"","warning--yield-ahead--au":"","warning--emu-crossing--au--left":"","warning--emu-crossing--au--right":"","warning--slippery-motorcycles--au--victoria":"","warning--traffic-merges-left-ahead--au":"","warning--traffic-merges-right-ahead--au":"","warning--wombat-crossing--au":"","warning--wombat-crossing--au--victoria":""} \ No newline at end of file diff --git a/vendor/assets/iD/iD/traffico/string-maps/be-map.json b/vendor/assets/iD/iD/traffico/string-maps/be-map.json new file mode 100644 index 000000000..b135ca062 --- /dev/null +++ b/vendor/assets/iD/iD/traffico/string-maps/be-map.json @@ -0,0 +1 @@ +{"information--information_border_be_nl--be":"België","information--information_border_be_fr--be":"Belgique","priority--priority-road-end--be":"","danger--railway-crossing-unsecured--be":""} \ No newline at end of file diff --git a/vendor/assets/iD/iD/traffico/string-maps/br-map.json b/vendor/assets/iD/iD/traffico/string-maps/br-map.json new file mode 100644 index 000000000..484ad666b --- /dev/null +++ b/vendor/assets/iD/iD/traffico/string-maps/br-map.json @@ -0,0 +1 @@ +{"mandatory--bicycles-only--br":"","mandatory--proceed-straight--br":"","mandatory--keep-left--br":"","mandatory--keep-right--br":"","mandatory--transit-only--br":"","mandatory--turn-right--br":"","information--parking--br":"E","information--two-way-traffic--br":"","prohibitory--maximum-speed-limit-5--br":"km/h5","prohibitory--maximum-speed-limit-10--br":"km/h10","prohibitory--maximum-speed-limit-15--br":"km/h15","prohibitory--maximum-speed-limit-20--br":"km/h20","prohibitory--maximum-speed-limit-25--br":"km/h25","prohibitory--maximum-speed-limit-30--br":"km/h30","prohibitory--maximum-speed-limit-35--br":"km/h35","prohibitory--maximum-speed-limit-40--br":"km/h40","prohibitory--maximum-speed-limit-45--br":"km/h45","prohibitory--maximum-speed-limit-50--br":"km/h50","prohibitory--maximum-speed-limit-55--br":"km/h55","prohibitory--maximum-speed-limit-60--br":"km/h60","prohibitory--maximum-speed-limit-65--br":"km/h65","prohibitory--maximum-speed-limit-70--br":"km/h70","prohibitory--maximum-speed-limit-75--br":"km/h75","prohibitory--maximum-speed-limit-80--br":"km/h80","prohibitory--maximum-speed-limit-85--br":"km/h85","prohibitory--maximum-speed-limit-90--br":"km/h90","prohibitory--maximum-speed-limit-100--br":"km/h100","prohibitory--maximum-speed-limit-110--br":"km/h110","prohibitory--maximum-speed-limit-120--br":"km/h120","prohibitory--maximum-speed-limit-130--br":"km/h130","regulatory--yield--br":"","regulatory--no-bicycles--br":"","regulatory--no-entry--br":"","regulatory--no-heavy-goods-vehicles--br":"","regulatory--no-motor-vehicles--br":"","regulatory--no-motorcycles--br":"","regulatory--no-overtaking--br":"","regulatory--no-parking--br":"E","regulatory--no-pedestrians--br":"","regulatory--no-stopping--br":"E","regulatory--stop--br":"PARE","regulatory--no-left-or-u-turn--br":"","regulatory--no-left-turn--br":"","regulatory--no-straight-through--br":"","regulatory--no_trucks--br":"","regulatory--no-right-turn--br":"","regulatory--no-u-turn--br":"","warning--bump-in-road--br":"","warning--cyclists-crossing--br":"","warning--domestic-animals--br":"","warning--falling-rocks-or-debris-right--br":"","warning--farm-vehicles--br":"","warning--loose-road-surface--br":"","warning--pedestrian-crossing--br":"","warning--road-narrows-ahead--br":"","warning--workers-in-road-ahead--br":"","warning--school-zone--br":"","warning--slippery-road-surface--br":"","warning--stop-ahead--br":"PARE","warning--two-way-traffic-ahead--br":"","warning--uneven-road--br":"","warning--wild-animals--br":"","warning--y-roads--br":"","warning--added-lane-right--br":"","warning--warning--added-lane-left--br":"","warning--double-curve-first-left-ahead--br":"","warning--double-curve-first-right-ahead--br":"","warning--double-reverse-curve--br":"","warning--flaggers-in-road-ahead--br":"","warning--divided-highway-ahead--br":"","warning--horizontal-alignment-right--br":"","warning--roundabout-ahead--br":"","warning--loop-pretzel--br":"","warning--height-restriction-ahead--br--feet":"","warning--traffic-merges-right-ahead--br":"","warning--pass-left-or-right--br":"","warning--playground-ahead--br":"","warning--road-narrows-left-ahead--br":"","warning--road-narrows-right-ahead--br":"","warning--junction-with-a-side-road-acute-left-ahead--br":"","warning--junction-with-a-side-road-perpendicular-left-ahead--br":"","warning--junction-with-a-side-road-perpendicular-right-ahead--br":"","warning--t-roads--br":"","warning--traffic-signals-ahead--br":"","warning--triple-reverse-curve--br":"","warning--trucks-rollover--br":"","warning--turn-curve-left--br":"","warning--turn-curve-right--br":"","warning--turn-left--br":"","warning--turn-right--br":"","warning--double-turn-first-left-ahead--br":"","warning--double-turn-first-right-ahead--br":"","warning--winding-road-first-left-ahead--br":"","warning--winding-road-first-right-ahead--br":""} \ No newline at end of file diff --git a/vendor/assets/iD/iD/traffico/string-maps/ca-map.json b/vendor/assets/iD/iD/traffico/string-maps/ca-map.json new file mode 100644 index 000000000..aaa27af86 --- /dev/null +++ b/vendor/assets/iD/iD/traffico/string-maps/ca-map.json @@ -0,0 +1 @@ +{"mandatory--pass-on-either-side--ca":"","regulatory--no-bicycles--ca":"","regulatory--no-entry--ca":"","regulatory--no-heavy-goods-vehicles--ca":"","regulatory--no-left-turn--ca":"","regulatory--no-motor-vehicles--ca":"","regulatory--no-motorcycles--ca":"","regulatory--no-overtaking--ca":"","regulatory--no-parking--ca":"P","regulatory--no-pedestrians--ca":"","regulatory--no-right-turn--ca":"","regulatory--no-stopping--ca":"","regulatory--no-u-turn--ca":"","regulatory--maximum-speed-limit-5--ca":"MAXIMUM5","regulatory--maximum-speed-limit-10--ca":"MAXIMUM10","regulatory--maximum-speed-limit-15--ca":"MAXIMUM15","regulatory--maximum-speed-limit-20--ca":"MAXIMUM20","regulatory--maximum-speed-limit-25--ca":"MAXIMUM25","regulatory--maximum-speed-limit-30--ca":"MAXIMUM30","regulatory--maximum-speed-limit-35--ca":"MAXIMUM35","regulatory--maximum-speed-limit-40--ca":"MAXIMUM40","regulatory--maximum-speed-limit-45--ca":"MAXIMUM45","regulatory--maximum-speed-limit-50--ca":"MAXIMUM50","regulatory--maximum-speed-limit-55--ca":"MAXIMUM55","regulatory--maximum-speed-limit-60--ca":"MAXIMUM60","regulatory--maximum-speed-limit-65--ca":"MAXIMUM65","regulatory--maximum-speed-limit-70--ca":"MAXIMUM70","regulatory--maximum-speed-limit-75--ca":"MAXIMUM75","regulatory--maximum-speed-limit-80--ca":"MAXIMUM80","regulatory--maximum-speed-limit-85--ca":"MAXIMUM85","regulatory--maximum-speed-limit-90--ca":"MAXIMUM90","regulatory--maximum-speed-limit-100--ca":"MAXIMUM100","regulatory--maximum-speed-limit-110--ca":"MAXIMUM110","regulatory--maximum-speed-limit-120--ca":"MAXIMUM120","regulatory--maximum-speed-limit-130--ca":"MAXIMUM130","regulatory--stop--ca":"","warning--bump-in-road--ca":"","warning--crossroads-ahead--ca":"","warning--curve-left-ahead--ca":"","warning--curve-left-ahead--ca--ontario":"","warning--double-curve-first-left-ahead--ca":"","warning--double-curve-first-right-ahead--ca--ontario":"","warning--curve-right-ahead--ca":"","warning--cyclists-crossing--ca":"","warning--dip-in-road--ca":"DIP","warning--divided-highway-ahead--ca":"","warning--divided-highway-ends--ca":"","warning--domestic-animals--ca":"","warning--emergency-vehicles--ca":"","warning--equestrians--ca":"","warning--falling-rocks-or-debris-right--ca":"","warning--farm-vehicles--ca":"","warning--hairpin-curve-right-ahead--ca":"","warning--hairpin-curve-right-ahead--ca--ontario":"","warning--level-railroad-crossing-with-barriers-ahead--ca":"","warning--loose-road-surface--ca":"","warning--height-restriction-ahead--ca--feet":"","warning--height-restriction-ahead--ca--meters":"","warning--narrow-bridge-ahead--ca":"","warning--opening-or-swing-bridge--ca":"","warning--pavement-ends--ca":"","warning--pedestrian-crossing--ca":"","warning--pedestrian-crossing--ca--quebec":"PEDESTRIANX","warning--playground-ahead--ca":"","warning--road-narrows-ahead--ca":"","warning--road-narrows-left-ahead--ca":"","warning--road-narrows-right-ahead--ca":"","warning--roundabout-ahead--ca":"","warning--shared-road-motocycles-cyclists--ca":"","warning--junction-with-a-side-road-perpendicular-left-ahead--ca":"","warning--junction-with-a-side-road-perpendicular-left-ahead--ca--ontario":"","warning--junction-with-a-side-road-perpendicular-right-ahead--ca":"","warning--slippery-road-surface--ca":"","warning--steep-hill-downwards--ca":"","warning--steep-hill-upwards--ca":"","warning--stop-ahead--ca":"","warning--stop-ahead--ca--ontario":"","warning--traffic-merges-left-ahead--ca":"","warning--traffic-merges-left-ahead--ca--ontario":"","warning--traffic-merges-right-ahead--ca":"","warning--traffic-merges-right-ahead--ca--ontario":"","warning--traffic-signals-ahead--ca":"","warning--tunnel-ahead--ca":"","warning--turn-left--ca":"","warning--double-turn-first-left-ahead--ca":"","warning--double-turn-first-right-ahead--ca":"","warning--turn-right--ca":"","warning--two-way-traffic-ahead--ca":"","warning--uncontrolled-railroad-crossing-ahead--ca":"","warning--uneven-road--ca":"","warning--wild-animals--ca":"","warning--winding-road-first-left-ahead--ca":"","warning--winding-road-first-right-ahead--ca":"","warning--workers-in-road-ahead--ca":"","warning--yield-ahead--ca":"","regulatory--yield--ca":""} \ No newline at end of file diff --git a/vendor/assets/iD/iD/traffico/string-maps/ch-map.json b/vendor/assets/iD/iD/traffico/string-maps/ch-map.json new file mode 100644 index 000000000..125d471ec --- /dev/null +++ b/vendor/assets/iD/iD/traffico/string-maps/ch-map.json @@ -0,0 +1 @@ +{"danger--level-crossing--ch--other":"","priority--priority-road-end--ch":"","danger--railway-crossing-unsecured--ch":""} \ No newline at end of file diff --git a/vendor/assets/iD/iD/traffico/string-maps/cz-map.json b/vendor/assets/iD/iD/traffico/string-maps/cz-map.json new file mode 100644 index 000000000..b12e1faae --- /dev/null +++ b/vendor/assets/iD/iD/traffico/string-maps/cz-map.json @@ -0,0 +1 @@ +{"information--information_border_cz--cz":"Českérepublika","priority--priority-road-end--cz":"","danger--railway-crossing-unsecured--cz":""} \ No newline at end of file diff --git a/vendor/assets/iD/iD/traffico/string-maps/de-map.json b/vendor/assets/iD/iD/traffico/string-maps/de-map.json new file mode 100644 index 000000000..4de9a347e --- /dev/null +++ b/vendor/assets/iD/iD/traffico/string-maps/de-map.json @@ -0,0 +1 @@ +{"danger--ascent--de":"10%","danger--descent--de":"10%","danger--domestic-animals--de":"","danger--falling-rocks--de":"","danger--level-crossing--de":"","danger--unprotected-quayside-or-riverbank--de":"","danger--wild-animals--de":"","danger--double-curve-first-left--de":"","danger--double-curve-first-right--de":"","danger--curve-left--de":"","danger--curve-right--de":"","danger--crossroads-with-priority-to-the-right--de":"","danger--cyclists-crossing-ahead--de":"","danger--cyclists-crossing-ahead--de--right":"","danger--other-danger--de":"","danger--other-danger--de--temporary":"","danger--crossroads-ahead--de":"","danger--junction-with-a-side-road-perpendicular-left--de":"","danger--junction-with-a-side-road-perpendicular-right--de":"","danger--pedestrian-crossing--de":"","danger--railway-crossing-unsecured--de":"","danger--railway-crossing-secured--de":"","danger--snow--de":"","danger--low-flying-aircraft--de":"","danger--strong-sidewind--de":"","danger--road-bump--de":"","danger--road-narrows-ahead--de":"","danger--road-narrows-left-ahead--de":"","danger--road-narrows-right-ahead--de":"","danger--roadworks-ahead--de":"","danger--roundabout--de":"","danger--children--de":"","danger--slippery-road-surface--de":"","danger--traffic-signals-ahead--de":"","danger--two-way-traffic-ahead--de":"","danger--uneven-road-ahead--de":"","information--border--de":"Bundes-republikDeutschland","information--pedestrian-crossing--de":"","information--deadend--de":"","information--first-aid--de":"","information--limited-access-road--de":"","information--parking-left--de":"","information--parking-right--de":"","information--bus-stop--de":"","information--disabled-persons--de":"","information--parking--de":"","mandatory--equestrians--de":"","mandatory--minimum-speed-5--de":"5","mandatory--minimum-speed-10--de":"10","mandatory--minimum-speed-15--de":"15","mandatory--minimum-speed-20--de":"20","mandatory--minimum-speed-25--de":"25","mandatory--minimum-speed-30--de":"30","mandatory--minimum-speed-35--de":"35","mandatory--minimum-speed-40--de":"40","mandatory--minimum-speed-45--de":"45","mandatory--minimum-speed-50--de":"50","mandatory--minimum-speed-55--de":"55","mandatory--minimum-speed-60--de":"60","mandatory--minimum-speed-65--de":"65","mandatory--minimum-speed-70--de":"70","mandatory--minimum-speed-75--de":"75","mandatory--minimum-speed-80--de":"80","mandatory--minimum-speed-85--de":"85","mandatory--minimum-speed-90--de":"90","mandatory--minimum-speed-100--de":"100","mandatory--minimum-speed-110--de":"110","mandatory--minimum-speed-120--de":"120","mandatory--minimum-speed-130--de":"130","mandatory--minimum-speed-end-5--de":"5","mandatory--minimum-speed-end-10--de":"10","mandatory--minimum-speed-end-15--de":"15","mandatory--minimum-speed-end-20--de":"20","mandatory--minimum-speed-end-25--de":"25","mandatory--minimum-speed-end-30--de":"30","mandatory--minimum-speed-end-35--de":"35","mandatory--minimum-speed-end-40--de":"40","mandatory--minimum-speed-end-45--de":"45","mandatory--minimum-speed-end-50--de":"50","mandatory--minimum-speed-end-55--de":"55","mandatory--minimum-speed-end-60--de":"60","mandatory--minimum-speed-end-65--de":"65","mandatory--minimum-speed-end-70--de":"70","mandatory--minimum-speed-end-75--de":"75","mandatory--minimum-speed-end-80--de":"80","mandatory--minimum-speed-end-85--de":"85","mandatory--minimum-speed-end-90--de":"90","mandatory--minimum-speed-end-100--de":"100","mandatory--minimum-speed-end-110--de":"110","mandatory--minimum-speed-end-120--de":"120","mandatory--minimum-speed-end-130--de":"130","mandatory--pedestrian-bicycle-dual-track--de":"","mandatory--dual-path-pedestrians-and-cyclists--de":"","mandatory--dual-path-cyclists-and-pedestrians--de":"","mandatory--bicycles-only--de":"","mandatory--pedestrians-only--de":"","mandatory--turn-left--de":"","mandatory--turn-right--de":"","mandatory--pass-on-either-side--de":"","mandatory--proceed-straight--de":"","mandatory--proceed-straight-or-turn-left--de":"","mandatory--proceed-straight-or-turn-right--de":"","mandatory--procced-straight--de":"","mandatory--pass-on-this-side-left--de":"","mandatory--pass-on-this-side-right--de":"","mandatory--shared-path-pedestrians-and-cyclists--de":"","mandatory--roundabout--de":"","mandatory--turn-left-ahead--de":"","mandatory--turn-right-ahead--de":"","priority--narrow-location-priority--de":"","priority--narrow-location-no-priority--de--other":"","priority--priority-road-end--de":"","priority--give-way--de":"","prohibitory--no-pedestrians--de":"","prohibitory--no-pedestrians-or-bicycles--de":"","prohibitory--no-bicycles--de":"","prohibitory--no-mopeds--de":"","prohibitory--no-motor-vehicles--de":"","prohibitory--no-slow-vehicles--de":"","prohibitory--no-trailers--de":"","prohibitory--no-buses--de":"","prohibitory--no-heavy-goods-vehicles--de":"","prohibitory--no-trucks-and-buses--de":"","prohibitory--no-parking-or-stopping-left--de":"","prohibitory--no-parking-or-stopping-left-and-right--de":"","prohibitory--no-parking-or-stopping-right--de":"","prohibitory--no-parking-left--de":"","prohibitory--no-parking-left-and-right--de":"","prohibitory--no-parking-right--de":"","prohibitory--speed-limit-zone--de":"ZONE","prohibitory--vehicle-weight-limit--de":"","prohibitory--no-entry--de":"","priority--priority-road--de":"","priority--give-way-to-oncoming-traffic--de":"","priority--stop--de":"","prohibitory--end-of-limits--de":"","prohibitory--low-emission-zone--de":"UmweltZONE","prohibitory--low-emission-zone-end--de":"UmweltZONE","prohibitory--no-moped-vehicles--de":"","prohibitory--no-motorcycles--de":"","prohibitory--no-parking--de":"","prohibitory--no-stopping-or-parking--de":"","prohibitory--no-traffic-both-ways--de":"","prohibitory--no-u-turn--de":"","prohibitory--no-vehicles-carrying-dangerous-goods--de":"","prohibitory--no-left-turn--de":"","prohibitory--no-right-turn--de":"","prohibitory--no-overtaking--de":"","prohibitory--no-overtaking-by-heavy-goods-vehicles--de":"","prohibitory--maximum-speed-limit-5--de":"5","prohibitory--maximum-speed-limit-10--de":"10","prohibitory--maximum-speed-limit-15--de":"15","prohibitory--maximum-speed-limit-20--de":"20","prohibitory--maximum-speed-limit-25--de":"25","prohibitory--maximum-speed-limit-30--de":"30","prohibitory--maximum-speed-limit-35--de":"35","prohibitory--maximum-speed-limit-40--de":"40","prohibitory--maximum-speed-limit-45--de":"45","prohibitory--maximum-speed-limit-50--de":"50","prohibitory--maximum-speed-limit-55--de":"55","prohibitory--maximum-speed-limit-60--de":"60","prohibitory--maximum-speed-limit-65--de":"65","prohibitory--maximum-speed-limit-70--de":"70","prohibitory--maximum-speed-limit-75--de":"75","prohibitory--maximum-speed-limit-80--de":"80","prohibitory--maximum-speed-limit-85--de":"85","prohibitory--maximum-speed-limit-90--de":"90","prohibitory--maximum-speed-limit-100--de":"100","prohibitory--maximum-speed-limit-110--de":"110","prohibitory--maximum-speed-limit-120--de":"120","prohibitory--maximum-speed-limit-130--de":"130","prohibitory--maximum-height--de":"","prohibitory--maximum-width--de":"","supplementary--destination--de":"Anliegerfrei","supplementary--disabled--de":"","supplementary--glaze--de":"","supplementary--left-pointing--de":"","supplementary--both-directions--de":"","supplementary--pedestrians-use-opposite-sidewalk--de--left":"","supplementary--pedestrians-use-opposite-sidewalk--de--right":"","supplementary--railway-only--de":"","supplementary--right-pointing--de":"","other--entry--de":"","supplementary--priority-road-bends-left-3way--de--1":"","supplementary--priority-road-bends-left-3way--de--2":"","supplementary--priority-road-bends-left-4way--de":"","supplementary--priority-road-bends-right-3way--de--1":"","supplementary--priority-road-bends-right-3way--de--2":"","supplementary--priority-road-bends-right-4way--de":"","supplementary--priority-road-from-left-3way--de":"","supplementary--priority-road-from-left-4way--de":"","supplementary--priority-road-from-right-3way--de":"","supplementary--priority-road-from-right-4way--de":""} \ No newline at end of file diff --git a/vendor/assets/iD/iD/traffico/string-maps/dk-map.json b/vendor/assets/iD/iD/traffico/string-maps/dk-map.json new file mode 100644 index 000000000..003759117 --- /dev/null +++ b/vendor/assets/iD/iD/traffico/string-maps/dk-map.json @@ -0,0 +1 @@ +{"danger--danger_level_crossing--dk":"","information--information_border_dk--dk":"Danmark","prohibitory--no_trucks--dk":"","priority--priority-road-end--dk":"","danger--railway-crossing-unsecured--dk":""} \ No newline at end of file diff --git a/vendor/assets/iD/iD/traffico/string-maps/ee-map.json b/vendor/assets/iD/iD/traffico/string-maps/ee-map.json new file mode 100644 index 000000000..9fc596ac6 --- /dev/null +++ b/vendor/assets/iD/iD/traffico/string-maps/ee-map.json @@ -0,0 +1 @@ +{"information--information_border_ee--ee":"EESTI"} \ No newline at end of file diff --git a/vendor/assets/iD/iD/traffico/string-maps/es-map.json b/vendor/assets/iD/iD/traffico/string-maps/es-map.json new file mode 100644 index 000000000..4d3325b5c --- /dev/null +++ b/vendor/assets/iD/iD/traffico/string-maps/es-map.json @@ -0,0 +1 @@ +{"information--information_border_es--es":"ESPAÑA","danger--pedestrian-crossing--es":"","danger--road-narrows-ahead--es":"","priority--priority-road-end--es":"","danger--railway-crossing-unsecured--es":""} \ No newline at end of file diff --git a/vendor/assets/iD/iD/traffico/string-maps/fi-map.json b/vendor/assets/iD/iD/traffico/string-maps/fi-map.json new file mode 100644 index 000000000..e192e13ff --- /dev/null +++ b/vendor/assets/iD/iD/traffico/string-maps/fi-map.json @@ -0,0 +1 @@ +{"information--information_border_fi--fi":"SUOMIFINLANDSUOPMA","danger--cyclists-crossing-ahead--fi":"","priority--priority-road-end--fi":"","danger--railway-crossing-unsecured--fi":""} \ No newline at end of file diff --git a/vendor/assets/iD/iD/traffico/string-maps/fr-map.json b/vendor/assets/iD/iD/traffico/string-maps/fr-map.json new file mode 100644 index 000000000..3aea8438e --- /dev/null +++ b/vendor/assets/iD/iD/traffico/string-maps/fr-map.json @@ -0,0 +1 @@ +{"information--information_border_fr--fr":"FRANCE","information--information_city_entrance--fr":"some city","information--information_city_exit--fr":"some city","priority--priority-road-end--fr":"","danger--railway-crossing-unsecured--fr":""} \ No newline at end of file diff --git a/vendor/assets/iD/iD/traffico/string-maps/gr-map.json b/vendor/assets/iD/iD/traffico/string-maps/gr-map.json new file mode 100644 index 000000000..76204ba43 --- /dev/null +++ b/vendor/assets/iD/iD/traffico/string-maps/gr-map.json @@ -0,0 +1 @@ +{"information--information_border_gr--gr":"EΛΛAΣGREECE","priority--priority-road-end--gr":"","danger--railway-crossing-unsecured--gr":""} \ No newline at end of file diff --git a/vendor/assets/iD/iD/traffico/string-maps/hu-map.json b/vendor/assets/iD/iD/traffico/string-maps/hu-map.json new file mode 100644 index 000000000..3e3bbb4ce --- /dev/null +++ b/vendor/assets/iD/iD/traffico/string-maps/hu-map.json @@ -0,0 +1 @@ +{"information--information_border_hu--hu":"Magyarország","priority--priority-road-end--hu":"","danger--railway-crossing-unsecured--hu":""} \ No newline at end of file diff --git a/vendor/assets/iD/iD/traffico/string-maps/it-map.json b/vendor/assets/iD/iD/traffico/string-maps/it-map.json new file mode 100644 index 000000000..313a13a0f --- /dev/null +++ b/vendor/assets/iD/iD/traffico/string-maps/it-map.json @@ -0,0 +1 @@ +{"information--information_border_it--it":"ITALIA","danger--cyclists-crossing-ahead--it":"","danger--children--it":"","danger--level-crossing--it--other":"","mandatory--pedestrians-only--it":"","priority--priority-road-end--it":"","danger--railway-crossing-unsecured--it":"","mandatory--turn-right-ahead--it":""} \ No newline at end of file diff --git a/vendor/assets/iD/iD/traffico/string-maps/lt-map.json b/vendor/assets/iD/iD/traffico/string-maps/lt-map.json new file mode 100644 index 000000000..52950783f --- /dev/null +++ b/vendor/assets/iD/iD/traffico/string-maps/lt-map.json @@ -0,0 +1 @@ +{"information--information_border_lt--lt":"LietuvosRespublika"} \ No newline at end of file diff --git a/vendor/assets/iD/iD/traffico/string-maps/lu-map.json b/vendor/assets/iD/iD/traffico/string-maps/lu-map.json new file mode 100644 index 000000000..fac12a931 --- /dev/null +++ b/vendor/assets/iD/iD/traffico/string-maps/lu-map.json @@ -0,0 +1 @@ +{"information--information_border_lu_fr--lu":"Luxembourg","information--information_border_lu_de--lu":"Luxemburg"} \ No newline at end of file diff --git a/vendor/assets/iD/iD/traffico/string-maps/lv-map.json b/vendor/assets/iD/iD/traffico/string-maps/lv-map.json new file mode 100644 index 000000000..6ca8d556c --- /dev/null +++ b/vendor/assets/iD/iD/traffico/string-maps/lv-map.json @@ -0,0 +1 @@ +{"information--information_border_lv--lv":"LATVIJA"} \ No newline at end of file diff --git a/vendor/assets/iD/iD/traffico/string-maps/nl-map.json b/vendor/assets/iD/iD/traffico/string-maps/nl-map.json new file mode 100644 index 000000000..36c1fb561 --- /dev/null +++ b/vendor/assets/iD/iD/traffico/string-maps/nl-map.json @@ -0,0 +1 @@ +{"information--information_border_nl--nl":"Nederland","information--information_cycleway--nl":"fietspad","priority--priority-road-end--nl":"","danger--railway-crossing-unsecured--nl":""} \ No newline at end of file diff --git a/vendor/assets/iD/iD/traffico/string-maps/no-map.json b/vendor/assets/iD/iD/traffico/string-maps/no-map.json new file mode 100644 index 000000000..4b1b82fd9 --- /dev/null +++ b/vendor/assets/iD/iD/traffico/string-maps/no-map.json @@ -0,0 +1 @@ +{"prohibitory--no_trucks--no":"","priority--priority-road-end--no":"","danger--railway-crossing-unsecured--no":""} \ No newline at end of file diff --git a/vendor/assets/iD/iD/traffico/string-maps/pl-map.json b/vendor/assets/iD/iD/traffico/string-maps/pl-map.json new file mode 100644 index 000000000..7518f40dc --- /dev/null +++ b/vendor/assets/iD/iD/traffico/string-maps/pl-map.json @@ -0,0 +1 @@ +{"information--information_border_pl--pl":"RzeczpospolitaPolska","danger--pedestrian-crossing--pl":"","priority--priority-road-end--pl":"","danger--railway-crossing-unsecured--pl":""} \ No newline at end of file diff --git a/vendor/assets/iD/iD/traffico/string-maps/se-map.json b/vendor/assets/iD/iD/traffico/string-maps/se-map.json new file mode 100644 index 000000000..f84dace50 --- /dev/null +++ b/vendor/assets/iD/iD/traffico/string-maps/se-map.json @@ -0,0 +1 @@ +{"information--information_border_se--se":"SVERIGE","danger--cyclists-crossing-ahead--se":"","danger--pedestrian-crossing--se":"","priority--priority-road-end--se":"","danger--railway-crossing-unsecured--se":"","danger--children--se":"","priority--give-way-to-oncoming-traffic--se":"","prohibitory--no-bicycles--se":"","prohibitory--no-pedestrians--se":""} \ No newline at end of file diff --git a/vendor/assets/iD/iD/traffico/string-maps/si-map.json b/vendor/assets/iD/iD/traffico/string-maps/si-map.json new file mode 100644 index 000000000..40466301a --- /dev/null +++ b/vendor/assets/iD/iD/traffico/string-maps/si-map.json @@ -0,0 +1 @@ +{"information--information_border_si--si":"SLOVENIA"} \ No newline at end of file diff --git a/vendor/assets/iD/iD/traffico/string-maps/sk-map.json b/vendor/assets/iD/iD/traffico/string-maps/sk-map.json new file mode 100644 index 000000000..9bd05a750 --- /dev/null +++ b/vendor/assets/iD/iD/traffico/string-maps/sk-map.json @@ -0,0 +1 @@ +{"information--information_border_sk--sk":"SLOVENSKO","priority--priority-road-end--sk":"","danger--railway-crossing-unsecured--sk":""} \ No newline at end of file diff --git a/vendor/assets/iD/iD/traffico/string-maps/uk-map.json b/vendor/assets/iD/iD/traffico/string-maps/uk-map.json new file mode 100644 index 000000000..6bf250ab6 --- /dev/null +++ b/vendor/assets/iD/iD/traffico/string-maps/uk-map.json @@ -0,0 +1 @@ +{"danger--danger_contraflow--uk":"","danger--level-crossing--uk--other":"","mandatory--mandatory_roundabout--uk":"","prohibitory--prohibitory_overtaking--uk":"","danger--railway-crossing-unsecured--uk":"","danger--children--uk":""} \ No newline at end of file diff --git a/vendor/assets/iD/iD/traffico/string-maps/us-map.json b/vendor/assets/iD/iD/traffico/string-maps/us-map.json new file mode 100644 index 000000000..23f68b4cc --- /dev/null +++ b/vendor/assets/iD/iD/traffico/string-maps/us-map.json @@ -0,0 +1 @@ +{"regulatory--pass-on-either-side--us":"","regulatory--yield--us":"YIELD","regulatory--no-bicycles--us":"","regulatory--no-entry--us":"","regulatory--no-left-or-u-turn--us":"","regulatory--no-left-turn--us":"","regulatory--no-parking--us":"","regulatory--no-pedestrians--us":"","regulatory--no-straight-through--us":"","regulatory--no-heavy-goods-vehicles--us":"","regulatory--no-right-turn--us":"","regulatory--no-u-turn--us":"","regulatory--maximum-speed-limit-5--us":"SPEEDLIMIT5","regulatory--maximum-speed-limit-10--us":"SPEEDLIMIT10","regulatory--maximum-speed-limit-15--us":"SPEEDLIMIT15","regulatory--maximum-speed-limit-20--us":"SPEEDLIMIT20","regulatory--maximum-speed-limit-25--us":"SPEEDLIMIT25","regulatory--maximum-speed-limit-30--us":"SPEEDLIMIT30","regulatory--maximum-speed-limit-35--us":"SPEEDLIMIT35","regulatory--maximum-speed-limit-45--us":"SPEEDLIMIT45","regulatory--maximum-speed-limit-50--us":"SPEEDLIMIT50","regulatory--maximum-speed-limit-55--us":"SPEEDLIMIT55","regulatory--maximum-speed-limit-60--us":"SPEEDLIMIT60","regulatory--maximum-speed-limit-65--us":"SPEEDLIMIT65","regulatory--maximum-speed-limit-70--us":"SPEEDLIMIT70","regulatory--maximum-speed-limit-75--us":"SPEEDLIMIT75","regulatory--maximum-speed-limit-80--us":"SPEEDLIMIT80","regulatory--maximum-speed-limit-85--us":"SPEEDLIMIT85","regulatory--stop--us":"","warning--t-roads--us":"","warning--y-roads--us":"","warning--added-lane-from-entering-roadway--us":"","warning--added-lane-right--us":"","warning--slippery-bicycles--us":"","warning--crossroads-ahead--us":"","warning--double-curve-first-right-ahead--us":"","warning--double-turn-first-left-ahead--us":"","warning--cyclists-crossing--us":"","warning--double-reverse-curve--us":"","warning--falling-rocks-or-debris-right--us":"","warning--emergency-vehicles--us":"","warning--flaggers-in-road-ahead--us":"","warning--hairpin-curve-right-ahead--us":"","warning--divided-highway-ahead--us":"","warning--horizontal-alignment-left--us":"","warning--horizontal-alignment-right--us":"","warning--roundabout-ahead--us":"","warning--tram-crossing--us":"","warning--loop-270-degrees--us":"","warning--loop-pretzel--us":"","warning--height-restriction-ahead--us--feet":"","warning--height-restriction-ahead--us--meters":"","warning--traffic-merges-right-ahead--us":"","warning--motorcycle-crossing--us":"","warning--narrow-bridge-ahead--us":"","warning--offset-roads--us":"","warning--pass-left-or-right--us":"","warning--pedestrian-crossing--us":"","warning--playground-ahead--us":"","warning--uncontroller-railroad-crossing-ahead--us":"","warning--road-narrows-right-ahead--us":"","warning--road-narrows-left-ahead--us":"","warning--road-narrows-ahead--us":"","warning--junction-with-a-side-road-acute-left-ahead--us":"","warning--junction-with-a-side-road-acute-right-ahead--us":"","warning--junction-with-a-side-road-perpendicular-right-ahead--us":"","warning--junction-with-a-side-road-perpendicular-left-ahead--us":"","warning--slippery-road-surface--us":"","warning--steep-hill-downwards--us":"","warning--stop-ahead--us":"","warning--traffic-signals-ahead--us":"","warning--triple-reverse-curve--us":"","warning--trucks-rollover--us":"","warning--turn-curve-left--us":"","warning--turn-curve-right--us":"","warning--turn-right--us":"","warning--turn-left--us":"","warning--double-turn-first-right-ahead--us":"","warning--two-way-traffic-ahead--us":"","warning--winding-road-first-left-ahead--us":"","warning--winding-road-first-right-ahead--us":"","warning--workers-in-road-ahead--us":"","warning--yield-ahead--us":"","warning--horizontal-traffic-signals-ahead--us":"","warning--dead-end--us":"","regulatory--no-hitch-hiking--us":"","warning--share-roads--us":"","warning--end--us":"","warning--skewed-railroad-crossing--us":"","warning--lightground-railroad-crossing--us":"","regulatory--national-network-lane--us":"","regulatory--national-network-prohibited--us":"","regulatory--hazardous-material-prohibited--us":"","warning--truck-rollover-with-speed--us":"","regulatory--no-rollerblading--us":"","regulatory--one-way-left--us":"ONEWAY","regulatory--one-way-right--us":"ONEWAY","regulatory--one-way-left--us--alternate":"ONEWAY","regulatory--one-way-right--us--alternate":"ONEWAY","warning--single-reverse-curve--us":"","school--school--us":"","school--school--us--obsolete":"","warning--turn-curve-left-with-speed--us":"","warning--turn-curve-right-with-speed--us":"","regulatory--hight-speed-limit-5--us":"NIGHT5","regulatory--hight-speed-limit-10--us":"NIGHT10","regulatory--hight-speed-limit-15--us":"NIGHT15","regulatory--hight-speed-limit-20--us":"NIGHT20","regulatory--hight-speed-limit-25--us":"NIGHT25","regulatory--hight-speed-limit-30--us":"NIGHT30","regulatory--hight-speed-limit-35--us":"NIGHT35","regulatory--hight-speed-limit-45--us":"NIGHT45","regulatory--hight-speed-limit-50--us":"NIGHT50","regulatory--hight-speed-limit-55--us":"NIGHT55","regulatory--hight-speed-limit-60--us":"NIGHT60","regulatory--hight-speed-limit-65--us":"NIGHT65","regulatory--hight-speed-limit-70--us":"NIGHT70","regulatory--hight-speed-limit-75--us":"NIGHT75","regulatory--hight-speed-limit-80--us":"NIGHT80","regulatory--hight-speed-limit-85--us":"NIGHT85","regulatory--truck-speed-limit-5--us":"TRUCKS5","regulatory--truck-speed-limit-10--us":"TRUCKS10","regulatory--truck-speed-limit-15--us":"TRUCKS15","regulatory--truck-speed-limit-20--us":"TRUCKS20","regulatory--truck-speed-limit-25--us":"TRUCKS25","regulatory--truck-speed-limit-30--us":"TRUCKS30","regulatory--truck-speed-limit-35--us":"TRUCKS35","regulatory--truck-speed-limit-45--us":"TRUCKS45","regulatory--truck-speed-limit-50--us":"TRUCKS50","regulatory--truck-speed-limit-55--us":"TRUCKS55","regulatory--truck-speed-limit-60--us":"TRUCKS60","regulatory--truck-speed-limit-65--us":"TRUCKS65","regulatory--truck-speed-limit-70--us":"TRUCKS70","regulatory--truck-speed-limit-75--us":"TRUCKS75","regulatory--truck-speed-limit-80--us":"TRUCKS80","regulatory--truck-speed-limit-85--us":"TRUCKS85","warning--merging-traffic--us":""} \ No newline at end of file diff --git a/vendor/assets/iD/iD/traffico/stylesheets/examples.css b/vendor/assets/iD/iD/traffico/stylesheets/examples.css new file mode 100644 index 000000000..8a9b7762a --- /dev/null +++ b/vendor/assets/iD/iD/traffico/stylesheets/examples.css @@ -0,0 +1,32 @@ +.examples-container { + max-width: 1200px; + margin: 0 auto; } + +.examples h2 { + background: none repeat scroll 0 0 #35af6d; + color: #ffffff; + padding: 0.5em 1em; } + +.examples h3 { + color: #35af6d; } + +.examples .t { + font-size: 75px; + margin: .1em; } + .examples .t i:first-child { + text-shadow: 0 0 3px rgba(0, 0, 0, 0.3); + transition: 1s ease text-shadow; } + +.examples .signContainer { + display: inline-block; + padding: .5em .5em 1.5em; } + .examples .signContainer .label { + position: absolute; + display: none; } + .examples .signContainer:hover .t i:first-child { + text-shadow: none; } + .examples .signContainer:hover .label { + display: block; } + +.examples .categoryContainer { + padding: 0 10px; } diff --git a/vendor/assets/iD/iD/traffico/stylesheets/traffico.css.erb b/vendor/assets/iD/iD/traffico/stylesheets/traffico.css.erb new file mode 100644 index 000000000..15044e8b4 --- /dev/null +++ b/vendor/assets/iD/iD/traffico/stylesheets/traffico.css.erb @@ -0,0 +1,465 @@ +/* + Icon Font: traffico +*/ + +@font-face { + font-family: "traffico"; + src: url(<%= asset_path("iD/traffico/fonts/traffico_d596ae6150aa5c55ac14b1e060efc523.eot") %>); + src: url(<%= asset_path("iD/traffico/fonts/traffico_d596ae6150aa5c55ac14b1e060efc523.eot") %>?#iefix) format("embedded-opentype"), + url(<%= asset_path("iD/traffico/fonts/traffico_d596ae6150aa5c55ac14b1e060efc523.woff") %>) format("woff"), + url(<%= asset_path("iD/traffico/fonts/traffico_d596ae6150aa5c55ac14b1e060efc523.ttf") %>) format("truetype"), + url(<%= asset_path("iD/traffico/fonts/traffico_d596ae6150aa5c55ac14b1e060efc523.svg") %>#traffico) format("svg"); + font-weight: normal; + font-style: normal; +} + +@media screen and (-webkit-min-device-pixel-ratio:0) { + @font-face { + font-family: "traffico"; + src: url(<%= asset_path("iD/traffico/fonts/traffico_d596ae6150aa5c55ac14b1e060efc523.svg") %>#traffico) format("svg"); + } +} + +[data-icon]:before { content: attr(data-icon); } + +[data-icon]:before, +.t-DE-arrow-up:before, +.t-US-arrow-oneway:before, +.t-US-arrow-up:before, +.t-added-lane:before, +.t-added-lane-entering-roadway:before, +.t-airplane:before, +.t-arrow-l:before, +.t-arrow-oneway:before, +.t-arrow-s-l:before, +.t-arrows_both_bra:before, +.t-bending-priority:before, +.t-bicycle:before, +.t-bicycle-slippery:before, +.t-bump:before, +.t-bump_bra:before, +.t-bump_road_bra:before, +.t-bumps:before, +.t-bus:before, +.t-car:before, +.t-children:before, +.t-children-au:before, +.t-circle-bar-rounded:before, +.t-circle-bg:before, +.t-circle-o:before, +.t-circle-separator:before, +.t-cliff:before, +.t-cross-roads:before, +.t-crossroads-ahead:before, +.t-crossroads-ahead-ontario:before, +.t-curve-r-l:before, +.t-cyclists_crossing_bra:before, +.t-d-curve-l:before, +.t-dead-end:before, +.t-descent:before, +.t-disabled-p:before, +.t-divided-highway:before, +.t-domestic-animal:before, +.t-domestic-animals-au:before, +.t-emu:before, +.t-end:before, +.t-equestrian:before, +.t-europe_stars:before, +.t-exclamation:before, +.t-falling-rocks-EU:before, +.t-falling-rocks-US:before, +.t-falling-rocks-au:before, +.t-fire-station:before, +.t-firemans-car:before, +.t-flaggers:before, +.t-footpath:before, +.t-h:before, +.t-h-align-l:before, +.t-hairpin-curve:before, +.t-hairpin-curve-au:before, +.t-hazardous-material:before, +.t-height:before, +.t-height-restriction-ca:before, +.t-highway-divided:before, +.t-hitch-hiking:before, +.t-kangaroo:before, +.t-koala-ugly:before, +.t-koalas:before, +.t-level-crossing:before, +.t-light-rail:before, +.t-lightground-railroad-crossing:before, +.t-loop-270:before, +.t-loose_road_surface_bra:before, +.t-lorry:before, +.t-lorry-left:before, +.t-low-clearance:before, +.t-merge:before, +.t-metric-clearance:before, +.t-moped:before, +.t-motorbike:before, +.t-narrow-bridge-au:before, +.t-narrow-bridge-us:before, +.t-narrow-road-both:before, +.t-narrow-road-l:before, +.t-no-l-or-u-turn:before, +.t-octagon:before, +.t-offset-roads:before, +.t-opening-swing-bridge-ca:before, +.t-parking:before, +.t-pass-either-us:before, +.t-pass-l-r:before, +.t-pavement-ends:before, +.t-pedestrian:before, +.t-pedestrian-crossing:before, +.t-pedestrian-crossing-au:before, +.t-pedestrian_bra:before, +.t-pedestrian_crossing_bra:before, +.t-pedestrians:before, +.t-play-ground:before, +.t-playground-ahead-ca:before, +.t-playground-br:before, +.t-pretzel-loop:before, +.t-railroad:before, +.t-railroad-barriers:before, +.t-railway-flashing-au:before, +.t-railway-xing-secured:before, +.t-railway-xing-unsecured:before, +.t-reverse-curve-au:before, +.t-reverse-curve-ontario:before, +.t-right-of-way:before, +.t-right-of-way-l:before, +.t-roadworks:before, +.t-roadworks_bra:before, +.t-rollerblading:before, +.t-roundabout:before, +.t-school:before, +.t-school_zone_bra:before, +.t-series-of-curves-left:before, +.t-share-road:before, +.t-share-roads:before, +.t-side-road-a-a-l:before, +.t-side-road-a-a-r:before, +.t-side-road-p-l:before, +.t-side-road-p-r:before, +.t-side-road-perpendicular:before, +.t-single-2-reverse-curve:before, +.t-skewed-railroads:before, +.t-slippery:before, +.t-slippery-motorcycle:before, +.t-slippery-road:before, +.t-small-arrow-au:before, +.t-snowflake:before, +.t-square-angular:before, +.t-square-diagonal-bar:before, +.t-square-rounded:before, +.t-steep-hill:before, +.t-steep-hill-downwards:before, +.t-steep-hill-upwards:before, +.t-stop:before, +.t-t-roads:before, +.t-tractor:before, +.t-traffic-signal-au:before, +.t-trailer:before, +.t-train-au:before, +.t-train-electric:before, +.t-tram:before, +.t-transit_bra:before, +.t-tri-angular:before, +.t-tri-rounded:before, +.t-truck:before, +.t-truck-rollover-speed:before, +.t-trucks-rollover:before, +.t-tunnel:before, +.t-turn-90-l:before, +.t-turn-curve-speed:before, +.t-turn-l:before, +.t-turn-l-aus:before, +.t-turn-l-curve:before, +.t-turn-reverse-left:before, +.t-turn-right-curve-ontario:before, +.t-turnaround:before, +.t-turnaround2:before, +.t-two_way_arrows_bra:before, +.t-u-turn:before, +.t-u-turn-au:before, +.t-wild-animal:before, +.t-windbag:before, +.t-winding-road-left:before, +.t-wombat:before, +.t-y-roads:before { + display: inline-block; + font-family: "traffico"; + font-style: normal; + font-weight: normal; + font-variant: normal; + line-height: 1; + text-decoration: inherit; + text-rendering: optimizeLegibility; + text-transform: none; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-smoothing: antialiased; +} + +.t-DE-arrow-up:before { content: "\f100"; } +.t-US-arrow-oneway:before { content: "\f101"; } +.t-US-arrow-up:before { content: "\f102"; } +.t-added-lane:before { content: "\f103"; } +.t-added-lane-entering-roadway:before { content: "\f104"; } +.t-airplane:before { content: "\f105"; } +.t-arrow-l:before { content: "\f106"; } +.t-arrow-oneway:before { content: "\f107"; } +.t-arrow-s-l:before { content: "\f108"; } +.t-arrows_both_bra:before { content: "\f109"; } +.t-bending-priority:before { content: "\f10a"; } +.t-bicycle:before { content: "\f10b"; } +.t-bicycle-slippery:before { content: "\f10c"; } +.t-bump:before { content: "\f10d"; } +.t-bump_bra:before { content: "\f10e"; } +.t-bump_road_bra:before { content: "\f10f"; } +.t-bumps:before { content: "\f110"; } +.t-bus:before { content: "\f111"; } +.t-car:before { content: "\f112"; } +.t-children:before { content: "\f113"; } +.t-children-au:before { content: "\f114"; } +.t-circle-bar-rounded:before { content: "\f115"; } +.t-circle-bg:before { content: "\f116"; } +.t-circle-o:before { content: "\f117"; } +.t-circle-separator:before { content: "\f118"; } +.t-cliff:before { content: "\f119"; } +.t-cross-roads:before { content: "\f11a"; } +.t-crossroads-ahead:before { content: "\f11b"; } +.t-crossroads-ahead-ontario:before { content: "\f11c"; } +.t-curve-r-l:before { content: "\f11d"; } +.t-cyclists_crossing_bra:before { content: "\f11e"; } +.t-d-curve-l:before { content: "\f11f"; } +.t-dead-end:before { content: "\f120"; } +.t-descent:before { content: "\f121"; } +.t-disabled-p:before { content: "\f122"; } +.t-divided-highway:before { content: "\f123"; } +.t-domestic-animal:before { content: "\f124"; } +.t-domestic-animals-au:before { content: "\f125"; } +.t-emu:before { content: "\f126"; } +.t-end:before { content: "\f127"; } +.t-equestrian:before { content: "\f128"; } +.t-europe_stars:before { content: "\f129"; } +.t-exclamation:before { content: "\f12a"; } +.t-falling-rocks-EU:before { content: "\f12b"; } +.t-falling-rocks-US:before { content: "\f12c"; } +.t-falling-rocks-au:before { content: "\f12d"; } +.t-fire-station:before { content: "\f12e"; } +.t-firemans-car:before { content: "\f12f"; } +.t-flaggers:before { content: "\f130"; } +.t-footpath:before { content: "\f131"; } +.t-h:before { content: "\f132"; } +.t-h-align-l:before { content: "\f133"; } +.t-hairpin-curve:before { content: "\f134"; } +.t-hairpin-curve-au:before { content: "\f135"; } +.t-hazardous-material:before { content: "\f136"; } +.t-height:before { content: "\f137"; } +.t-height-restriction-ca:before { content: "\f138"; } +.t-highway-divided:before { content: "\f139"; } +.t-hitch-hiking:before { content: "\f13a"; } +.t-kangaroo:before { content: "\f13b"; } +.t-koala-ugly:before { content: "\f13c"; } +.t-koalas:before { content: "\f13d"; } +.t-level-crossing:before { content: "\f13e"; } +.t-light-rail:before { content: "\f13f"; } +.t-lightground-railroad-crossing:before { content: "\f140"; } +.t-loop-270:before { content: "\f141"; } +.t-loose_road_surface_bra:before { content: "\f142"; } +.t-lorry:before { content: "\f143"; } +.t-lorry-left:before { content: "\f144"; } +.t-low-clearance:before { content: "\f145"; } +.t-merge:before { content: "\f146"; } +.t-metric-clearance:before { content: "\f147"; } +.t-moped:before { content: "\f148"; } +.t-motorbike:before { content: "\f149"; } +.t-narrow-bridge-au:before { content: "\f14a"; } +.t-narrow-bridge-us:before { content: "\f14b"; } +.t-narrow-road-both:before { content: "\f14c"; } +.t-narrow-road-l:before { content: "\f14d"; } +.t-no-l-or-u-turn:before { content: "\f14e"; } +.t-octagon:before { content: "\f14f"; } +.t-offset-roads:before { content: "\f150"; } +.t-opening-swing-bridge-ca:before { content: "\f151"; } +.t-parking:before { content: "\f152"; } +.t-pass-either-us:before { content: "\f153"; } +.t-pass-l-r:before { content: "\f154"; } +.t-pavement-ends:before { content: "\f155"; } +.t-pedestrian:before { content: "\f156"; } +.t-pedestrian-crossing:before { content: "\f157"; } +.t-pedestrian-crossing-au:before { content: "\f158"; } +.t-pedestrian_bra:before { content: "\f159"; } +.t-pedestrian_crossing_bra:before { content: "\f15a"; } +.t-pedestrians:before { content: "\f15b"; } +.t-play-ground:before { content: "\f15c"; } +.t-playground-ahead-ca:before { content: "\f15d"; } +.t-playground-br:before { content: "\f15e"; } +.t-pretzel-loop:before { content: "\f15f"; } +.t-railroad:before { content: "\f160"; } +.t-railroad-barriers:before { content: "\f161"; } +.t-railway-flashing-au:before { content: "\f162"; } +.t-railway-xing-secured:before { content: "\f163"; } +.t-railway-xing-unsecured:before { content: "\f164"; } +.t-reverse-curve-au:before { content: "\f165"; } +.t-reverse-curve-ontario:before { content: "\f166"; } +.t-right-of-way:before { content: "\f167"; } +.t-right-of-way-l:before { content: "\f168"; } +.t-roadworks:before { content: "\f169"; } +.t-roadworks_bra:before { content: "\f16a"; } +.t-rollerblading:before { content: "\f16b"; } +.t-roundabout:before { content: "\f16c"; } +.t-school:before { content: "\f16d"; } +.t-school_zone_bra:before { content: "\f16e"; } +.t-series-of-curves-left:before { content: "\f16f"; } +.t-share-road:before { content: "\f170"; } +.t-share-roads:before { content: "\f171"; } +.t-side-road-a-a-l:before { content: "\f172"; } +.t-side-road-a-a-r:before { content: "\f173"; } +.t-side-road-p-l:before { content: "\f174"; } +.t-side-road-p-r:before { content: "\f175"; } +.t-side-road-perpendicular:before { content: "\f176"; } +.t-single-2-reverse-curve:before { content: "\f177"; } +.t-skewed-railroads:before { content: "\f178"; } +.t-slippery:before { content: "\f179"; } +.t-slippery-motorcycle:before { content: "\f17a"; } +.t-slippery-road:before { content: "\f17b"; } +.t-small-arrow-au:before { content: "\f17c"; } +.t-snowflake:before { content: "\f17d"; } +.t-square-angular:before { content: "\f17e"; } +.t-square-diagonal-bar:before { content: "\f17f"; } +.t-square-rounded:before { content: "\f180"; } +.t-steep-hill:before { content: "\f181"; } +.t-steep-hill-downwards:before { content: "\f182"; } +.t-steep-hill-upwards:before { content: "\f183"; } +.t-stop:before { content: "\f184"; } +.t-t-roads:before { content: "\f185"; } +.t-tractor:before { content: "\f186"; } +.t-traffic-signal-au:before { content: "\f187"; } +.t-trailer:before { content: "\f188"; } +.t-train-au:before { content: "\f189"; } +.t-train-electric:before { content: "\f18a"; } +.t-tram:before { content: "\f18b"; } +.t-transit_bra:before { content: "\f18c"; } +.t-tri-angular:before { content: "\f18d"; } +.t-tri-rounded:before { content: "\f18e"; } +.t-truck:before { content: "\f18f"; } +.t-truck-rollover-speed:before { content: "\f190"; } +.t-trucks-rollover:before { content: "\f191"; } +.t-tunnel:before { content: "\f192"; } +.t-turn-90-l:before { content: "\f193"; } +.t-turn-curve-speed:before { content: "\f194"; } +.t-turn-l:before { content: "\f195"; } +.t-turn-l-aus:before { content: "\f196"; } +.t-turn-l-curve:before { content: "\f197"; } +.t-turn-reverse-left:before { content: "\f198"; } +.t-turn-right-curve-ontario:before { content: "\f199"; } +.t-turnaround:before { content: "\f19a"; } +.t-turnaround2:before { content: "\f19b"; } +.t-two_way_arrows_bra:before { content: "\f19c"; } +.t-u-turn:before { content: "\f19d"; } +.t-u-turn-au:before { content: "\f19e"; } +.t-wild-animal:before { content: "\f19f"; } +.t-windbag:before { content: "\f1a0"; } +.t-winding-road-left:before { content: "\f1a1"; } +.t-wombat:before { content: "\f1a2"; } +.t-y-roads:before { content: "\f1a3"; } + +/** Base */ +.t { + display: inline-block; + font: normal normal normal 14px/1 traffico; + position: relative; + width: 1em; + height: 1em; + line-height: 1em; + vertical-align: middle; + font-size: inherit; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.t i { + position: absolute; + left: 0; + width: 100%; + height:1em; + line-height:0; + text-align: center; +} + +/** Content */ + +.t-content, +.t-content-3, +.t-content-4{ + font-family: Helvetica, Arial, sans-serif; + font-weight: bold; + font-style: normal; + letter-spacing:0; + top:48.5%; +} +.t-content { + font-size: 50%; +} + +.t-content-3 { + font-size: 40%; +} + +.t-content-4 { + font-size: 22.5%; +} + +.t-content-5 { + font-family: Helvetica, Arial, sans-serif; + font-weight: normal; + font-style: normal; + font-size: 15%; + letter-spacing:0; + top:50%; +} + +/** Colours */ + +.t-c-white { + color: white; +} + +.t-c-red { + color: #c1121c; +} + +.t-c-orange { + color: #f60; +} + +.t-c-blue { + color: #154889; +} + +.t-c-black { + color: black; +} + +.t-c-yellow-dark { + color: #f0ca00; +} + +.t-c-yellow { + color: #fecf33; +} + +.t-c-grey { + color: grey; +} + +.t-c-green { + color: #008754; +} + +.t-c-fluogreen { + color: #A2FF31; +} diff --git a/vendor/assets/iD/iD/traffico/transformations.json b/vendor/assets/iD/iD/traffico/transformations.json new file mode 100644 index 000000000..08d9a95f7 --- /dev/null +++ b/vendor/assets/iD/iD/traffico/transformations.json @@ -0,0 +1 @@ +{"fit_triangle":"scale(.8) translate(0,5%)","fit_border_circle":"scale(.8)","fit_diamond":"scale(.9)","top_half":"scale(.6) translate(0,-35%)","bottom_half":"scale(.6) translate(0,35%)","left_half":"scale(.6) translate(-40%,0)","right_half":"scale(.6) translate(40%,0)","square_to_diamond":"scale(0.707107) rotate(45deg)","center2tri":"translate(0,14.43%)","tri2center":"translate(0,-14.43%)","inner_triangle":"{center2tri} scale(.7) {tri2center}"} \ No newline at end of file diff --git a/vendor/assets/iD/imagery.js b/vendor/assets/iD/imagery.js deleted file mode 100644 index 0f94a2fe5..000000000 --- a/vendor/assets/iD/imagery.js +++ /dev/null @@ -1,38144 +0,0 @@ -iD.data.imagery = [ - { - "name": "7th Series (OS7)", - "type": "tms", - "template": "http://ooc.openstreetmap.org/os7/{zoom}/{x}/{y}.jpg", - "polygon": [ - [ - [ - -9, - 49.8 - ], - [ - -9, - 61.1 - ], - [ - 1.9, - 61.1 - ], - [ - 1.9, - 49.8 - ], - [ - -9, - 49.8 - ] - ] - ] - }, - { - "name": "AGRI black-and-white 2.5m", - "type": "tms", - "template": "http://agri.openstreetmap.org/{zoom}/{x}/{y}.png", - "polygon": [ - [ - [ - 112.28778, - -28.784589 - ], - [ - 112.71488, - -31.13894 - ], - [ - 114.11263, - -34.178287 - ], - [ - 113.60788, - -37.39012 - ], - [ - 117.17992, - -37.451794 - ], - [ - 119.31538, - -37.42096 - ], - [ - 121.72262, - -36.708394 - ], - [ - 123.81925, - -35.76893 - ], - [ - 125.9547, - -34.3066 - ], - [ - 127.97368, - -33.727398 - ], - [ - 130.07031, - -33.24166 - ], - [ - 130.10913, - -33.888704 - ], - [ - 131.00214, - -34.049705 - ], - [ - 131.0798, - -34.72257 - ], - [ - 132.28342, - -35.39 - ], - [ - 134.18591, - -35.61126 - ], - [ - 133.8753, - -37.1119 - ], - [ - 134.8459, - -37.6365 - ], - [ - 139.7769, - -37.82075 - ], - [ - 139.93223, - -39.4283 - ], - [ - 141.6017, - -39.8767 - ], - [ - 142.3783, - -39.368294 - ], - [ - 142.3783, - -40.64702 - ], - [ - 142.49478, - -42.074874 - ], - [ - 144.009, - -44.060127 - ], - [ - 147.23161, - -44.03222 - ], - [ - 149.05645, - -42.534313 - ], - [ - 149.52237, - -40.99959 - ], - [ - 149.9494, - -40.852921 - ], - [ - 150.8036, - -38.09627 - ], - [ - 151.81313, - -38.12682 - ], - [ - 156.20052, - -22.667706 - ], - [ - 156.20052, - -20.10109 - ], - [ - 156.62761, - -17.417627 - ], - [ - 155.26869, - -17.19521 - ], - [ - 154.14272, - -19.51662 - ], - [ - 153.5215, - -18.34139 - ], - [ - 153.05558, - -16.5636 - ], - [ - 152.78379, - -15.256768 - ], - [ - 152.27905, - -13.4135 - ], - [ - 151.3472, - -12.391767 - ], - [ - 149.48354, - -12.05024 - ], - [ - 146.9598, - -9.992408 - ], - [ - 135.9719, - -9.992408 - ], - [ - 130.3032, - -10.33636 - ], - [ - 128.09016, - -12.164136 - ], - [ - 125.91588, - -12.315912 - ], - [ - 124.3239, - -11.860326 - ], - [ - 122.03323, - -11.974295 - ], - [ - 118.26706, - -16.9353 - ], - [ - 115.93747, - -19.11357 - ], - [ - 114.0738, - -21.11863 - ], - [ - 113.49141, - -22.596033 - ], - [ - 112.28778, - -28.784589 - ] - ] - ], - "terms_text": "AGRI" - }, - { - "name": "Bing aerial imagery", - "type": "bing", - "description": "Satellite and aerial imagery.", - "template": "http://www.bing.com/maps/", - "scaleExtent": [ - 0, - 22 - ], - "id": "Bing", - "default": true - }, - { - "name": "British Columbia Mosaic", - "type": "tms", - "template": "http://{switch:a,b,c,d}.imagery.paulnorman.ca/tiles/bc_mosaic/{zoom}/{x}/{y}.png", - "scaleExtent": [ - 9, - 20 - ], - "polygon": [ - [ - [ - -123.3176032, - 49.3272567 - ], - [ - -123.4405258, - 49.3268222 - ], - [ - -123.440717, - 49.3384429 - ], - [ - -123.4398375, - 49.3430357 - ], - [ - -123.4401258, - 49.3435398 - ], - [ - -123.4401106, - 49.3439946 - ], - [ - -123.4406265, - 49.3444493 - ], - [ - -123.4404747, - 49.3455762 - ], - [ - -123.4397768, - 49.3460606 - ], - [ - -123.4389726, - 49.3461298 - ], - [ - -123.4372904, - 49.3567236 - ], - [ - -123.4374774, - 49.3710843 - ], - [ - -123.4335292, - 49.3709446 - ], - [ - -123.4330357, - 49.373725 - ], - [ - -123.4332717, - 49.3751221 - ], - [ - -123.4322847, - 49.3761001 - ], - [ - -123.4317482, - 49.3791736 - ], - [ - -123.4314264, - 49.3795927 - ], - [ - -123.4307826, - 49.3823866 - ], - [ - -123.4313405, - 49.3827358 - ], - [ - -123.4312118, - 49.3838533 - ], - [ - -123.4300415, - 49.3845883 - ], - [ - -123.4189858, - 49.3847087 - ], - [ - -123.4192235, - 49.4135198 - ], - [ - -123.3972532, - 49.4135691 - ], - [ - -123.3972758, - 49.4243473 - ], - [ - -123.4006929, - 49.4243314 - ], - [ - -123.4007741, - 49.5703491 - ], - [ - -123.4000812, - 49.570345 - ], - [ - -123.4010761, - 49.5933838 - ], - [ - -123.3760399, - 49.5932848 - ], - [ - -123.3769811, - 49.6756063 - ], - [ - -123.3507288, - 49.6756396 - ], - [ - -123.3507969, - 49.7086751 - ], - [ - -123.332887, - 49.708722 - ], - [ - -123.3327888, - 49.7256288 - ], - [ - -123.3007111, - 49.7255625 - ], - [ - -123.3009164, - 49.7375384 - ], - [ - -123.2885986, - 49.737638 - ], - [ - -123.2887823, - 49.8249207 - ], - [ - -123.2997955, - 49.8249207 - ], - [ - -123.3011721, - 49.8497814 - ], - [ - -123.3218218, - 49.850669 - ], - [ - -123.3273284, - 49.8577696 - ], - [ - -123.3276726, - 49.9758852 - ], - [ - -123.3008279, - 49.9752212 - ], - [ - -123.3007204, - 50.0997002 - ], - [ - -123.2501716, - 50.100735 - ], - [ - -123.25091, - 50.2754901 - ], - [ - -123.0224338, - 50.2755598 - ], - [ - -123.0224879, - 50.3254853 - ], - [ - -123.0009318, - 50.3254689 - ], - [ - -123.0007778, - 50.3423899 - ], - [ - -122.9775023, - 50.3423408 - ], - [ - -122.9774766, - 50.3504306 - ], - [ - -122.9508137, - 50.3504961 - ], - [ - -122.950795, - 50.3711984 - ], - [ - -122.9325221, - 50.3711521 - ], - [ - -122.9321048, - 50.399793 - ], - [ - -122.8874234, - 50.3999748 - ], - [ - -122.8873385, - 50.4256108 - ], - [ - -122.6620152, - 50.4256959 - ], - [ - -122.6623083, - 50.3994506 - ], - [ - -122.5990316, - 50.3992413 - ], - [ - -122.5988274, - 50.3755206 - ], - [ - -122.5724832, - 50.3753706 - ], - [ - -122.5735621, - 50.2493891 - ], - [ - -122.5990415, - 50.2494643 - ], - [ - -122.5991504, - 50.2265663 - ], - [ - -122.6185016, - 50.2266359 - ], - [ - -122.6185741, - 50.2244081 - ], - [ - -122.6490609, - 50.2245126 - ], - [ - -122.6492181, - 50.1993528 - ], - [ - -122.7308575, - 50.1993758 - ], - [ - -122.7311583, - 50.1244287 - ], - [ - -122.7490352, - 50.1245109 - ], - [ - -122.7490541, - 50.0903032 - ], - [ - -122.7687806, - 50.0903435 - ], - [ - -122.7689801, - 49.9494546 - ], - [ - -122.999047, - 49.9494706 - ], - [ - -122.9991199, - 49.8754553 - ], - [ - -122.9775894, - 49.8754553 - ], - [ - -122.9778145, - 49.6995098 - ], - [ - -122.9992362, - 49.6994781 - ], - [ - -122.9992524, - 49.6516526 - ], - [ - -123.0221525, - 49.6516526 - ], - [ - -123.0221162, - 49.5995096 - ], - [ - -123.0491898, - 49.5994625 - ], - [ - -123.0491898, - 49.5940523 - ], - [ - -123.0664647, - 49.5940405 - ], - [ - -123.0663594, - 49.5451868 - ], - [ - -123.0699906, - 49.5451202 - ], - [ - -123.0699008, - 49.5413153 - ], - [ - -123.0706835, - 49.5392837 - ], - [ - -123.0708888, - 49.5379931 - ], - [ - -123.0711454, - 49.5368773 - ], - [ - -123.0711069, - 49.5358115 - ], - [ - -123.0713764, - 49.532822 - ], - [ - -123.0716458, - 49.5321141 - ], - [ - -123.07171, - 49.5313896 - ], - [ - -123.0720308, - 49.5304153 - ], - [ - -123.0739554, - 49.5303486 - ], - [ - -123.0748023, - 49.5294992 - ], - [ - -123.0748151, - 49.5288079 - ], - [ - -123.0743403, - 49.5280584 - ], - [ - -123.073532, - 49.5274588 - ], - [ - -123.0733652, - 49.5270423 - ], - [ - -123.0732882, - 49.5255932 - ], - [ - -123.0737116, - 49.5249602 - ], - [ - -123.0736218, - 49.5244938 - ], - [ - -123.0992583, - 49.5244854 - ], - [ - -123.0991649, - 49.4754502 - ], - [ - -123.071052, - 49.4755252 - ], - [ - -123.071088, - 49.4663034 - ], - [ - -123.0739204, - 49.4663054 - ], - [ - -123.07422, - 49.4505028 - ], - [ - -123.0746319, - 49.4500858 - ], - [ - -123.074651, - 49.449329 - ], - [ - -123.0745999, - 49.449018 - ], - [ - -123.0744619, - 49.4486927 - ], - [ - -123.0743336, - 49.4479899 - ], - [ - -123.0742427, - 49.4477688 - ], - [ - -123.0743061, - 49.4447473 - ], - [ - -123.0747103, - 49.4447556 - ], - [ - -123.0746384, - 49.4377306 - ], - [ - -122.9996506, - 49.4377363 - ], - [ - -122.9996506, - 49.4369214 - ], - [ - -122.8606163, - 49.4415314 - ], - [ - -122.8102616, - 49.4423972 - ], - [ - -122.8098984, - 49.3766739 - ], - [ - -122.4036093, - 49.3766617 - ], - [ - -122.4036341, - 49.3771944 - ], - [ - -122.264739, - 49.3773028 - ], - [ - -122.263542, - 49.2360088 - ], - [ - -122.2155742, - 49.236139 - ], - [ - -122.0580956, - 49.235878 - ], - [ - -121.9538274, - 49.2966525 - ], - [ - -121.9400911, - 49.3045389 - ], - [ - -121.9235761, - 49.3142257 - ], - [ - -121.8990871, - 49.3225436 - ], - [ - -121.8883447, - 49.3259752 - ], - [ - -121.8552982, - 49.3363575 - ], - [ - -121.832697, - 49.3441519 - ], - [ - -121.7671336, - 49.3654361 - ], - [ - -121.6736683, - 49.3654589 - ], - [ - -121.6404153, - 49.3743775 - ], - [ - -121.5961976, - 49.3860493 - ], - [ - -121.5861178, - 49.3879193 - ], - [ - -121.5213684, - 49.3994649 - ], - [ - -121.5117375, - 49.4038378 - ], - [ - -121.4679302, - 49.4229024 - ], - [ - -121.4416803, - 49.4345607 - ], - [ - -121.422429, - 49.4345788 - ], - [ - -121.3462885, - 49.3932312 - ], - [ - -121.3480144, - 49.3412388 - ], - [ - -121.5135035, - 49.320577 - ], - [ - -121.6031683, - 49.2771727 - ], - [ - -121.6584065, - 49.1856125 - ], - [ - -121.679953, - 49.1654109 - ], - [ - -121.7815793, - 49.0702559 - ], - [ - -121.8076228, - 49.0622471 - ], - [ - -121.9393997, - 49.0636219 - ], - [ - -121.9725524, - 49.0424179 - ], - [ - -121.9921394, - 49.0332869 - ], - [ - -122.0035289, - 49.0273413 - ], - [ - -122.0178564, - 49.0241067 - ], - [ - -122.1108634, - 48.9992786 - ], - [ - -122.1493067, - 48.9995305 - ], - [ - -122.1492705, - 48.9991498 - ], - [ - -122.1991447, - 48.9996019 - ], - [ - -122.199181, - 48.9991974 - ], - [ - -122.234365, - 48.9994829 - ], - [ - -122.234365, - 49.000173 - ], - [ - -122.3994722, - 49.0012385 - ], - [ - -122.4521338, - 49.0016326 - ], - [ - -122.4521338, - 49.000883 - ], - [ - -122.4584089, - 49.0009306 - ], - [ - -122.4584814, - 48.9993124 - ], - [ - -122.4992458, - 48.9995022 - ], - [ - -122.4992458, - 48.9992906 - ], - [ - -122.5492618, - 48.9995107 - ], - [ - -122.5492564, - 48.9993206 - ], - [ - -122.6580785, - 48.9994212 - ], - [ - -122.6581061, - 48.9954007 - ], - [ - -122.7067604, - 48.9955344 - ], - [ - -122.7519761, - 48.9956392 - ], - [ - -122.7922063, - 48.9957204 - ], - [ - -122.7921907, - 48.9994331 - ], - [ - -123.0350417, - 48.9995724 - ], - [ - -123.0350437, - 49.0000958 - ], - [ - -123.0397091, - 49.0000536 - ], - [ - -123.0397444, - 49.0001812 - ], - [ - -123.0485506, - 49.0001348 - ], - [ - -123.0485329, - 49.0004712 - ], - [ - -123.0557122, - 49.000448 - ], - [ - -123.0556324, - 49.0002284 - ], - [ - -123.0641365, - 49.0001293 - ], - [ - -123.064158, - 48.9999421 - ], - [ - -123.074899, - 48.9996928 - ], - [ - -123.0750717, - 49.0006218 - ], - [ - -123.0899573, - 49.0003726 - ], - [ - -123.109229, - 48.9999421 - ], - [ - -123.1271193, - 49.0003046 - ], - [ - -123.1359953, - 48.9998741 - ], - [ - -123.1362716, - 49.0005765 - ], - [ - -123.153851, - 48.9998061 - ], - [ - -123.1540533, - 49.0006806 - ], - [ - -123.1710015, - 49.0001274 - ], - [ - -123.2000916, - 48.9996849 - ], - [ - -123.2003446, - 49.0497785 - ], - [ - -123.2108845, - 49.0497232 - ], - [ - -123.2112218, - 49.051989 - ], - [ - -123.2070479, - 49.0520857 - ], - [ - -123.2078911, - 49.0607884 - ], - [ - -123.2191688, - 49.0600978 - ], - [ - -123.218958, - 49.0612719 - ], - [ - -123.2251766, - 49.0612719 - ], - [ - -123.2253874, - 49.0622388 - ], - [ - -123.2297088, - 49.0620316 - ], - [ - -123.2298142, - 49.068592 - ], - [ - -123.2331869, - 49.0687301 - ], - [ - -123.2335031, - 49.0705945 - ], - [ - -123.249313, - 49.0702493 - ], - [ - -123.2497346, - 49.0802606 - ], - [ - -123.2751358, - 49.0803986 - ], - [ - -123.2751358, - 49.0870947 - ], - [ - -123.299483, - 49.0873018 - ], - [ - -123.29944, - 49.080253 - ], - [ - -123.3254508, - 49.0803944 - ], - [ - -123.3254353, - 49.1154662 - ], - [ - -123.2750966, - 49.1503341 - ], - [ - -123.275181, - 49.1873267 - ], - [ - -123.2788067, - 49.1871063 - ], - [ - -123.278891, - 49.1910741 - ], - [ - -123.3004767, - 49.1910741 - ], - [ - -123.3004186, - 49.2622933 - ], - [ - -123.3126185, - 49.2622416 - ], - [ - -123.3125958, - 49.2714948 - ], - [ - -123.3154251, - 49.2714727 - ], - [ - -123.3156628, - 49.2818906 - ], - [ - -123.3174735, - 49.2818832 - ], - [ - -123.3174961, - 49.2918488 - ], - [ - -123.3190353, - 49.2918488 - ], - [ - -123.3190692, - 49.298602 - ], - [ - -123.3202349, - 49.2985651 - ], - [ - -123.3202786, - 49.3019749 - ], - [ - -123.3222679, - 49.3019605 - ], - [ - -123.3223943, - 49.3118263 - ], - [ - -123.3254002, - 49.3118086 - ], - [ - -123.3253898, - 49.3201721 - ], - [ - -123.3192695, - 49.3201957 - ], - [ - -123.3192242, - 49.3246748 - ], - [ - -123.3179437, - 49.3246596 - ], - [ - -123.3179861, - 49.3254065 - ] - ] - ], - "terms_url": "http://imagery.paulnorman.ca/tiles/about.html", - "terms_text": "Copyright Province of British Columbia, City of Surrey" - }, - { - "name": "Cambodia, Laos, Thailand, Vietnam bilingual", - "type": "tms", - "template": "http://{switch:a,b,c,d}.tile.osm-tools.org/osm_then/{zoom}/{x}/{y}.png", - "scaleExtent": [ - 0, - 19 - ], - "polygon": [ - [ - [ - 97.3, - 5.6 - ], - [ - 97.3, - 23.4 - ], - [ - 109.6, - 23.4 - ], - [ - 109.6, - 5.6 - ], - [ - 97.3, - 5.6 - ] - ] - ], - "terms_url": "http://www.osm-tools.org/", - "terms_text": "© osm-tools.org & OpenStreetMap contributors, CC-BY-SA" - }, - { - "name": "Czech CUZK:KM tiles proxy", - "type": "tms", - "template": "http://osm-{switch:a,b,c}.zby.cz/tiles_cuzk.php/{zoom}/{x}/{y}.png", - "scaleExtent": [ - 13, - 18 - ], - "polygon": [ - [ - [ - 15.0063684, - 49.0177392 - ], - [ - 15.1559854, - 49.0013828 - ], - [ - 15.190896, - 48.9424551 - ], - [ - 15.3105895, - 48.9882938 - ], - [ - 15.4053469, - 48.9752013 - ], - [ - 15.5400022, - 48.9162426 - ], - [ - 15.7145553, - 48.8670572 - ], - [ - 15.8342488, - 48.880178 - ], - [ - 15.968904, - 48.8178233 - ], - [ - 16.0885976, - 48.7455261 - ], - [ - 16.3978059, - 48.7455261 - ], - [ - 16.4875761, - 48.8145394 - ], - [ - 16.6721036, - 48.7784014 - ], - [ - 16.6820781, - 48.7356594 - ], - [ - 16.9015163, - 48.7126294 - ], - [ - 16.9464014, - 48.6237005 - ], - [ - 17.1159672, - 48.8375227 - ], - [ - 17.2107246, - 48.880178 - ], - [ - 17.4052266, - 48.8178233 - ], - [ - 17.4800351, - 48.8539329 - ], - [ - 17.5299074, - 48.8178233 - ], - [ - 17.7044605, - 48.8670572 - ], - [ - 17.8141796, - 48.9359033 - ], - [ - 17.8840008, - 48.9359033 - ], - [ - 17.9438476, - 49.0210099 - ], - [ - 18.0635412, - 49.0340903 - ], - [ - 18.1184007, - 49.0994409 - ], - [ - 18.1981964, - 49.3047337 - ], - [ - 18.3877112, - 49.3339917 - ], - [ - 18.577226, - 49.5091747 - ], - [ - 18.7567663, - 49.4994587 - ], - [ - 18.8465365, - 49.5253637 - ], - [ - 18.8764598, - 49.5706645 - ], - [ - 18.7966641, - 49.693412 - ], - [ - 18.64206, - 49.7095399 - ], - [ - 18.5872004, - 49.8351543 - ], - [ - 18.6121366, - 49.8833809 - ], - [ - 18.5622643, - 49.9347695 - ], - [ - 18.512392, - 49.9058702 - ], - [ - 18.362775, - 49.9540261 - ], - [ - 18.3278644, - 49.9219275 - ], - [ - 18.2630304, - 49.9732751 - ], - [ - 18.1184007, - 50.0053395 - ], - [ - 18.0635412, - 50.075806 - ], - [ - 17.9139242, - 49.9796897 - ], - [ - 17.779269, - 50.0309757 - ], - [ - 17.714435, - 50.1237921 - ], - [ - 17.6047159, - 50.1653411 - ], - [ - 17.7593201, - 50.21962 - ], - [ - 17.7343839, - 50.3439092 - ], - [ - 17.6396265, - 50.2802117 - ], - [ - 17.3802905, - 50.2802117 - ], - [ - 17.3503671, - 50.3439092 - ], - [ - 17.2805459, - 50.3375433 - ], - [ - 17.1857885, - 50.4075214 - ], - [ - 16.9015163, - 50.4615247 - ], - [ - 16.8666057, - 50.4138779 - ], - [ - 16.9663503, - 50.3184404 - ], - [ - 17.0361715, - 50.2323826 - ], - [ - 16.8366823, - 50.21962 - ], - [ - 16.7120015, - 50.1046034 - ], - [ - 16.5823335, - 50.1589513 - ], - [ - 16.5623846, - 50.2387626 - ], - [ - 16.4327166, - 50.3375433 - ], - [ - 16.3529209, - 50.3916263 - ], - [ - 16.2781124, - 50.3916263 - ], - [ - 16.2082911, - 50.4456477 - ], - [ - 16.3978059, - 50.5344899 - ], - [ - 16.4476782, - 50.5978464 - ], - [ - 16.3529209, - 50.670601 - ], - [ - 16.2382145, - 50.6769221 - ], - [ - 16.2182656, - 50.6326561 - ], - [ - 16.1284954, - 50.6832425 - ], - [ - 16.0486997, - 50.6073425 - ], - [ - 15.988853, - 50.7021983 - ], - [ - 15.8741467, - 50.6832425 - ], - [ - 15.8292616, - 50.7653291 - ], - [ - 15.729517, - 50.743243 - ], - [ - 15.450232, - 50.8157725 - ], - [ - 15.3903852, - 50.7747914 - ], - [ - 15.3804108, - 50.8598659 - ], - [ - 15.2956278, - 50.8850434 - ], - [ - 15.2956278, - 50.9887568 - ], - [ - 15.1709471, - 51.0201394 - ], - [ - 14.9914067, - 51.0013124 - ], - [ - 15.0063684, - 50.8881896 - ], - [ - 14.8417898, - 50.8756034 - ], - [ - 14.7969047, - 50.8252246 - ], - [ - 14.6323261, - 50.8567177 - ], - [ - 14.6622495, - 50.9353576 - ], - [ - 14.5724793, - 50.9227841 - ], - [ - 14.6123772, - 50.9856174 - ], - [ - 14.4976708, - 51.0483657 - ], - [ - 14.4178751, - 51.0232765 - ], - [ - 14.3081561, - 51.0671736 - ], - [ - 14.2532965, - 51.0044508 - ], - [ - 14.4029134, - 50.9322145 - ], - [ - 14.3729901, - 50.897627 - ], - [ - 14.2433221, - 50.9070625 - ], - [ - 14.2084114, - 50.844123 - ], - [ - 14.0338583, - 50.8126214 - ], - [ - 13.9789988, - 50.8252246 - ], - [ - 13.9041903, - 50.7968626 - ], - [ - 13.8742669, - 50.740087 - ], - [ - 13.5351352, - 50.7243038 - ], - [ - 13.530148, - 50.6579561 - ], - [ - 13.4703012, - 50.6136722 - ], - [ - 13.3905055, - 50.664279 - ], - [ - 13.3256715, - 50.5883483 - ], - [ - 13.250863, - 50.6105074 - ], - [ - 13.1960035, - 50.5059517 - ], - [ - 13.0513738, - 50.5218084 - ], - [ - 12.9665909, - 50.4106997 - ], - [ - 12.8269484, - 50.4710483 - ], - [ - 12.7022676, - 50.4138779 - ], - [ - 12.5077656, - 50.401164 - ], - [ - 12.343187, - 50.2547088 - ], - [ - 12.323238, - 50.1845054 - ], - [ - 12.2484296, - 50.2738373 - ], - [ - 12.1736211, - 50.3311765 - ], - [ - 12.0988126, - 50.33436 - ], - [ - 12.1187616, - 50.25152 - ], - [ - 12.2234934, - 50.1653411 - ], - [ - 12.2035445, - 50.1237921 - ], - [ - 12.5027784, - 49.9732751 - ], - [ - 12.4778422, - 49.9379795 - ], - [ - 12.5476634, - 49.9155052 - ], - [ - 12.4678677, - 49.8029766 - ], - [ - 12.408021, - 49.7611134 - ], - [ - 12.4828294, - 49.6869593 - ], - [ - 12.5327017, - 49.6869593 - ], - [ - 12.5177401, - 49.6288466 - ], - [ - 12.6075102, - 49.5415474 - ], - [ - 12.6723442, - 49.4378793 - ], - [ - 12.8119867, - 49.3469896 - ], - [ - 12.9466419, - 49.3437405 - ], - [ - 13.2309141, - 49.1288206 - ], - [ - 13.3256715, - 49.1059712 - ], - [ - 13.4353906, - 49.0438984 - ], - [ - 13.4154417, - 48.9948387 - ], - [ - 13.5002246, - 48.949006 - ], - [ - 13.5650586, - 48.9882938 - ], - [ - 13.6847522, - 48.8834577 - ], - [ - 13.7445989, - 48.9031312 - ], - [ - 13.8243946, - 48.7751149 - ], - [ - 13.8992031, - 48.7751149 - ], - [ - 14.0587945, - 48.676418 - ], - [ - 14.0438328, - 48.6302932 - ], - [ - 14.1435774, - 48.5907241 - ], - [ - 14.3729901, - 48.5610269 - ], - [ - 14.4827091, - 48.6500662 - ], - [ - 14.5774665, - 48.607215 - ], - [ - 14.6273389, - 48.6335892 - ], - [ - 14.7071346, - 48.5808269 - ], - [ - 14.7470324, - 48.7027561 - ], - [ - 14.8118664, - 48.7389485 - ], - [ - 14.8168536, - 48.794831 - ], - [ - 14.9864195, - 48.7652539 - ] - ] - ], - "overlay": true - }, - { - "name": "Czech ÚHUL:ORTOFOTO tiles proxy", - "type": "tms", - "template": "http://osm-{switch:a,b,c}.zby.cz/tiles_uhul.php/{zoom}/{x}/{y}.jpg", - "scaleExtent": [ - 13, - 18 - ], - "polygon": [ - [ - [ - 15.0063684, - 49.0177392 - ], - [ - 15.1559854, - 49.0013828 - ], - [ - 15.190896, - 48.9424551 - ], - [ - 15.3105895, - 48.9882938 - ], - [ - 15.4053469, - 48.9752013 - ], - [ - 15.5400022, - 48.9162426 - ], - [ - 15.7145553, - 48.8670572 - ], - [ - 15.8342488, - 48.880178 - ], - [ - 15.968904, - 48.8178233 - ], - [ - 16.0885976, - 48.7455261 - ], - [ - 16.3978059, - 48.7455261 - ], - [ - 16.4875761, - 48.8145394 - ], - [ - 16.6721036, - 48.7784014 - ], - [ - 16.6820781, - 48.7356594 - ], - [ - 16.9015163, - 48.7126294 - ], - [ - 16.9464014, - 48.6237005 - ], - [ - 17.1159672, - 48.8375227 - ], - [ - 17.2107246, - 48.880178 - ], - [ - 17.4052266, - 48.8178233 - ], - [ - 17.4800351, - 48.8539329 - ], - [ - 17.5299074, - 48.8178233 - ], - [ - 17.7044605, - 48.8670572 - ], - [ - 17.8141796, - 48.9359033 - ], - [ - 17.8840008, - 48.9359033 - ], - [ - 17.9438476, - 49.0210099 - ], - [ - 18.0635412, - 49.0340903 - ], - [ - 18.1184007, - 49.0994409 - ], - [ - 18.1981964, - 49.3047337 - ], - [ - 18.3877112, - 49.3339917 - ], - [ - 18.577226, - 49.5091747 - ], - [ - 18.7567663, - 49.4994587 - ], - [ - 18.8465365, - 49.5253637 - ], - [ - 18.8764598, - 49.5706645 - ], - [ - 18.7966641, - 49.693412 - ], - [ - 18.64206, - 49.7095399 - ], - [ - 18.5872004, - 49.8351543 - ], - [ - 18.6121366, - 49.8833809 - ], - [ - 18.5622643, - 49.9347695 - ], - [ - 18.512392, - 49.9058702 - ], - [ - 18.362775, - 49.9540261 - ], - [ - 18.3278644, - 49.9219275 - ], - [ - 18.2630304, - 49.9732751 - ], - [ - 18.1184007, - 50.0053395 - ], - [ - 18.0635412, - 50.075806 - ], - [ - 17.9139242, - 49.9796897 - ], - [ - 17.779269, - 50.0309757 - ], - [ - 17.714435, - 50.1237921 - ], - [ - 17.6047159, - 50.1653411 - ], - [ - 17.7593201, - 50.21962 - ], - [ - 17.7343839, - 50.3439092 - ], - [ - 17.6396265, - 50.2802117 - ], - [ - 17.3802905, - 50.2802117 - ], - [ - 17.3503671, - 50.3439092 - ], - [ - 17.2805459, - 50.3375433 - ], - [ - 17.1857885, - 50.4075214 - ], - [ - 16.9015163, - 50.4615247 - ], - [ - 16.8666057, - 50.4138779 - ], - [ - 16.9663503, - 50.3184404 - ], - [ - 17.0361715, - 50.2323826 - ], - [ - 16.8366823, - 50.21962 - ], - [ - 16.7120015, - 50.1046034 - ], - [ - 16.5823335, - 50.1589513 - ], - [ - 16.5623846, - 50.2387626 - ], - [ - 16.4327166, - 50.3375433 - ], - [ - 16.3529209, - 50.3916263 - ], - [ - 16.2781124, - 50.3916263 - ], - [ - 16.2082911, - 50.4456477 - ], - [ - 16.3978059, - 50.5344899 - ], - [ - 16.4476782, - 50.5978464 - ], - [ - 16.3529209, - 50.670601 - ], - [ - 16.2382145, - 50.6769221 - ], - [ - 16.2182656, - 50.6326561 - ], - [ - 16.1284954, - 50.6832425 - ], - [ - 16.0486997, - 50.6073425 - ], - [ - 15.988853, - 50.7021983 - ], - [ - 15.8741467, - 50.6832425 - ], - [ - 15.8292616, - 50.7653291 - ], - [ - 15.729517, - 50.743243 - ], - [ - 15.450232, - 50.8157725 - ], - [ - 15.3903852, - 50.7747914 - ], - [ - 15.3804108, - 50.8598659 - ], - [ - 15.2956278, - 50.8850434 - ], - [ - 15.2956278, - 50.9887568 - ], - [ - 15.1709471, - 51.0201394 - ], - [ - 14.9914067, - 51.0013124 - ], - [ - 15.0063684, - 50.8881896 - ], - [ - 14.8417898, - 50.8756034 - ], - [ - 14.7969047, - 50.8252246 - ], - [ - 14.6323261, - 50.8567177 - ], - [ - 14.6622495, - 50.9353576 - ], - [ - 14.5724793, - 50.9227841 - ], - [ - 14.6123772, - 50.9856174 - ], - [ - 14.4976708, - 51.0483657 - ], - [ - 14.4178751, - 51.0232765 - ], - [ - 14.3081561, - 51.0671736 - ], - [ - 14.2532965, - 51.0044508 - ], - [ - 14.4029134, - 50.9322145 - ], - [ - 14.3729901, - 50.897627 - ], - [ - 14.2433221, - 50.9070625 - ], - [ - 14.2084114, - 50.844123 - ], - [ - 14.0338583, - 50.8126214 - ], - [ - 13.9789988, - 50.8252246 - ], - [ - 13.9041903, - 50.7968626 - ], - [ - 13.8742669, - 50.740087 - ], - [ - 13.5351352, - 50.7243038 - ], - [ - 13.530148, - 50.6579561 - ], - [ - 13.4703012, - 50.6136722 - ], - [ - 13.3905055, - 50.664279 - ], - [ - 13.3256715, - 50.5883483 - ], - [ - 13.250863, - 50.6105074 - ], - [ - 13.1960035, - 50.5059517 - ], - [ - 13.0513738, - 50.5218084 - ], - [ - 12.9665909, - 50.4106997 - ], - [ - 12.8269484, - 50.4710483 - ], - [ - 12.7022676, - 50.4138779 - ], - [ - 12.5077656, - 50.401164 - ], - [ - 12.343187, - 50.2547088 - ], - [ - 12.323238, - 50.1845054 - ], - [ - 12.2484296, - 50.2738373 - ], - [ - 12.1736211, - 50.3311765 - ], - [ - 12.0988126, - 50.33436 - ], - [ - 12.1187616, - 50.25152 - ], - [ - 12.2234934, - 50.1653411 - ], - [ - 12.2035445, - 50.1237921 - ], - [ - 12.5027784, - 49.9732751 - ], - [ - 12.4778422, - 49.9379795 - ], - [ - 12.5476634, - 49.9155052 - ], - [ - 12.4678677, - 49.8029766 - ], - [ - 12.408021, - 49.7611134 - ], - [ - 12.4828294, - 49.6869593 - ], - [ - 12.5327017, - 49.6869593 - ], - [ - 12.5177401, - 49.6288466 - ], - [ - 12.6075102, - 49.5415474 - ], - [ - 12.6723442, - 49.4378793 - ], - [ - 12.8119867, - 49.3469896 - ], - [ - 12.9466419, - 49.3437405 - ], - [ - 13.2309141, - 49.1288206 - ], - [ - 13.3256715, - 49.1059712 - ], - [ - 13.4353906, - 49.0438984 - ], - [ - 13.4154417, - 48.9948387 - ], - [ - 13.5002246, - 48.949006 - ], - [ - 13.5650586, - 48.9882938 - ], - [ - 13.6847522, - 48.8834577 - ], - [ - 13.7445989, - 48.9031312 - ], - [ - 13.8243946, - 48.7751149 - ], - [ - 13.8992031, - 48.7751149 - ], - [ - 14.0587945, - 48.676418 - ], - [ - 14.0438328, - 48.6302932 - ], - [ - 14.1435774, - 48.5907241 - ], - [ - 14.3729901, - 48.5610269 - ], - [ - 14.4827091, - 48.6500662 - ], - [ - 14.5774665, - 48.607215 - ], - [ - 14.6273389, - 48.6335892 - ], - [ - 14.7071346, - 48.5808269 - ], - [ - 14.7470324, - 48.7027561 - ], - [ - 14.8118664, - 48.7389485 - ], - [ - 14.8168536, - 48.794831 - ], - [ - 14.9864195, - 48.7652539 - ] - ] - ], - "terms_text": "Ortofoto public domain ÚHUL, year 2000" - }, - { - "name": "Freemap.sk Car", - "type": "tms", - "template": "http://t{switch:1,2,3,4}.freemap.sk/A/{zoom}/{x}/{y}.jpeg", - "scaleExtent": [ - 8, - 16 - ], - "polygon": [ - [ - [ - 19.83682, - 49.25529 - ], - [ - 19.80075, - 49.42385 - ], - [ - 19.60437, - 49.48058 - ], - [ - 19.49179, - 49.63961 - ], - [ - 19.21831, - 49.52604 - ], - [ - 19.16778, - 49.42521 - ], - [ - 19.00308, - 49.42236 - ], - [ - 18.97611, - 49.5308 - ], - [ - 18.54685, - 49.51425 - ], - [ - 18.31432, - 49.33818 - ], - [ - 18.15913, - 49.2961 - ], - [ - 18.05564, - 49.11134 - ], - [ - 17.56396, - 48.84938 - ], - [ - 17.17929, - 48.88816 - ], - [ - 17.058, - 48.81105 - ], - [ - 16.90426, - 48.61947 - ], - [ - 16.79685, - 48.38561 - ], - [ - 17.06762, - 48.01116 - ], - [ - 17.32787, - 47.97749 - ], - [ - 17.51699, - 47.82535 - ], - [ - 17.74776, - 47.73093 - ], - [ - 18.29515, - 47.72075 - ], - [ - 18.67959, - 47.75541 - ], - [ - 18.89755, - 47.81203 - ], - [ - 18.79463, - 47.88245 - ], - [ - 18.84318, - 48.04046 - ], - [ - 19.46212, - 48.05333 - ], - [ - 19.62064, - 48.22938 - ], - [ - 19.89585, - 48.09387 - ], - [ - 20.33766, - 48.2643 - ], - [ - 20.55395, - 48.52358 - ], - [ - 20.82335, - 48.55714 - ], - [ - 21.10271, - 48.47096 - ], - [ - 21.45863, - 48.55513 - ], - [ - 21.74536, - 48.31435 - ], - [ - 22.15293, - 48.37179 - ], - [ - 22.61255, - 49.08914 - ], - [ - 22.09997, - 49.23814 - ], - [ - 21.9686, - 49.36363 - ], - [ - 21.6244, - 49.46989 - ], - [ - 21.06873, - 49.46402 - ], - [ - 20.94336, - 49.31088 - ], - [ - 20.73052, - 49.44006 - ], - [ - 20.22804, - 49.41714 - ], - [ - 20.05234, - 49.23052 - ], - [ - 19.83682, - 49.25529 - ] - ] - ], - "terms_text": "Copyright ©2007-2012 Freemap Slovakia (www.freemap.sk). Some rights reserved." - }, - { - "name": "Freemap.sk Cyclo", - "type": "tms", - "template": "http://t{switch:1,2,3,4}.freemap.sk/C/{zoom}/{x}/{y}.jpeg", - "scaleExtent": [ - 8, - 16 - ], - "polygon": [ - [ - [ - 19.83682, - 49.25529 - ], - [ - 19.80075, - 49.42385 - ], - [ - 19.60437, - 49.48058 - ], - [ - 19.49179, - 49.63961 - ], - [ - 19.21831, - 49.52604 - ], - [ - 19.16778, - 49.42521 - ], - [ - 19.00308, - 49.42236 - ], - [ - 18.97611, - 49.5308 - ], - [ - 18.54685, - 49.51425 - ], - [ - 18.31432, - 49.33818 - ], - [ - 18.15913, - 49.2961 - ], - [ - 18.05564, - 49.11134 - ], - [ - 17.56396, - 48.84938 - ], - [ - 17.17929, - 48.88816 - ], - [ - 17.058, - 48.81105 - ], - [ - 16.90426, - 48.61947 - ], - [ - 16.79685, - 48.38561 - ], - [ - 17.06762, - 48.01116 - ], - [ - 17.32787, - 47.97749 - ], - [ - 17.51699, - 47.82535 - ], - [ - 17.74776, - 47.73093 - ], - [ - 18.29515, - 47.72075 - ], - [ - 18.67959, - 47.75541 - ], - [ - 18.89755, - 47.81203 - ], - [ - 18.79463, - 47.88245 - ], - [ - 18.84318, - 48.04046 - ], - [ - 19.46212, - 48.05333 - ], - [ - 19.62064, - 48.22938 - ], - [ - 19.89585, - 48.09387 - ], - [ - 20.33766, - 48.2643 - ], - [ - 20.55395, - 48.52358 - ], - [ - 20.82335, - 48.55714 - ], - [ - 21.10271, - 48.47096 - ], - [ - 21.45863, - 48.55513 - ], - [ - 21.74536, - 48.31435 - ], - [ - 22.15293, - 48.37179 - ], - [ - 22.61255, - 49.08914 - ], - [ - 22.09997, - 49.23814 - ], - [ - 21.9686, - 49.36363 - ], - [ - 21.6244, - 49.46989 - ], - [ - 21.06873, - 49.46402 - ], - [ - 20.94336, - 49.31088 - ], - [ - 20.73052, - 49.44006 - ], - [ - 20.22804, - 49.41714 - ], - [ - 20.05234, - 49.23052 - ], - [ - 19.83682, - 49.25529 - ] - ] - ], - "terms_text": "Copyright ©2007-2012 Freemap Slovakia (www.freemap.sk). Some rights reserved." - }, - { - "name": "Freemap.sk Hiking", - "type": "tms", - "template": "http://t{switch:1,2,3,4}.freemap.sk/T/{zoom}/{x}/{y}.jpeg", - "scaleExtent": [ - 8, - 16 - ], - "polygon": [ - [ - [ - 19.83682, - 49.25529 - ], - [ - 19.80075, - 49.42385 - ], - [ - 19.60437, - 49.48058 - ], - [ - 19.49179, - 49.63961 - ], - [ - 19.21831, - 49.52604 - ], - [ - 19.16778, - 49.42521 - ], - [ - 19.00308, - 49.42236 - ], - [ - 18.97611, - 49.5308 - ], - [ - 18.54685, - 49.51425 - ], - [ - 18.31432, - 49.33818 - ], - [ - 18.15913, - 49.2961 - ], - [ - 18.05564, - 49.11134 - ], - [ - 17.56396, - 48.84938 - ], - [ - 17.17929, - 48.88816 - ], - [ - 17.058, - 48.81105 - ], - [ - 16.90426, - 48.61947 - ], - [ - 16.79685, - 48.38561 - ], - [ - 17.06762, - 48.01116 - ], - [ - 17.32787, - 47.97749 - ], - [ - 17.51699, - 47.82535 - ], - [ - 17.74776, - 47.73093 - ], - [ - 18.29515, - 47.72075 - ], - [ - 18.67959, - 47.75541 - ], - [ - 18.89755, - 47.81203 - ], - [ - 18.79463, - 47.88245 - ], - [ - 18.84318, - 48.04046 - ], - [ - 19.46212, - 48.05333 - ], - [ - 19.62064, - 48.22938 - ], - [ - 19.89585, - 48.09387 - ], - [ - 20.33766, - 48.2643 - ], - [ - 20.55395, - 48.52358 - ], - [ - 20.82335, - 48.55714 - ], - [ - 21.10271, - 48.47096 - ], - [ - 21.45863, - 48.55513 - ], - [ - 21.74536, - 48.31435 - ], - [ - 22.15293, - 48.37179 - ], - [ - 22.61255, - 49.08914 - ], - [ - 22.09997, - 49.23814 - ], - [ - 21.9686, - 49.36363 - ], - [ - 21.6244, - 49.46989 - ], - [ - 21.06873, - 49.46402 - ], - [ - 20.94336, - 49.31088 - ], - [ - 20.73052, - 49.44006 - ], - [ - 20.22804, - 49.41714 - ], - [ - 20.05234, - 49.23052 - ], - [ - 19.83682, - 49.25529 - ] - ] - ], - "terms_text": "Copyright ©2007-2012 Freemap Slovakia (www.freemap.sk). Some rights reserved." - }, - { - "name": "Freemap.sk Ski", - "type": "tms", - "template": "http://t{switch:1,2,3,4}.freemap.sk/K/{zoom}/{x}/{y}.jpeg", - "scaleExtent": [ - 8, - 16 - ], - "polygon": [ - [ - [ - 19.83682, - 49.25529 - ], - [ - 19.80075, - 49.42385 - ], - [ - 19.60437, - 49.48058 - ], - [ - 19.49179, - 49.63961 - ], - [ - 19.21831, - 49.52604 - ], - [ - 19.16778, - 49.42521 - ], - [ - 19.00308, - 49.42236 - ], - [ - 18.97611, - 49.5308 - ], - [ - 18.54685, - 49.51425 - ], - [ - 18.31432, - 49.33818 - ], - [ - 18.15913, - 49.2961 - ], - [ - 18.05564, - 49.11134 - ], - [ - 17.56396, - 48.84938 - ], - [ - 17.17929, - 48.88816 - ], - [ - 17.058, - 48.81105 - ], - [ - 16.90426, - 48.61947 - ], - [ - 16.79685, - 48.38561 - ], - [ - 17.06762, - 48.01116 - ], - [ - 17.32787, - 47.97749 - ], - [ - 17.51699, - 47.82535 - ], - [ - 17.74776, - 47.73093 - ], - [ - 18.29515, - 47.72075 - ], - [ - 18.67959, - 47.75541 - ], - [ - 18.89755, - 47.81203 - ], - [ - 18.79463, - 47.88245 - ], - [ - 18.84318, - 48.04046 - ], - [ - 19.46212, - 48.05333 - ], - [ - 19.62064, - 48.22938 - ], - [ - 19.89585, - 48.09387 - ], - [ - 20.33766, - 48.2643 - ], - [ - 20.55395, - 48.52358 - ], - [ - 20.82335, - 48.55714 - ], - [ - 21.10271, - 48.47096 - ], - [ - 21.45863, - 48.55513 - ], - [ - 21.74536, - 48.31435 - ], - [ - 22.15293, - 48.37179 - ], - [ - 22.61255, - 49.08914 - ], - [ - 22.09997, - 49.23814 - ], - [ - 21.9686, - 49.36363 - ], - [ - 21.6244, - 49.46989 - ], - [ - 21.06873, - 49.46402 - ], - [ - 20.94336, - 49.31088 - ], - [ - 20.73052, - 49.44006 - ], - [ - 20.22804, - 49.41714 - ], - [ - 20.05234, - 49.23052 - ], - [ - 19.83682, - 49.25529 - ] - ] - ], - "terms_text": "Copyright ©2007-2012 Freemap Slovakia (www.freemap.sk). Some rights reserved." - }, - { - "name": "Fugro (Denmark)", - "type": "tms", - "template": "http://{switch:a,b,c}.tile.openstreetmap.dk/fugro2005/{zoom}/{x}/{y}.png", - "scaleExtent": [ - 0, - 19 - ], - "polygon": [ - [ - [ - 8.3743941, - 54.9551655 - ], - [ - 8.3683809, - 55.4042149 - ], - [ - 8.2103997, - 55.4039795 - ], - [ - 8.2087314, - 55.4937345 - ], - [ - 8.0502655, - 55.4924731 - ], - [ - 8.0185123, - 56.7501399 - ], - [ - 8.1819161, - 56.7509948 - ], - [ - 8.1763274, - 57.0208898 - ], - [ - 8.3413329, - 57.0219872 - ], - [ - 8.3392467, - 57.1119574 - ], - [ - 8.5054433, - 57.1123212 - ], - [ - 8.5033923, - 57.2020499 - ], - [ - 9.3316304, - 57.2027636 - ], - [ - 9.3319079, - 57.2924835 - ], - [ - 9.4978864, - 57.2919578 - ], - [ - 9.4988593, - 57.3820608 - ], - [ - 9.6649749, - 57.3811615 - ], - [ - 9.6687295, - 57.5605591 - ], - [ - 9.8351961, - 57.5596265 - ], - [ - 9.8374896, - 57.6493322 - ], - [ - 10.1725726, - 57.6462818 - ], - [ - 10.1754245, - 57.7367768 - ], - [ - 10.5118282, - 57.7330269 - ], - [ - 10.5152095, - 57.8228945 - ], - [ - 10.6834853, - 57.8207722 - ], - [ - 10.6751613, - 57.6412021 - ], - [ - 10.5077045, - 57.6433097 - ], - [ - 10.5039992, - 57.5535088 - ], - [ - 10.671038, - 57.5514113 - ], - [ - 10.6507805, - 57.1024538 - ], - [ - 10.4857673, - 57.1045138 - ], - [ - 10.4786236, - 56.9249051 - ], - [ - 10.3143981, - 56.9267573 - ], - [ - 10.3112341, - 56.8369269 - ], - [ - 10.4750295, - 56.83509 - ], - [ - 10.4649016, - 56.5656681 - ], - [ - 10.9524239, - 56.5589761 - ], - [ - 10.9479249, - 56.4692243 - ], - [ - 11.1099335, - 56.4664675 - ], - [ - 11.1052639, - 56.376833 - ], - [ - 10.9429901, - 56.3795284 - ], - [ - 10.9341235, - 56.1994768 - ], - [ - 10.7719685, - 56.2020244 - ], - [ - 10.7694751, - 56.1120103 - ], - [ - 10.6079695, - 56.1150259 - ], - [ - 10.4466742, - 56.116717 - ], - [ - 10.2865948, - 56.118675 - ], - [ - 10.2831527, - 56.0281851 - ], - [ - 10.4439274, - 56.0270388 - ], - [ - 10.4417713, - 55.7579243 - ], - [ - 10.4334961, - 55.6693533 - ], - [ - 10.743814, - 55.6646861 - ], - [ - 10.743814, - 55.5712253 - ], - [ - 10.8969041, - 55.5712253 - ], - [ - 10.9051793, - 55.3953852 - ], - [ - 11.0613726, - 55.3812841 - ], - [ - 11.0593038, - 55.1124061 - ], - [ - 11.0458567, - 55.0318621 - ], - [ - 11.2030844, - 55.0247474 - ], - [ - 11.2030844, - 55.117139 - ], - [ - 11.0593038, - 55.1124061 - ], - [ - 11.0613726, - 55.3812841 - ], - [ - 11.0789572, - 55.5712253 - ], - [ - 10.8969041, - 55.5712253 - ], - [ - 10.9258671, - 55.6670198 - ], - [ - 10.743814, - 55.6646861 - ], - [ - 10.7562267, - 55.7579243 - ], - [ - 10.4417713, - 55.7579243 - ], - [ - 10.4439274, - 56.0270388 - ], - [ - 10.4466742, - 56.116717 - ], - [ - 10.6079695, - 56.1150259 - ], - [ - 10.6052053, - 56.0247462 - ], - [ - 10.9258671, - 56.0201215 - ], - [ - 10.9197132, - 55.9309388 - ], - [ - 11.0802782, - 55.92792 - ], - [ - 11.0858066, - 56.0178284 - ], - [ - 11.7265047, - 56.005058 - ], - [ - 11.7319981, - 56.0952142 - ], - [ - 12.0540333, - 56.0871256 - ], - [ - 12.0608477, - 56.1762576 - ], - [ - 12.7023469, - 56.1594405 - ], - [ - 12.6611131, - 55.7114318 - ], - [ - 12.9792318, - 55.7014026 - ], - [ - 12.9612912, - 55.5217294 - ], - [ - 12.3268659, - 55.5412096 - ], - [ - 12.3206071, - 55.4513655 - ], - [ - 12.4778226, - 55.447067 - ], - [ - 12.4702432, - 55.3570479 - ], - [ - 12.6269738, - 55.3523837 - ], - [ - 12.6200898, - 55.2632576 - ], - [ - 12.4627339, - 55.26722 - ], - [ - 12.4552949, - 55.1778223 - ], - [ - 12.2987046, - 55.1822303 - ], - [ - 12.2897344, - 55.0923641 - ], - [ - 12.6048608, - 55.0832904 - ], - [ - 12.5872011, - 54.9036285 - ], - [ - 12.2766618, - 54.9119031 - ], - [ - 12.2610181, - 54.7331602 - ], - [ - 12.1070691, - 54.7378161 - ], - [ - 12.0858621, - 54.4681655 - ], - [ - 11.7794953, - 54.4753579 - ], - [ - 11.7837381, - 54.5654783 - ], - [ - 11.1658525, - 54.5782155 - ], - [ - 11.1706443, - 54.6686508 - ], - [ - 10.8617173, - 54.6733956 - ], - [ - 10.8651245, - 54.7634667 - ], - [ - 10.7713646, - 54.7643888 - ], - [ - 10.7707276, - 54.7372807 - ], - [ - 10.7551428, - 54.7375776 - ], - [ - 10.7544039, - 54.7195666 - ], - [ - 10.7389074, - 54.7197588 - ], - [ - 10.7384368, - 54.7108482 - ], - [ - 10.7074486, - 54.7113045 - ], - [ - 10.7041094, - 54.6756741 - ], - [ - 10.5510973, - 54.6781698 - ], - [ - 10.5547184, - 54.7670245 - ], - [ - 10.2423994, - 54.7705935 - ], - [ - 10.2459845, - 54.8604673 - ], - [ - 10.0902268, - 54.8622134 - ], - [ - 10.0873731, - 54.7723851 - ], - [ - 9.1555798, - 54.7769557 - ], - [ - 9.1562752, - 54.8675369 - ], - [ - 8.5321973, - 54.8663765 - ], - [ - 8.531432, - 54.95516 - ] - ], - [ - [ - 11.4577738, - 56.819554 - ], - [ - 11.7849181, - 56.8127385 - ], - [ - 11.7716715, - 56.6332796 - ], - [ - 11.4459621, - 56.6401087 - ] - ], - [ - [ - 11.3274736, - 57.3612962 - ], - [ - 11.3161808, - 57.1818004 - ], - [ - 11.1508692, - 57.1847276 - ], - [ - 11.1456628, - 57.094962 - ], - [ - 10.8157703, - 57.1001693 - ], - [ - 10.8290599, - 57.3695272 - ] - ], - [ - [ - 11.5843266, - 56.2777928 - ], - [ - 11.5782882, - 56.1880397 - ], - [ - 11.7392309, - 56.1845765 - ], - [ - 11.7456428, - 56.2743186 - ] - ], - [ - [ - 14.6825922, - 55.3639405 - ], - [ - 14.8395247, - 55.3565231 - ], - [ - 14.8263755, - 55.2671261 - ], - [ - 15.1393406, - 55.2517359 - ], - [ - 15.1532015, - 55.3410836 - ], - [ - 15.309925, - 55.3330556 - ], - [ - 15.295719, - 55.2437356 - ], - [ - 15.1393406, - 55.2517359 - ], - [ - 15.1255631, - 55.1623802 - ], - [ - 15.2815819, - 55.1544167 - ], - [ - 15.2535578, - 54.9757646 - ], - [ - 14.6317464, - 55.0062496 - ] - ] - ], - "terms_url": "http://wiki.openstreetmap.org/wiki/Fugro", - "terms_text": "Fugro Aerial Mapping" - }, - { - "name": "FÖMI ortofotó 2000", - "type": "tms", - "description": "Hungary", - "template": "http://e.tile.openstreetmap.hu/ortofoto2000/{zoom}/{x}/{y}.jpg", - "scaleExtent": [ - 0, - 17 - ], - "polygon": [ - [ - [ - 16.1139147, - 46.8691038 - ], - [ - 16.1789749, - 46.90662 - ], - [ - 16.2000429, - 46.9415079 - ], - [ - 16.2217547, - 46.9355441 - ], - [ - 16.2462784, - 46.9463851 - ], - [ - 16.2553226, - 46.9642125 - ], - [ - 16.2764694, - 46.9626082 - ], - [ - 16.290583, - 47.0139849 - ], - [ - 16.3016199, - 46.9992329 - ], - [ - 16.3414618, - 46.9965225 - ], - [ - 16.3505162, - 47.0106313 - ], - [ - 16.3734016, - 46.9985929 - ], - [ - 16.412765, - 47.00475 - ], - [ - 16.4332705, - 46.9927417 - ], - [ - 16.4478119, - 47.003893 - ], - [ - 16.479997, - 46.9941169 - ], - [ - 16.5121988, - 47.0011695 - ], - [ - 16.4635584, - 47.0322699 - ], - [ - 16.4478586, - 47.0227481 - ], - [ - 16.439123, - 47.029663 - ], - [ - 16.445673, - 47.038872 - ], - [ - 16.520323, - 47.056103 - ], - [ - 16.473213, - 47.0736169 - ], - [ - 16.4637199, - 47.09392 - ], - [ - 16.500798, - 47.110058 - ], - [ - 16.500035, - 47.123295 - ], - [ - 16.5295349, - 47.1287419 - ], - [ - 16.5171609, - 47.1496938 - ], - [ - 16.454951, - 47.1425878 - ], - [ - 16.4648728, - 47.1683349 - ], - [ - 16.4555643, - 47.1875584 - ], - [ - 16.4305559, - 47.1847022 - ], - [ - 16.4195013, - 47.1949147 - ], - [ - 16.4189215, - 47.2107114 - ], - [ - 16.4371293, - 47.2097043 - ], - [ - 16.4426335, - 47.2337117 - ], - [ - 16.4313127, - 47.2527554 - ], - [ - 16.4671512, - 47.2531652 - ], - [ - 16.4892319, - 47.2798885 - ], - [ - 16.4646338, - 47.3338455 - ], - [ - 16.4337002, - 47.3528101 - ], - [ - 16.458513, - 47.3670496 - ], - [ - 16.4454619, - 47.4070195 - ], - [ - 16.4831657, - 47.4093628 - ], - [ - 16.4963821, - 47.3892659 - ], - [ - 16.5170941, - 47.4100218 - ], - [ - 16.5749054, - 47.4054243 - ], - [ - 16.5807291, - 47.4191699 - ], - [ - 16.661847, - 47.455595 - ], - [ - 16.6706419, - 47.47422 - ], - [ - 16.6523395, - 47.500342 - ], - [ - 16.6895619, - 47.510161 - ], - [ - 16.7147797, - 47.540199 - ], - [ - 16.663545, - 47.567733 - ], - [ - 16.673199, - 47.6049544 - ], - [ - 16.6595343, - 47.6061018 - ], - [ - 16.652758, - 47.622852 - ], - [ - 16.6314207, - 47.6283176 - ], - [ - 16.5739108, - 47.619667 - ], - [ - 16.5147382, - 47.6461964 - ], - [ - 16.4967504, - 47.6393149 - ], - [ - 16.425464, - 47.6621679 - ], - [ - 16.4437449, - 47.674205 - ], - [ - 16.4480507, - 47.6964725 - ], - [ - 16.4746984, - 47.6811576 - ], - [ - 16.4872245, - 47.6979767 - ], - [ - 16.5521729, - 47.7225519 - ], - [ - 16.5363779, - 47.736785 - ], - [ - 16.5479799, - 47.751544 - ], - [ - 16.6095193, - 47.7603722 - ], - [ - 16.6344148, - 47.7590843 - ], - [ - 16.65729, - 47.7414879 - ], - [ - 16.7209405, - 47.7353565 - ], - [ - 16.7534062, - 47.6828165 - ], - [ - 16.8301587, - 47.681058 - ], - [ - 16.8394284, - 47.7045139 - ], - [ - 16.8668943, - 47.7211462 - ], - [ - 16.876679, - 47.6876452 - ], - [ - 17.0937421, - 47.7077706 - ], - [ - 17.0706562, - 47.7285366 - ], - [ - 17.0516019, - 47.7938499 - ], - [ - 17.0749479, - 47.8084997 - ], - [ - 17.047139, - 47.8285635 - ], - [ - 17.0519452, - 47.8377691 - ], - [ - 17.0105513, - 47.8581765 - ], - [ - 17.0163878, - 47.8673325 - ], - [ - 17.0857537, - 47.8746239 - ], - [ - 17.113171, - 47.9271605 - ], - [ - 17.0917133, - 47.9342916 - ], - [ - 17.1183782, - 47.9601083 - ], - [ - 17.094657, - 47.9708775 - ], - [ - 17.2010289, - 48.019992 - ], - [ - 17.241769, - 48.0224651 - ], - [ - 17.257955, - 47.998655 - ], - [ - 17.334651, - 47.993125 - ], - [ - 17.4029929, - 47.947849 - ], - [ - 17.4539199, - 47.8852579 - ], - [ - 17.5267369, - 47.865509 - ], - [ - 17.5675779, - 47.8151289 - ], - [ - 17.608402, - 47.8218859 - ], - [ - 17.7085789, - 47.756678 - ], - [ - 17.7798739, - 47.739487 - ], - [ - 17.8660959, - 47.74575 - ], - [ - 17.9001292, - 47.7392633 - ], - [ - 17.946867, - 47.744668 - ], - [ - 17.9708709, - 47.7578392 - ], - [ - 18.0044103, - 47.7463402 - ], - [ - 18.0380583, - 47.7576812 - ], - [ - 18.2958774, - 47.7314616 - ], - [ - 18.4540681, - 47.7651226 - ], - [ - 18.4931553, - 47.7527552 - ], - [ - 18.5590761, - 47.7659963 - ], - [ - 18.6460866, - 47.7590921 - ], - [ - 18.7260691, - 47.7890411 - ], - [ - 18.7411784, - 47.8138245 - ], - [ - 18.7920013, - 47.8230869 - ], - [ - 18.8485417, - 47.8167221 - ], - [ - 18.855876, - 47.826077 - ], - [ - 18.828014, - 47.834291 - ], - [ - 18.8135749, - 47.85555 - ], - [ - 18.76353, - 47.8716049 - ], - [ - 18.756858, - 47.896838 - ], - [ - 18.776746, - 47.955092 - ], - [ - 18.7552499, - 47.9763469 - ], - [ - 18.8157429, - 47.993442 - ], - [ - 18.819998, - 48.039676 - ], - [ - 18.833268, - 48.048239 - ], - [ - 18.8749364, - 48.0470707 - ], - [ - 18.886674, - 48.058682 - ], - [ - 18.9089819, - 48.051139 - ], - [ - 18.9439039, - 48.058865 - ], - [ - 18.9816099, - 48.0536009 - ], - [ - 19.0148639, - 48.078179 - ], - [ - 19.0585249, - 48.0573529 - ], - [ - 19.0843619, - 48.072781 - ], - [ - 19.107402, - 48.065596 - ], - [ - 19.1352889, - 48.074146 - ], - [ - 19.2413679, - 48.0536529 - ], - [ - 19.2557819, - 48.0715559 - ], - [ - 19.3031119, - 48.088711 - ], - [ - 19.3865969, - 48.091914 - ], - [ - 19.400018, - 48.082304 - ], - [ - 19.454053, - 48.101436 - ], - [ - 19.467354, - 48.083933 - ], - [ - 19.4944199, - 48.109906 - ], - [ - 19.492377, - 48.1396639 - ], - [ - 19.5128219, - 48.154663 - ], - [ - 19.504518, - 48.173443 - ], - [ - 19.528967, - 48.190358 - ], - [ - 19.526044, - 48.20313 - ], - [ - 19.577502, - 48.2160149 - ], - [ - 19.6308263, - 48.2500725 - ], - [ - 19.6445239, - 48.2391719 - ], - [ - 19.669857, - 48.239212 - ], - [ - 19.691219, - 48.203894 - ], - [ - 19.721125, - 48.201473 - ], - [ - 19.74618, - 48.2165119 - ], - [ - 19.7871629, - 48.19253 - ], - [ - 19.7987329, - 48.19482 - ], - [ - 19.8052829, - 48.183733 - ], - [ - 19.782415, - 48.165039 - ], - [ - 19.794812, - 48.153529 - ], - [ - 19.821331, - 48.169081 - ], - [ - 19.8452819, - 48.162742 - ], - [ - 19.8551729, - 48.178431 - ], - [ - 19.8601309, - 48.169409 - ], - [ - 19.898745, - 48.1663119 - ], - [ - 19.9145359, - 48.146863 - ], - [ - 19.898298, - 48.1249019 - ], - [ - 19.937383, - 48.131118 - ], - [ - 19.9743939, - 48.1660049 - ], - [ - 19.988706, - 48.1621679 - ], - [ - 20.029038, - 48.1776849 - ], - [ - 20.049449, - 48.1671999 - ], - [ - 20.0729859, - 48.179606 - ], - [ - 20.0700369, - 48.1917019 - ], - [ - 20.1340909, - 48.225182 - ], - [ - 20.1331879, - 48.253982 - ], - [ - 20.206162, - 48.250979 - ], - [ - 20.2038299, - 48.261906 - ], - [ - 20.228466, - 48.262779 - ], - [ - 20.2349469, - 48.279933 - ], - [ - 20.286858, - 48.26164 - ], - [ - 20.3257109, - 48.272794 - ], - [ - 20.3374649, - 48.301667 - ], - [ - 20.3656579, - 48.316606 - ], - [ - 20.384077, - 48.3511809 - ], - [ - 20.4098349, - 48.365857 - ], - [ - 20.402532, - 48.382565 - ], - [ - 20.4205349, - 48.403858 - ], - [ - 20.416228, - 48.418536 - ], - [ - 20.507929, - 48.489363 - ], - [ - 20.5065069, - 48.534415 - ], - [ - 20.537471, - 48.527878 - ], - [ - 20.5464939, - 48.544292 - ], - [ - 20.586595, - 48.535759 - ], - [ - 20.6538739, - 48.561413 - ], - [ - 20.836359, - 48.58284 - ], - [ - 20.8378, - 48.57421 - ], - [ - 20.8504359, - 48.5816329 - ], - [ - 20.8453301, - 48.5665046 - ], - [ - 20.8681549, - 48.551818 - ], - [ - 20.922323, - 48.559453 - ], - [ - 20.9346349, - 48.538341 - ], - [ - 20.955882, - 48.533963 - ], - [ - 20.9561979, - 48.521666 - ], - [ - 20.9815849, - 48.5177669 - ], - [ - 21.0151139, - 48.532313 - ], - [ - 21.0663209, - 48.525894 - ], - [ - 21.1174479, - 48.4910549 - ], - [ - 21.1608749, - 48.521499 - ], - [ - 21.179634, - 48.518232 - ], - [ - 21.221061, - 48.537497 - ], - [ - 21.305488, - 48.5222489 - ], - [ - 21.313377, - 48.550841 - ], - [ - 21.326875, - 48.554129 - ], - [ - 21.319384, - 48.561201 - ], - [ - 21.4154499, - 48.558951 - ], - [ - 21.4226649, - 48.578821 - ], - [ - 21.4406099, - 48.585104 - ], - [ - 21.514091, - 48.551065 - ], - [ - 21.5420199, - 48.508395 - ], - [ - 21.6139329, - 48.509416 - ], - [ - 21.6201879, - 48.469826 - ], - [ - 21.663549, - 48.417961 - ], - [ - 21.6645609, - 48.392164 - ], - [ - 21.7017409, - 48.380695 - ], - [ - 21.711871, - 48.357617 - ], - [ - 21.8174139, - 48.332787 - ], - [ - 21.8352029, - 48.3346409 - ], - [ - 21.837213, - 48.363253 - ], - [ - 21.8842979, - 48.356047 - ], - [ - 21.8848429, - 48.367539 - ], - [ - 21.897883, - 48.36256 - ], - [ - 21.8997959, - 48.3702229 - ], - [ - 21.9281859, - 48.3615969 - ], - [ - 21.9268059, - 48.370899 - ], - [ - 21.949198, - 48.378728 - ], - [ - 21.994463, - 48.377323 - ], - [ - 22.0213259, - 48.392749 - ], - [ - 22.0546049, - 48.377528 - ], - [ - 22.0764859, - 48.387241 - ], - [ - 22.086743, - 48.371564 - ], - [ - 22.1359089, - 48.380519 - ], - [ - 22.131056, - 48.3912329 - ], - [ - 22.152768, - 48.3962409 - ], - [ - 22.1561913, - 48.4093076 - ], - [ - 22.2125722, - 48.4256468 - ], - [ - 22.2371405, - 48.4100396 - ], - [ - 22.2654858, - 48.4098675 - ], - [ - 22.2398761, - 48.3870055 - ], - [ - 22.2675722, - 48.3611612 - ], - [ - 22.3178106, - 48.3545437 - ], - [ - 22.3132861, - 48.3250712 - ], - [ - 22.3372944, - 48.3079113 - ], - [ - 22.3384267, - 48.2792074 - ], - [ - 22.3847547, - 48.2339632 - ], - [ - 22.4006407, - 48.249198 - ], - [ - 22.4328384, - 48.2525166 - ], - [ - 22.456386, - 48.2423109 - ], - [ - 22.4899029, - 48.2534237 - ], - [ - 22.4972201, - 48.2395546 - ], - [ - 22.5161491, - 48.237965 - ], - [ - 22.5311088, - 48.2094282 - ], - [ - 22.5711442, - 48.1961428 - ], - [ - 22.5616362, - 48.1816066 - ], - [ - 22.5982449, - 48.144756 - ], - [ - 22.5902763, - 48.1073414 - ], - [ - 22.6754492, - 48.091997 - ], - [ - 22.7347192, - 48.119848 - ], - [ - 22.7576242, - 48.1200599 - ], - [ - 22.7703914, - 48.1090162 - ], - [ - 22.772319, - 48.1218742 - ], - [ - 22.8027688, - 48.1221112 - ], - [ - 22.8025285, - 48.1070813 - ], - [ - 22.8254256, - 48.1175119 - ], - [ - 22.8364365, - 48.080249 - ], - [ - 22.8611284, - 48.0750312 - ], - [ - 22.8677955, - 48.0524256 - ], - [ - 22.8820424, - 48.0548053 - ], - [ - 22.8659692, - 48.0113165 - ], - [ - 22.835562, - 47.9905988 - ], - [ - 22.8407599, - 47.9813636 - ], - [ - 22.8725729, - 47.9752683 - ], - [ - 22.8697274, - 47.9659593 - ], - [ - 22.8915652, - 47.9672446 - ], - [ - 22.897435, - 47.9540629 - ], - [ - 22.8473299, - 47.9077579 - ], - [ - 22.7928135, - 47.8908586 - ], - [ - 22.7586924, - 47.8941446 - ], - [ - 22.77775, - 47.8422508 - ], - [ - 22.7136344, - 47.8360928 - ], - [ - 22.6801938, - 47.7877527 - ], - [ - 22.6111171, - 47.7717455 - ], - [ - 22.5490018, - 47.7722246 - ], - [ - 22.4812121, - 47.8108886 - ], - [ - 22.4513078, - 47.803389 - ], - [ - 22.4313319, - 47.7398119 - ], - [ - 22.3566167, - 47.7486206 - ], - [ - 22.3177714, - 47.7660887 - ], - [ - 22.3176236, - 47.7433657 - ], - [ - 22.2851369, - 47.7292757 - ], - [ - 22.264325, - 47.7310675 - ], - [ - 22.2589955, - 47.6979057 - ], - [ - 22.2306796, - 47.693196 - ], - [ - 22.1796501, - 47.5916115 - ], - [ - 22.1289245, - 47.5978984 - ], - [ - 22.0942787, - 47.5583628 - ], - [ - 22.0782587, - 47.5621299 - ], - [ - 22.0534529, - 47.5474795 - ], - [ - 22.0712176, - 47.5380742 - ], - [ - 22.0617872, - 47.5288029 - ], - [ - 22.0451278, - 47.5398919 - ], - [ - 22.0367222, - 47.5326653 - ], - [ - 22.0071886, - 47.48362 - ], - [ - 22.0327909, - 47.4508372 - ], - [ - 22.0238835, - 47.3908631 - ], - [ - 22.0119849, - 47.3758016 - ], - [ - 21.9627373, - 47.381053 - ], - [ - 21.9382461, - 47.3725317 - ], - [ - 21.8777922, - 47.2857763 - ], - [ - 21.8872845, - 47.2730473 - ], - [ - 21.8534909, - 47.2397622 - ], - [ - 21.8580662, - 47.1873597 - ], - [ - 21.8124804, - 47.1667511 - ], - [ - 21.7924092, - 47.1059751 - ], - [ - 21.7268258, - 47.0983882 - ], - [ - 21.6976037, - 47.057915 - ], - [ - 21.6504151, - 47.0408303 - ], - [ - 21.6888701, - 47.0019977 - ], - [ - 21.6678744, - 46.9712337 - ], - [ - 21.6814917, - 46.9652089 - ], - [ - 21.6381964, - 46.9330487 - ], - [ - 21.5984455, - 46.9274708 - ], - [ - 21.6142857, - 46.8867275 - ], - [ - 21.6016694, - 46.8668202 - ], - [ - 21.520328, - 46.8373749 - ], - [ - 21.5186086, - 46.8000703 - ], - [ - 21.4831761, - 46.7650246 - ], - [ - 21.5263389, - 46.7393249 - ], - [ - 21.529369, - 46.7209721 - ], - [ - 21.4923253, - 46.6859652 - ], - [ - 21.4728438, - 46.6959075 - ], - [ - 21.4299047, - 46.693937 - ], - [ - 21.4309553, - 46.6781367 - ], - [ - 21.4546661, - 46.660863 - ], - [ - 21.4162375, - 46.6426231 - ], - [ - 21.4097959, - 46.6218052 - ], - [ - 21.3657038, - 46.6379501 - ], - [ - 21.3300499, - 46.6318155 - ], - [ - 21.3139733, - 46.617666 - ], - [ - 21.3012351, - 46.5908672 - ], - [ - 21.3207905, - 46.5828562 - ], - [ - 21.2743045, - 46.5407362 - ], - [ - 21.2600254, - 46.5021583 - ], - [ - 21.2744188, - 46.4767333 - ], - [ - 21.2964506, - 46.4762973 - ], - [ - 21.3174343, - 46.4507288 - ], - [ - 21.2895176, - 46.4154784 - ], - [ - 21.2963256, - 46.4069601 - ], - [ - 21.2250116, - 46.4136899 - ], - [ - 21.2064214, - 46.4033825 - ], - [ - 21.1992563, - 46.3479034 - ], - [ - 21.1762269, - 46.3357664 - ], - [ - 21.180497, - 46.3044494 - ], - [ - 21.1155437, - 46.3018529 - ], - [ - 21.1030549, - 46.2624637 - ], - [ - 21.0708792, - 46.2539014 - ], - [ - 21.0660827, - 46.2429394 - ], - [ - 21.0366237, - 46.2480392 - ], - [ - 21.0246723, - 46.2665329 - ], - [ - 20.960817, - 46.2623039 - ], - [ - 20.9465849, - 46.2793024 - ], - [ - 20.9250701, - 46.2766191 - ], - [ - 20.9218133, - 46.2618129 - ], - [ - 20.8732713, - 46.2877555 - ], - [ - 20.7756538, - 46.2759602 - ], - [ - 20.7490474, - 46.2508489 - ], - [ - 20.7618619, - 46.204563 - ], - [ - 20.727401, - 46.2077485 - ], - [ - 20.7341052, - 46.1939355 - ], - [ - 20.7140487, - 46.1660531 - ], - [ - 20.6843592, - 46.1447802 - ], - [ - 20.6549178, - 46.1497739 - ], - [ - 20.6394471, - 46.1267602 - ], - [ - 20.5450486, - 46.1790935 - ], - [ - 20.5014839, - 46.190334 - ], - [ - 20.4949436, - 46.1709908 - ], - [ - 20.4592293, - 46.1428837 - ], - [ - 20.3975133, - 46.1574709 - ], - [ - 20.3685325, - 46.1528554 - ], - [ - 20.3557074, - 46.1696256 - ], - [ - 20.2968136, - 46.1521542 - ], - [ - 20.2549024, - 46.1158522 - ], - [ - 20.2484757, - 46.1300956 - ], - [ - 20.2330132, - 46.1241668 - ], - [ - 20.1817362, - 46.1601137 - ], - [ - 20.1364966, - 46.1449476 - ], - [ - 20.1009667, - 46.1772756 - ], - [ - 20.0636156, - 46.1437275 - ], - [ - 20.0346142, - 46.1458888 - ], - [ - 20.0158072, - 46.1768354 - ], - [ - 19.9354075, - 46.1764243 - ], - [ - 19.8533469, - 46.1500005 - ], - [ - 19.8179747, - 46.1281652 - ], - [ - 19.7585403, - 46.1479754 - ], - [ - 19.6982054, - 46.1879317 - ], - [ - 19.6827672, - 46.1800388 - ], - [ - 19.661508, - 46.1904394 - ], - [ - 19.6317396, - 46.1692993 - ], - [ - 19.5676482, - 46.179106 - ], - [ - 19.5604013, - 46.1665762 - ], - [ - 19.5026585, - 46.1424492 - ], - [ - 19.5271208, - 46.1210269 - ], - [ - 19.4645033, - 46.0953827 - ], - [ - 19.4665828, - 46.0820437 - ], - [ - 19.4160037, - 46.0460453 - ], - [ - 19.3803957, - 46.0358749 - ], - [ - 19.3640923, - 46.0522965 - ], - [ - 19.2819012, - 46.0148048 - ], - [ - 19.2965348, - 45.9881173 - ], - [ - 19.2856472, - 45.9968981 - ], - [ - 19.1479857, - 45.9963445 - ], - [ - 19.1338422, - 46.0370993 - ], - [ - 19.104873, - 46.0401673 - ], - [ - 19.0660427, - 46.0001999 - ], - [ - 19.0796791, - 45.9636376 - ], - [ - 19.0059803, - 45.9590674 - ], - [ - 19.0092745, - 45.9236559 - ], - [ - 18.9061334, - 45.9353801 - ], - [ - 18.8794572, - 45.9166827 - ], - [ - 18.8647137, - 45.9208493 - ], - [ - 18.8685629, - 45.9113361 - ], - [ - 18.8276792, - 45.9051714 - ], - [ - 18.8220041, - 45.9145893 - ], - [ - 18.8075092, - 45.9036055 - ], - [ - 18.809247, - 45.8796189 - ], - [ - 18.7956242, - 45.8784488 - ], - [ - 18.7048857, - 45.9181883 - ], - [ - 18.6700246, - 45.9108439 - ], - [ - 18.6596602, - 45.9168934 - ], - [ - 18.6651348, - 45.899279 - ], - [ - 18.6412808, - 45.8890396 - ], - [ - 18.6550179, - 45.8742393 - ], - [ - 18.6277704, - 45.8733782 - ], - [ - 18.6148449, - 45.8531438 - ], - [ - 18.6236656, - 45.8398531 - ], - [ - 18.5732391, - 45.8137578 - ], - [ - 18.5749849, - 45.8004344 - ], - [ - 18.559716, - 45.8037961 - ], - [ - 18.5223504, - 45.7826858 - ], - [ - 18.4906706, - 45.7947167 - ], - [ - 18.4821905, - 45.7655032 - ], - [ - 18.4562828, - 45.7695229 - ], - [ - 18.4450763, - 45.7605195 - ], - [ - 18.446853, - 45.737128 - ], - [ - 18.40763, - 45.7397119 - ], - [ - 18.3918949, - 45.7616983 - ], - [ - 18.3642257, - 45.7729364 - ], - [ - 18.3394214, - 45.7471605 - ], - [ - 18.2968157, - 45.7612196 - ], - [ - 18.2440473, - 45.7612305 - ], - [ - 18.2307311, - 45.7790328 - ], - [ - 18.1908702, - 45.7878759 - ], - [ - 18.1681939, - 45.7762712 - ], - [ - 18.1246514, - 45.7896277 - ], - [ - 18.1068067, - 45.7708256 - ], - [ - 18.0818922, - 45.7645205 - ], - [ - 17.9958808, - 45.7957311 - ], - [ - 17.9302095, - 45.7863301 - ], - [ - 17.9066757, - 45.7925692 - ], - [ - 17.8653145, - 45.7670064 - ], - [ - 17.8262748, - 45.8099957 - ], - [ - 17.8089784, - 45.8040989 - ], - [ - 17.7809054, - 45.8174884 - ], - [ - 17.7603399, - 45.811923 - ], - [ - 17.7408624, - 45.8295975 - ], - [ - 17.6632915, - 45.8381849 - ], - [ - 17.6276211, - 45.8979446 - ], - [ - 17.5700676, - 45.9358204 - ], - [ - 17.4378254, - 45.9503823 - ], - [ - 17.4258964, - 45.9272681 - ], - [ - 17.4108059, - 45.9399665 - ], - [ - 17.392149, - 45.9302149 - ], - [ - 17.3828713, - 45.9475733 - ], - [ - 17.3476208, - 45.9423413 - ], - [ - 17.3438769, - 45.9605329 - ], - [ - 17.3537711, - 45.9525011 - ], - [ - 17.3905375, - 45.9581914 - ], - [ - 17.387423, - 45.9661823 - ], - [ - 17.3583539, - 45.9642737 - ], - [ - 17.3754852, - 45.9686921 - ], - [ - 17.3751895, - 45.9881054 - ], - [ - 17.3635685, - 45.9915442 - ], - [ - 17.3567202, - 45.9735836 - ], - [ - 17.3339583, - 45.9960781 - ], - [ - 17.3319847, - 45.9728948 - ], - [ - 17.3129974, - 45.9665347 - ], - [ - 17.323647, - 45.9887776 - ], - [ - 17.2987653, - 45.9838652 - ], - [ - 17.3041996, - 46.0021128 - ], - [ - 17.2579726, - 46.0110256 - ], - [ - 17.29632, - 46.0285169 - ], - [ - 17.2541514, - 46.030005 - ], - [ - 17.270955, - 46.0567055 - ], - [ - 17.2324767, - 46.0592034 - ], - [ - 17.2525145, - 46.0664725 - ], - [ - 17.2313144, - 46.0790345 - ], - [ - 17.2019916, - 46.0765488 - ], - [ - 17.2331299, - 46.0989644 - ], - [ - 17.2104017, - 46.1001693 - ], - [ - 17.2129734, - 46.113855 - ], - [ - 17.175927, - 46.1084583 - ], - [ - 17.1743424, - 46.1287608 - ], - [ - 17.1865197, - 46.1332308 - ], - [ - 17.1810983, - 46.1505485 - ], - [ - 17.1562307, - 46.1585819 - ], - [ - 17.1592857, - 46.1696818 - ], - [ - 17.1261012, - 46.1684495 - ], - [ - 17.1227409, - 46.1789791 - ], - [ - 17.0752482, - 46.1889531 - ], - [ - 17.0661614, - 46.2022984 - ], - [ - 16.9735401, - 46.2251982 - ], - [ - 16.973954, - 46.2431113 - ], - [ - 16.9504085, - 46.2415285 - ], - [ - 16.8862356, - 46.2814598 - ], - [ - 16.8713682, - 46.3252767 - ], - [ - 16.8802109, - 46.3356966 - ], - [ - 16.8615374, - 46.3452401 - ], - [ - 16.8656232, - 46.3556489 - ], - [ - 16.8521959, - 46.3517189 - ], - [ - 16.8498589, - 46.3626245 - ], - [ - 16.8352859, - 46.3638195 - ], - [ - 16.8376499, - 46.3748032 - ], - [ - 16.8261732, - 46.3670994 - ], - [ - 16.7933444, - 46.387385 - ], - [ - 16.7592072, - 46.3776563 - ], - [ - 16.7298672, - 46.40149 - ], - [ - 16.7182119, - 46.3898704 - ], - [ - 16.6772872, - 46.4494536 - ], - [ - 16.6631785, - 46.4486958 - ], - [ - 16.6663732, - 46.4582995 - ], - [ - 16.6187915, - 46.4619875 - ], - [ - 16.604468, - 46.4760773 - ], - [ - 16.5235997, - 46.5053761 - ], - [ - 16.5325768, - 46.5314027 - ], - [ - 16.5176728, - 46.5363516 - ], - [ - 16.5084107, - 46.5652692 - ], - [ - 16.4829969, - 46.5660383 - ], - [ - 16.4834008, - 46.5786011 - ], - [ - 16.4455713, - 46.610952 - ], - [ - 16.4248583, - 46.6131645 - ], - [ - 16.385941, - 46.6442485 - ], - [ - 16.3915424, - 46.6637257 - ], - [ - 16.4198454, - 46.6584771 - ], - [ - 16.4286335, - 46.6939737 - ], - [ - 16.3689211, - 46.7040082 - ], - [ - 16.3798266, - 46.7153869 - ], - [ - 16.3710856, - 46.7222945 - ], - [ - 16.3570587, - 46.7142387 - ], - [ - 16.3185954, - 46.7541449 - ], - [ - 16.3305417, - 46.7752119 - ], - [ - 16.3121626, - 46.7780033 - ], - [ - 16.3127666, - 46.797314 - ], - [ - 16.3406373, - 46.8051851 - ], - [ - 16.3508404, - 46.8300552 - ], - [ - 16.3403309, - 46.8468762 - ], - [ - 16.3015007, - 46.8595142 - ], - [ - 16.2913867, - 46.8728341 - ], - [ - 16.2332296, - 46.8766702 - ], - [ - 16.1560866, - 46.8537074 - ], - [ - 16.126571, - 46.8569079 - ], - [ - 16.1139147, - 46.8691038 - ] - ] - ], - "terms_url": "http://www.fomi.hu/", - "terms_text": "Földmérési és Távérzékelési Intézet" - }, - { - "name": "Geodatastyrelsen (Denmark)", - "type": "tms", - "template": "http://mapproxy.gpweb.dk/tiles/1.0.0/kortforsyningen_ortoforaar/EPSG3857/{zoom}/{x}/{y}.jpeg", - "scaleExtent": [ - 0, - 21 - ], - "polygon": [ - [ - [ - 8.3743941, - 54.9551655 - ], - [ - 8.3683809, - 55.4042149 - ], - [ - 8.2103997, - 55.4039795 - ], - [ - 8.2087314, - 55.4937345 - ], - [ - 8.0502655, - 55.4924731 - ], - [ - 8.0185123, - 56.7501399 - ], - [ - 8.1819161, - 56.7509948 - ], - [ - 8.1763274, - 57.0208898 - ], - [ - 8.3413329, - 57.0219872 - ], - [ - 8.3392467, - 57.1119574 - ], - [ - 8.5054433, - 57.1123212 - ], - [ - 8.5033923, - 57.2020499 - ], - [ - 9.3316304, - 57.2027636 - ], - [ - 9.3319079, - 57.2924835 - ], - [ - 9.4978864, - 57.2919578 - ], - [ - 9.4988593, - 57.3820608 - ], - [ - 9.6649749, - 57.3811615 - ], - [ - 9.6687295, - 57.5605591 - ], - [ - 9.8351961, - 57.5596265 - ], - [ - 9.8374896, - 57.6493322 - ], - [ - 10.1725726, - 57.6462818 - ], - [ - 10.1754245, - 57.7367768 - ], - [ - 10.5118282, - 57.7330269 - ], - [ - 10.5152095, - 57.8228945 - ], - [ - 10.6834853, - 57.8207722 - ], - [ - 10.6751613, - 57.6412021 - ], - [ - 10.5077045, - 57.6433097 - ], - [ - 10.5039992, - 57.5535088 - ], - [ - 10.671038, - 57.5514113 - ], - [ - 10.6507805, - 57.1024538 - ], - [ - 10.4857673, - 57.1045138 - ], - [ - 10.4786236, - 56.9249051 - ], - [ - 10.3143981, - 56.9267573 - ], - [ - 10.3112341, - 56.8369269 - ], - [ - 10.4750295, - 56.83509 - ], - [ - 10.4649016, - 56.5656681 - ], - [ - 10.9524239, - 56.5589761 - ], - [ - 10.9479249, - 56.4692243 - ], - [ - 11.1099335, - 56.4664675 - ], - [ - 11.1052639, - 56.376833 - ], - [ - 10.9429901, - 56.3795284 - ], - [ - 10.9341235, - 56.1994768 - ], - [ - 10.7719685, - 56.2020244 - ], - [ - 10.7694751, - 56.1120103 - ], - [ - 10.6079695, - 56.1150259 - ], - [ - 10.4466742, - 56.116717 - ], - [ - 10.2865948, - 56.118675 - ], - [ - 10.2831527, - 56.0281851 - ], - [ - 10.4439274, - 56.0270388 - ], - [ - 10.4417713, - 55.7579243 - ], - [ - 10.4334961, - 55.6693533 - ], - [ - 10.743814, - 55.6646861 - ], - [ - 10.743814, - 55.5712253 - ], - [ - 10.8969041, - 55.5712253 - ], - [ - 10.9051793, - 55.3953852 - ], - [ - 11.0613726, - 55.3812841 - ], - [ - 11.0593038, - 55.1124061 - ], - [ - 11.0458567, - 55.0318621 - ], - [ - 11.2030844, - 55.0247474 - ], - [ - 11.2030844, - 55.117139 - ], - [ - 11.0593038, - 55.1124061 - ], - [ - 11.0613726, - 55.3812841 - ], - [ - 11.0789572, - 55.5712253 - ], - [ - 10.8969041, - 55.5712253 - ], - [ - 10.9258671, - 55.6670198 - ], - [ - 10.743814, - 55.6646861 - ], - [ - 10.7562267, - 55.7579243 - ], - [ - 10.4417713, - 55.7579243 - ], - [ - 10.4439274, - 56.0270388 - ], - [ - 10.4466742, - 56.116717 - ], - [ - 10.6079695, - 56.1150259 - ], - [ - 10.6052053, - 56.0247462 - ], - [ - 10.9258671, - 56.0201215 - ], - [ - 10.9197132, - 55.9309388 - ], - [ - 11.0802782, - 55.92792 - ], - [ - 11.0858066, - 56.0178284 - ], - [ - 11.7265047, - 56.005058 - ], - [ - 11.7319981, - 56.0952142 - ], - [ - 12.0540333, - 56.0871256 - ], - [ - 12.0608477, - 56.1762576 - ], - [ - 12.7023469, - 56.1594405 - ], - [ - 12.6611131, - 55.7114318 - ], - [ - 12.9792318, - 55.7014026 - ], - [ - 12.9612912, - 55.5217294 - ], - [ - 12.3268659, - 55.5412096 - ], - [ - 12.3206071, - 55.4513655 - ], - [ - 12.4778226, - 55.447067 - ], - [ - 12.4702432, - 55.3570479 - ], - [ - 12.6269738, - 55.3523837 - ], - [ - 12.6200898, - 55.2632576 - ], - [ - 12.4627339, - 55.26722 - ], - [ - 12.4552949, - 55.1778223 - ], - [ - 12.2987046, - 55.1822303 - ], - [ - 12.2897344, - 55.0923641 - ], - [ - 12.6048608, - 55.0832904 - ], - [ - 12.5872011, - 54.9036285 - ], - [ - 12.2766618, - 54.9119031 - ], - [ - 12.2610181, - 54.7331602 - ], - [ - 12.1070691, - 54.7378161 - ], - [ - 12.0858621, - 54.4681655 - ], - [ - 11.7794953, - 54.4753579 - ], - [ - 11.7837381, - 54.5654783 - ], - [ - 11.1658525, - 54.5782155 - ], - [ - 11.1706443, - 54.6686508 - ], - [ - 10.8617173, - 54.6733956 - ], - [ - 10.8651245, - 54.7634667 - ], - [ - 10.7713646, - 54.7643888 - ], - [ - 10.7707276, - 54.7372807 - ], - [ - 10.7551428, - 54.7375776 - ], - [ - 10.7544039, - 54.7195666 - ], - [ - 10.7389074, - 54.7197588 - ], - [ - 10.7384368, - 54.7108482 - ], - [ - 10.7074486, - 54.7113045 - ], - [ - 10.7041094, - 54.6756741 - ], - [ - 10.5510973, - 54.6781698 - ], - [ - 10.5547184, - 54.7670245 - ], - [ - 10.2423994, - 54.7705935 - ], - [ - 10.2459845, - 54.8604673 - ], - [ - 10.0902268, - 54.8622134 - ], - [ - 10.0873731, - 54.7723851 - ], - [ - 9.1555798, - 54.7769557 - ], - [ - 9.1562752, - 54.8675369 - ], - [ - 8.5321973, - 54.8663765 - ], - [ - 8.531432, - 54.95516 - ] - ], - [ - [ - 11.4577738, - 56.819554 - ], - [ - 11.7849181, - 56.8127385 - ], - [ - 11.7716715, - 56.6332796 - ], - [ - 11.4459621, - 56.6401087 - ] - ], - [ - [ - 11.3274736, - 57.3612962 - ], - [ - 11.3161808, - 57.1818004 - ], - [ - 11.1508692, - 57.1847276 - ], - [ - 11.1456628, - 57.094962 - ], - [ - 10.8157703, - 57.1001693 - ], - [ - 10.8290599, - 57.3695272 - ] - ], - [ - [ - 11.5843266, - 56.2777928 - ], - [ - 11.5782882, - 56.1880397 - ], - [ - 11.7392309, - 56.1845765 - ], - [ - 11.7456428, - 56.2743186 - ] - ], - [ - [ - 14.6825922, - 55.3639405 - ], - [ - 14.8395247, - 55.3565231 - ], - [ - 14.8263755, - 55.2671261 - ], - [ - 15.1393406, - 55.2517359 - ], - [ - 15.1532015, - 55.3410836 - ], - [ - 15.309925, - 55.3330556 - ], - [ - 15.295719, - 55.2437356 - ], - [ - 15.1393406, - 55.2517359 - ], - [ - 15.1255631, - 55.1623802 - ], - [ - 15.2815819, - 55.1544167 - ], - [ - 15.2535578, - 54.9757646 - ], - [ - 14.6317464, - 55.0062496 - ] - ] - ], - "terms_url": "http://download.kortforsyningen.dk/content/vilkaar-og-betingelser", - "terms_text": "Geodatastyrelsen og Danske Kommuner" - }, - { - "name": "Geoimage.at MaxRes", - "type": "tms", - "template": "http://geoimage.openstreetmap.at/4d80de696cd562a63ce463a58a61488d/{zoom}/{x}/{y}.jpg", - "polygon": [ - [ - [ - 16.5073284, - 46.9929304 - ], - [ - 16.283417, - 46.9929304 - ], - [ - 16.135839, - 46.8713046 - ], - [ - 15.9831722, - 46.8190947 - ], - [ - 16.0493278, - 46.655175 - ], - [ - 15.8610387, - 46.7180116 - ], - [ - 15.7592608, - 46.6900933 - ], - [ - 15.5607938, - 46.6796202 - ], - [ - 15.5760605, - 46.6342132 - ], - [ - 15.4793715, - 46.6027553 - ], - [ - 15.4335715, - 46.6516819 - ], - [ - 15.2249267, - 46.6342132 - ], - [ - 15.0468154, - 46.6481886 - ], - [ - 14.9908376, - 46.5887681 - ], - [ - 14.9603042, - 46.6237293 - ], - [ - 14.8534374, - 46.6027553 - ], - [ - 14.8330818, - 46.5012666 - ], - [ - 14.7516595, - 46.4977636 - ], - [ - 14.6804149, - 46.4381781 - ], - [ - 14.6142593, - 46.4381781 - ], - [ - 14.578637, - 46.3785275 - ], - [ - 14.4412369, - 46.4311638 - ], - [ - 14.1613476, - 46.4276563 - ], - [ - 14.1257253, - 46.4767409 - ], - [ - 14.0188585, - 46.4767409 - ], - [ - 13.9119917, - 46.5257813 - ], - [ - 13.8254805, - 46.5047694 - ], - [ - 13.4438134, - 46.560783 - ], - [ - 13.3064132, - 46.5502848 - ], - [ - 13.1283019, - 46.5887681 - ], - [ - 12.8433237, - 46.6132433 - ], - [ - 12.7262791, - 46.6412014 - ], - [ - 12.5125455, - 46.6656529 - ], - [ - 12.3598787, - 46.7040543 - ], - [ - 12.3649676, - 46.7703197 - ], - [ - 12.2886341, - 46.7772902 - ], - [ - 12.2733674, - 46.8852187 - ], - [ - 12.2072118, - 46.8747835 - ], - [ - 12.1308784, - 46.9026062 - ], - [ - 12.1156117, - 46.9998721 - ], - [ - 12.2530119, - 47.0657733 - ], - [ - 12.2123007, - 47.0934969 - ], - [ - 11.9833004, - 47.0449712 - ], - [ - 11.7339445, - 46.9616816 - ], - [ - 11.6321666, - 47.010283 - ], - [ - 11.5405665, - 46.9755722 - ], - [ - 11.4998553, - 47.0068129 - ], - [ - 11.418433, - 46.9651546 - ], - [ - 11.2555884, - 46.9755722 - ], - [ - 11.1130993, - 46.913036 - ], - [ - 11.0418548, - 46.7633482 - ], - [ - 10.8891879, - 46.7598621 - ], - [ - 10.7416099, - 46.7842599 - ], - [ - 10.7059877, - 46.8643462 - ], - [ - 10.5787653, - 46.8399847 - ], - [ - 10.4566318, - 46.8504267 - ], - [ - 10.4769874, - 46.9269392 - ], - [ - 10.3853873, - 46.9894592 - ], - [ - 10.2327204, - 46.8643462 - ], - [ - 10.1207647, - 46.8330223 - ], - [ - 9.8663199, - 46.9408389 - ], - [ - 9.9019422, - 47.0033426 - ], - [ - 9.6831197, - 47.0588402 - ], - [ - 9.6118752, - 47.0380354 - ], - [ - 9.6322307, - 47.128131 - ], - [ - 9.5813418, - 47.1662025 - ], - [ - 9.5406306, - 47.2664422 - ], - [ - 9.6067863, - 47.3492559 - ], - [ - 9.6729419, - 47.369939 - ], - [ - 9.6424085, - 47.4457079 - ], - [ - 9.5660751, - 47.4801122 - ], - [ - 9.7136531, - 47.5282405 - ], - [ - 9.7848976, - 47.5969187 - ], - [ - 9.8357866, - 47.5454185 - ], - [ - 9.9477423, - 47.538548 - ], - [ - 10.0902313, - 47.4491493 - ], - [ - 10.1105869, - 47.3664924 - ], - [ - 10.2428982, - 47.3871688 - ], - [ - 10.1869203, - 47.2698953 - ], - [ - 10.3243205, - 47.2975125 - ], - [ - 10.4820763, - 47.4491493 - ], - [ - 10.4311873, - 47.4869904 - ], - [ - 10.4413651, - 47.5900549 - ], - [ - 10.4871652, - 47.5522881 - ], - [ - 10.5482319, - 47.5351124 - ], - [ - 10.5991209, - 47.5660246 - ], - [ - 10.7568766, - 47.5316766 - ], - [ - 10.8891879, - 47.5454185 - ], - [ - 10.9400769, - 47.4869904 - ], - [ - 10.9960547, - 47.3906141 - ], - [ - 11.2352328, - 47.4422662 - ], - [ - 11.2810328, - 47.3975039 - ], - [ - 11.4235219, - 47.5144941 - ], - [ - 11.5761888, - 47.5076195 - ], - [ - 11.6067221, - 47.5900549 - ], - [ - 11.8357224, - 47.5866227 - ], - [ - 12.003656, - 47.6243647 - ], - [ - 12.2072118, - 47.6037815 - ], - [ - 12.1614117, - 47.6963421 - ], - [ - 12.2581008, - 47.7442718 - ], - [ - 12.2530119, - 47.6792136 - ], - [ - 12.4311232, - 47.7100408 - ], - [ - 12.4921899, - 47.631224 - ], - [ - 12.5685234, - 47.6277944 - ], - [ - 12.6295901, - 47.6894913 - ], - [ - 12.7720792, - 47.6689338 - ], - [ - 12.8331459, - 47.5419833 - ], - [ - 12.975635, - 47.4732332 - ], - [ - 13.0417906, - 47.4938677 - ], - [ - 13.0367017, - 47.5557226 - ], - [ - 13.0977685, - 47.6415112 - ], - [ - 13.0316128, - 47.7100408 - ], - [ - 12.9043905, - 47.7203125 - ], - [ - 13.0061684, - 47.84683 - ], - [ - 12.9451016, - 47.9355501 - ], - [ - 12.8636793, - 47.9594103 - ], - [ - 12.8636793, - 48.0036929 - ], - [ - 12.7517236, - 48.0989418 - ], - [ - 12.8738571, - 48.2109733 - ], - [ - 12.9603683, - 48.2109733 - ], - [ - 13.0417906, - 48.2652035 - ], - [ - 13.1842797, - 48.2990682 - ], - [ - 13.2606131, - 48.2922971 - ], - [ - 13.3980133, - 48.3565867 - ], - [ - 13.4438134, - 48.417418 - ], - [ - 13.4387245, - 48.5523383 - ], - [ - 13.509969, - 48.5860123 - ], - [ - 13.6117469, - 48.5725454 - ], - [ - 13.7287915, - 48.5118999 - ], - [ - 13.7847694, - 48.5725454 - ], - [ - 13.8203916, - 48.6263915 - ], - [ - 13.7949471, - 48.7171267 - ], - [ - 13.850925, - 48.7741724 - ], - [ - 14.0595697, - 48.6633774 - ], - [ - 14.0137696, - 48.6331182 - ], - [ - 14.0748364, - 48.5927444 - ], - [ - 14.2173255, - 48.5961101 - ], - [ - 14.3649034, - 48.5489696 - ], - [ - 14.4666813, - 48.6499311 - ], - [ - 14.5582815, - 48.5961101 - ], - [ - 14.5989926, - 48.6263915 - ], - [ - 14.7211261, - 48.5759124 - ], - [ - 14.7211261, - 48.6868997 - ], - [ - 14.822904, - 48.7271983 - ], - [ - 14.8178151, - 48.777526 - ], - [ - 14.9647227, - 48.7851754 - ], - [ - 14.9893637, - 49.0126611 - ], - [ - 15.1485933, - 48.9950306 - ], - [ - 15.1943934, - 48.9315502 - ], - [ - 15.3063491, - 48.9850128 - ], - [ - 15.3928603, - 48.9850128 - ], - [ - 15.4844604, - 48.9282069 - ], - [ - 15.749083, - 48.8545973 - ], - [ - 15.8406831, - 48.8880697 - ], - [ - 16.0086166, - 48.7808794 - ], - [ - 16.2070835, - 48.7339115 - ], - [ - 16.3953727, - 48.7372678 - ], - [ - 16.4920617, - 48.8110498 - ], - [ - 16.6905286, - 48.7741724 - ], - [ - 16.7057953, - 48.7339115 - ], - [ - 16.8991733, - 48.713769 - ], - [ - 16.9755067, - 48.515271 - ], - [ - 16.8482844, - 48.4511817 - ], - [ - 16.8533733, - 48.3464411 - ], - [ - 16.9551512, - 48.2516513 - ], - [ - 16.9907734, - 48.1498955 - ], - [ - 17.0925513, - 48.1397088 - ], - [ - 17.0823736, - 48.0241182 - ], - [ - 17.1739737, - 48.0207146 - ], - [ - 17.0823736, - 47.8741447 - ], - [ - 16.9856845, - 47.8673174 - ], - [ - 17.0823736, - 47.8092489 - ], - [ - 17.0925513, - 47.7031919 - ], - [ - 16.7414176, - 47.6792136 - ], - [ - 16.7057953, - 47.7511153 - ], - [ - 16.5378617, - 47.7545368 - ], - [ - 16.5480395, - 47.7066164 - ], - [ - 16.4208172, - 47.6689338 - ], - [ - 16.573484, - 47.6175045 - ], - [ - 16.670173, - 47.631224 - ], - [ - 16.7108842, - 47.538548 - ], - [ - 16.6599952, - 47.4491493 - ], - [ - 16.5429506, - 47.3940591 - ], - [ - 16.4615283, - 47.3940591 - ], - [ - 16.4920617, - 47.276801 - ], - [ - 16.425906, - 47.1973317 - ], - [ - 16.4717061, - 47.1489007 - ], - [ - 16.5480395, - 47.1489007 - ], - [ - 16.476795, - 47.0796369 - ], - [ - 16.527684, - 47.0588402 - ] - ] - ], - "terms_text": "geoimage.at", - "id": "geoimage.at" - }, - { - "name": "Geoportal.gov.pl (Orthophotomap)", - "type": "tms", - "template": "http://wms.misek.pl/geoportal.orto/tms/{zoom}/{x}/{y}", - "scaleExtent": [ - 6, - 24 - ], - "polygon": [ - [ - [ - 15.9751041, - 54.3709213 - ], - [ - 16.311164, - 54.5561775 - ], - [ - 17.1391878, - 54.7845723 - ], - [ - 18.3448458, - 54.9022727 - ], - [ - 19.6613689, - 54.4737213 - ], - [ - 20.2815206, - 54.4213456 - ], - [ - 21.4663914, - 54.3406369 - ], - [ - 22.7759855, - 54.3769755 - ], - [ - 22.8625989, - 54.4233613 - ], - [ - 23.2956657, - 54.2678633 - ], - [ - 23.5347186, - 54.0955258 - ], - [ - 23.5208604, - 53.9775182 - ], - [ - 23.7183389, - 53.4629603 - ], - [ - 23.9296755, - 53.1856735 - ], - [ - 23.9296755, - 52.6887269 - ], - [ - 23.732197, - 52.6067497 - ], - [ - 23.5658994, - 52.5878101 - ], - [ - 23.2090523, - 52.3302642 - ], - [ - 23.1951942, - 52.2370089 - ], - [ - 23.5035377, - 52.1860596 - ], - [ - 23.6906226, - 52.0030113 - ], - [ - 23.5970802, - 51.739903 - ], - [ - 23.6629063, - 51.3888562 - ], - [ - 23.9366046, - 50.9827781 - ], - [ - 24.1687284, - 50.8604752 - ], - [ - 24.0197534, - 50.8035823 - ], - [ - 24.1098313, - 50.6610467 - ], - [ - 24.0578633, - 50.4188439 - ], - [ - 23.6178674, - 50.3083403 - ], - [ - 22.6824431, - 49.5163532 - ], - [ - 22.7378756, - 49.2094935 - ], - [ - 22.9041733, - 49.0780441 - ], - [ - 22.8625989, - 48.9940062 - ], - [ - 22.6096878, - 49.0371785 - ], - [ - 22.0761495, - 49.2004392 - ], - [ - 21.8474902, - 49.3721872 - ], - [ - 21.3763135, - 49.4488281 - ], - [ - 21.1026153, - 49.3721872 - ], - [ - 20.9120659, - 49.3022043 - ], - [ - 20.6452967, - 49.3902311 - ], - [ - 20.1845136, - 49.3315641 - ], - [ - 20.1186875, - 49.2004392 - ], - [ - 19.9419962, - 49.1302123 - ], - [ - 19.765305, - 49.2117568 - ], - [ - 19.7479823, - 49.3992506 - ], - [ - 19.6024718, - 49.4150307 - ], - [ - 19.5089294, - 49.5815389 - ], - [ - 19.4292451, - 49.5905232 - ], - [ - 19.2317666, - 49.4150307 - ], - [ - 18.9961783, - 49.387976 - ], - [ - 18.9338167, - 49.4916048 - ], - [ - 18.8368097, - 49.4938552 - ], - [ - 18.8021643, - 49.6623381 - ], - [ - 18.6427958, - 49.7094091 - ], - [ - 18.521537, - 49.8994693 - ], - [ - 18.0815412, - 50.0109209 - ], - [ - 17.8875272, - 49.9886512 - ], - [ - 17.7385522, - 50.0687739 - ], - [ - 17.6068999, - 50.1709584 - ], - [ - 17.7454813, - 50.2153184 - ], - [ - 17.710836, - 50.3017019 - ], - [ - 17.4163505, - 50.2640668 - ], - [ - 16.9486384, - 50.4453265 - ], - [ - 16.8932058, - 50.4033889 - ], - [ - 17.0006064, - 50.3105529 - ], - [ - 17.017929, - 50.2241854 - ], - [ - 16.8135215, - 50.186489 - ], - [ - 16.6402948, - 50.0976742 - ], - [ - 16.4324227, - 50.2862087 - ], - [ - 16.1968344, - 50.4276731 - ], - [ - 16.4220291, - 50.5885165 - ], - [ - 16.3388803, - 50.6632429 - ], - [ - 16.2280152, - 50.6368824 - ], - [ - 16.0547884, - 50.6127057 - ], - [ - 15.5732181, - 50.7641544 - ], - [ - 15.2683391, - 50.8976368 - ], - [ - 15.2440873, - 50.980597 - ], - [ - 15.0292862, - 51.0133036 - ], - [ - 15.0015699, - 50.8582883 - ], - [ - 14.8110205, - 50.8735944 - ], - [ - 14.956531, - 51.0721176 - ], - [ - 15.0188926, - 51.2914636 - ], - [ - 14.9392083, - 51.4601459 - ], - [ - 14.7209426, - 51.5571799 - ], - [ - 14.7521234, - 51.6260562 - ], - [ - 14.5996839, - 51.8427626 - ], - [ - 14.70362, - 52.0733396 - ], - [ - 14.5581095, - 52.2497371 - ], - [ - 14.5165351, - 52.425436 - ], - [ - 14.6031485, - 52.5878101 - ], - [ - 14.1146491, - 52.8208272 - ], - [ - 14.152759, - 52.9733951 - ], - [ - 14.3502374, - 53.0734212 - ], - [ - 14.4229927, - 53.2665624 - ], - [ - 14.1977979, - 53.8734759 - ], - [ - 14.2220497, - 53.9958517 - ] - ] - ], - "terms_text": "Copyright © Główny Urząd Geodezji i Kartografii." - }, - { - "name": "IBGE Mapa de Setores Rurais", - "type": "tms", - "template": "http://{switch:a,b,c}.tiles.mapbox.com/v3/tmpsantos.i00mo1kj/{zoom}/{x}/{y}.png", - "scaleExtent": [ - 0, - 14 - ], - "polygon": [ - [ - [ - -29.3325, - 2.335959 - ], - [ - -28.72472, - 2.031551 - ], - [ - -27.76041, - -8.937033 - ], - [ - -27.67249, - -22.20839 - ], - [ - -51.11495, - -35.46552 - ], - [ - -53.39394, - -33.85064 - ], - [ - -53.62553, - -33.72493 - ], - [ - -53.62503, - -33.15428 - ], - [ - -53.24498, - -32.73392 - ], - [ - -53.65747, - -32.51873 - ], - [ - -53.8329, - -32.16592 - ], - [ - -54.64174, - -31.55507 - ], - [ - -55.29638, - -31.3429 - ], - [ - -55.57371, - -30.99691 - ], - [ - -56.06384, - -31.16749 - ], - [ - -56.10468, - -30.86436 - ], - [ - -56.86862, - -30.20752 - ], - [ - -57.39671, - -30.40464 - ], - [ - -57.74384, - -30.22142 - ], - [ - -55.83724, - -28.16598 - ], - [ - -54.86969, - -27.44994 - ], - [ - -53.9016, - -27.02998 - ], - [ - -53.74972, - -26.25781 - ], - [ - -53.97158, - -25.74513 - ], - [ - -54.44723, - -25.79609 - ], - [ - -54.67802, - -25.64668 - ], - [ - -54.36097, - -24.35145 - ], - [ - -54.41679, - -24.06527 - ], - [ - -54.64355, - -23.94107 - ], - [ - -55.22163, - -24.11355 - ], - [ - -55.49138, - -24.02797 - ], - [ - -55.71734, - -22.68488 - ], - [ - -55.90555, - -22.39886 - ], - [ - -56.45255, - -22.21731 - ], - [ - -56.8256, - -22.4002 - ], - [ - -57.34109, - -22.34351 - ], - [ - -58.08472, - -22.13075 - ], - [ - -57.95766, - -20.99818 - ], - [ - -58.26551, - -20.24147 - ], - [ - -58.03577, - -19.95871 - ], - [ - -58.23083, - -19.75211 - ], - [ - -57.64739, - -18.19828 - ], - [ - -57.89356, - -17.57377 - ], - [ - -58.16997, - -17.53519 - ], - [ - -58.48825, - -17.21961 - ], - [ - -58.57691, - -16.81466 - ], - [ - -58.45563, - -16.42158 - ], - [ - -60.2541, - -16.32571 - ], - [ - -60.33481, - -15.51483 - ], - [ - -60.67423, - -15.1122 - ], - [ - -60.34999, - -14.99707 - ], - [ - -60.63603, - -13.84119 - ], - [ - -61.07283, - -13.62569 - ], - [ - -61.9025, - -13.62647 - ], - [ - -62.21395, - -13.25048 - ], - [ - -62.80185, - -13.10905 - ], - [ - -63.17194, - -12.76568 - ], - [ - -63.74229, - -12.54071 - ], - [ - -64.32845, - -12.59578 - ], - [ - -65.10261, - -12.0682 - ], - [ - -65.45781, - -11.27865 - ], - [ - -65.41641, - -9.838943 - ], - [ - -66.52331, - -9.985873 - ], - [ - -67.66452, - -10.80093 - ], - [ - -67.99778, - -10.75991 - ], - [ - -68.52286, - -11.20807 - ], - [ - -69.88988, - -11.02776 - ], - [ - -70.30957, - -11.1699 - ], - [ - -70.71896, - -11.02003 - ], - [ - -70.68128, - -9.669083 - ], - [ - -71.27536, - -10.08971 - ], - [ - -72.18053, - -10.09967 - ], - [ - -72.41623, - -9.587397 - ], - [ - -73.29207, - -9.454149 - ], - [ - -73.0625, - -9.017267 - ], - [ - -73.61432, - -8.40982 - ], - [ - -74.09056, - -7.527548 - ], - [ - -74.03652, - -7.27885 - ], - [ - -73.84718, - -7.238285 - ], - [ - -73.78618, - -6.774872 - ], - [ - -73.22362, - -6.430106 - ], - [ - -73.33719, - -6.029736 - ], - [ - -72.93016, - -5.038711 - ], - [ - -71.93973, - -4.425027 - ], - [ - -70.96802, - -4.248294 - ], - [ - -70.79598, - -4.064931 - ], - [ - -70.02393, - -4.167345 - ], - [ - -69.51025, - -1.134089 - ], - [ - -69.70776, - -0.567619 - ], - [ - -70.13645, - -0.226161 - ], - [ - -70.14083, - 0.5844 - ], - [ - -69.26594, - 0.806502 - ], - [ - -69.34226, - 0.968924 - ], - [ - -69.92481, - 1.015705 - ], - [ - -69.92343, - 1.773851 - ], - [ - -68.38511, - 1.82943 - ], - [ - -68.24848, - 2.119808 - ], - [ - -67.94571, - 1.948424 - ], - [ - -67.37696, - 2.327468 - ], - [ - -67.05751, - 1.858336 - ], - [ - -67.00579, - 1.291603 - ], - [ - -66.79967, - 1.314684 - ], - [ - -66.28683, - 0.857709 - ], - [ - -65.67671, - 1.111146 - ], - [ - -65.42494, - 0.966549 - ], - [ - -65.15671, - 1.24203 - ], - [ - -64.27483, - 1.601591 - ], - [ - -64.0486, - 2.065137 - ], - [ - -63.47236, - 2.279358 - ], - [ - -64.13446, - 2.433909 - ], - [ - -64.10005, - 2.723778 - ], - [ - -64.32628, - 3.118275 - ], - [ - -64.28142, - 3.541983 - ], - [ - -64.88451, - 4.117671 - ], - [ - -64.88064, - 4.342461 - ], - [ - -64.13653, - 4.223152 - ], - [ - -63.95465, - 4.021316 - ], - [ - -63.17706, - 4.048301 - ], - [ - -62.96093, - 3.763658 - ], - [ - -62.82024, - 4.106019 - ], - [ - -62.49922, - 4.270815 - ], - [ - -61.91181, - 4.26284 - ], - [ - -61.35393, - 4.630097 - ], - [ - -61.04904, - 4.623115 - ], - [ - -60.70452, - 4.969851 - ], - [ - -60.78709, - 5.296764 - ], - [ - -60.22457, - 5.371207 - ], - [ - -59.89857, - 5.107541 - ], - [ - -59.97549, - 4.603025 - ], - [ - -59.59676, - 4.439875 - ], - [ - -59.41942, - 3.96994 - ], - [ - -59.71017, - 3.542008 - ], - [ - -59.88955, - 2.72301 - ], - [ - -59.63006, - 2.316332 - ], - [ - -59.63382, - 1.966581 - ], - [ - -59.18812, - 1.478079 - ], - [ - -58.80545, - 1.320732 - ], - [ - -58.35933, - 1.689932 - ], - [ - -57.6, - 1.803907 - ], - [ - -57.39854, - 2.065119 - ], - [ - -57.12392, - 2.128758 - ], - [ - -56.02925, - 1.949445 - ], - [ - -56.23884, - 2.263348 - ], - [ - -55.98195, - 2.628657 - ], - [ - -55.64816, - 2.519953 - ], - [ - -54.93958, - 2.682515 - ], - [ - -54.24988, - 2.25056 - ], - [ - -53.73937, - 2.473731 - ], - [ - -52.98578, - 2.280494 - ], - [ - -52.65712, - 2.564069 - ], - [ - -52.41739, - 3.22121 - ], - [ - -51.73983, - 4.119158 - ], - [ - -51.7246, - 4.556867 - ], - [ - -51.0112, - 5.522895 - ], - [ - -43.48209, - 5.335832 - ], - [ - -29.3325, - 2.335959 - ] - ] - ] - }, - { - "name": "IBGE Mapa de Setores Urbanos", - "type": "tms", - "template": "http://{switch:a,b,c}.tiles.mapbox.com/v3/tmpsantos.hgda0m6h/{zoom}/{x}/{y}.png", - "scaleExtent": [ - 0, - 19 - ], - "polygon": [ - [ - [ - -29.3325, - 2.335959 - ], - [ - -28.72472, - 2.031551 - ], - [ - -27.76041, - -8.937033 - ], - [ - -27.67249, - -22.20839 - ], - [ - -51.11495, - -35.46552 - ], - [ - -53.39394, - -33.85064 - ], - [ - -53.62553, - -33.72493 - ], - [ - -53.62503, - -33.15428 - ], - [ - -53.24498, - -32.73392 - ], - [ - -53.65747, - -32.51873 - ], - [ - -53.8329, - -32.16592 - ], - [ - -54.64174, - -31.55507 - ], - [ - -55.29638, - -31.3429 - ], - [ - -55.57371, - -30.99691 - ], - [ - -56.06384, - -31.16749 - ], - [ - -56.10468, - -30.86436 - ], - [ - -56.86862, - -30.20752 - ], - [ - -57.39671, - -30.40464 - ], - [ - -57.74384, - -30.22142 - ], - [ - -55.83724, - -28.16598 - ], - [ - -54.86969, - -27.44994 - ], - [ - -53.9016, - -27.02998 - ], - [ - -53.74972, - -26.25781 - ], - [ - -53.97158, - -25.74513 - ], - [ - -54.44723, - -25.79609 - ], - [ - -54.67802, - -25.64668 - ], - [ - -54.36097, - -24.35145 - ], - [ - -54.41679, - -24.06527 - ], - [ - -54.64355, - -23.94107 - ], - [ - -55.22163, - -24.11355 - ], - [ - -55.49138, - -24.02797 - ], - [ - -55.71734, - -22.68488 - ], - [ - -55.90555, - -22.39886 - ], - [ - -56.45255, - -22.21731 - ], - [ - -56.8256, - -22.4002 - ], - [ - -57.34109, - -22.34351 - ], - [ - -58.08472, - -22.13075 - ], - [ - -57.95766, - -20.99818 - ], - [ - -58.26551, - -20.24147 - ], - [ - -58.03577, - -19.95871 - ], - [ - -58.23083, - -19.75211 - ], - [ - -57.64739, - -18.19828 - ], - [ - -57.89356, - -17.57377 - ], - [ - -58.16997, - -17.53519 - ], - [ - -58.48825, - -17.21961 - ], - [ - -58.57691, - -16.81466 - ], - [ - -58.45563, - -16.42158 - ], - [ - -60.2541, - -16.32571 - ], - [ - -60.33481, - -15.51483 - ], - [ - -60.67423, - -15.1122 - ], - [ - -60.34999, - -14.99707 - ], - [ - -60.63603, - -13.84119 - ], - [ - -61.07283, - -13.62569 - ], - [ - -61.9025, - -13.62647 - ], - [ - -62.21395, - -13.25048 - ], - [ - -62.80185, - -13.10905 - ], - [ - -63.17194, - -12.76568 - ], - [ - -63.74229, - -12.54071 - ], - [ - -64.32845, - -12.59578 - ], - [ - -65.10261, - -12.0682 - ], - [ - -65.45781, - -11.27865 - ], - [ - -65.41641, - -9.838943 - ], - [ - -66.52331, - -9.985873 - ], - [ - -67.66452, - -10.80093 - ], - [ - -67.99778, - -10.75991 - ], - [ - -68.52286, - -11.20807 - ], - [ - -69.88988, - -11.02776 - ], - [ - -70.30957, - -11.1699 - ], - [ - -70.71896, - -11.02003 - ], - [ - -70.68128, - -9.669083 - ], - [ - -71.27536, - -10.08971 - ], - [ - -72.18053, - -10.09967 - ], - [ - -72.41623, - -9.587397 - ], - [ - -73.29207, - -9.454149 - ], - [ - -73.0625, - -9.017267 - ], - [ - -73.61432, - -8.40982 - ], - [ - -74.09056, - -7.527548 - ], - [ - -74.03652, - -7.27885 - ], - [ - -73.84718, - -7.238285 - ], - [ - -73.78618, - -6.774872 - ], - [ - -73.22362, - -6.430106 - ], - [ - -73.33719, - -6.029736 - ], - [ - -72.93016, - -5.038711 - ], - [ - -71.93973, - -4.425027 - ], - [ - -70.96802, - -4.248294 - ], - [ - -70.79598, - -4.064931 - ], - [ - -70.02393, - -4.167345 - ], - [ - -69.51025, - -1.134089 - ], - [ - -69.70776, - -0.567619 - ], - [ - -70.13645, - -0.226161 - ], - [ - -70.14083, - 0.5844 - ], - [ - -69.26594, - 0.806502 - ], - [ - -69.34226, - 0.968924 - ], - [ - -69.92481, - 1.015705 - ], - [ - -69.92343, - 1.773851 - ], - [ - -68.38511, - 1.82943 - ], - [ - -68.24848, - 2.119808 - ], - [ - -67.94571, - 1.948424 - ], - [ - -67.37696, - 2.327468 - ], - [ - -67.05751, - 1.858336 - ], - [ - -67.00579, - 1.291603 - ], - [ - -66.79967, - 1.314684 - ], - [ - -66.28683, - 0.857709 - ], - [ - -65.67671, - 1.111146 - ], - [ - -65.42494, - 0.966549 - ], - [ - -65.15671, - 1.24203 - ], - [ - -64.27483, - 1.601591 - ], - [ - -64.0486, - 2.065137 - ], - [ - -63.47236, - 2.279358 - ], - [ - -64.13446, - 2.433909 - ], - [ - -64.10005, - 2.723778 - ], - [ - -64.32628, - 3.118275 - ], - [ - -64.28142, - 3.541983 - ], - [ - -64.88451, - 4.117671 - ], - [ - -64.88064, - 4.342461 - ], - [ - -64.13653, - 4.223152 - ], - [ - -63.95465, - 4.021316 - ], - [ - -63.17706, - 4.048301 - ], - [ - -62.96093, - 3.763658 - ], - [ - -62.82024, - 4.106019 - ], - [ - -62.49922, - 4.270815 - ], - [ - -61.91181, - 4.26284 - ], - [ - -61.35393, - 4.630097 - ], - [ - -61.04904, - 4.623115 - ], - [ - -60.70452, - 4.969851 - ], - [ - -60.78709, - 5.296764 - ], - [ - -60.22457, - 5.371207 - ], - [ - -59.89857, - 5.107541 - ], - [ - -59.97549, - 4.603025 - ], - [ - -59.59676, - 4.439875 - ], - [ - -59.41942, - 3.96994 - ], - [ - -59.71017, - 3.542008 - ], - [ - -59.88955, - 2.72301 - ], - [ - -59.63006, - 2.316332 - ], - [ - -59.63382, - 1.966581 - ], - [ - -59.18812, - 1.478079 - ], - [ - -58.80545, - 1.320732 - ], - [ - -58.35933, - 1.689932 - ], - [ - -57.6, - 1.803907 - ], - [ - -57.39854, - 2.065119 - ], - [ - -57.12392, - 2.128758 - ], - [ - -56.02925, - 1.949445 - ], - [ - -56.23884, - 2.263348 - ], - [ - -55.98195, - 2.628657 - ], - [ - -55.64816, - 2.519953 - ], - [ - -54.93958, - 2.682515 - ], - [ - -54.24988, - 2.25056 - ], - [ - -53.73937, - 2.473731 - ], - [ - -52.98578, - 2.280494 - ], - [ - -52.65712, - 2.564069 - ], - [ - -52.41739, - 3.22121 - ], - [ - -51.73983, - 4.119158 - ], - [ - -51.7246, - 4.556867 - ], - [ - -51.0112, - 5.522895 - ], - [ - -43.48209, - 5.335832 - ], - [ - -29.3325, - 2.335959 - ] - ] - ] - }, - { - "name": "Imagerie Drone (Haiti)", - "type": "tms", - "template": "http://wms.openstreetmap.fr/tms/1.0.0/iomhaiti/{zoom}/{x}/{y}", - "polygon": [ - [ - [ - -72.1547401, - 19.6878969 - ], - [ - -72.162234, - 19.689011 - ], - [ - -72.164995, - 19.6932445 - ], - [ - -72.1657838, - 19.6979977 - ], - [ - -72.161603, - 19.7035677 - ], - [ - -72.1487449, - 19.7028993 - ], - [ - -72.1477194, - 19.7026765 - ], - [ - -72.1485082, - 19.7001514 - ], - [ - -72.1436963, - 19.7011169 - ], - [ - -72.1410143, - 19.7000029 - ], - [ - -72.139476, - 19.6973664 - ], - [ - -72.1382533, - 19.6927617 - ], - [ - -72.1386872, - 19.6923161 - ], - [ - -72.1380561, - 19.6896423 - ], - [ - -72.1385294, - 19.6894938 - ], - [ - -72.1388055, - 19.6901251 - ], - [ - -72.1388844, - 19.6876741 - ], - [ - -72.1378195, - 19.6872656 - ], - [ - -72.13778, - 19.6850003 - ], - [ - -72.1369517, - 19.6855945 - ], - [ - -72.136794, - 19.6840719 - ], - [ - -72.135729, - 19.6835148 - ], - [ - -72.1355713, - 19.6740817 - ], - [ - -72.1366362, - 19.6708133 - ], - [ - -72.1487843, - 19.6710733 - ], - [ - -72.1534779, - 19.6763843 - ], - [ - -72.1530835, - 19.6769414 - ], - [ - -72.1533251, - 19.6769768 - ], - [ - -72.1532807, - 19.6796525 - ], - [ - -72.1523834, - 19.6797175 - ], - [ - -72.1522749, - 19.6803488 - ], - [ - -72.1519101, - 19.6803395 - ], - [ - -72.1518608, - 19.6805067 - ], - [ - -72.1528173, - 19.6806552 - ], - [ - -72.1522299, - 19.6833011 - ], - [ - -72.1507801, - 19.6831499 - ], - [ - -72.1504457, - 19.6847862 - ], - [ - -72.1508591, - 19.6843492 - ], - [ - -72.1530087, - 19.6849898 - ], - [ - -72.1546258, - 19.6854354 - ], - [ - -72.1543103, - 19.6870694 - ], - [ - -72.1547244, - 19.6868466 - ], - [ - -72.1548501, - 19.6877564 - ], - [ - -72.1545814, - 19.6877982 - ] - ], - [ - [ - -72.1310601, - 19.6718929 - ], - [ - -72.1259842, - 19.6772765 - ], - [ - -72.1255379, - 19.6776179 - ], - [ - -72.1216891, - 19.6776442 - ], - [ - -72.1149677, - 19.672602 - ], - [ - -72.1152745, - 19.6687152 - ], - [ - -72.1198205, - 19.6627535 - ], - [ - -72.1227768, - 19.6625696 - ], - [ - -72.1248965, - 19.662701 - ], - [ - -72.1285779, - 19.6645394 - ], - [ - -72.1308091, - 19.6661677 - ], - [ - -72.1316737, - 19.668794 - ], - [ - -72.1315621, - 19.671 - ] - ], - [ - [ - -71.845795, - 19.6709758 - ], - [ - -71.8429354, - 19.6759525 - ], - [ - -71.8410027, - 19.6759525 - ], - [ - -71.8380249, - 19.6755254 - ], - [ - -71.8378671, - 19.6745041 - ], - [ - -71.8390504, - 19.6743927 - ], - [ - -71.8390109, - 19.6741141 - ], - [ - -71.8398392, - 19.673947 - ], - [ - -71.8389123, - 19.6736127 - ], - [ - -71.8380249, - 19.67209 - ], - [ - -71.8380052, - 19.6726285 - ], - [ - -71.8376699, - 19.6727214 - ], - [ - -71.8376305, - 19.672545 - ], - [ - -71.8354414, - 19.6732135 - ], - [ - -71.835333, - 19.6729999 - ], - [ - -71.8331242, - 19.6734642 - ], - [ - -71.8326706, - 19.6716815 - ], - [ - -71.8321579, - 19.67209 - ], - [ - -71.8307183, - 19.6694902 - ], - [ - -71.8306009, - 19.6697594 - ], - [ - -71.8302174, - 19.6698907 - ], - [ - -71.8291833, - 19.6672095 - ], - [ - -71.8290749, - 19.6672095 - ], - [ - -71.8289122, - 19.6667916 - ], - [ - -71.8289516, - 19.6666199 - ], - [ - -71.8288333, - 19.6663506 - ], - [ - -71.8285572, - 19.6664759 - ], - [ - -71.8288678, - 19.6672466 - ], - [ - -71.8287593, - 19.6674138 - ], - [ - -71.8277979, - 19.6678177 - ], - [ - -71.8277112, - 19.6678586 - ], - [ - -71.8278263, - 19.6679637 - ], - [ - -71.8271831, - 19.6681212 - ], - [ - -71.8271761, - 19.6680917 - ], - [ - -71.8264405, - 19.6683921 - ], - [ - -71.8264074, - 19.6683231 - ], - [ - -71.8261954, - 19.6684253 - ], - [ - -71.8261806, - 19.6683556 - ], - [ - -71.8258946, - 19.6684206 - ], - [ - -71.8258897, - 19.6686574 - ], - [ - -71.8251551, - 19.6687549 - ], - [ - -71.8254509, - 19.6691588 - ], - [ - -71.8229332, - 19.6695739 - ], - [ - -71.822713, - 19.6696658 - ], - [ - -71.8227688, - 19.6697577 - ], - [ - -71.8201751, - 19.6709855 - ], - [ - -71.8198474, - 19.6704537 - ], - [ - -71.8197985, - 19.6706014 - ], - [ - -71.8194674, - 19.6707557 - ], - [ - -71.8182472, - 19.6713433 - ], - [ - -71.8181426, - 19.6711431 - ], - [ - -71.8175813, - 19.6714254 - ], - [ - -71.816959, - 19.6707672 - ], - [ - -71.8176388, - 19.6718965 - ], - [ - -71.8171403, - 19.6720376 - ], - [ - -71.8158225, - 19.6718045 - ], - [ - -71.8138354, - 19.6711874 - ], - [ - -71.8123259, - 19.6706982 - ], - [ - -71.8121759, - 19.6704258 - ], - [ - -71.8124304, - 19.6701467 - ], - [ - -71.8119184, - 19.6700141 - ], - [ - -71.8118765, - 19.6705828 - ], - [ - -71.811169, - 19.6703483 - ], - [ - -71.8095938, - 19.6698516 - ], - [ - -71.8077992, - 19.6692829 - ], - [ - -71.8056028, - 19.668612 - ], - [ - -71.8051443, - 19.6668942 - ], - [ - -71.8051196, - 19.6652322 - ], - [ - -71.8052315, - 19.661979 - ], - [ - -71.8065603, - 19.6523921 - ], - [ - -71.8073412, - 19.6482946 - ], - [ - -71.8099686, - 19.6468292 - ], - [ - -71.8147517, - 19.6454502 - ], - [ - -71.8147726, - 19.6455619 - ], - [ - -71.8150027, - 19.6455093 - ], - [ - -71.8149469, - 19.6453846 - ], - [ - -71.8159928, - 19.6450234 - ], - [ - -71.8158882, - 19.6448855 - ], - [ - -71.8165854, - 19.6446097 - ], - [ - -71.8190119, - 19.643802 - ], - [ - -71.8211524, - 19.643454 - ], - [ - -71.8221564, - 19.6433292 - ], - [ - -71.8269046, - 19.643211 - ], - [ - -71.8280481, - 19.6432241 - ], - [ - -71.8304466, - 19.6440778 - ], - [ - -71.8306419, - 19.6448592 - ], - [ - -71.8295263, - 19.6450365 - ], - [ - -71.8296064, - 19.6456111 - ], - [ - -71.8299411, - 19.6455651 - ], - [ - -71.8303699, - 19.6451744 - ], - [ - -71.830471, - 19.6453452 - ], - [ - -71.8308092, - 19.6451974 - ], - [ - -71.8310184, - 19.6451088 - ], - [ - -71.8312519, - 19.6458541 - ], - [ - -71.8311125, - 19.6458245 - ], - [ - -71.831367, - 19.6465862 - ], - [ - -71.8328939, - 19.646189 - ], - [ - -71.8344566, - 19.6457062 - ], - [ - -71.8344664, - 19.6463052 - ], - [ - -71.834215, - 19.6461938 - ], - [ - -71.8342002, - 19.6465513 - ], - [ - -71.8346702, - 19.6463 - ], - [ - -71.8349118, - 19.6463905 - ], - [ - -71.8347984, - 19.6462187 - ], - [ - -71.8354393, - 19.6458496 - ], - [ - -71.8355034, - 19.6458032 - ], - [ - -71.8364747, - 19.6461328 - ], - [ - -71.8376382, - 19.6472658 - ], - [ - -71.8379143, - 19.647888 - ], - [ - -71.8390483, - 19.6508039 - ], - [ - -71.8456942, - 19.6696203 - ] - ], - [ - [ - -72.098878, - 18.54843 - ], - [ - -72.096993, - 18.5501994 - ], - [ - -72.0972888, - 18.5503209 - ], - [ - -72.0968451, - 18.5503489 - ], - [ - -72.0955632, - 18.551854 - ], - [ - -72.0956428, - 18.5526742 - ], - [ - -72.0959914, - 18.5533748 - ], - [ - -72.0962145, - 18.553203 - ], - [ - -72.0962842, - 18.5535665 - ], - [ - -72.0964446, - 18.5535533 - ], - [ - -72.0965352, - 18.5539764 - ], - [ - -72.0965056, - 18.554173 - ], - [ - -72.0966085, - 18.5541747 - ], - [ - -72.0965178, - 18.5542127 - ], - [ - -72.0968769, - 18.5546588 - ], - [ - -72.0979018, - 18.5552141 - ], - [ - -72.1006211, - 18.5555875 - ], - [ - -72.1014926, - 18.5556206 - ], - [ - -72.1024339, - 18.5555016 - ], - [ - -72.103417, - 18.5543515 - ], - [ - -72.1034798, - 18.5516215 - ], - [ - -72.1030789, - 18.5516149 - ], - [ - -72.1033752, - 18.5515224 - ], - [ - -72.1035042, - 18.5515224 - ], - [ - -72.1035239, - 18.5502417 - ], - [ - -72.1028701, - 18.5503062 - ], - [ - -72.1029015, - 18.55025 - ], - [ - -72.1028457, - 18.5501773 - ], - [ - -72.1035081, - 18.5500252 - ], - [ - -72.103491, - 18.5497396 - ], - [ - -72.1035181, - 18.5497361 - ], - [ - -72.1035398, - 18.5489039 - ], - [ - -72.1034317, - 18.5487056 - ], - [ - -72.102717, - 18.5481437 - ], - [ - -72.1025601, - 18.5481536 - ], - [ - -72.10229, - 18.5482751 - ], - [ - -72.1022891, - 18.5482569 - ], - [ - -72.1025201, - 18.5481396 - ], - [ - -72.1023388, - 18.5481321 - ], - [ - -72.0999082, - 18.5480901 - ], - [ - -72.09907, - 18.5483799 - ] - ], - [ - [ - -72.2542503, - 18.568262 - ], - [ - -72.2560252, - 18.5717765 - ], - [ - -72.2557886, - 18.5748049 - ], - [ - -72.2535009, - 18.5755526 - ], - [ - -72.2522782, - 18.5755526 - ], - [ - -72.2499906, - 18.5740945 - ], - [ - -72.2473874, - 18.5698323 - ], - [ - -72.2460069, - 18.566729 - ], - [ - -72.2458492, - 18.5629527 - ], - [ - -72.2479396, - 18.5625414 - ], - [ - -72.2501483, - 18.5628031 - ], - [ - -72.2519232, - 18.5650839 - ] - ], - [ - [ - -72.303145, - 18.5332749 - ], - [ - -72.3031275, - 18.5331799 - ], - [ - -72.3048311, - 18.5311081 - ], - [ - -72.3097397, - 18.5311081 - ], - [ - -72.3164332, - 18.5324302 - ], - [ - -72.3234056, - 18.5366083 - ], - [ - -72.3261388, - 18.5387765 - ], - [ - -72.3261946, - 18.5426371 - ], - [ - -72.3170468, - 18.5540596 - ], - [ - -72.3130864, - 18.5540596 - ], - [ - -72.2987511, - 18.5453342 - ], - [ - -72.2988627, - 18.5407333 - ], - [ - -72.2962969, - 18.5404689 - ], - [ - -72.2954602, - 18.5395169 - ], - [ - -72.2961853, - 18.5338582 - ], - [ - -72.2971893, - 18.5332235 - ], - [ - -72.3007034, - 18.5332764 - ], - [ - -72.3022652, - 18.5342284 - ], - [ - -72.3028486, - 18.5335189 - ], - [ - -72.303104, - 18.5333361 - ], - [ - -72.303181, - 18.5334007 - ], - [ - -72.3035793, - 18.5335614 - ], - [ - -72.3030793, - 18.5346463 - ], - [ - -72.303715, - 18.5339873 - ], - [ - -72.3045286, - 18.5344052 - ], - [ - -72.3044015, - 18.5345097 - ], - [ - -72.3062747, - 18.5352571 - ], - [ - -72.3063107, - 18.5352741 - ], - [ - -72.3061219, - 18.5357628 - ], - [ - -72.3061219, - 18.5358196 - ], - [ - -72.30637, - 18.5358928 - ], - [ - -72.3062726, - 18.5354869 - ], - [ - -72.3066688, - 18.5350891 - ], - [ - -72.3061963, - 18.5349706 - ], - [ - -72.3058869, - 18.5349385 - ], - [ - -72.3055373, - 18.5346833 - ], - [ - -72.3054864, - 18.534613 - ], - [ - -72.3055585, - 18.5345065 - ], - [ - -72.3046749, - 18.5342293 - ], - [ - -72.3047617, - 18.5338817 - ], - [ - -72.3043252, - 18.5337511 - ], - [ - -72.3042595, - 18.5336346 - ] - ], - [ - [ - -72.2981405, - 18.477502 - ], - [ - -72.2935652, - 18.4948587 - ], - [ - -72.2922242, - 18.4964297 - ], - [ - -72.2931708, - 18.4972526 - ], - [ - -72.2892266, - 18.5057058 - ], - [ - -72.2878067, - 18.5080996 - ], - [ - -72.2850458, - 18.5119893 - ], - [ - -72.2840203, - 18.5113161 - ], - [ - -72.2808649, - 18.515879 - ], - [ - -72.2773151, - 18.5175994 - ], - [ - -72.2723454, - 18.5175246 - ], - [ - -72.2662714, - 18.5144578 - ], - [ - -72.2665869, - 18.5066783 - ], - [ - -72.2692643, - 18.5046154 - ], - [ - -72.2661965, - 18.5029756 - ], - [ - -72.2688181, - 18.4965222 - ], - [ - -72.2691528, - 18.4959403 - ], - [ - -72.2702684, - 18.4961519 - ], - [ - -72.2702684, - 18.4955964 - ], - [ - -72.2690691, - 18.49557 - ], - [ - -72.2692922, - 18.4937714 - ], - [ - -72.2736988, - 18.4859951 - ], - [ - -72.2746749, - 18.4850429 - ], - [ - -72.2751769, - 18.483403 - ], - [ - -72.2765435, - 18.4813398 - ], - [ - -72.2773523, - 18.4814985 - ], - [ - -72.2783006, - 18.4809694 - ], - [ - -72.2778544, - 18.4807049 - ], - [ - -72.2771013, - 18.480123 - ], - [ - -72.2789978, - 18.4775836 - ], - [ - -72.279723, - 18.4772927 - ], - [ - -72.2806433, - 18.4776365 - ], - [ - -72.2813685, - 18.4771604 - ], - [ - -72.2808386, - 18.4769752 - ], - [ - -72.2812848, - 18.4758378 - ], - [ - -72.2823167, - 18.4751765 - ], - [ - -72.2851615, - 18.4750971 - ], - [ - -72.2849941, - 18.4763668 - ], - [ - -72.2854404, - 18.4769752 - ], - [ - -72.286277, - 18.4756262 - ], - [ - -72.2869325, - 18.4754675 - ], - [ - -72.2865978, - 18.4751897 - ], - [ - -72.2865978, - 18.4750046 - ], - [ - -72.2909765, - 18.4747268 - ], - [ - -72.2946579, - 18.4749384 - ], - [ - -72.2973911, - 18.476843 - ] - ], - [ - [ - -72.3466657, - 18.5222375 - ], - [ - -72.346833, - 18.5244325 - ], - [ - -72.3475303, - 18.5277645 - ], - [ - -72.3455501, - 18.5291131 - ], - [ - -72.3403069, - 18.5292189 - ], - [ - -72.3383267, - 18.5280289 - ], - [ - -72.3369043, - 18.530118 - ], - [ - -72.3338086, - 18.5296684 - ], - [ - -72.3289279, - 18.5270769 - ], - [ - -72.328649, - 18.5253316 - ], - [ - -72.3292068, - 18.5232689 - ], - [ - -72.330406, - 18.5220524 - ], - [ - -72.3321631, - 18.5221847 - ], - [ - -72.3322467, - 18.5191963 - ], - [ - -72.3369183, - 18.5183633 - ], - [ - -72.3382012, - 18.5184691 - ], - [ - -72.3381454, - 18.5181782 - ], - [ - -72.3411993, - 18.5177947 - ], - [ - -72.3454943, - 18.5171997 - ], - [ - -72.3492595, - 18.517279 - ], - [ - -72.3504308, - 18.5188922 - ], - [ - -72.3503472, - 18.5206112 - ], - [ - -72.3496778, - 18.5220392 - ] - ], - [ - [ - -72.3303078, - 18.5486462 - ], - [ - -72.3429687, - 18.5508149 - ], - [ - -72.3433236, - 18.5530585 - ], - [ - -72.3413121, - 18.5614341 - ], - [ - -72.3390639, - 18.5613593 - ], - [ - -72.3384723, - 18.5638271 - ], - [ - -72.3375257, - 18.5654348 - ], - [ - -72.3348436, - 18.5650609 - ], - [ - -72.3311755, - 18.5638271 - ], - [ - -72.3312149, - 18.5616211 - ], - [ - -72.3232082, - 18.5606863 - ], - [ - -72.3212361, - 18.559602 - ], - [ - -72.3208023, - 18.5587046 - ], - [ - -72.3208811, - 18.557882 - ], - [ - -72.3259493, - 18.5580274 - ], - [ - -72.3266186, - 18.5581993 - ], - [ - -72.3259214, - 18.5577498 - ], - [ - -72.3250986, - 18.5573797 - ], - [ - -72.3233767, - 18.552263 - ], - [ - -72.3245994, - 18.5478507 - ], - [ - -72.3288986, - 18.5483742 - ], - [ - -72.329979, - 18.5489548 - ] - ], - [ - [ - -72.3231383, - 18.5269828 - ], - [ - -72.3223434, - 18.528067 - ], - [ - -72.3209629, - 18.5279745 - ], - [ - -72.3207816, - 18.5271282 - ], - [ - -72.3208513, - 18.5253697 - ], - [ - -72.3214649, - 18.5249598 - ], - [ - -72.3225666, - 18.5248937 - ], - [ - -72.3228454, - 18.52533 - ], - [ - -72.3232359, - 18.5264804 - ] - ], - [ - [ - -72.2160832, - 18.6457752 - ], - [ - -72.2159649, - 18.6553795 - ], - [ - -72.2030279, - 18.6558279 - ], - [ - -72.1947057, - 18.6553421 - ], - [ - -72.1922208, - 18.6545573 - ], - [ - -72.1920631, - 18.6521283 - ], - [ - -72.193483, - 18.6477559 - ], - [ - -72.201253, - 18.6385249 - ], - [ - -72.2069327, - 18.6388239 - ], - [ - -72.2120996, - 18.6424117 - ], - [ - -72.2118068, - 18.6430591 - ], - [ - -72.2121693, - 18.6426892 - ], - [ - -72.2127968, - 18.6427552 - ], - [ - -72.2134662, - 18.6431252 - ], - [ - -72.2135638, - 18.6437462 - ], - [ - -72.2154176, - 18.6443947 - ], - [ - -72.2158909, - 18.6450301 - ] - ], - [ - [ - -72.2867654, - 18.6482017 - ], - [ - -72.2900977, - 18.6527446 - ], - [ - -72.28981, - 18.6536532 - ], - [ - -72.2900738, - 18.6542664 - ], - [ - -72.290721, - 18.6537667 - ], - [ - -72.2910327, - 18.6544709 - ], - [ - -72.2912485, - 18.654221 - ], - [ - -72.29168, - 18.6558905 - ], - [ - -72.2912245, - 18.656606 - ], - [ - -72.2922673, - 18.65597 - ], - [ - -72.2926869, - 18.6567536 - ], - [ - -72.2930705, - 18.6567309 - ], - [ - -72.2941253, - 18.6581846 - ], - [ - -72.2960192, - 18.6608421 - ], - [ - -72.2959713, - 18.6619096 - ], - [ - -72.2932862, - 18.664567 - ], - [ - -72.2906731, - 18.6659979 - ], - [ - -72.2895943, - 18.6661342 - ], - [ - -72.2895943, - 18.6665657 - ], - [ - -72.2877004, - 18.6664749 - ], - [ - -72.2875805, - 18.6676559 - ], - [ - -72.2831214, - 18.6697227 - ], - [ - -72.2796453, - 18.6696546 - ], - [ - -72.2784311, - 18.6690787 - ], - [ - -72.2783972, - 18.6687736 - ], - [ - -72.277736, - 18.6691671 - ], - [ - -72.2774394, - 18.669143 - ], - [ - -72.2770071, - 18.6683159 - ], - [ - -72.2765575, - 18.6681125 - ], - [ - -72.2765385, - 18.6680583 - ], - [ - -72.2752319, - 18.6685239 - ], - [ - -72.2749292, - 18.6674649 - ], - [ - -72.2746416, - 18.6674309 - ], - [ - -72.2734668, - 18.6682145 - ], - [ - -72.2732271, - 18.6682712 - ], - [ - -72.2726757, - 18.6671583 - ], - [ - -72.2719147, - 18.6674288 - ], - [ - -72.2718808, - 18.6673405 - ], - [ - -72.2688149, - 18.6681868 - ], - [ - -72.2688269, - 18.6671761 - ], - [ - -72.2690786, - 18.6668241 - ], - [ - -72.2688149, - 18.66679 - ], - [ - -72.2681077, - 18.6670739 - ], - [ - -72.2676282, - 18.6673805 - ], - [ - -72.2675563, - 18.6666878 - ], - [ - -72.266861, - 18.666949 - ], - [ - -72.2655904, - 18.6673578 - ], - [ - -72.2654466, - 18.6670058 - ], - [ - -72.2647514, - 18.6674146 - ], - [ - -72.2629893, - 18.6681868 - ], - [ - -72.2628455, - 18.6681754 - ], - [ - -72.2626537, - 18.6676076 - ], - [ - -72.2623001, - 18.6677098 - ], - [ - -72.2624799, - 18.6679199 - ], - [ - -72.2624799, - 18.6682322 - ], - [ - -72.262306, - 18.6682606 - ], - [ - -72.2620963, - 18.6679654 - ], - [ - -72.2622761, - 18.6689193 - ], - [ - -72.2601484, - 18.6688966 - ], - [ - -72.2542749, - 18.6687944 - ], - [ - -72.2505388, - 18.6683476 - ], - [ - -72.2504371, - 18.669536 - ], - [ - -72.2477926, - 18.6698893 - ], - [ - -72.2415204, - 18.669793 - ], - [ - -72.2414187, - 18.6741933 - ], - [ - -72.2389167, - 18.6739759 - ], - [ - -72.2387249, - 18.6734649 - ], - [ - -72.2383653, - 18.6733059 - ], - [ - -72.2387009, - 18.6739532 - ], - [ - -72.2375502, - 18.6738964 - ], - [ - -72.2374183, - 18.6735103 - ], - [ - -72.237742, - 18.67334 - ], - [ - -72.2375142, - 18.6732605 - ], - [ - -72.236843, - 18.6734876 - ], - [ - -72.2364354, - 18.6724088 - ], - [ - -72.2355124, - 18.6726019 - ], - [ - -72.2354045, - 18.6724202 - ], - [ - -72.2353027, - 18.6729028 - ], - [ - -72.2345475, - 18.6726871 - ], - [ - -72.2343077, - 18.6724599 - ], - [ - -72.2342358, - 18.6734706 - ], - [ - -72.2334087, - 18.6734592 - ], - [ - -72.2332889, - 18.6733003 - ], - [ - -72.2327375, - 18.6732889 - ], - [ - -72.2327135, - 18.6735047 - ], - [ - -72.227703, - 18.6725281 - ], - [ - -72.2265283, - 18.6716537 - ], - [ - -72.226804, - 18.6715742 - ], - [ - -72.2274993, - 18.6715855 - ], - [ - -72.2274873, - 18.6714493 - ], - [ - -72.2272899, - 18.6714623 - ], - [ - -72.2272814, - 18.6712977 - ], - [ - -72.2272094, - 18.671358 - ], - [ - -72.2261785, - 18.6713693 - ], - [ - -72.2256032, - 18.670881 - ], - [ - -72.2255073, - 18.6694502 - ], - [ - -72.2261066, - 18.6696886 - ], - [ - -72.2261785, - 18.6695949 - ], - [ - -72.2259837, - 18.6695495 - ], - [ - -72.225777, - 18.6691379 - ], - [ - -72.2253335, - 18.6694643 - ], - [ - -72.2249739, - 18.66947 - ], - [ - -72.2245783, - 18.6678802 - ], - [ - -72.2235525, - 18.6677046 - ], - [ - -72.2235907, - 18.6675921 - ], - [ - -72.2224634, - 18.6676283 - ], - [ - -72.2223659, - 18.667022 - ], - [ - -72.2223277, - 18.6670943 - ], - [ - -72.2219209, - 18.667026 - ], - [ - -72.2208105, - 18.6669015 - ], - [ - -72.220809, - 18.6665325 - ], - [ - -72.2208705, - 18.6663593 - ], - [ - -72.2206023, - 18.6668107 - ], - [ - -72.2203895, - 18.6666361 - ], - [ - -72.2184341, - 18.6650535 - ], - [ - -72.21829, - 18.6640979 - ], - [ - -72.2183493, - 18.6608376 - ], - [ - -72.2187223, - 18.6606541 - ], - [ - -72.2186894, - 18.660603 - ], - [ - -72.2187253, - 18.6604525 - ], - [ - -72.2189771, - 18.6603247 - ], - [ - -72.2187823, - 18.6601998 - ], - [ - -72.2186984, - 18.6602367 - ], - [ - -72.2185815, - 18.6600352 - ], - [ - -72.2186085, - 18.6600039 - ], - [ - -72.2187823, - 18.6601345 - ], - [ - -72.218995, - 18.6600181 - ], - [ - -72.2189111, - 18.6599131 - ], - [ - -72.2189681, - 18.6597938 - ], - [ - -72.2183807, - 18.6595837 - ], - [ - -72.2184728, - 18.6539662 - ], - [ - -72.2201001, - 18.6511554 - ], - [ - -72.225796, - 18.6469472 - ], - [ - -72.2283048, - 18.6457265 - ], - [ - -72.2379335, - 18.645855 - ], - [ - -72.237764, - 18.6446985 - ], - [ - -72.2400355, - 18.6432529 - ], - [ - -72.2455958, - 18.6433493 - ], - [ - -72.2482742, - 18.6450358 - ], - [ - -72.2487488, - 18.6436705 - ], - [ - -72.2511067, - 18.6429775 - ], - [ - -72.2512385, - 18.6433409 - ], - [ - -72.2512625, - 18.6431592 - ], - [ - -72.2514843, - 18.6431365 - ], - [ - -72.2513284, - 18.6429718 - ], - [ - -72.2533602, - 18.6423471 - ], - [ - -72.253516, - 18.6426765 - ], - [ - -72.2539535, - 18.6425402 - ], - [ - -72.2541453, - 18.642932 - ], - [ - -72.2543851, - 18.6428696 - ], - [ - -72.2543791, - 18.6427503 - ], - [ - -72.2564168, - 18.6423244 - ], - [ - -72.2566925, - 18.6431365 - ], - [ - -72.2568783, - 18.6428582 - ], - [ - -72.2568184, - 18.6425288 - ], - [ - -72.258843, - 18.6420991 - ], - [ - -72.258885, - 18.6422467 - ], - [ - -72.2592626, - 18.6422297 - ], - [ - -72.2596461, - 18.6424057 - ], - [ - -72.2592206, - 18.6406907 - ], - [ - -72.2599545, - 18.6404815 - ], - [ - -72.2601156, - 18.6406341 - ], - [ - -72.2601156, - 18.6399393 - ], - [ - -72.2615268, - 18.6394669 - ], - [ - -72.2626056, - 18.6391034 - ], - [ - -72.2654465, - 18.6387286 - ], - [ - -72.2719433, - 18.6386832 - ], - [ - -72.272201, - 18.6388649 - ], - [ - -72.2730341, - 18.6394158 - ], - [ - -72.273166, - 18.6412558 - ], - [ - -72.2738732, - 18.6410286 - ], - [ - -72.2742208, - 18.6416079 - ], - [ - -72.2752187, - 18.6416987 - ], - [ - -72.2754524, - 18.6415738 - ], - [ - -72.2755513, - 18.6416874 - ], - [ - -72.2755394, - 18.6417527 - ], - [ - -72.2764713, - 18.6418634 - ], - [ - -72.276753, - 18.6418975 - ], - [ - -72.2762953, - 18.6426002 - ], - [ - -72.2774226, - 18.6429978 - ], - [ - -72.277982, - 18.6427247 - ], - [ - -72.2785796, - 18.6431303 - ], - [ - -72.2785669, - 18.6432307 - ], - [ - -72.2789017, - 18.6433471 - ], - [ - -72.279851, - 18.6439655 - ], - [ - -72.2858703, - 18.6469651 - ] - ], - [ - [ - -72.5557247, - 18.5305893 - ], - [ - -72.5555866, - 18.5367036 - ], - [ - -72.554995, - 18.537975 - ], - [ - -72.5488026, - 18.537919 - ], - [ - -72.5486646, - 18.5372832 - ], - [ - -72.548842, - 18.5306267 - ], - [ - -72.5493745, - 18.5301031 - ], - [ - -72.555133, - 18.5301218 - ] - ], - [ - [ - -72.6235278, - 18.5079877 - ], - [ - -72.6234441, - 18.5095217 - ], - [ - -72.6226074, - 18.5104341 - ], - [ - -72.6204878, - 18.511849 - ], - [ - -72.6183403, - 18.5107514 - ], - [ - -72.6162207, - 18.5083183 - ], - [ - -72.6162625, - 18.506467 - ], - [ - -72.618661, - 18.5044438 - ], - [ - -72.6204041, - 18.5044967 - ], - [ - -72.6228305, - 18.506996 - ] - ] - ] - }, - { - "name": "Interspect ortofotó 2014", - "type": "tms", - "description": "Four districts of Budapest: III, XIII, XIV, XV", - "template": "http://geoserver.infobex.hu/Budapest2014/IST/{zoom}/{x}/{y}.jpg", - "scaleExtent": [ - 10, - 21 - ], - "polygon": [ - [ - [ - 19.04642, - 47.61098 - ], - [ - 19.05375, - 47.60995 - ], - [ - 19.06033, - 47.61037 - ], - [ - 19.06022, - 47.61009 - ], - [ - 19.06091, - 47.61023 - ], - [ - 19.0755, - 47.60835 - ], - [ - 19.07796, - 47.60718 - ], - [ - 19.07773, - 47.60627 - ], - [ - 19.07599, - 47.60433 - ], - [ - 19.07337, - 47.59906 - ], - [ - 19.07232, - 47.59332 - ], - [ - 19.0723, - 47.58865 - ], - [ - 19.0693, - 47.5798 - ], - [ - 19.06891, - 47.57742 - ], - [ - 19.06949, - 47.57211 - ], - [ - 19.06623, - 47.56375 - ], - [ - 19.06717, - 47.56427 - ], - [ - 19.0692, - 47.56456 - ], - [ - 19.06992, - 47.56418 - ], - [ - 19.07011, - 47.56363 - ], - [ - 19.07785, - 47.56148 - ], - [ - 19.07986, - 47.56053 - ], - [ - 19.08359, - 47.55604 - ], - [ - 19.08516, - 47.5548 - ], - [ - 19.08601, - 47.5551 - ], - [ - 19.08703, - 47.55488 - ], - [ - 19.0984, - 47.54666 - ], - [ - 19.09974, - 47.54692 - ], - [ - 19.10094, - 47.54656 - ], - [ - 19.1015, - 47.54593 - ], - [ - 19.1015, - 47.54523 - ], - [ - 19.10255, - 47.54458 - ], - [ - 19.10939, - 47.56255 - ], - [ - 19.10917, - 47.56324 - ], - [ - 19.11193, - 47.57058 - ], - [ - 19.11235, - 47.57087 - ], - [ - 19.11271, - 47.57297 - ], - [ - 19.11382, - 47.57379 - ], - [ - 19.1144, - 47.57504 - ], - [ - 19.11779, - 47.58375 - ], - [ - 19.11774, - 47.5844 - ], - [ - 19.11844, - 47.58512 - ], - [ - 19.12, - 47.58924 - ], - [ - 19.12008, - 47.59563 - ], - [ - 19.1206, - 47.59856 - ], - [ - 19.12127, - 47.59952 - ], - [ - 19.12266, - 47.6004 - ], - [ - 19.12436, - 47.6008 - ], - [ - 19.1255, - 47.60048 - ], - [ - 19.12577, - 47.5997 - ], - [ - 19.128, - 47.59885 - ], - [ - 19.13058, - 47.59898 - ], - [ - 19.13768, - 47.60057 - ], - [ - 19.13874, - 47.60043 - ], - [ - 19.14144, - 47.59639 - ], - [ - 19.14122, - 47.59568 - ], - [ - 19.14023, - 47.59527 - ], - [ - 19.15557, - 47.58499 - ], - [ - 19.15413, - 47.58389 - ], - [ - 19.15329, - 47.58013 - ], - [ - 19.15344, - 47.57918 - ], - [ - 19.15499, - 47.57884 - ], - [ - 19.16043, - 47.57871 - ], - [ - 19.16043, - 47.57583 - ], - [ - 19.16213, - 47.57583 - ], - [ - 19.16196, - 47.57383 - ], - [ - 19.17573, - 47.56442 - ], - [ - 19.17511, - 47.56345 - ], - [ - 19.16356, - 47.55986 - ], - [ - 19.16295, - 47.5594 - ], - [ - 19.17589, - 47.55134 - ], - [ - 19.18156, - 47.54896 - ], - [ - 19.18205, - 47.5483 - ], - [ - 19.18165, - 47.54762 - ], - [ - 19.16905, - 47.53994 - ], - [ - 19.15316, - 47.52885 - ], - [ - 19.14747, - 47.52584 - ], - [ - 19.14691, - 47.52332 - ], - [ - 19.14947, - 47.52059 - ], - [ - 19.15581, - 47.51256 - ], - [ - 19.1572, - 47.51155 - ], - [ - 19.15697, - 47.51051 - ], - [ - 19.15885, - 47.50566 - ], - [ - 19.15866, - 47.50493 - ], - [ - 19.15793, - 47.50438 - ], - [ - 19.10292, - 47.49828 - ], - [ - 19.1016, - 47.49846 - ], - [ - 19.10057, - 47.49914 - ], - [ - 19.09185, - 47.5003 - ], - [ - 19.08953, - 47.50117 - ], - [ - 19.07138, - 47.51722 - ], - [ - 19.06794, - 47.51558 - ], - [ - 19.06631, - 47.51529 - ], - [ - 19.06522, - 47.51545 - ], - [ - 19.06347, - 47.51668 - ], - [ - 19.06072, - 47.51512 - ], - [ - 19.05709, - 47.51044 - ], - [ - 19.05567, - 47.50992 - ], - [ - 19.05417, - 47.50997 - ], - [ - 19.04318, - 47.51383 - ], - [ - 19.04093, - 47.51397 - ], - [ - 19.04045, - 47.51449 - ], - [ - 19.03916, - 47.51909 - ], - [ - 19.03898, - 47.52143 - ], - [ - 19.03938, - 47.52358 - ], - [ - 19.04081, - 47.52649 - ], - [ - 19.0408, - 47.53092 - ], - [ - 19.02088, - 47.53091 - ], - [ - 19.02088, - 47.529 - ], - [ - 19.0172, - 47.52866 - ], - [ - 19.01684, - 47.52876 - ], - [ - 19.01453, - 47.53356 - ], - [ - 19.01459, - 47.5347 - ], - [ - 19.01373, - 47.5348 - ], - [ - 19.01167, - 47.53786 - ], - [ - 19.01055, - 47.53839 - ], - [ - 19.0051, - 47.53978 - ], - [ - 19.00501, - 47.54075 - ], - [ - 19.00761, - 47.54245 - ], - [ - 19.00684, - 47.54297 - ], - [ - 19.00684, - 47.54385 - ], - [ - 19.00525, - 47.54499 - ], - [ - 19.0053, - 47.5455 - ], - [ - 19.00462, - 47.54557 - ], - [ - 19.00434, - 47.54599 - ], - [ - 19.00261, - 47.55075 - ], - [ - 18.99714, - 47.55468 - ], - [ - 18.99466, - 47.55877 - ], - [ - 18.99244, - 47.5605 - ], - [ - 18.99173, - 47.56266 - ], - [ - 18.99105, - 47.56278 - ], - [ - 18.986, - 47.56863 - ], - [ - 18.97914, - 47.57257 - ], - [ - 18.97675, - 47.57301 - ], - [ - 18.97622, - 47.57444 - ], - [ - 18.97677, - 47.57463 - ], - [ - 18.97641, - 47.57596 - ], - [ - 18.98247, - 47.58127 - ], - [ - 18.98227, - 47.58198 - ], - [ - 18.98276, - 47.58283 - ], - [ - 18.97695, - 47.58448 - ], - [ - 18.97645, - 47.58485 - ], - [ - 18.97639, - 47.58555 - ], - [ - 18.98285, - 47.58936 - ], - [ - 18.9841, - 47.58929 - ], - [ - 18.99076, - 47.58612 - ], - [ - 18.99375, - 47.58507 - ], - [ - 18.99618, - 47.58645 - ], - [ - 18.99727, - 47.58664 - ], - [ - 19.00068, - 47.58457 - ], - [ - 19.0016, - 47.58438 - ], - [ - 19.00892, - 47.58637 - ], - [ - 19.01088, - 47.58637 - ], - [ - 19.01088, - 47.5869 - ], - [ - 19.01264, - 47.58738 - ], - [ - 19.02151, - 47.58876 - ], - [ - 19.02593, - 47.58914 - ], - [ - 19.03271, - 47.5883 - ], - [ - 19.03199, - 47.59087 - ], - [ - 19.03113, - 47.59163 - ], - [ - 19.03125, - 47.59276 - ], - [ - 19.02883, - 47.59838 - ], - [ - 19.02808, - 47.59978 - ], - [ - 19.0239, - 47.60425 - ], - [ - 19.02393, - 47.60498 - ], - [ - 19.02531, - 47.60575 - ], - [ - 19.03768, - 47.6104 - ], - [ - 19.04642, - 47.61098 - ] - ] - ], - "terms_url": "http://interspect.hu/", - "terms_text": "Interspect Kft." - }, - { - "name": "Ireland Bartholomew Quarter-Inch 1940", - "type": "tms", - "template": "http://geo.nls.uk/maps/ireland/bartholomew/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 5, - 13 - ], - "polygon": [ - [ - [ - -8.8312773, - 55.3963337 - ], - [ - -7.3221271, - 55.398605 - ], - [ - -7.2891331, - 55.4333162 - ], - [ - -7.2368042, - 55.4530757 - ], - [ - -7.18881, - 55.4497995 - ], - [ - -7.1528144, - 55.3968384 - ], - [ - -6.90561, - 55.394903 - ], - [ - -6.9047153, - 55.3842114 - ], - [ - -5.8485282, - 55.3922956 - ], - [ - -5.8378629, - 55.248676 - ], - [ - -5.3614762, - 55.2507024 - ], - [ - -5.3899172, - 53.8466464 - ], - [ - -5.8734141, - 53.8487436 - ], - [ - -5.8983, - 52.8256258 - ], - [ - -6.0191742, - 52.8256258 - ], - [ - -6.0262844, - 51.7712367 - ], - [ - -8.1131422, - 51.7712367 - ], - [ - -8.1273627, - 51.3268839 - ], - [ - -10.6052842, - 51.3091083 - ], - [ - -10.6271879, - 52.0328254 - ], - [ - -10.6469845, - 52.0322454 - ], - [ - -10.6469845, - 52.0440365 - ], - [ - -10.6271879, - 52.0448095 - ], - [ - -10.6290733, - 52.0745627 - ], - [ - -10.6699234, - 52.0743695 - ], - [ - -10.6702376, - 52.0876941 - ], - [ - -10.6312729, - 52.0898179 - ], - [ - -10.6393128, - 52.4147202 - ], - [ - -10.3137689, - 52.4185533 - ], - [ - -10.3166401, - 53.3341342 - ], - [ - -10.3699669, - 53.3330727 - ], - [ - -10.385965, - 54.3534472 - ], - [ - -8.8163777, - 54.3586265 - ], - [ - -8.8173427, - 54.6595721 - ], - [ - -8.8413398, - 54.6616284 - ], - [ - -8.8422286, - 54.6929749 - ], - [ - -8.8315632, - 54.7145436 - ], - [ - -8.8151208, - 54.7145436 - ] - ] - ], - "terms_url": "http://geo.nls.uk/maps/", - "terms_text": "National Library of Scotland Historic Maps" - }, - { - "name": "Ireland British War Office 1:25k GSGS 3906", - "type": "tms", - "template": "http://mapwarper.net/layers/tile/101/{zoom}/{x}/{y}.png", - "scaleExtent": [ - 0, - 18 - ], - "polygon": [ - [ - [ - -10.71, - 51.32 - ], - [ - -10.71, - 55.46 - ], - [ - -5.37, - 55.46 - ], - [ - -5.37, - 51.32 - ], - [ - -10.71, - 51.32 - ] - ] - ], - "terms_url": "http://wiki.openstreetmap.org/wiki/WikiProject_Ireland#Trinity_College_Dublin", - "terms_text": "Glucksman Map Library, Trinity College Dublin", - "id": "GSGS3906" - }, - { - "name": "Ireland British War Office One-Inch 1941-43 GSGS 4136", - "type": "tms", - "template": "http://geo.nls.uk/maps/ireland/gsgs4136/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 5, - 15 - ], - "polygon": [ - [ - [ - -10.0847426, - 51.4147902 - ], - [ - -10.0906535, - 51.5064103 - ], - [ - -10.4564222, - 51.5003961 - ], - [ - -10.5005905, - 52.3043019 - ], - [ - -10.0837522, - 52.312741 - ], - [ - -10.0840973, - 52.3404698 - ], - [ - -10.055802, - 52.3408915 - ], - [ - -10.0768509, - 52.7628238 - ], - [ - -9.7780248, - 52.7684611 - ], - [ - -9.7818205, - 52.8577261 - ], - [ - -9.6337877, - 52.8596012 - ], - [ - -9.6449626, - 53.1294502 - ], - [ - -10.0919663, - 53.1227152 - ], - [ - -10.1051422, - 53.3912913 - ], - [ - -10.4052593, - 53.3866349 - ], - [ - -10.4530828, - 54.193502 - ], - [ - -10.2998523, - 54.1974988 - ], - [ - -10.3149801, - 54.4669592 - ], - [ - -8.9276095, - 54.4853897 - ], - [ - -8.9339534, - 54.7546562 - ], - [ - -8.7773069, - 54.755501 - ], - [ - -8.7826749, - 55.0252208 - ], - [ - -8.9402974, - 55.0238221 - ], - [ - -8.9451773, - 55.2934155 - ], - [ - -7.528039, - 55.2970274 - ], - [ - -7.525599, - 55.3874955 - ], - [ - -7.0541955, - 55.3841691 - ], - [ - -7.0556595, - 55.2939712 - ], - [ - -6.3241545, - 55.2859128 - ], - [ - -6.3217146, - 55.3253556 - ], - [ - -6.1035807, - 55.3223016 - ], - [ - -6.1045566, - 55.2828557 - ], - [ - -5.7985836, - 55.2772968 - ], - [ - -5.8117595, - 55.0087135 - ], - [ - -5.656577, - 55.0056351 - ], - [ - -5.6721928, - 54.7355021 - ], - [ - -5.3618278, - 54.729585 - ], - [ - -5.3964755, - 54.1917889 - ], - [ - -5.855679, - 54.2017807 - ], - [ - -5.9220464, - 52.8524504 - ], - [ - -6.070885, - 52.8551025 - ], - [ - -6.1030927, - 52.1373337 - ], - [ - -6.8331336, - 52.1463183 - ], - [ - -6.8355736, - 52.0578908 - ], - [ - -7.5641506, - 52.0617913 - ], - [ - -7.5661026, - 51.7921593 - ], - [ - -8.147305, - 51.792763 - ], - [ - -8.146329, - 51.7033331 - ], - [ - -8.2912636, - 51.7027283 - ], - [ - -8.2897996, - 51.5227274 - ], - [ - -9.1174397, - 51.516958 - ], - [ - -9.1179277, - 51.4625685 - ], - [ - -9.3692452, - 51.4616564 - ], - [ - -9.3672933, - 51.4254613 - ] - ] - ], - "terms_url": "http://geo.nls.uk/maps/", - "terms_text": "National Library of Scotland Historic Maps", - "id": "GSGS4136" - }, - { - "name": "Ireland EEA CORINE 2006", - "type": "tms", - "template": "http://a.tile.openstreetmap.ie/tiles/corine/{zoom}/{x}/{y}.png", - "scaleExtent": [ - 5, - 16 - ], - "polygon": [ - [ - [ - -5.842956, - 53.8627976 - ], - [ - -5.8341575, - 53.7633541 - ], - [ - -5.6267647, - 53.5383692 - ], - [ - -5.9648778, - 52.1631197 - ], - [ - -6.0453211, - 52.0527275 - ], - [ - -6.1823261, - 51.9699475 - ], - [ - -6.3960035, - 51.9234618 - ], - [ - -6.5945978, - 51.883911 - ], - [ - -7.2481994, - 51.9056295 - ], - [ - -7.341212, - 51.8148076 - ], - [ - -8.1971787, - 51.5037019 - ], - [ - -8.3191005, - 51.4167737 - ], - [ - -9.4478202, - 51.1991221 - ], - [ - -9.9015706, - 51.2266802 - ], - [ - -10.472215, - 51.4050139 - ], - [ - -10.8857437, - 51.6770619 - ], - [ - -11.035318, - 52.0620016 - ], - [ - -10.9950963, - 52.1831616 - ], - [ - -10.8178697, - 52.3139827 - ], - [ - -9.8839736, - 52.9032208 - ], - [ - -10.1165049, - 52.9676141 - ], - [ - -10.5514014, - 53.3317027 - ], - [ - -10.6896633, - 53.5854022 - ], - [ - -10.6444139, - 54.0100436 - ], - [ - -10.5501445, - 54.257482 - ], - [ - -10.2824192, - 54.4742405 - ], - [ - -9.8073011, - 54.5705346 - ], - [ - -9.196435, - 54.5486695 - ], - [ - -9.2253443, - 54.7000264 - ], - [ - -8.8985435, - 55.1363582 - ], - [ - -8.0476045, - 55.4711977 - ], - [ - -7.4367384, - 55.6191092 - ], - [ - -7.2205471, - 55.6205288 - ], - [ - -6.8258723, - 55.5608644 - ], - [ - -6.0679458, - 55.3727567 - ], - [ - -5.5639184, - 55.0759594 - ], - [ - -5.0649187, - 54.4640142 - ], - [ - -5.2572284, - 54.1582424 - ] - ] - ], - "terms_url": "http://www.eea.europa.eu/data-and-maps/data/clc-2006-vector-data-version-1", - "terms_text": "EEA Corine 2006" - }, - { - "name": "Ireland EEA GMES Urban Atlas", - "type": "tms", - "template": "http://a.tile.openstreetmap.ie/tiles/urbanatlas/{zoom}/{x}/{y}.png", - "scaleExtent": [ - 5, - 17 - ], - "polygon": [ - [ - [ - -9.2759602, - 52.7993666 - ], - [ - -9.215509, - 52.8276933 - ], - [ - -9.1086618, - 52.9128016 - ], - [ - -9.0196831, - 52.8837107 - ], - [ - -8.8760649, - 52.8978445 - ], - [ - -8.8001797, - 52.8833558 - ], - [ - -8.7665597, - 52.9065354 - ], - [ - -8.5938079, - 52.9238592 - ], - [ - -8.5241972, - 52.8869724 - ], - [ - -8.4956786, - 52.9105906 - ], - [ - -8.3506448, - 52.9238592 - ], - [ - -8.2718204, - 52.9492401 - ], - [ - -8.2249679, - 52.8991338 - ], - [ - -8.1564001, - 52.9149986 - ], - [ - -8.0881237, - 52.7630417 - ], - [ - -8.1360092, - 52.7239783 - ], - [ - -8.1570652, - 52.6766443 - ], - [ - -8.2059695, - 52.6185385 - ], - [ - -8.2025734, - 52.5954396 - ], - [ - -8.2231242, - 52.5599691 - ], - [ - -8.2236294, - 52.5095371 - ], - [ - -8.2976651, - 52.5025088 - ], - [ - -8.3295888, - 52.4721087 - ], - [ - -8.3589695, - 52.4986072 - ], - [ - -8.3737385, - 52.4764529 - ], - [ - -8.432326, - 52.4342609 - ], - [ - -8.4754569, - 52.4216289 - ], - [ - -8.5017727, - 52.3870011 - ], - [ - -8.5476205, - 52.3681351 - ], - [ - -8.6444103, - 52.3376422 - ], - [ - -8.6841451, - 52.3660614 - ], - [ - -8.8154099, - 52.3721014 - ], - [ - -8.8614233, - 52.3521652 - ], - [ - -8.9074451, - 52.3824674 - ], - [ - -8.9388551, - 52.3789166 - ], - [ - -8.9782502, - 52.4093811 - ], - [ - -9.0298715, - 52.4104169 - ], - [ - -9.1059449, - 52.420981 - ], - [ - -9.1084962, - 52.4415071 - ], - [ - -9.140702, - 52.4650891 - ], - [ - -9.1315765, - 52.5136207 - ], - [ - -9.1739699, - 52.5620573 - ], - [ - -9.1426235, - 52.589645 - ], - [ - -9.1542382, - 52.610216 - ], - [ - -9.1426231, - 52.6387401 - ], - [ - -9.1776844, - 52.6447573 - ], - [ - -9.2012184, - 52.6526248 - ], - [ - -9.2036198, - 52.6686468 - ], - [ - -9.2238348, - 52.6706578 - ], - [ - -9.2161072, - 52.6919412 - ], - [ - -9.1882395, - 52.7057242 - ], - [ - -9.2750099, - 52.7350292 - ], - [ - -9.2601152, - 52.7616711 - ] - ], - [ - [ - -7.307313219981238, - 53.81625879275365 - ], - [ - -7.245858447032101, - 53.78300449111207 - ], - [ - -7.15144468970801, - 53.81179938127503 - ], - [ - -7.086900011973722, - 53.784424420834 - ], - [ - -7.0347149533800435, - 53.77996162275688 - ], - [ - -6.975320116954343, - 53.788481098127924 - ], - [ - -6.928628222423156, - 53.81443454540607 - ], - [ - -6.992829577403537, - 53.86609081229548 - ], - [ - -6.975320116954343, - 53.87945028968944 - ], - [ - -6.949914233165313, - 53.87094929783329 - ], - [ - -6.9375546140247035, - 53.87540241385127 - ], - [ - -6.936867968516893, - 53.896649390754646 - ], - [ - -6.897042529063821, - 53.889770599553906 - ], - [ - -6.867516772227924, - 53.880259817835736 - ], - [ - -6.851037280040446, - 53.88450958346468 - ], - [ - -6.842454211192801, - 53.89786317755242 - ], - [ - -6.812928454356904, - 53.90069520963246 - ], - [ - -6.79850889869286, - 53.89280549994937 - ], - [ - -6.789925829845217, - 53.89462633440526 - ], - [ - -6.791985766368652, - 53.904538374710896 - ], - [ - -6.778939501720231, - 53.918087767078354 - ], - [ - -6.77001311011868, - 53.91505470292794 - ], - [ - -6.75868345923979, - 53.921727153244476 - ], - [ - -6.744263903575747, - 53.916065748791254 - ], - [ - -6.727441088634364, - 53.92334455637637 - ], - [ - -6.713021532970319, - 53.90777445003927 - ], - [ - -6.684182421642232, - 53.90292024303218 - ], - [ - -6.623757616954815, - 53.88187882710815 - ], - [ - -6.590455309825955, - 53.857789593974296 - ], - [ - -6.591141955333765, - 53.835509894663346 - ], - [ - -6.574319140392382, - 53.82254170362619 - ], - [ - -6.571572558361136, - 53.804703885117576 - ], - [ - -6.5533764524041285, - 53.79983770791046 - ], - [ - -6.541360156017425, - 53.78300449111207 - ], - [ - -6.511491076427622, - 53.76900546961285 - ], - [ - -6.472695605236269, - 53.77326653566421 - ], - [ - -6.443513171154276, - 53.76393220797015 - ], - [ - -6.44728972144724, - 53.75114486961979 - ], - [ - -6.4775021237909485, - 53.728199094666586 - ], - [ - -6.459649340587848, - 53.71682309412751 - ], - [ - -6.435616747814443, - 53.72230833571077 - ], - [ - -6.4198239011347775, - 53.72921465935537 - ], - [ - -6.4009411496699595, - 53.72169889975152 - ], - [ - -6.375878588634836, - 53.718042098526006 - ], - [ - -6.359055773693453, - 53.708695495259434 - ], - [ - -6.340173022228636, - 53.708085862042424 - ], - [ - -6.329873339611461, - 53.71296268045594 - ], - [ - -6.325753466564592, - 53.72210519137233 - ], - [ - -6.2938244504513525, - 53.72576163932632 - ], - [ - -6.265328661877173, - 53.7363229253304 - ], - [ - -6.240952746349864, - 53.734292114843086 - ], - [ - -6.180871264416349, - 53.632015710147016 - ], - [ - -6.092793818322125, - 53.588038288422446 - ], - [ - -5.985734079608837, - 53.49383447350347 - ], - [ - -6.0887447432153685, - 53.27174268379562 - ], - [ - -6.033272979232964, - 53.1191110041494 - ], - [ - -5.984663357119282, - 52.9651254915577 - ], - [ - -6.122679104189409, - 52.73207538466633 - ], - [ - -6.185163845400262, - 52.73706461957944 - ], - [ - -6.1899703639549415, - 52.76075568810044 - ], - [ - -6.319059719423517, - 52.782357357522855 - ], - [ - -6.393904079774976, - 52.7790347214105 - ], - [ - -6.465315212587381, - 52.6946379192593 - ], - [ - -6.534666408876349, - 52.673409093161446 - ], - [ - -6.612257351259057, - 52.69255711803012 - ], - [ - -6.6692489284074155, - 52.74745702505679 - ], - [ - -6.671308864930852, - 52.76948072949997 - ], - [ - -6.720747341493285, - 52.7748810695361 - ], - [ - -6.71456753192298, - 52.80311808637125 - ], - [ - -6.658949245790243, - 52.84709806982182 - ], - [ - -6.582044948915348, - 52.81349473557279 - ], - [ - -6.547712673524768, - 52.83133677935633 - ], - [ - -6.531233181337292, - 52.87404491274922 - ], - [ - -6.617750515321548, - 52.87528820923615 - ], - [ - -6.728987087587023, - 52.90635903963372 - ], - [ - -6.780485500672891, - 52.859122574848655 - ], - [ - -6.870436062196207, - 52.85165948109425 - ], - [ - -6.938413967469552, - 52.86658438536895 - ], - [ - -6.965879787782016, - 52.89766145203082 - ], - [ - -6.987852444031986, - 52.969260966642985 - ], - [ - -7.039350857117853, - 52.9560260536776 - ], - [ - -7.109388698914634, - 53.007288776633686 - ], - [ - -7.068876613953752, - 53.058078015357786 - ], - [ - -7.088789333680287, - 53.11869890949892 - ], - [ - -7.119688381531809, - 53.15000684568904 - ], - [ - -7.105955471375577, - 53.16112391039828 - ], - [ - -7.127928127625547, - 53.17223809655703 - ], - [ - -7.180113186219227, - 53.182526443342745 - ], - [ - -7.160887112000503, - 53.19898266621498 - ], - [ - -7.057890285828767, - 53.19898266621498 - ], - [ - -7.048963894227218, - 53.217077217179636 - ], - [ - -7.0915359157115345, - 53.235575105358386 - ], - [ - -7.0434707301647235, - 53.25735126035676 - ], - [ - -7.05102383075065, - 53.29717703664696 - ], - [ - -6.996778835633536, - 53.31112780504489 - ], - [ - -7.044157375672535, - 53.33368557548294 - ], - [ - -7.105955471375576, - 53.371801590024276 - ], - [ - -7.22050647653913, - 53.432465115081854 - ], - [ - -7.149441429887032, - 53.45731709817442 - ], - [ - -7.099891489102085, - 53.463915962572514 - ], - [ - -7.0744645458045445, - 53.48370640260363 - ], - [ - -7.079028356140001, - 53.504650927752664 - ], - [ - -7.047733656696876, - 53.515119311359335 - ], - [ - -7.029478415355053, - 53.54147267392419 - ], - [ - -7.054253385747527, - 53.56471202500164 - ], - [ - -7.009267255298033, - 53.58561652973758 - ], - [ - -6.992641946218873, - 53.602642188744426 - ], - [ - -6.989056095241016, - 53.62739453790707 - ], - [ - -6.9717788132567895, - 53.63686620586593 - ], - [ - -6.9633031654909425, - 53.650973114934644 - ], - [ - -6.9871001765258205, - 53.66623418009986 - ], - [ - -6.999813648174589, - 53.67086935885432 - ], - [ - -7.008289295940436, - 53.65908728051006 - ], - [ - -7.044473792171549, - 53.65367801032349 - ], - [ - -7.066640870943764, - 53.63918547390694 - ], - [ - -7.101847407817279, - 53.65870092708686 - ], - [ - -7.120754622064167, - 53.672993645380515 - ], - [ - -7.137379931143327, - 53.66893809633893 - ], - [ - -7.160850955725672, - 53.683034277255075 - ], - [ - -7.174216400279507, - 53.686316272406906 - ], - [ - -7.196057492599188, - 53.69017711570491 - ], - [ - -7.210726882963154, - 53.69480966037566 - ], - [ - -7.247237365646801, - 53.71661437518035 - ], - [ - -7.239413690786019, - 53.73223735177976 - ], - [ - -7.260276823748104, - 53.74361339729716 - ], - [ - -7.2814659431627184, - 53.75922634307083 - ], - [ - -7.289615604476034, - 53.77271433845693 - ], - [ - -7.3238441819919515, - 53.78465723043301 - ], - [ - -7.337209626545788, - 53.78658318504567 - ], - [ - -7.351227044004687, - 53.80141007448381 - ], - [ - -7.307313219981238, - 53.81625879275365 - ] - ], - [ - [ - -5.685433013282673, - 54.77854496390836 - ], - [ - -5.696867084279401, - 54.73050346921268 - ], - [ - -5.8223689524230124, - 54.70033215177621 - ], - [ - -5.878760568989772, - 54.649492182564074 - ], - [ - -5.743404719024681, - 54.68128223623249 - ], - [ - -5.581196917402638, - 54.68781619319656 - ], - [ - -5.571488953592992, - 54.67074450064368 - ], - [ - -5.582915011231644, - 54.66440901595977 - ], - [ - -5.58291501123164, - 54.65085746679818 - ], - [ - -5.6086481910584185, - 54.63997082553691 - ], - [ - -5.6354970593650116, - 54.61551371292451 - ], - [ - -5.728732824433139, - 54.6184944610979 - ], - [ - -5.822612969913913, - 54.49193018941315 - ], - [ - -5.896754545381575, - 54.44975600798866 - ], - [ - -5.936834914186871, - 54.38213187386197 - ], - [ - -6.0187561190025445, - 54.36974944197913 - ], - [ - -6.059257912638059, - 54.38280030737259 - ], - [ - -6.101784280694663, - 54.41510088826871 - ], - [ - -6.1740201072375225, - 54.43476829635816 - ], - [ - -6.216261364689026, - 54.42827259213158 - ], - [ - -6.264329002478664, - 54.487825014814625 - ], - [ - -6.249277519938476, - 54.49741303545491 - ], - [ - -6.288340515296785, - 54.53143435197413 - ], - [ - -6.283750270272458, - 54.54447449434036 - ], - [ - -6.321445027854273, - 54.58928767713928 - ], - [ - -6.264329002478664, - 54.604982769755765 - ], - [ - -6.240052417736423, - 54.59541999854735 - ], - [ - -6.098762694536575, - 54.631690374598676 - ], - [ - -6.051950538018501, - 54.61314575326238 - ], - [ - -6.031509408441251, - 54.620921248201434 - ], - [ - -6.002995140908084, - 54.65571636730639 - ], - [ - -6.0647754758974335, - 54.6634355452454 - ], - [ - -6.059920158948984, - 54.704134188139534 - ], - [ - -6.047781866577864, - 54.71395188569398 - ], - [ - -6.120611620804591, - 54.801644524994515 - ], - [ - -6.002141887262449, - 54.80836072138932 - ], - [ - -5.984662746248036, - 54.78652900156178 - ], - [ - -5.685433013282673, - 54.77854496390836 - ] - ], - [ - [ - -9.128658300749114, - 53.24759266864586 - ], - [ - -9.024510568479629, - 53.26744820137083 - ], - [ - -9.016360907166316, - 53.26364619217274 - ], - [ - -9.001854510028616, - 53.26588844362053 - ], - [ - -8.9951717877517, - 53.259258838409615 - ], - [ - -8.973493688658284, - 53.262378780650025 - ], - [ - -8.95230456924367, - 53.271444820907114 - ], - [ - -8.956705386352859, - 53.281580911863244 - ], - [ - -8.961106203462048, - 53.28119110665652 - ], - [ - -8.960780217009516, - 53.28908396911955 - ], - [ - -8.954260487958864, - 53.28927883616923 - ], - [ - -8.95230456924367, - 53.30155366854246 - ], - [ - -8.963714095082308, - 53.303793931840495 - ], - [ - -8.9811543702928, - 53.294734752711804 - ], - [ - -8.985718180628256, - 53.30174847871221 - ], - [ - -9.019946758144176, - 53.30768976199425 - ], - [ - -9.00837423907927, - 53.31596722087059 - ], - [ - -9.01880580556031, - 53.31625933715475 - ], - [ - -9.045862681120513, - 53.31275380979257 - ], - [ - -9.06444390891487, - 53.32122500810515 - ], - [ - -9.080906224767762, - 53.307397587062724 - ], - [ - -9.08106921799403, - 53.303404329274585 - ], - [ - -9.09019683866494, - 53.30574189135002 - ], - [ - -9.095901601584261, - 53.298826232852214 - ], - [ - -9.10128037805105, - 53.3008718259498 - ], - [ - -9.115623781962478, - 53.28450433758295 - ], - [ - -9.121491538108067, - 53.2832375443259 - ], - [ - -9.13273807072044, - 53.28557621023763 - ], - [ - -9.144636576237877, - 53.27865728614638 - ], - [ - -9.13876882009229, - 53.26345120822951 - ], - [ - -9.128658300749114, - 53.24759266864586 - ] - ], - [ - [ - -8.595266214281438, - 51.69264788483154 - ], - [ - -8.55819409885298, - 51.69306638852667 - ], - [ - -8.566697711835303, - 51.682644706464686 - ], - [ - -8.579130708100188, - 51.67349700898941 - ], - [ - -8.544554623426079, - 51.66520531197343 - ], - [ - -8.494765061495364, - 51.667778759675976 - ], - [ - -8.30113898732036, - 51.7235009029955 - ], - [ - -8.268406960495541, - 51.784858633837544 - ], - [ - -8.154536388302146, - 51.7814362126791 - ], - [ - -8.115350159004825, - 51.809093351533164 - ], - [ - -8.068326683848039, - 51.870050153657075 - ], - [ - -8.10059769621054, - 51.89964422561186 - ], - [ - -8.08123508879304, - 51.918414974037226 - ], - [ - -8.09183842142643, - 51.95337589170907 - ], - [ - -8.124570448251253, - 51.95479649105758 - ], - [ - -8.132407694110718, - 51.970988142592034 - ], - [ - -8.099675667285895, - 51.978371865876596 - ], - [ - -8.144394070131078, - 52.02151390085561 - ], - [ - -8.159607547387685, - 52.064330945363764 - ], - [ - -8.140705954432507, - 52.07254939152303 - ], - [ - -8.165600735397863, - 52.09294727054506 - ], - [ - -8.18726841512697, - 52.0835993998731 - ], - [ - -8.2093971093184, - 52.10512489114057 - ], - [ - -8.207092037006792, - 52.12494181389489 - ], - [ - -8.227837687811258, - 52.143052434929714 - ], - [ - -8.222766528725723, - 52.16454923557058 - ], - [ - -8.30298304516965, - 52.1829264222872 - ], - [ - -8.427456949996438, - 52.17783811526099 - ], - [ - -8.46710419375608, - 52.169921813849676 - ], - [ - -8.509978538751975, - 52.18405707812542 - ], - [ - -8.530263175094117, - 52.16511480067495 - ], - [ - -8.574981577939297, - 52.18066502436804 - ], - [ - -8.587889982884295, - 52.16963906274442 - ], - [ - -8.642289689438227, - 52.18829678149147 - ], - [ - -8.719279104645906, - 52.15804472022032 - ], - [ - -8.698533453841442, - 52.13541291452849 - ], - [ - -8.740946784375014, - 52.10823956240069 - ], - [ - -8.77460084012448, - 52.05951253229793 - ], - [ - -8.803183736788409, - 52.03768144571248 - ], - [ - -8.86818677597573, - 52.03286015807593 - ], - [ - -8.870491848287335, - 52.01839317543363 - ], - [ - -8.844214023935015, - 51.991148511559096 - ], - [ - -8.79811257770287, - 51.964455373040394 - ], - [ - -8.782899100446263, - 51.931777239822054 - ], - [ - -8.835915763613228, - 51.9292188160068 - ], - [ - -8.838681850387156, - 51.90277322850554 - ], - [ - -8.802261707863764, - 51.89367006943167 - ], - [ - -8.792580404155013, - 51.85695425263326 - ], - [ - -8.765841565340368, - 51.82476769939557 - ], - [ - -8.758926348405547, - 51.80054140901511 - ], - [ - -8.79811257770287, - 51.78628456602828 - ], - [ - -8.832227647914657, - 51.79626482935233 - ], - [ - -8.836837792537873, - 51.77687258059678 - ], - [ - -8.885705325543944, - 51.746055989869106 - ], - [ - -8.859888515653944, - 51.72435763090916 - ], - [ - -8.807332866949299, - 51.71093369500414 - ], - [ - -8.678248817499297, - 51.693505197270746 - ], - [ - -8.60540853245251, - 51.67835695335278 - ], - [ - -8.595266214281438, - 51.69264788483154 - ] - ], - [ - [ - -7.138279151048154, - 55.06131559970097 - ], - [ - -7.117994514706011, - 54.99631329558348 - ], - [ - -7.070049010624583, - 54.98784996056705 - ], - [ - -7.076503213097081, - 54.93332450204895 - ], - [ - -7.025791622241725, - 54.91159959910791 - ], - [ - -7.007351043748867, - 54.87872502112528 - ], - [ - -7.024869593317081, - 54.8511320998998 - ], - [ - -6.990754523105296, - 54.81661438893913 - ], - [ - -7.051608432131725, - 54.80598761598125 - ], - [ - -7.115228427932084, - 54.80651902101645 - ], - [ - -7.170550163410654, - 54.84847793920564 - ], - [ - -7.199133060074584, - 54.84316909395457 - ], - [ - -7.222183783190655, - 54.85803210052931 - ], - [ - -7.2111194360949415, - 54.862808332627324 - ], - [ - -7.212041465019584, - 54.882438010878076 - ], - [ - -7.279349576518514, - 54.880846771447125 - ], - [ - -7.273817402970655, - 54.91530955931841 - ], - [ - -7.3033223285592275, - 54.915839525718205 - ], - [ - -7.363254208661015, - 54.90894941815292 - ], - [ - -7.385382902852443, - 54.91636948513913 - ], - [ - -7.391837105324943, - 54.93438395336098 - ], - [ - -7.429640291235302, - 54.95291983389722 - ], - [ - -7.420420001988872, - 54.99208185118366 - ], - [ - -7.410277683817801, - 55.03437621938347 - ], - [ - -7.3577220351131585, - 55.057619110599035 - ], - [ - -7.265519142648871, - 55.07557028899173 - ], - [ - -7.138279151048154, - 55.06131559970097 - ] - ], - [ - [ - -7.190498776293322, - 52.26144368927652 - ], - [ - -7.156844720543858, - 52.28443443581867 - ], - [ - -7.132871968503143, - 52.27343421670601 - ], - [ - -7.113278853854483, - 52.26779201951648 - ], - [ - -7.098295883829036, - 52.27230583471742 - ], - [ - -7.089767116276089, - 52.25509445009032 - ], - [ - -7.07109603055207, - 52.259186286149074 - ], - [ - -7.033984366335195, - 52.257352061495865 - ], - [ - -7.027530163862696, - 52.250720000975015 - ], - [ - -7.034675888028678, - 52.247756419376 - ], - [ - -7.031218279561267, - 52.24013487190721 - ], - [ - -7.034214873566356, - 52.23222966213934 - ], - [ - -7.050580886978767, - 52.2296884028405 - ], - [ - -7.062567262999124, - 52.21980434486687 - ], - [ - -7.076858711331088, - 52.216132562953725 - ], - [ - -7.084926464421715, - 52.22065163604718 - ], - [ - -7.084465449959392, - 52.22785295843095 - ], - [ - -7.101292477834124, - 52.221498911062525 - ], - [ - -7.105211100763858, - 52.21726237433474 - ], - [ - -7.111665303236357, - 52.21796849185403 - ], - [ - -7.107977187537785, - 52.21104805609072 - ], - [ - -7.117773744862115, - 52.20928246619701 - ], - [ - -7.129760120882472, - 52.21690931136535 - ], - [ - -7.14497359813908, - 52.21782726924826 - ], - [ - -7.150505771686938, - 52.22375823207553 - ], - [ - -7.158112510315241, - 52.22262858593765 - ], - [ - -7.158804032008724, - 52.22700580464912 - ], - [ - -7.158573524777563, - 52.23180612902503 - ], - [ - -7.167563306792832, - 52.23985256723076 - ], - [ - -7.16733279956167, - 52.244580933687786 - ], - [ - -7.172519212262786, - 52.24676851484933 - ], - [ - -7.177590371348324, - 52.25114335361416 - ], - [ - -7.190498776293322, - 52.26144368927652 - ] - ] - ], - "terms_url": "http://www.eea.europa.eu/data-and-maps/data/urban-atlas", - "terms_text": "EEA GMES Urban Atlas" - }, - { - "name": "Kanton Aargau 25cm (AGIS 2011)", - "type": "tms", - "template": "http://tiles.poole.ch/AGIS/OF2011/{zoom}/{x}/{y}.png", - "scaleExtent": [ - 14, - 19 - ], - "polygon": [ - [ - [ - 7.7, - 47.12 - ], - [ - 7.7, - 47.63 - ], - [ - 8.5, - 47.63 - ], - [ - 8.5, - 47.12 - ], - [ - 7.7, - 47.12 - ] - ] - ], - "terms_text": "AGIS OF2011" - }, - { - "name": "Kanton Aargau 25cm (AGIS 2014)", - "type": "tms", - "template": "http://mapproxy.osm.ch:8080/tiles/AGIS2014/EPSG900913/{z}/{x}/{y}.png?origin=nw", - "scaleExtent": [ - 8, - 19 - ], - "polygon": [ - [ - [ - 7.7, - 47.12 - ], - [ - 7.7, - 47.63 - ], - [ - 8.5, - 47.63 - ], - [ - 8.5, - 47.12 - ], - [ - 7.7, - 47.12 - ] - ] - ], - "terms_text": "AGIS OF2014" - }, - { - "name": "Kanton Solothurn 25cm (SOGIS 2011-2014)", - "type": "tms", - "template": "http://mapproxy.osm.ch:8080/tiles/sogis2014/EPSG900913/{z}/{x}/{y}.png?origin=nw", - "scaleExtent": [ - 12, - 19 - ], - "polygon": [ - [ - [ - 7.08, - 47.03 - ], - [ - 7.08, - 47.54 - ], - [ - 8.04, - 47.54 - ], - [ - 8.04, - 47.03 - ], - [ - 7.08, - 47.03 - ] - ] - ], - "terms_text": "Orthofoto WMS Solothurn" - }, - { - "name": "Katastrálna mapa Slovenska (KaPor, 2010-04)", - "type": "tms", - "template": "http://www.freemap.sk/tms/kapor2/{zoom}/{x}/{y}.jpg", - "polygon": [ - [ - [ - 19.83682, - 49.25529 - ], - [ - 19.80075, - 49.42385 - ], - [ - 19.60437, - 49.48058 - ], - [ - 19.49179, - 49.63961 - ], - [ - 19.21831, - 49.52604 - ], - [ - 19.16778, - 49.42521 - ], - [ - 19.00308, - 49.42236 - ], - [ - 18.97611, - 49.5308 - ], - [ - 18.54685, - 49.51425 - ], - [ - 18.31432, - 49.33818 - ], - [ - 18.15913, - 49.2961 - ], - [ - 18.05564, - 49.11134 - ], - [ - 17.56396, - 48.84938 - ], - [ - 17.17929, - 48.88816 - ], - [ - 17.058, - 48.81105 - ], - [ - 16.90426, - 48.61947 - ], - [ - 16.79685, - 48.38561 - ], - [ - 17.06762, - 48.01116 - ], - [ - 17.32787, - 47.97749 - ], - [ - 17.51699, - 47.82535 - ], - [ - 17.74776, - 47.73093 - ], - [ - 18.29515, - 47.72075 - ], - [ - 18.67959, - 47.75541 - ], - [ - 18.89755, - 47.81203 - ], - [ - 18.79463, - 47.88245 - ], - [ - 18.84318, - 48.04046 - ], - [ - 19.46212, - 48.05333 - ], - [ - 19.62064, - 48.22938 - ], - [ - 19.89585, - 48.09387 - ], - [ - 20.33766, - 48.2643 - ], - [ - 20.55395, - 48.52358 - ], - [ - 20.82335, - 48.55714 - ], - [ - 21.10271, - 48.47096 - ], - [ - 21.45863, - 48.55513 - ], - [ - 21.74536, - 48.31435 - ], - [ - 22.15293, - 48.37179 - ], - [ - 22.61255, - 49.08914 - ], - [ - 22.09997, - 49.23814 - ], - [ - 21.9686, - 49.36363 - ], - [ - 21.6244, - 49.46989 - ], - [ - 21.06873, - 49.46402 - ], - [ - 20.94336, - 49.31088 - ], - [ - 20.73052, - 49.44006 - ], - [ - 20.22804, - 49.41714 - ], - [ - 20.05234, - 49.23052 - ], - [ - 19.83682, - 49.25529 - ] - ] - ], - "terms_url": "http://wiki.freemap.sk/KatasterPortal", - "terms_text": "Permisssion by UGKK" - }, - { - "name": "Katastrálna mapa Slovenska (KaPor, 2011-05)", - "type": "tms", - "template": "http://www.freemap.sk/tms/kapor2_201105/{zoom}/{x}/{y}.jpg", - "polygon": [ - [ - [ - 19.83682, - 49.25529 - ], - [ - 19.80075, - 49.42385 - ], - [ - 19.60437, - 49.48058 - ], - [ - 19.49179, - 49.63961 - ], - [ - 19.21831, - 49.52604 - ], - [ - 19.16778, - 49.42521 - ], - [ - 19.00308, - 49.42236 - ], - [ - 18.97611, - 49.5308 - ], - [ - 18.54685, - 49.51425 - ], - [ - 18.31432, - 49.33818 - ], - [ - 18.15913, - 49.2961 - ], - [ - 18.05564, - 49.11134 - ], - [ - 17.56396, - 48.84938 - ], - [ - 17.17929, - 48.88816 - ], - [ - 17.058, - 48.81105 - ], - [ - 16.90426, - 48.61947 - ], - [ - 16.79685, - 48.38561 - ], - [ - 17.06762, - 48.01116 - ], - [ - 17.32787, - 47.97749 - ], - [ - 17.51699, - 47.82535 - ], - [ - 17.74776, - 47.73093 - ], - [ - 18.29515, - 47.72075 - ], - [ - 18.67959, - 47.75541 - ], - [ - 18.89755, - 47.81203 - ], - [ - 18.79463, - 47.88245 - ], - [ - 18.84318, - 48.04046 - ], - [ - 19.46212, - 48.05333 - ], - [ - 19.62064, - 48.22938 - ], - [ - 19.89585, - 48.09387 - ], - [ - 20.33766, - 48.2643 - ], - [ - 20.55395, - 48.52358 - ], - [ - 20.82335, - 48.55714 - ], - [ - 21.10271, - 48.47096 - ], - [ - 21.45863, - 48.55513 - ], - [ - 21.74536, - 48.31435 - ], - [ - 22.15293, - 48.37179 - ], - [ - 22.61255, - 49.08914 - ], - [ - 22.09997, - 49.23814 - ], - [ - 21.9686, - 49.36363 - ], - [ - 21.6244, - 49.46989 - ], - [ - 21.06873, - 49.46402 - ], - [ - 20.94336, - 49.31088 - ], - [ - 20.73052, - 49.44006 - ], - [ - 20.22804, - 49.41714 - ], - [ - 20.05234, - 49.23052 - ], - [ - 19.83682, - 49.25529 - ] - ] - ], - "terms_url": "http://wiki.freemap.sk/KatasterPortal", - "terms_text": "Permisssion by UGKK" - }, - { - "name": "Kelowna 2012", - "type": "tms", - "description": "High quality aerial imagery taken for the City of Kelowna", - "template": "http://{switch:a,b,c,d}.tile.paulnorman.ca/kelowna2012/{zoom}/{x}/{y}.png", - "scaleExtent": [ - 9, - 20 - ], - "polygon": [ - [ - [ - -119.5867318, - 49.7928087 - ], - [ - -119.5465655, - 49.7928097 - ], - [ - -119.5465661, - 49.8013837 - ], - [ - -119.5343374, - 49.8013841 - ], - [ - -119.5343376, - 49.8047321 - ], - [ - -119.5296211, - 49.8047322 - ], - [ - -119.5296216, - 49.8119555 - ], - [ - -119.5104463, - 49.811956 - ], - [ - -119.5115683, - 49.8744325 - ], - [ - -119.5108946, - 49.8744904 - ], - [ - -119.5114111, - 49.8843312 - ], - [ - -119.5114115, - 49.9221763 - ], - [ - -119.49386, - 49.9223477 - ], - [ - -119.4940505, - 49.9313031 - ], - [ - -119.4803936, - 49.9317529 - ], - [ - -119.4804572, - 49.9407474 - ], - [ - -119.4666732, - 49.9409927 - ], - [ - -119.4692775, - 49.9913717 - ], - [ - -119.4551337, - 49.9916078 - ], - [ - -119.4556736, - 50.0121242 - ], - [ - -119.4416673, - 50.0123895 - ], - [ - -119.4417308, - 50.0136345 - ], - [ - -119.4221492, - 50.0140377 - ], - [ - -119.4221042, - 50.0119306 - ], - [ - -119.4121303, - 50.012165 - ], - [ - -119.4126082, - 50.0216913 - ], - [ - -119.4123387, - 50.0216913 - ], - [ - -119.4124772, - 50.0250773 - ], - [ - -119.4120917, - 50.0250821 - ], - [ - -119.4121954, - 50.0270769 - ], - [ - -119.4126083, - 50.0270718 - ], - [ - -119.4128328, - 50.0321946 - ], - [ - -119.3936313, - 50.0326418 - ], - [ - -119.393529, - 50.0307781 - ], - [ - -119.3795727, - 50.0310116 - ], - [ - -119.3795377, - 50.0287584 - ], - [ - -119.3735764, - 50.0288621 - ], - [ - -119.371544, - 49.9793618 - ], - [ - -119.3573506, - 49.9793618 - ], - [ - -119.3548353, - 49.9256081 - ], - [ - -119.3268079, - 49.9257238 - ], - [ - -119.3256573, - 49.8804068 - ], - [ - -119.3138893, - 49.8806528 - ], - [ - -119.3137097, - 49.8771651 - ], - [ - -119.3132156, - 49.877223 - ], - [ - -119.3131482, - 49.8749652 - ], - [ - -119.312452, - 49.8749073 - ], - [ - -119.3122275, - 49.87236 - ], - [ - -119.3117558, - 49.872331 - ], - [ - -119.3115986, - 49.8696098 - ], - [ - -119.3112169, - 49.8694217 - ], - [ - -119.3109199, - 49.8632417 - ], - [ - -119.3103721, - 49.8632724 - ], - [ - -119.3095139, - 49.8512388 - ], - [ - -119.3106368, - 49.8512316 - ], - [ - -119.3103859, - 49.8462564 - ], - [ - -119.3245344, - 49.8459957 - ], - [ - -119.3246018, - 49.8450689 - ], - [ - -119.3367018, - 49.844875 - ], - [ - -119.3367467, - 49.8435136 - ], - [ - -119.337937, - 49.8434702 - ], - [ - -119.3378023, - 49.8382055 - ], - [ - -119.3383637, - 49.8381041 - ], - [ - -119.3383749, - 49.8351202 - ], - [ - -119.3390936, - 49.8351058 - ], - [ - -119.3388016, - 49.8321217 - ], - [ - -119.3391497, - 49.8320565 - ], - [ - -119.3391722, - 49.8293331 - ], - [ - -119.3394641, - 49.8293331 - ], - [ - -119.3395879, - 49.8267878 - ], - [ - -119.3500053, - 49.8265829 - ], - [ - -119.3493701, - 49.8180588 - ], - [ - -119.4046964, - 49.8163785 - ], - [ - -119.4045694, - 49.8099022 - ], - [ - -119.4101592, - 49.8099022 - ], - [ - -119.4102862, - 49.8072787 - ], - [ - -119.4319467, - 49.8069098 - ], - [ - -119.4322643, - 49.7907965 - ], - [ - -119.4459847, - 49.7905504 - ], - [ - -119.445286, - 49.7820201 - ], - [ - -119.4967376, - 49.7811587 - ], - [ - -119.4966105, - 49.7784927 - ], - [ - -119.5418371, - 49.7775082 - ], - [ - -119.5415892, - 49.7718277 - ], - [ - -119.5560296, - 49.7714941 - ], - [ - -119.5561194, - 49.7718422 - ], - [ - -119.5715704, - 49.7715086 - ], - [ - -119.5716153, - 49.7717262 - ], - [ - -119.5819235, - 49.7714941 - ], - [ - -119.5820133, - 49.7717697 - ], - [ - -119.5922991, - 49.7715231 - ], - [ - -119.592344, - 49.7718132 - ], - [ - -119.6003839, - 49.7715957 - ], - [ - -119.6011924, - 49.7839081 - ], - [ - -119.5864365, - 49.7843863 - ] - ] - ], - "id": "kelowna_2012" - }, - { - "name": "Kelowna Roads overlay", - "type": "tms", - "template": "http://{switch:a,b,c,d}.tile.paulnorman.ca/kelowna_overlay/{zoom}/{x}/{y}.png", - "scaleExtent": [ - 9, - 20 - ], - "polygon": [ - [ - [ - -119.5867318, - 49.7928087 - ], - [ - -119.5465655, - 49.7928097 - ], - [ - -119.5465661, - 49.8013837 - ], - [ - -119.5343374, - 49.8013841 - ], - [ - -119.5343376, - 49.8047321 - ], - [ - -119.5296211, - 49.8047322 - ], - [ - -119.5296216, - 49.8119555 - ], - [ - -119.5104463, - 49.811956 - ], - [ - -119.5115683, - 49.8744325 - ], - [ - -119.5108946, - 49.8744904 - ], - [ - -119.5114111, - 49.8843312 - ], - [ - -119.5114115, - 49.9221763 - ], - [ - -119.49386, - 49.9223477 - ], - [ - -119.4940505, - 49.9313031 - ], - [ - -119.4803936, - 49.9317529 - ], - [ - -119.4804572, - 49.9407474 - ], - [ - -119.4666732, - 49.9409927 - ], - [ - -119.4692775, - 49.9913717 - ], - [ - -119.4551337, - 49.9916078 - ], - [ - -119.4556736, - 50.0121242 - ], - [ - -119.4416673, - 50.0123895 - ], - [ - -119.4417308, - 50.0136345 - ], - [ - -119.4221492, - 50.0140377 - ], - [ - -119.4221042, - 50.0119306 - ], - [ - -119.4121303, - 50.012165 - ], - [ - -119.4126082, - 50.0216913 - ], - [ - -119.4123387, - 50.0216913 - ], - [ - -119.4124772, - 50.0250773 - ], - [ - -119.4120917, - 50.0250821 - ], - [ - -119.4121954, - 50.0270769 - ], - [ - -119.4126083, - 50.0270718 - ], - [ - -119.4128328, - 50.0321946 - ], - [ - -119.3936313, - 50.0326418 - ], - [ - -119.393529, - 50.0307781 - ], - [ - -119.3795727, - 50.0310116 - ], - [ - -119.3795377, - 50.0287584 - ], - [ - -119.3735764, - 50.0288621 - ], - [ - -119.371544, - 49.9793618 - ], - [ - -119.3573506, - 49.9793618 - ], - [ - -119.3548353, - 49.9256081 - ], - [ - -119.3268079, - 49.9257238 - ], - [ - -119.3256573, - 49.8804068 - ], - [ - -119.3138893, - 49.8806528 - ], - [ - -119.3137097, - 49.8771651 - ], - [ - -119.3132156, - 49.877223 - ], - [ - -119.3131482, - 49.8749652 - ], - [ - -119.312452, - 49.8749073 - ], - [ - -119.3122275, - 49.87236 - ], - [ - -119.3117558, - 49.872331 - ], - [ - -119.3115986, - 49.8696098 - ], - [ - -119.3112169, - 49.8694217 - ], - [ - -119.3109199, - 49.8632417 - ], - [ - -119.3103721, - 49.8632724 - ], - [ - -119.3095139, - 49.8512388 - ], - [ - -119.3106368, - 49.8512316 - ], - [ - -119.3103859, - 49.8462564 - ], - [ - -119.3245344, - 49.8459957 - ], - [ - -119.3246018, - 49.8450689 - ], - [ - -119.3367018, - 49.844875 - ], - [ - -119.3367467, - 49.8435136 - ], - [ - -119.337937, - 49.8434702 - ], - [ - -119.3378023, - 49.8382055 - ], - [ - -119.3383637, - 49.8381041 - ], - [ - -119.3383749, - 49.8351202 - ], - [ - -119.3390936, - 49.8351058 - ], - [ - -119.3388016, - 49.8321217 - ], - [ - -119.3391497, - 49.8320565 - ], - [ - -119.3391722, - 49.8293331 - ], - [ - -119.3394641, - 49.8293331 - ], - [ - -119.3395879, - 49.8267878 - ], - [ - -119.3500053, - 49.8265829 - ], - [ - -119.3493701, - 49.8180588 - ], - [ - -119.4046964, - 49.8163785 - ], - [ - -119.4045694, - 49.8099022 - ], - [ - -119.4101592, - 49.8099022 - ], - [ - -119.4102862, - 49.8072787 - ], - [ - -119.4319467, - 49.8069098 - ], - [ - -119.4322643, - 49.7907965 - ], - [ - -119.4459847, - 49.7905504 - ], - [ - -119.445286, - 49.7820201 - ], - [ - -119.4967376, - 49.7811587 - ], - [ - -119.4966105, - 49.7784927 - ], - [ - -119.5418371, - 49.7775082 - ], - [ - -119.5415892, - 49.7718277 - ], - [ - -119.5560296, - 49.7714941 - ], - [ - -119.5561194, - 49.7718422 - ], - [ - -119.5715704, - 49.7715086 - ], - [ - -119.5716153, - 49.7717262 - ], - [ - -119.5819235, - 49.7714941 - ], - [ - -119.5820133, - 49.7717697 - ], - [ - -119.5922991, - 49.7715231 - ], - [ - -119.592344, - 49.7718132 - ], - [ - -119.6003839, - 49.7715957 - ], - [ - -119.6011924, - 49.7839081 - ], - [ - -119.5864365, - 49.7843863 - ] - ] - ], - "id": "kelowna_roads", - "overlay": true - }, - { - "name": "Landsat 233055", - "type": "tms", - "description": "Recent Landsat imagery", - "template": "http://{switch:a,b,c,d}.tile.paulnorman.ca/landsat_233055/{zoom}/{x}/{y}.png", - "scaleExtent": [ - 5, - 14 - ], - "polygon": [ - [ - [ - -60.8550011, - 6.1765004 - ], - [ - -60.4762612, - 7.9188291 - ], - [ - -62.161689, - 8.2778675 - ], - [ - -62.5322549, - 6.5375488 - ] - ] - ], - "id": "landsat_233055" - }, - { - "name": "Latest southwest British Columbia Landsat", - "type": "tms", - "description": "Recent lower-resolution landsat imagery for southwest British Columbia", - "template": "http://{switch:a,b,c,d}.tile.paulnorman.ca/landsat_047026/{zoom}/{x}/{y}.png", - "scaleExtent": [ - 5, - 13 - ], - "polygon": [ - [ - [ - -121.9355512, - 47.7820648 - ], - [ - -121.5720582, - 48.6410125 - ], - [ - -121.2015461, - 49.4846247 - ], - [ - -121.8375516, - 49.6023246 - ], - [ - -122.4767046, - 49.7161735 - ], - [ - -123.118912, - 49.8268824 - ], - [ - -123.760228, - 49.9335836 - ], - [ - -124.0887706, - 49.0870469 - ], - [ - -124.4128889, - 48.2252567 - ], - [ - -123.792772, - 48.1197334 - ], - [ - -123.1727942, - 48.0109592 - ], - [ - -122.553553, - 47.8982299 - ] - ] - ], - "id": "landsat_047026" - }, - { - "name": "Lithuania - NŽT ORT10LT", - "type": "tms", - "template": "http://mapproxy.openmap.lt/ort10lt/g/{z}/{x}/{y}.jpeg", - "scaleExtent": [ - 4, - 18 - ], - "polygon": [ - [ - [ - 21.4926054, - 56.3592046 - ], - [ - 21.8134688, - 56.4097144 - ], - [ - 21.9728753, - 56.4567587 - ], - [ - 22.2158294, - 56.4604404 - ], - [ - 22.2183922, - 56.4162361 - ], - [ - 23.3511527, - 56.4267251 - ], - [ - 23.3521778, - 56.3824815 - ], - [ - 23.9179035, - 56.383305 - ], - [ - 23.9176231, - 56.3392908 - ], - [ - 24.5649817, - 56.3382169 - ], - [ - 24.564933, - 56.3828587 - ], - [ - 24.6475683, - 56.4277798 - ], - [ - 24.8099394, - 56.470646 - ], - [ - 24.9733979, - 56.4698452 - ], - [ - 25.1299701, - 56.2890356 - ], - [ - 25.127433, - 56.1990144 - ], - [ - 25.6921076, - 56.1933684 - ], - [ - 26.0839005, - 56.0067879 - ], - [ - 26.4673573, - 55.7304232 - ], - [ - 26.5463565, - 55.7132705 - ], - [ - 26.5154447, - 55.2345969 - ], - [ - 25.7874641, - 54.8425656 - ], - [ - 25.7675259, - 54.6350898 - ], - [ - 25.6165253, - 54.4404007 - ], - [ - 24.4566043, - 53.9577649 - ], - [ - 23.6164786, - 53.9575517 - ], - [ - 23.5632006, - 54.048085 - ], - [ - 22.8462074, - 54.3563682 - ], - [ - 22.831944, - 54.9414849 - ], - [ - 22.4306085, - 55.1159913 - ], - [ - 21.9605898, - 55.1107144 - ], - [ - 21.7253241, - 55.1496885 - ], - [ - 21.5628422, - 55.2362913 - ], - [ - 21.2209638, - 55.2742668 - ], - [ - 21.1630444, - 55.2803979 - ], - [ - 20.9277788, - 55.3101641 - ], - [ - 20.9257285, - 55.3588507 - ], - [ - 20.9980451, - 55.4514157 - ], - [ - 21.0282249, - 56.0796297 - ] - ] - ], - "terms_url": "http://www.geoportal.lt", - "terms_text": "NŽT ORT10LT" - }, - { - "name": "Locator Overlay", - "type": "tms", - "description": "Shows major features to help orient you.", - "template": "http://{switch:a,b,c}.tiles.mapbox.com/v4/openstreetmap.map-inh76ba2/{zoom}/{x}/{y}.png?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJncjlmd0t3In0.DmZsIeOW-3x-C5eX-wAqTw", - "scaleExtent": [ - 0, - 16 - ], - "overzoom": false, - "terms_url": "http://www.mapbox.com/about/maps/", - "terms_text": "Terms & Feedback", - "default": true, - "overlay": true - }, - { - "name": "Luxembourg Inspire Ortho 2010", - "type": "tms", - "template": "http://mapproxy.openstreetmap.lu/tiles/ortho2010/EPSG900913/{z}/{x}/{y}.jpeg", - "scaleExtent": [ - 0, - 20 - ], - "polygon": [ - [ - [ - 5.961753, - 50.17631 - ], - [ - 6.026268, - 50.18496 - ], - [ - 6.033182, - 50.16395 - ], - [ - 6.060695, - 50.15536 - ], - [ - 6.07668, - 50.15913 - ], - [ - 6.078237, - 50.17255 - ], - [ - 6.101762, - 50.17199 - ], - [ - 6.122501, - 50.16437 - ], - [ - 6.120101, - 50.15594 - ], - [ - 6.127695, - 50.14993 - ], - [ - 6.113228, - 50.13739 - ], - [ - 6.123691, - 50.13719 - ], - [ - 6.140929, - 50.1305 - ], - [ - 6.135554, - 50.11899 - ], - [ - 6.138082, - 50.10263 - ], - [ - 6.131085, - 50.09964 - ], - [ - 6.135473, - 50.09119 - ], - [ - 6.121939, - 50.09059 - ], - [ - 6.126335, - 50.07817 - ], - [ - 6.131858, - 50.07348 - ], - [ - 6.121171, - 50.064 - ], - [ - 6.114444, - 50.06139 - ], - [ - 6.115631, - 50.05817 - ], - [ - 6.123611, - 50.06323 - ], - [ - 6.136608, - 50.04178 - ], - [ - 6.130343, - 50.02975 - ], - [ - 6.148207, - 50.02307 - ], - [ - 6.13868, - 50.01572 - ], - [ - 6.135938, - 50.01485 - ], - [ - 6.131384, - 50.01905 - ], - [ - 6.130243, - 50.01819 - ], - [ - 6.139343, - 50.01116 - ], - [ - 6.151702, - 50.01058 - ], - [ - 6.145464, - 49.99689 - ], - [ - 6.139657, - 49.9994 - ], - [ - 6.138524, - 49.99829 - ], - [ - 6.142178, - 49.99535 - ], - [ - 6.150227, - 49.99518 - ], - [ - 6.156247, - 49.98867 - ], - [ - 6.173045, - 49.98589 - ], - [ - 6.17348, - 49.98344 - ], - [ - 6.170353, - 49.98376 - ], - [ - 6.165487, - 49.97115 - ], - [ - 6.171512, - 49.96298 - ], - [ - 6.176298, - 49.962 - ], - [ - 6.179954, - 49.95386 - ], - [ - 6.183393, - 49.9548 - ], - [ - 6.179829, - 49.96307 - ], - [ - 6.183312, - 49.9686 - ], - [ - 6.192774, - 49.97158 - ], - [ - 6.199783, - 49.95352 - ], - [ - 6.207066, - 49.95672 - ], - [ - 6.212689, - 49.9514 - ], - [ - 6.225023, - 49.95039 - ], - [ - 6.22044, - 49.94369 - ], - [ - 6.228241, - 49.93726 - ], - [ - 6.22635, - 49.92766 - ], - [ - 6.219133, - 49.92354 - ], - [ - 6.229862, - 49.92125 - ], - [ - 6.236032, - 49.91355 - ], - [ - 6.231867, - 49.91064 - ], - [ - 6.227694, - 49.91062 - ], - [ - 6.232286, - 49.9072 - ], - [ - 6.23381, - 49.90028 - ], - [ - 6.246919, - 49.89535 - ], - [ - 6.257809, - 49.88724 - ], - [ - 6.263008, - 49.88101 - ], - [ - 6.276455, - 49.87725 - ], - [ - 6.281126, - 49.87957 - ], - [ - 6.291661, - 49.87548 - ], - [ - 6.297699, - 49.86673 - ], - [ - 6.309889, - 49.87107 - ], - [ - 6.315324, - 49.8673 - ], - [ - 6.314651, - 49.86057 - ], - [ - 6.323611, - 49.85188 - ], - [ - 6.321577, - 49.8409 - ], - [ - 6.327406, - 49.83673 - ], - [ - 6.336561, - 49.83998 - ], - [ - 6.339366, - 49.8507 - ], - [ - 6.364651, - 49.85164 - ], - [ - 6.402203, - 49.82098 - ], - [ - 6.426434, - 49.81629 - ], - [ - 6.428071, - 49.81186 - ], - [ - 6.43097, - 49.81129 - ], - [ - 6.441608, - 49.81547 - ], - [ - 6.443442, - 49.81233 - ], - [ - 6.45366, - 49.81275 - ], - [ - 6.464538, - 49.81975 - ], - [ - 6.47057, - 49.82385 - ], - [ - 6.496805, - 49.81277 - ], - [ - 6.50669, - 49.80993 - ], - [ - 6.511554, - 49.80238 - ], - [ - 6.51485, - 49.80513 - ], - [ - 6.519604, - 49.81446 - ], - [ - 6.529808, - 49.81048 - ], - [ - 6.532249, - 49.80686 - ], - [ - 6.530829, - 49.80116 - ], - [ - 6.506225, - 49.78899 - ], - [ - 6.519171, - 49.78344 - ], - [ - 6.511055, - 49.77422 - ], - [ - 6.520563, - 49.76818 - ], - [ - 6.520516, - 49.76134 - ], - [ - 6.503734, - 49.75086 - ], - [ - 6.502627, - 49.73298 - ], - [ - 6.507266, - 49.72938 - ], - [ - 6.518092, - 49.7242 - ], - [ - 6.516417, - 49.72129 - ], - [ - 6.511763, - 49.72016 - ], - [ - 6.504791, - 49.725 - ], - [ - 6.498913, - 49.72639 - ], - [ - 6.495576, - 49.72443 - ], - [ - 6.507122, - 49.71655 - ], - [ - 6.507884, - 49.71215 - ], - [ - 6.504598, - 49.71227 - ], - [ - 6.427139, - 49.66237 - ], - [ - 6.439899, - 49.66025 - ], - [ - 6.442511, - 49.65591 - ], - [ - 6.421781, - 49.61809 - ], - [ - 6.398978, - 49.60094 - ], - [ - 6.379408, - 49.59526 - ], - [ - 6.375507, - 49.58809 - ], - [ - 6.384426, - 49.5801 - ], - [ - 6.381188, - 49.57509 - ], - [ - 6.369093, - 49.5783 - ], - [ - 6.357913, - 49.57166 - ], - [ - 6.384902, - 49.55817 - ], - [ - 6.380095, - 49.54856 - ], - [ - 6.358555, - 49.53296 - ], - [ - 6.359322, - 49.52481 - ], - [ - 6.370763, - 49.50545 - ], - [ - 6.370562, - 49.45732 - ], - [ - 6.333403, - 49.46493 - ], - [ - 6.321894, - 49.47244 - ], - [ - 6.295034, - 49.47928 - ], - [ - 6.287889, - 49.48379 - ], - [ - 6.271912, - 49.49995 - ], - [ - 6.241327, - 49.50693 - ], - [ - 6.196692, - 49.50331 - ], - [ - 6.173373, - 49.50577 - ], - [ - 6.160858, - 49.50085 - ], - [ - 6.167099, - 49.49006 - ], - [ - 6.140179, - 49.48525 - ], - [ - 6.129367, - 49.48803 - ], - [ - 6.127247, - 49.47081 - ], - [ - 6.101403, - 49.46726 - ], - [ - 6.104826, - 49.45076 - ], - [ - 6.081667, - 49.45417 - ], - [ - 6.077222, - 49.46139 - ], - [ - 6.059167, - 49.46306 - ], - [ - 6.052222, - 49.46028 - ], - [ - 6.044213, - 49.44553 - ], - [ - 6.025294, - 49.44703 - ], - [ - 6.021545, - 49.45127 - ], - [ - 6.01574, - 49.44885 - ], - [ - 5.994123, - 49.45301 - ], - [ - 5.976569, - 49.44885 - ], - [ - 5.977725, - 49.45955 - ], - [ - 5.972317, - 49.46087 - ], - [ - 5.968912, - 49.48202 - ], - [ - 5.9616, - 49.49026 - ], - [ - 5.915781, - 49.49835 - ], - [ - 5.890334, - 49.4948 - ], - [ - 5.863321, - 49.50006 - ], - [ - 5.84897, - 49.50826 - ], - [ - 5.84828, - 49.51397 - ], - [ - 5.83641, - 49.51817 - ], - [ - 5.831868, - 49.52639 - ], - [ - 5.84308, - 49.53081 - ], - [ - 5.835622, - 49.54114 - ], - [ - 5.816251, - 49.53325 - ], - [ - 5.805201, - 49.54272 - ], - [ - 5.859432, - 49.57158 - ], - [ - 5.868663, - 49.587 - ], - [ - 5.862888, - 49.58525 - ], - [ - 5.851102, - 49.58379 - ], - [ - 5.847116, - 49.58961 - ], - [ - 5.845652, - 49.5981 - ], - [ - 5.869401, - 49.6106 - ], - [ - 5.881819, - 49.63815 - ], - [ - 5.899978, - 49.63907 - ], - [ - 5.899339, - 49.66239 - ], - [ - 5.856561, - 49.67628 - ], - [ - 5.856283, - 49.68211 - ], - [ - 5.875703, - 49.71118 - ], - [ - 5.864811, - 49.72331 - ], - [ - 5.843249, - 49.71822 - ], - [ - 5.82191, - 49.72128 - ], - [ - 5.824894, - 49.73767 - ], - [ - 5.820728, - 49.74878 - ], - [ - 5.786264, - 49.79079 - ], - [ - 5.765172, - 49.78961 - ], - [ - 5.750937, - 49.79094 - ], - [ - 5.741591, - 49.82126 - ], - [ - 5.745814, - 49.82435 - ], - [ - 5.737197, - 49.83353 - ], - [ - 5.740531, - 49.84142 - ], - [ - 5.747012, - 49.84048 - ], - [ - 5.746237, - 49.84783 - ], - [ - 5.753989, - 49.84878 - ], - [ - 5.740663, - 49.85152 - ], - [ - 5.752288, - 49.85922 - ], - [ - 5.749545, - 49.87554 - ], - [ - 5.775668, - 49.87438 - ], - [ - 5.775053, - 49.88057 - ], - [ - 5.734598, - 49.89341 - ], - [ - 5.733033, - 49.90285 - ], - [ - 5.757834, - 49.91737 - ], - [ - 5.760393, - 49.93252 - ], - [ - 5.770728, - 49.93711 - ], - [ - 5.768783, - 49.94239 - ], - [ - 5.768802, - 49.96104 - ], - [ - 5.786724, - 49.96816 - ], - [ - 5.80524, - 49.96677 - ], - [ - 5.806521, - 49.97321 - ], - [ - 5.831293, - 49.97995 - ], - [ - 5.834616, - 49.98656 - ], - [ - 5.818057, - 49.99936 - ], - [ - 5.815606, - 50.01437 - ], - [ - 5.847923, - 50.02809 - ], - [ - 5.861889, - 50.04581 - ], - [ - 5.850872, - 50.0563 - ], - [ - 5.857809, - 50.07186 - ], - [ - 5.880997, - 50.08069 - ], - [ - 5.891965, - 50.12041 - ], - [ - 5.952856, - 50.13384 - ], - [ - 5.961753, - 50.17631 - ] - ] - ], - "terms_url": "http://www.act.public.lu/fr/actualites/2014/02/ortho2014/", - "terms_text": "Administration du Cadastre et de la Topographie", - "id": "lu.geoportail.inspire.ortho2010" - }, - { - "name": "Luxembourg Inspire Ortho 2013", - "type": "tms", - "template": "http://mapproxy.openstreetmap.lu/tiles/ortho2013/EPSG900913/{z}/{x}/{y}.jpeg", - "scaleExtent": [ - 0, - 20 - ], - "polygon": [ - [ - [ - 5.961753, - 50.17631 - ], - [ - 6.026268, - 50.18496 - ], - [ - 6.033182, - 50.16395 - ], - [ - 6.060695, - 50.15536 - ], - [ - 6.07668, - 50.15913 - ], - [ - 6.078237, - 50.17255 - ], - [ - 6.101762, - 50.17199 - ], - [ - 6.122501, - 50.16437 - ], - [ - 6.120101, - 50.15594 - ], - [ - 6.127695, - 50.14993 - ], - [ - 6.113228, - 50.13739 - ], - [ - 6.123691, - 50.13719 - ], - [ - 6.140929, - 50.1305 - ], - [ - 6.135554, - 50.11899 - ], - [ - 6.138082, - 50.10263 - ], - [ - 6.131085, - 50.09964 - ], - [ - 6.135473, - 50.09119 - ], - [ - 6.121939, - 50.09059 - ], - [ - 6.126335, - 50.07817 - ], - [ - 6.131858, - 50.07348 - ], - [ - 6.121171, - 50.064 - ], - [ - 6.114444, - 50.06139 - ], - [ - 6.115631, - 50.05817 - ], - [ - 6.123611, - 50.06323 - ], - [ - 6.136608, - 50.04178 - ], - [ - 6.130343, - 50.02975 - ], - [ - 6.148207, - 50.02307 - ], - [ - 6.13868, - 50.01572 - ], - [ - 6.135938, - 50.01485 - ], - [ - 6.131384, - 50.01905 - ], - [ - 6.130243, - 50.01819 - ], - [ - 6.139343, - 50.01116 - ], - [ - 6.151702, - 50.01058 - ], - [ - 6.145464, - 49.99689 - ], - [ - 6.139657, - 49.9994 - ], - [ - 6.138524, - 49.99829 - ], - [ - 6.142178, - 49.99535 - ], - [ - 6.150227, - 49.99518 - ], - [ - 6.156247, - 49.98867 - ], - [ - 6.173045, - 49.98589 - ], - [ - 6.17348, - 49.98344 - ], - [ - 6.170353, - 49.98376 - ], - [ - 6.165487, - 49.97115 - ], - [ - 6.171512, - 49.96298 - ], - [ - 6.176298, - 49.962 - ], - [ - 6.179954, - 49.95386 - ], - [ - 6.183393, - 49.9548 - ], - [ - 6.179829, - 49.96307 - ], - [ - 6.183312, - 49.9686 - ], - [ - 6.192774, - 49.97158 - ], - [ - 6.199783, - 49.95352 - ], - [ - 6.207066, - 49.95672 - ], - [ - 6.212689, - 49.9514 - ], - [ - 6.225023, - 49.95039 - ], - [ - 6.22044, - 49.94369 - ], - [ - 6.228241, - 49.93726 - ], - [ - 6.22635, - 49.92766 - ], - [ - 6.219133, - 49.92354 - ], - [ - 6.229862, - 49.92125 - ], - [ - 6.236032, - 49.91355 - ], - [ - 6.231867, - 49.91064 - ], - [ - 6.227694, - 49.91062 - ], - [ - 6.232286, - 49.9072 - ], - [ - 6.23381, - 49.90028 - ], - [ - 6.246919, - 49.89535 - ], - [ - 6.257809, - 49.88724 - ], - [ - 6.263008, - 49.88101 - ], - [ - 6.276455, - 49.87725 - ], - [ - 6.281126, - 49.87957 - ], - [ - 6.291661, - 49.87548 - ], - [ - 6.297699, - 49.86673 - ], - [ - 6.309889, - 49.87107 - ], - [ - 6.315324, - 49.8673 - ], - [ - 6.314651, - 49.86057 - ], - [ - 6.323611, - 49.85188 - ], - [ - 6.321577, - 49.8409 - ], - [ - 6.327406, - 49.83673 - ], - [ - 6.336561, - 49.83998 - ], - [ - 6.339366, - 49.8507 - ], - [ - 6.364651, - 49.85164 - ], - [ - 6.402203, - 49.82098 - ], - [ - 6.426434, - 49.81629 - ], - [ - 6.428071, - 49.81186 - ], - [ - 6.43097, - 49.81129 - ], - [ - 6.441608, - 49.81547 - ], - [ - 6.443442, - 49.81233 - ], - [ - 6.45366, - 49.81275 - ], - [ - 6.464538, - 49.81975 - ], - [ - 6.47057, - 49.82385 - ], - [ - 6.496805, - 49.81277 - ], - [ - 6.50669, - 49.80993 - ], - [ - 6.511554, - 49.80238 - ], - [ - 6.51485, - 49.80513 - ], - [ - 6.519604, - 49.81446 - ], - [ - 6.529808, - 49.81048 - ], - [ - 6.532249, - 49.80686 - ], - [ - 6.530829, - 49.80116 - ], - [ - 6.506225, - 49.78899 - ], - [ - 6.519171, - 49.78344 - ], - [ - 6.511055, - 49.77422 - ], - [ - 6.520563, - 49.76818 - ], - [ - 6.520516, - 49.76134 - ], - [ - 6.503734, - 49.75086 - ], - [ - 6.502627, - 49.73298 - ], - [ - 6.507266, - 49.72938 - ], - [ - 6.518092, - 49.7242 - ], - [ - 6.516417, - 49.72129 - ], - [ - 6.511763, - 49.72016 - ], - [ - 6.504791, - 49.725 - ], - [ - 6.498913, - 49.72639 - ], - [ - 6.495576, - 49.72443 - ], - [ - 6.507122, - 49.71655 - ], - [ - 6.507884, - 49.71215 - ], - [ - 6.504598, - 49.71227 - ], - [ - 6.427139, - 49.66237 - ], - [ - 6.439899, - 49.66025 - ], - [ - 6.442511, - 49.65591 - ], - [ - 6.421781, - 49.61809 - ], - [ - 6.398978, - 49.60094 - ], - [ - 6.379408, - 49.59526 - ], - [ - 6.375507, - 49.58809 - ], - [ - 6.384426, - 49.5801 - ], - [ - 6.381188, - 49.57509 - ], - [ - 6.369093, - 49.5783 - ], - [ - 6.357913, - 49.57166 - ], - [ - 6.384902, - 49.55817 - ], - [ - 6.380095, - 49.54856 - ], - [ - 6.358555, - 49.53296 - ], - [ - 6.359322, - 49.52481 - ], - [ - 6.370763, - 49.50545 - ], - [ - 6.370562, - 49.45732 - ], - [ - 6.333403, - 49.46493 - ], - [ - 6.321894, - 49.47244 - ], - [ - 6.295034, - 49.47928 - ], - [ - 6.287889, - 49.48379 - ], - [ - 6.271912, - 49.49995 - ], - [ - 6.241327, - 49.50693 - ], - [ - 6.196692, - 49.50331 - ], - [ - 6.173373, - 49.50577 - ], - [ - 6.160858, - 49.50085 - ], - [ - 6.167099, - 49.49006 - ], - [ - 6.140179, - 49.48525 - ], - [ - 6.129367, - 49.48803 - ], - [ - 6.127247, - 49.47081 - ], - [ - 6.101403, - 49.46726 - ], - [ - 6.104826, - 49.45076 - ], - [ - 6.081667, - 49.45417 - ], - [ - 6.077222, - 49.46139 - ], - [ - 6.059167, - 49.46306 - ], - [ - 6.052222, - 49.46028 - ], - [ - 6.044213, - 49.44553 - ], - [ - 6.025294, - 49.44703 - ], - [ - 6.021545, - 49.45127 - ], - [ - 6.01574, - 49.44885 - ], - [ - 5.994123, - 49.45301 - ], - [ - 5.976569, - 49.44885 - ], - [ - 5.977725, - 49.45955 - ], - [ - 5.972317, - 49.46087 - ], - [ - 5.968912, - 49.48202 - ], - [ - 5.9616, - 49.49026 - ], - [ - 5.915781, - 49.49835 - ], - [ - 5.890334, - 49.4948 - ], - [ - 5.863321, - 49.50006 - ], - [ - 5.84897, - 49.50826 - ], - [ - 5.84828, - 49.51397 - ], - [ - 5.83641, - 49.51817 - ], - [ - 5.831868, - 49.52639 - ], - [ - 5.84308, - 49.53081 - ], - [ - 5.835622, - 49.54114 - ], - [ - 5.816251, - 49.53325 - ], - [ - 5.805201, - 49.54272 - ], - [ - 5.859432, - 49.57158 - ], - [ - 5.868663, - 49.587 - ], - [ - 5.862888, - 49.58525 - ], - [ - 5.851102, - 49.58379 - ], - [ - 5.847116, - 49.58961 - ], - [ - 5.845652, - 49.5981 - ], - [ - 5.869401, - 49.6106 - ], - [ - 5.881819, - 49.63815 - ], - [ - 5.899978, - 49.63907 - ], - [ - 5.899339, - 49.66239 - ], - [ - 5.856561, - 49.67628 - ], - [ - 5.856283, - 49.68211 - ], - [ - 5.875703, - 49.71118 - ], - [ - 5.864811, - 49.72331 - ], - [ - 5.843249, - 49.71822 - ], - [ - 5.82191, - 49.72128 - ], - [ - 5.824894, - 49.73767 - ], - [ - 5.820728, - 49.74878 - ], - [ - 5.786264, - 49.79079 - ], - [ - 5.765172, - 49.78961 - ], - [ - 5.750937, - 49.79094 - ], - [ - 5.741591, - 49.82126 - ], - [ - 5.745814, - 49.82435 - ], - [ - 5.737197, - 49.83353 - ], - [ - 5.740531, - 49.84142 - ], - [ - 5.747012, - 49.84048 - ], - [ - 5.746237, - 49.84783 - ], - [ - 5.753989, - 49.84878 - ], - [ - 5.740663, - 49.85152 - ], - [ - 5.752288, - 49.85922 - ], - [ - 5.749545, - 49.87554 - ], - [ - 5.775668, - 49.87438 - ], - [ - 5.775053, - 49.88057 - ], - [ - 5.734598, - 49.89341 - ], - [ - 5.733033, - 49.90285 - ], - [ - 5.757834, - 49.91737 - ], - [ - 5.760393, - 49.93252 - ], - [ - 5.770728, - 49.93711 - ], - [ - 5.768783, - 49.94239 - ], - [ - 5.768802, - 49.96104 - ], - [ - 5.786724, - 49.96816 - ], - [ - 5.80524, - 49.96677 - ], - [ - 5.806521, - 49.97321 - ], - [ - 5.831293, - 49.97995 - ], - [ - 5.834616, - 49.98656 - ], - [ - 5.818057, - 49.99936 - ], - [ - 5.815606, - 50.01437 - ], - [ - 5.847923, - 50.02809 - ], - [ - 5.861889, - 50.04581 - ], - [ - 5.850872, - 50.0563 - ], - [ - 5.857809, - 50.07186 - ], - [ - 5.880997, - 50.08069 - ], - [ - 5.891965, - 50.12041 - ], - [ - 5.952856, - 50.13384 - ], - [ - 5.961753, - 50.17631 - ] - ] - ], - "terms_url": "http://www.act.public.lu/fr/actualites/2014/02/ortho2014/", - "terms_text": "Administration du Cadastre et de la Topographie", - "id": "lu.geoportail.inspire.ortho2013" - }, - { - "name": "MapQuest Open Aerial", - "type": "tms", - "template": "http://oatile{switch:1,2,3,4}.mqcdn.com/tiles/1.0.0/sat/{zoom}/{x}/{y}.png", - "default": true - }, - { - "name": "Mapbox Satellite", - "type": "tms", - "description": "Satellite and aerial imagery.", - "template": "http://{switch:a,b,c}.tiles.mapbox.com/v4/openstreetmap.map-inh7ifmo/{zoom}/{x}/{y}.png?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJncjlmd0t3In0.DmZsIeOW-3x-C5eX-wAqTw", - "scaleExtent": [ - 0, - 19 - ], - "terms_url": "http://www.mapbox.com/about/maps/", - "terms_text": "Terms & Feedback", - "id": "Mapbox", - "default": true - }, - { - "name": "NLS - Bartholomew Half Inch, 1897-1907", - "type": "tms", - "template": "http://geo.nls.uk/mapdata2/bartholomew/great_britain/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 0, - 15 - ], - "polygon": [ - [ - [ - -9, - 49.8 - ], - [ - -9, - 61.1 - ], - [ - 1.9, - 61.1 - ], - [ - 1.9, - 49.8 - ], - [ - -9, - 49.8 - ] - ] - ], - "terms_url": "http://geo.nls.uk/maps/", - "terms_text": "National Library of Scotland Historic Maps" - }, - { - "name": "NLS - OS 1-inch 7th Series 1955-61", - "type": "tms", - "template": "http://geo.nls.uk/mapdata2/os/seventh/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 5, - 16 - ], - "polygon": [ - [ - [ - -6.4585407, - 49.9044128 - ], - [ - -6.3872009, - 49.9841116 - ], - [ - -6.2296827, - 49.9896159 - ], - [ - -6.2171269, - 49.8680087 - ], - [ - -6.4551164, - 49.8591793 - ] - ], - [ - [ - -1.4495137, - 60.8634056 - ], - [ - -0.7167114, - 60.8545122 - ], - [ - -0.7349744, - 60.4359756 - ], - [ - -0.6938826, - 60.4168218 - ], - [ - -0.7258429, - 60.3942735 - ], - [ - -0.7395401, - 60.0484714 - ], - [ - -0.9267357, - 60.0461918 - ], - [ - -0.9381501, - 59.8266157 - ], - [ - -1.4586452, - 59.831205 - ], - [ - -1.4455187, - 60.0535999 - ], - [ - -1.463211, - 60.0535999 - ], - [ - -1.4643524, - 60.0630002 - ], - [ - -1.5716475, - 60.0638546 - ], - [ - -1.5693646, - 60.1790005 - ], - [ - -1.643558, - 60.1807033 - ], - [ - -1.643558, - 60.1892162 - ], - [ - -1.8216221, - 60.1894999 - ], - [ - -1.8204807, - 60.3615507 - ], - [ - -1.8415973, - 60.3697345 - ], - [ - -1.8216221, - 60.3832755 - ], - [ - -1.8179852, - 60.5934321 - ], - [ - -1.453168, - 60.5934321 - ] - ], - [ - [ - -4.9089213, - 54.4242078 - ], - [ - -4.282598, - 54.4429861 - ], - [ - -4.2535417, - 54.029769 - ], - [ - -4.8766366, - 54.0221831 - ] - ], - [ - [ - -5.8667408, - 59.1444603 - ], - [ - -5.7759966, - 59.1470945 - ], - [ - -5.7720016, - 59.1014052 - ], - [ - -5.8621751, - 59.0990605 - ] - ], - [ - [ - -1.7065887, - 59.5703599 - ], - [ - -1.5579165, - 59.5693481 - ], - [ - -1.5564897, - 59.4965695 - ], - [ - -1.7054472, - 59.4975834 - ] - ], - [ - [ - -7.6865827, - 58.2940975 - ], - [ - -7.5330594, - 58.3006957 - ], - [ - -7.5256401, - 58.2646905 - ], - [ - -7.6797341, - 58.2577853 - ] - ], - [ - [ - -4.5338281, - 59.0359871 - ], - [ - -4.481322, - 59.0371616 - ], - [ - -4.4796099, - 59.0186583 - ], - [ - -4.5332574, - 59.0180707 - ] - ], - [ - [ - -8.6710698, - 57.8769896 - ], - [ - -8.4673234, - 57.8897332 - ], - [ - -8.4467775, - 57.7907 - ], - [ - -8.6510947, - 57.7779213 - ] - ], - [ - [ - -5.2395519, - 50.3530581 - ], - [ - -5.7920073, - 50.3384899 - ], - [ - -5.760047, - 49.9317027 - ], - [ - -4.6551363, - 49.9581461 - ], - [ - -4.677965, - 50.2860073 - ], - [ - -4.244219, - 50.2801723 - ], - [ - -4.2487848, - 50.2042525 - ], - [ - -3.3812929, - 50.2042525 - ], - [ - -3.4223846, - 50.5188201 - ], - [ - -3.1164796, - 50.5246258 - ], - [ - -3.1210453, - 50.6579592 - ], - [ - -2.6736357, - 50.6619495 - ], - [ - -2.5953453, - 50.6394325 - ], - [ - -2.5905026, - 50.5728419 - ], - [ - -2.4791203, - 50.5733545 - ], - [ - -2.4758919, - 50.5066704 - ], - [ - -2.3967943, - 50.5056438 - ], - [ - -2.401637, - 50.5723293 - ], - [ - -1.0400296, - 50.5718167 - ], - [ - -1.0335726, - 50.7059289 - ], - [ - -0.549302, - 50.7038843 - ], - [ - -0.5460736, - 50.7886618 - ], - [ - -0.0924734, - 50.7856002 - ], - [ - -0.0876307, - 50.7181949 - ], - [ - 0.4789659, - 50.7120623 - ], - [ - 0.487037, - 50.8182467 - ], - [ - 0.9761503, - 50.8049868 - ], - [ - 0.9922927, - 51.0126311 - ], - [ - 1.4491213, - 51.0004424 - ], - [ - 1.4781775, - 51.4090372 - ], - [ - 1.0229632, - 51.4271576 - ], - [ - 1.035877, - 51.7640881 - ], - [ - 1.6105448, - 51.7500992 - ], - [ - 1.646058, - 52.1560003 - ], - [ - 1.7267698, - 52.1540195 - ], - [ - 1.749369, - 52.4481811 - ], - [ - 1.7870672, - 52.4811624 - ], - [ - 1.759102, - 52.522505 - ], - [ - 1.7933451, - 52.9602749 - ], - [ - 0.3798147, - 52.9958468 - ], - [ - 0.3895238, - 53.2511239 - ], - [ - 0.3478614, - 53.2511239 - ], - [ - 0.3238912, - 53.282186 - ], - [ - 0.3461492, - 53.6538501 - ], - [ - 0.128487, - 53.6575466 - ], - [ - 0.116582, - 53.6674703 - ], - [ - 0.1350586, - 54.0655731 - ], - [ - -0.0609831, - 54.065908 - ], - [ - -0.0414249, - 54.4709448 - ], - [ - -0.5662701, - 54.4771794 - ], - [ - -0.5592078, - 54.6565127 - ], - [ - -1.1665638, - 54.6623485 - ], - [ - -1.1637389, - 54.842611 - ], - [ - -1.3316194, - 54.843909 - ], - [ - -1.3257065, - 55.2470842 - ], - [ - -1.529453, - 55.2487108 - ], - [ - -1.524178, - 55.6540122 - ], - [ - -1.7638798, - 55.6540122 - ], - [ - -1.7733693, - 55.9719116 - ], - [ - -2.1607858, - 55.9682981 - ], - [ - -2.1543289, - 56.0621387 - ], - [ - -2.4578051, - 56.0585337 - ], - [ - -2.4190635, - 56.641717 - ], - [ - -2.0962164, - 56.641717 - ], - [ - -2.0833025, - 57.0021322 - ], - [ - -1.9283359, - 57.0126802 - ], - [ - -1.9180966, - 57.3590895 - ], - [ - -1.7502161, - 57.3625721 - ], - [ - -1.7695869, - 57.7608634 - ], - [ - -3.6937554, - 57.7574187 - ], - [ - -3.7066693, - 57.9806386 - ], - [ - -3.5969013, - 57.9772149 - ], - [ - -3.6033582, - 58.1207277 - ], - [ - -3.0222335, - 58.1309566 - ], - [ - -3.0286905, - 58.5410788 - ], - [ - -2.8478961, - 58.530968 - ], - [ - -2.86081, - 58.8430508 - ], - [ - -2.679624, - 58.8414991 - ], - [ - -2.6841897, - 58.885175 - ], - [ - -2.6339665, - 58.9052239 - ], - [ - -2.679624, - 58.9335083 - ], - [ - -2.6887555, - 59.0229231 - ], - [ - -2.3668703, - 59.0229231 - ], - [ - -2.3702946, - 59.2652861 - ], - [ - -2.3429001, - 59.2821989 - ], - [ - -2.3714361, - 59.2996861 - ], - [ - -2.3737189, - 59.3707083 - ], - [ - -2.3429001, - 59.385825 - ], - [ - -2.3725775, - 59.400354 - ], - [ - -2.3714361, - 59.4259098 - ], - [ - -3.0734196, - 59.4230067 - ], - [ - -3.0711368, - 59.3433649 - ], - [ - -3.103097, - 59.3311405 - ], - [ - -3.0745611, - 59.3136695 - ], - [ - -3.0722782, - 59.232603 - ], - [ - -3.3850319, - 59.1484167 - ], - [ - -3.3747589, - 58.9352753 - ], - [ - -3.5653789, - 58.9323303 - ], - [ - -3.554829, - 58.69759 - ], - [ - -5.2808579, - 58.6667732 - ], - [ - -5.2534159, - 58.3514125 - ], - [ - -5.5068508, - 58.3437887 - ], - [ - -5.4761804, - 58.0323557 - ], - [ - -5.8974958, - 58.0212436 - ], - [ - -5.8522972, - 57.6171758 - ], - [ - -6.1396311, - 57.6137174 - ], - [ - -6.1541592, - 57.7423183 - ], - [ - -6.2913692, - 57.7380102 - ], - [ - -6.3365678, - 58.1398784 - ], - [ - -6.1121891, - 58.1466944 - ], - [ - -6.1473778, - 58.5106285 - ], - [ - -6.2934817, - 58.5416182 - ], - [ - -6.8413713, - 58.2977321 - ], - [ - -7.0057382, - 58.2929331 - ], - [ - -7.1016189, - 58.2064403 - ], - [ - -7.2573132, - 58.1793148 - ], - [ - -7.2531092, - 58.1004928 - ], - [ - -7.4070698, - 58.0905566 - ], - [ - -7.391347, - 57.7911354 - ], - [ - -7.790991, - 57.7733151 - ], - [ - -7.7624215, - 57.5444165 - ], - [ - -7.698501, - 57.1453194 - ], - [ - -7.7943817, - 57.1304547 - ], - [ - -7.716764, - 56.7368628 - ], - [ - -7.0122067, - 56.7654359 - ], - [ - -6.979922, - 56.5453858 - ], - [ - -7.0638622, - 56.5453858 - ], - [ - -7.0444914, - 56.3562587 - ], - [ - -6.500676, - 56.3812917 - ], - [ - -6.4491433, - 55.9793649 - ], - [ - -6.563287, - 55.9691456 - ], - [ - -6.5393742, - 55.7030135 - ], - [ - -6.5595521, - 55.6907321 - ], - [ - -6.5345315, - 55.6761713 - ], - [ - -6.5216176, - 55.5704434 - ], - [ - -5.8912587, - 55.5923416 - ], - [ - -5.8560127, - 55.2320733 - ], - [ - -5.2293639, - 55.2515958 - ], - [ - -5.1837064, - 54.6254139 - ], - [ - -3.6655956, - 54.6518373 - ], - [ - -3.6496155, - 54.4320023 - ], - [ - -3.5400375, - 54.4306744 - ], - [ - -3.530906, - 54.0290181 - ], - [ - -3.0697656, - 54.030359 - ], - [ - -3.0675737, - 53.8221388 - ], - [ - -3.0804876, - 53.7739911 - ], - [ - -3.0619239, - 53.7477488 - ], - [ - -3.0611168, - 53.6737049 - ], - [ - -3.2144691, - 53.6708361 - ], - [ - -3.2057699, - 53.4226163 - ], - [ - -3.2799632, - 53.355224 - ], - [ - -3.2896655, - 53.3608441 - ], - [ - -3.3327547, - 53.364931 - ], - [ - -3.3761293, - 53.3540318 - ], - [ - -4.0888976, - 53.3433102 - ], - [ - -4.0945474, - 53.4612036 - ], - [ - -4.697412, - 53.4448624 - ], - [ - -4.6882805, - 53.3318598 - ], - [ - -4.7202407, - 53.2895771 - ], - [ - -4.6837148, - 53.2486184 - ], - [ - -4.6768661, - 53.1542644 - ], - [ - -4.8480816, - 53.1446807 - ], - [ - -4.8178336, - 52.7440299 - ], - [ - -4.2545751, - 52.7558939 - ], - [ - -4.228876, - 52.254876 - ], - [ - -4.2607571, - 52.2536408 - ], - [ - -4.2724603, - 52.2432637 - ], - [ - -4.8136263, - 52.230095 - ], - [ - -4.8079191, - 52.1138892 - ], - [ - -5.3889104, - 52.0991668 - ], - [ - -5.3717888, - 51.9129667 - ], - [ - -5.4208706, - 51.9101502 - ], - [ - -5.414022, - 51.8453218 - ], - [ - -5.3683645, - 51.8474373 - ], - [ - -5.3466772, - 51.5595332 - ], - [ - -4.773676, - 51.5758518 - ], - [ - -4.7656859, - 51.4885146 - ], - [ - -4.1915432, - 51.4970427 - ], - [ - -4.1869775, - 51.4344663 - ], - [ - -3.6151177, - 51.4444274 - ], - [ - -3.6105519, - 51.3746543 - ], - [ - -3.1494115, - 51.3789292 - ], - [ - -3.1494115, - 51.2919281 - ], - [ - -4.3038735, - 51.2745907 - ], - [ - -4.2861169, - 51.0508721 - ], - [ - -4.8543277, - 51.0366633 - ], - [ - -4.8372201, - 50.7212787 - ], - [ - -5.2618345, - 50.7082694 - ] - ], - [ - [ - -2.1502671, - 60.171318 - ], - [ - -2.0030218, - 60.1696146 - ], - [ - -2.0013096, - 60.0997023 - ], - [ - -2.148555, - 60.1011247 - ] - ], - [ - [ - -6.2086011, - 59.1163488 - ], - [ - -6.1229934, - 59.1166418 - ], - [ - -6.121852, - 59.0714985 - ], - [ - -6.2097426, - 59.0714985 - ] - ], - [ - [ - -4.4159559, - 59.0889036 - ], - [ - -4.4212022, - 59.0770848 - ], - [ - -4.3971904, - 59.0779143 - ], - [ - -4.3913388, - 59.0897328 - ] - ] - ], - "terms_url": "http://geo.nls.uk/maps/", - "terms_text": "National Library of Scotland Historic Maps" - }, - { - "name": "NLS - OS 1:25k 1st Series 1937-61", - "type": "tms", - "template": "http://geo.nls.uk/mapdata2/os/25000/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 5, - 16 - ], - "polygon": [ - [ - [ - -4.7157244, - 54.6796556 - ], - [ - -4.6850662, - 54.6800268 - ], - [ - -4.6835779, - 54.6623245 - ], - [ - -4.7148782, - 54.6615818 - ] - ], - [ - [ - -3.7085748, - 58.3371151 - ], - [ - -3.5405937, - 58.3380684 - ], - [ - -3.5315137, - 58.1608002 - ], - [ - -3.3608086, - 58.1622372 - ], - [ - -3.3653486, - 58.252173 - ], - [ - -3.1610473, - 58.2536063 - ], - [ - -3.1610473, - 58.3261509 - ], - [ - -3.0275704, - 58.3271045 - ], - [ - -3.0366505, - 58.6139001 - ], - [ - -3.0021463, - 58.614373 - ], - [ - -3.0030543, - 58.7036341 - ], - [ - -3.4180129, - 58.7003322 - ], - [ - -3.4171049, - 58.6290293 - ], - [ - -3.7240109, - 58.6266658 - ], - [ - -3.7231029, - 58.606806 - ], - [ - -4.2361262, - 58.5992374 - ], - [ - -4.2334022, - 58.5092347 - ], - [ - -3.88836, - 58.5144516 - ], - [ - -3.8829119, - 58.4261327 - ], - [ - -3.7158389, - 58.4270836 - ] - ], - [ - [ - -6.46676, - 49.9943621 - ], - [ - -6.1889102, - 50.004868 - ], - [ - -6.1789222, - 49.8967815 - ], - [ - -6.3169391, - 49.8915171 - ], - [ - -6.312399, - 49.8200979 - ], - [ - -6.4504159, - 49.8159968 - ] - ], - [ - [ - -5.6453263, - 50.2029809 - ], - [ - -5.7801329, - 50.2014076 - ], - [ - -5.7637888, - 50.0197267 - ], - [ - -5.3479221, - 50.0290604 - ], - [ - -5.3388421, - 49.9414854 - ], - [ - -5.024672, - 49.9473287 - ], - [ - -5.0355681, - 50.0383923 - ], - [ - -5.0010639, - 50.0453901 - ], - [ - -4.9974319, - 50.1304478 - ], - [ - -4.855783, - 50.13394 - ], - [ - -4.861231, - 50.206057 - ], - [ - -4.6546085, - 50.2140172 - ], - [ - -4.6558926, - 50.3018616 - ], - [ - -4.5184924, - 50.3026818 - ], - [ - -4.51464, - 50.325642 - ], - [ - -4.2488284, - 50.3264618 - ], - [ - -4.2488284, - 50.3100631 - ], - [ - -4.10886, - 50.3141633 - ], - [ - -4.1062917, - 50.2411267 - ], - [ - -3.9648088, - 50.2432047 - ], - [ - -3.9640778, - 50.2254158 - ], - [ - -3.8522287, - 50.2273626 - ], - [ - -3.8503757, - 50.1552563 - ], - [ - -3.6921809, - 50.1572487 - ], - [ - -3.5414602, - 50.1602198 - ], - [ - -3.5465781, - 50.3226814 - ], - [ - -3.4068012, - 50.3241013 - ], - [ - -3.4165761, - 50.5892711 - ], - [ - -3.2746691, - 50.5962721 - ], - [ - -3.2749172, - 50.6106323 - ], - [ - -2.9971742, - 50.613972 - ], - [ - -2.9896008, - 50.688537 - ], - [ - -2.7120266, - 50.690565 - ], - [ - -2.710908, - 50.6195964 - ], - [ - -2.5695473, - 50.6157538 - ], - [ - -2.5651019, - 50.5134083 - ], - [ - -2.4014463, - 50.513379 - ], - [ - -2.3940583, - 50.6160348 - ], - [ - -2.2894123, - 50.6147436 - ], - [ - -2.2876184, - 50.6008549 - ], - [ - -2.1477855, - 50.6048506 - ], - [ - -2.1451013, - 50.5325437 - ], - [ - -1.9335117, - 50.5347477 - ], - [ - -1.9362139, - 50.6170445 - ], - [ - -1.8573025, - 50.6228094 - ], - [ - -1.8554865, - 50.709139 - ], - [ - -1.6066929, - 50.709139 - ], - [ - -1.6085089, - 50.6239615 - ], - [ - -1.4450678, - 50.6228094 - ], - [ - -1.4432518, - 50.5317039 - ], - [ - -1.1545059, - 50.5293951 - ], - [ - -1.1472419, - 50.6170485 - ], - [ - -1.011041, - 50.6205051 - ], - [ - -1.011041, - 50.7056889 - ], - [ - -0.704135, - 50.7045388 - ], - [ - -0.700503, - 50.7769401 - ], - [ - -0.5860943, - 50.7723465 - ], - [ - -0.5879103, - 50.7907181 - ], - [ - -0.0149586, - 50.7798108 - ], - [ - -0.0185906, - 50.7625836 - ], - [ - 0.0967261, - 50.7620093 - ], - [ - 0.0921861, - 50.6913106 - ], - [ - 0.3046595, - 50.6890096 - ], - [ - 0.3101075, - 50.7757917 - ], - [ - 0.5511831, - 50.7726336 - ], - [ - 0.5529991, - 50.8432096 - ], - [ - 0.695556, - 50.8403428 - ], - [ - 0.696464, - 50.8592608 - ], - [ - 0.9852099, - 50.8523824 - ], - [ - 0.9906579, - 50.9417226 - ], - [ - 1.0160821, - 50.9411504 - ], - [ - 1.0215301, - 51.0303204 - ], - [ - 1.2812198, - 51.0240383 - ], - [ - 1.2848518, - 51.0948044 - ], - [ - 1.4277848, - 51.0948044 - ], - [ - 1.4386809, - 51.2882859 - ], - [ - 1.4713691, - 51.2871502 - ], - [ - 1.4804492, - 51.3994534 - ], - [ - 1.1590151, - 51.4073836 - ], - [ - 1.1590151, - 51.3869889 - ], - [ - 1.0191822, - 51.3903886 - ], - [ - 1.0228142, - 51.4798247 - ], - [ - 0.8793493, - 51.4843484 - ], - [ - 0.8829813, - 51.5566675 - ], - [ - 1.0264462, - 51.5544092 - ], - [ - 1.0373423, - 51.7493319 - ], - [ - 1.2607117, - 51.7482076 - ], - [ - 1.2661598, - 51.8279642 - ], - [ - 1.3351682, - 51.8335756 - ], - [ - 1.3478803, - 51.9199021 - ], - [ - 1.4840812, - 51.9199021 - ], - [ - 1.4986093, - 52.0038271 - ], - [ - 1.6438902, - 52.0027092 - ], - [ - 1.6656823, - 52.270221 - ], - [ - 1.7310588, - 52.270221 - ], - [ - 1.7528509, - 52.4465637 - ], - [ - 1.8254914, - 52.4476705 - ], - [ - 1.8345714, - 52.624408 - ], - [ - 1.7690346, - 52.6291402 - ], - [ - 1.7741711, - 52.717904 - ], - [ - 1.6996925, - 52.721793 - ], - [ - 1.706113, - 52.8103687 - ], - [ - 1.559724, - 52.8165777 - ], - [ - 1.5648605, - 52.9034116 - ], - [ - 1.4184715, - 52.9103818 - ], - [ - 1.4223238, - 52.9281894 - ], - [ - 1.3439928, - 52.9289635 - ], - [ - 1.3491293, - 53.0001194 - ], - [ - 0.4515789, - 53.022589 - ], - [ - 0.4497629, - 52.9351139 - ], - [ - 0.3789384, - 52.9351139 - ], - [ - 0.3716744, - 52.846365 - ], - [ - 0.2227614, - 52.8496552 - ], - [ - 0.2336575, - 52.9329248 - ], - [ - 0.3062979, - 52.9351139 - ], - [ - 0.308114, - 53.022589 - ], - [ - 0.3807544, - 53.0236813 - ], - [ - 0.3993708, - 53.2933729 - ], - [ - 0.3248922, - 53.2987454 - ], - [ - 0.3274604, - 53.3853782 - ], - [ - 0.2504136, - 53.38691 - ], - [ - 0.2581183, - 53.4748924 - ], - [ - 0.1862079, - 53.4779494 - ], - [ - 0.1913443, - 53.6548777 - ], - [ - 0.1502527, - 53.6594436 - ], - [ - 0.1528209, - 53.7666003 - ], - [ - 0.0012954, - 53.7734308 - ], - [ - 0.0025796, - 53.8424326 - ], - [ - -0.0282392, - 53.841675 - ], - [ - -0.0226575, - 53.9311501 - ], - [ - -0.1406983, - 53.9322193 - ], - [ - -0.1416063, - 54.0219323 - ], - [ - -0.1706625, - 54.0235326 - ], - [ - -0.1679384, - 54.0949482 - ], - [ - -0.0126694, - 54.0912206 - ], - [ - -0.0099454, - 54.1811226 - ], - [ - -0.1615824, - 54.1837795 - ], - [ - -0.1606744, - 54.2029038 - ], - [ - -0.2405789, - 54.2034349 - ], - [ - -0.2378549, - 54.2936234 - ], - [ - -0.3894919, - 54.2941533 - ], - [ - -0.3857497, - 54.3837321 - ], - [ - -0.461638, - 54.3856364 - ], - [ - -0.4571122, - 54.4939066 - ], - [ - -0.6105651, - 54.4965434 - ], - [ - -0.6096571, - 54.5676704 - ], - [ - -0.7667421, - 54.569776 - ], - [ - -0.7640181, - 54.5887213 - ], - [ - -0.9192871, - 54.5908258 - ], - [ - -0.9148116, - 54.6608348 - ], - [ - -1.1485204, - 54.6634343 - ], - [ - -1.1472363, - 54.7528316 - ], - [ - -1.2268514, - 54.7532021 - ], - [ - -1.2265398, - 54.8429879 - ], - [ - -1.2991803, - 54.8435107 - ], - [ - -1.2991803, - 54.9333391 - ], - [ - -1.3454886, - 54.9354258 - ], - [ - -1.3436726, - 55.0234878 - ], - [ - -1.3772688, - 55.0255698 - ], - [ - -1.3754528, - 55.1310877 - ], - [ - -1.4997441, - 55.1315727 - ], - [ - -1.4969272, - 55.2928323 - ], - [ - -1.5296721, - 55.2942946 - ], - [ - -1.5258198, - 55.6523803 - ], - [ - -1.7659492, - 55.6545537 - ], - [ - -1.7620968, - 55.7435626 - ], - [ - -1.9688392, - 55.7435626 - ], - [ - -1.9698023, - 55.8334505 - ], - [ - -2.0019051, - 55.8336308 - ], - [ - -2.0015841, - 55.9235526 - ], - [ - -2.1604851, - 55.9240613 - ], - [ - -2.1613931, - 55.9413549 - ], - [ - -2.3202942, - 55.9408463 - ], - [ - -2.3212022, - 56.0145126 - ], - [ - -2.5627317, - 56.0124824 - ], - [ - -2.5645477, - 56.1022207 - ], - [ - -2.9658863, - 56.0991822 - ], - [ - -2.9667943, - 56.1710304 - ], - [ - -2.4828272, - 56.1755797 - ], - [ - -2.4882752, - 56.2856078 - ], - [ - -2.5645477, - 56.2835918 - ], - [ - -2.5681798, - 56.3742075 - ], - [ - -2.7261728, - 56.3732019 - ], - [ - -2.7316208, - 56.4425301 - ], - [ - -2.6190281, - 56.4425301 - ], - [ - -2.6153961, - 56.5317671 - ], - [ - -2.453771, - 56.5347715 - ], - [ - -2.4534686, - 56.6420248 - ], - [ - -2.4062523, - 56.6440218 - ], - [ - -2.3953562, - 56.7297964 - ], - [ - -2.2936596, - 56.7337811 - ], - [ - -2.2972916, - 56.807423 - ], - [ - -2.1629067, - 56.8113995 - ], - [ - -2.1592747, - 56.9958425 - ], - [ - -1.9922016, - 57.0017771 - ], - [ - -2.0067297, - 57.2737477 - ], - [ - -1.9195612, - 57.2757112 - ], - [ - -1.9304572, - 57.3482876 - ], - [ - -1.8106005, - 57.3443682 - ], - [ - -1.7997044, - 57.4402728 - ], - [ - -1.6616875, - 57.4285429 - ], - [ - -1.6689516, - 57.5398256 - ], - [ - -1.7452241, - 57.5398256 - ], - [ - -1.7524881, - 57.6313302 - ], - [ - -1.8287606, - 57.6332746 - ], - [ - -1.8287606, - 57.7187255 - ], - [ - -3.1768526, - 57.7171219 - ], - [ - -3.1794208, - 57.734264 - ], - [ - -3.5134082, - 57.7292105 - ], - [ - -3.5129542, - 57.7112683 - ], - [ - -3.7635638, - 57.7076303 - ], - [ - -3.7598539, - 57.635713 - ], - [ - -3.8420372, - 57.6343382 - ], - [ - -3.8458895, - 57.6178365 - ], - [ - -3.9794374, - 57.6157733 - ], - [ - -3.9794374, - 57.686544 - ], - [ - -3.8150708, - 57.689976 - ], - [ - -3.817639, - 57.7968899 - ], - [ - -3.6853753, - 57.7989429 - ], - [ - -3.6892276, - 57.8891567 - ], - [ - -3.9383458, - 57.8877915 - ], - [ - -3.9421981, - 57.9750592 - ], - [ - -3.6943641, - 57.9784638 - ], - [ - -3.6969323, - 58.0695865 - ], - [ - -4.0372226, - 58.0641528 - ], - [ - -4.0346543, - 57.9730163 - ], - [ - -4.2003051, - 57.9702923 - ], - [ - -4.1832772, - 57.7012869 - ], - [ - -4.518752, - 57.6951111 - ], - [ - -4.5122925, - 57.6050682 - ], - [ - -4.6789116, - 57.6016628 - ], - [ - -4.666022, - 57.4218334 - ], - [ - -3.6677696, - 57.4394729 - ], - [ - -3.671282, - 57.5295384 - ], - [ - -3.3384979, - 57.5331943 - ], - [ - -3.3330498, - 57.4438859 - ], - [ - -2.8336466, - 57.4485275 - ], - [ - -2.8236396, - 56.9992706 - ], - [ - -2.3305398, - 57.0006693 - ], - [ - -2.3298977, - 56.9113932 - ], - [ - -2.6579889, - 56.9092901 - ], - [ - -2.6559637, - 56.8198406 - ], - [ - -2.8216747, - 56.8188467 - ], - [ - -2.8184967, - 56.7295397 - ], - [ - -3.1449248, - 56.7265508 - ], - [ - -3.1435628, - 56.6362749 - ], - [ - -3.4679089, - 56.6350265 - ], - [ - -3.474265, - 56.7238108 - ], - [ - -3.8011471, - 56.7188284 - ], - [ - -3.785711, - 56.4493026 - ], - [ - -3.946428, - 56.4457896 - ], - [ - -3.9428873, - 56.2659777 - ], - [ - -4.423146, - 56.2588459 - ], - [ - -4.4141572, - 56.0815506 - ], - [ - -4.8944159, - 56.0708008 - ], - [ - -4.8791072, - 55.8896994 - ], - [ - -5.1994158, - 55.8821374 - ], - [ - -5.1852906, - 55.7023791 - ], - [ - -5.0273445, - 55.7067203 - ], - [ - -5.0222081, - 55.6879046 - ], - [ - -4.897649, - 55.6907999 - ], - [ - -4.8880181, - 55.6002822 - ], - [ - -4.7339244, - 55.6046348 - ], - [ - -4.7275038, - 55.5342082 - ], - [ - -4.773732, - 55.5334815 - ], - [ - -4.7685955, - 55.4447227 - ], - [ - -4.8494947, - 55.4418092 - ], - [ - -4.8405059, - 55.3506535 - ], - [ - -4.8700405, - 55.3513836 - ], - [ - -4.8649041, - 55.2629462 - ], - [ - -4.9920314, - 55.2592875 - ], - [ - -4.9907473, - 55.1691779 - ], - [ - -5.0600894, - 55.1655105 - ], - [ - -5.0575212, - 55.0751884 - ], - [ - -5.2141831, - 55.0722477 - ], - [ - -5.1991766, - 54.8020337 - ], - [ - -5.0466316, - 54.8062205 - ], - [ - -5.0502636, - 54.7244996 - ], - [ - -4.9703591, - 54.7203043 - ], - [ - -4.9776232, - 54.6215905 - ], - [ - -4.796022, - 54.6342056 - ], - [ - -4.796022, - 54.7307917 - ], - [ - -4.8977186, - 54.7265971 - ], - [ - -4.9086147, - 54.8145928 - ], - [ - -4.8069181, - 54.8166856 - ], - [ - -4.8105501, - 54.7915648 - ], - [ - -4.6943253, - 54.7978465 - ], - [ - -4.6761652, - 54.7244996 - ], - [ - -4.5744686, - 54.7244996 - ], - [ - -4.5599405, - 54.6426135 - ], - [ - -4.3093309, - 54.6384098 - ], - [ - -4.3333262, - 54.8229889 - ], - [ - -4.2626999, - 54.8274274 - ], - [ - -4.2549952, - 54.7348587 - ], - [ - -3.8338058, - 54.7400481 - ], - [ - -3.836374, - 54.8141105 - ], - [ - -3.7118149, - 54.8133706 - ], - [ - -3.7143831, - 54.8318654 - ], - [ - -3.5346072, - 54.8355633 - ], - [ - -3.5271039, - 54.9066228 - ], - [ - -3.4808758, - 54.9084684 - ], - [ - -3.4776655, - 54.7457328 - ], - [ - -3.5874573, - 54.744621 - ], - [ - -3.5836049, - 54.6546166 - ], - [ - -3.7107322, - 54.6531308 - ], - [ - -3.6991752, - 54.4550407 - ], - [ - -3.5746161, - 54.4572801 - ], - [ - -3.5759002, - 54.3863042 - ], - [ - -3.539945, - 54.3855564 - ], - [ - -3.5386609, - 54.297224 - ], - [ - -3.46033, - 54.2957252 - ], - [ - -3.4590458, - 54.2079507 - ], - [ - -3.3807149, - 54.2102037 - ], - [ - -3.381999, - 54.1169788 - ], - [ - -3.302878, - 54.1160656 - ], - [ - -3.300154, - 54.0276224 - ], - [ - -3.1013007, - 54.0292224 - ], - [ - -3.093596, - 53.6062158 - ], - [ - -3.2065981, - 53.6016441 - ], - [ - -3.2091663, - 53.4917753 - ], - [ - -3.2451215, - 53.4887193 - ], - [ - -3.2348486, - 53.4045934 - ], - [ - -3.5276266, - 53.3999999 - ], - [ - -3.5343966, - 53.328481 - ], - [ - -3.6488053, - 53.3252272 - ], - [ - -3.6527308, - 53.3057716 - ], - [ - -3.7271873, - 53.3046865 - ], - [ - -3.7315003, - 53.3945257 - ], - [ - -3.9108315, - 53.3912769 - ], - [ - -3.9071995, - 53.3023804 - ], - [ - -3.9521457, - 53.3015665 - ], - [ - -3.9566724, - 53.3912183 - ], - [ - -4.1081979, - 53.3889209 - ], - [ - -4.1081979, - 53.4072967 - ], - [ - -4.2622916, - 53.4065312 - ], - [ - -4.2635757, - 53.4753707 - ], - [ - -4.638537, - 53.4677274 - ], - [ - -4.6346847, - 53.3812621 - ], - [ - -4.7091633, - 53.3774321 - ], - [ - -4.7001745, - 53.1954965 - ], - [ - -4.5499332, - 53.1962658 - ], - [ - -4.5435126, - 53.1092488 - ], - [ - -4.3919871, - 53.1100196 - ], - [ - -4.3855666, - 53.0236002 - ], - [ - -4.6115707, - 53.0205105 - ], - [ - -4.603866, - 52.9284932 - ], - [ - -4.7566756, - 52.9261709 - ], - [ - -4.7476868, - 52.8370555 - ], - [ - -4.8208813, - 52.8331768 - ], - [ - -4.8208813, - 52.7446476 - ], - [ - -4.3701572, - 52.7539749 - ], - [ - -4.3765778, - 52.8401583 - ], - [ - -4.2314728, - 52.8455875 - ], - [ - -4.2237682, - 52.7586379 - ], - [ - -4.1056297, - 52.7570836 - ], - [ - -4.1015192, - 52.6714874 - ], - [ - -4.1487355, - 52.6703862 - ], - [ - -4.1305754, - 52.4008596 - ], - [ - -4.1995838, - 52.3986435 - ], - [ - -4.2050319, - 52.3110195 - ], - [ - -4.3466808, - 52.303247 - ], - [ - -4.3484968, - 52.2365693 - ], - [ - -4.4901457, - 52.2332328 - ], - [ - -4.4883297, - 52.2098702 - ], - [ - -4.6572188, - 52.2098702 - ], - [ - -4.6590348, - 52.1385939 - ], - [ - -4.7788916, - 52.13525 - ], - [ - -4.7807076, - 52.1162967 - ], - [ - -4.9259885, - 52.1140663 - ], - [ - -4.9187245, - 52.0392855 - ], - [ - -5.2365265, - 52.0314653 - ], - [ - -5.2347105, - 51.9442339 - ], - [ - -5.3473032, - 51.9408755 - ], - [ - -5.3473032, - 51.9195995 - ], - [ - -5.4925842, - 51.9162392 - ], - [ - -5.4853201, - 51.8265386 - ], - [ - -5.1983903, - 51.8321501 - ], - [ - -5.1893102, - 51.7625177 - ], - [ - -5.335825, - 51.7589528 - ], - [ - -5.3281204, - 51.6686495 - ], - [ - -5.1836575, - 51.6730296 - ], - [ - -5.1836575, - 51.6539134 - ], - [ - -5.0674452, - 51.6578966 - ], - [ - -5.0603825, - 51.5677905 - ], - [ - -4.5974594, - 51.5809588 - ], - [ - -4.60388, - 51.6726314 - ], - [ - -4.345773, - 51.6726314 - ], - [ - -4.3355001, - 51.4962964 - ], - [ - -3.9528341, - 51.5106841 - ], - [ - -3.9425611, - 51.5905333 - ], - [ - -3.8809237, - 51.5953198 - ], - [ - -3.8706508, - 51.5074872 - ], - [ - -3.7679216, - 51.4978952 - ], - [ - -3.7550805, - 51.4242895 - ], - [ - -3.5855774, - 51.41468 - ], - [ - -3.5778727, - 51.3329177 - ], - [ - -3.0796364, - 51.3329177 - ], - [ - -3.0770682, - 51.2494018 - ], - [ - -3.7216935, - 51.2381477 - ], - [ - -3.7216935, - 51.2558315 - ], - [ - -3.8706508, - 51.2558315 - ], - [ - -3.8680825, - 51.2365398 - ], - [ - -4.2944084, - 51.2252825 - ], - [ - -4.289272, - 51.0496352 - ], - [ - -4.5692089, - 51.0431767 - ], - [ - -4.5624122, - 50.9497388 - ], - [ - -4.5905604, - 50.9520269 - ], - [ - -4.5896524, - 50.8627065 - ], - [ - -4.6296046, - 50.8592677 - ], - [ - -4.6226411, - 50.7691513 - ], - [ - -4.6952816, - 50.7680028 - ], - [ - -4.6934655, - 50.6967379 - ], - [ - -4.8342064, - 50.6938621 - ], - [ - -4.8296664, - 50.6046231 - ], - [ - -4.9676833, - 50.6000126 - ], - [ - -4.9685913, - 50.5821427 - ], - [ - -5.1084242, - 50.5786832 - ], - [ - -5.1029762, - 50.4892254 - ], - [ - -5.1311244, - 50.48807 - ], - [ - -5.1274923, - 50.4163798 - ], - [ - -5.2664172, - 50.4117509 - ], - [ - -5.2609692, - 50.3034214 - ], - [ - -5.5124868, - 50.2976214 - ], - [ - -5.5061308, - 50.2256428 - ], - [ - -5.6468717, - 50.2209953 - ] - ], - [ - [ - -5.1336607, - 55.2630226 - ], - [ - -5.1021999, - 55.2639372 - ], - [ - -5.0999527, - 55.2458239 - ], - [ - -5.1322161, - 55.2446343 - ] - ], - [ - [ - -5.6431878, - 55.5095745 - ], - [ - -5.4861028, - 55.5126594 - ], - [ - -5.4715747, - 55.3348829 - ], - [ - -5.6277517, - 55.3302345 - ] - ], - [ - [ - -4.7213517, - 51.2180246 - ], - [ - -4.5804201, - 51.2212417 - ], - [ - -4.5746416, - 51.1306736 - ], - [ - -4.7174993, - 51.1280545 - ] - ], - [ - [ - -5.1608796, - 55.4153626 - ], - [ - -5.0045387, - 55.4190069 - ], - [ - -5.0184798, - 55.6153521 - ], - [ - -5.1755648, - 55.6138137 - ] - ] - ], - "terms_url": "http://geo.nls.uk/maps/", - "terms_text": "National Library of Scotland Historic Maps" - }, - { - "name": "NLS - OS 6-inch Scotland 1842-82", - "type": "tms", - "template": "http://geo.nls.uk/maps/os/six_inch/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 5, - 16 - ], - "polygon": [ - [ - [ - -5.2112173, - 54.8018593 - ], - [ - -5.0642752, - 54.8026508 - ], - [ - -5.0560354, - 54.6305176 - ], - [ - -4.3158316, - 54.6297227 - ], - [ - -4.3117117, - 54.7448258 - ], - [ - -3.8530325, - 54.7464112 - ], - [ - -3.8530325, - 54.8034424 - ], - [ - -3.5522818, - 54.8034424 - ], - [ - -3.5522818, - 54.8374644 - ], - [ - -3.468511, - 54.8406277 - ], - [ - -3.4657644, - 54.8983158 - ], - [ - -3.3847403, - 54.8991055 - ], - [ - -3.3888601, - 54.9559214 - ], - [ - -3.0920786, - 54.9539468 - ], - [ - -3.0392359, - 54.9923274 - ], - [ - -3.0212713, - 55.0493881 - ], - [ - -2.9591232, - 55.0463283 - ], - [ - -2.9202807, - 55.0666294 - ], - [ - -2.7857081, - 55.068652 - ], - [ - -2.7852225, - 55.0914426 - ], - [ - -2.7337562, - 55.0922761 - ], - [ - -2.737616, - 55.151204 - ], - [ - -2.7648395, - 55.1510672 - ], - [ - -2.7013114, - 55.1722505 - ], - [ - -2.6635459, - 55.2192808 - ], - [ - -2.6460364, - 55.2188891 - ], - [ - -2.629042, - 55.2233933 - ], - [ - -2.6317886, - 55.2287781 - ], - [ - -2.6235488, - 55.2446345 - ], - [ - -2.6197723, - 55.2454663 - ], - [ - -2.6099017, - 55.2454174 - ], - [ - -2.6099876, - 55.2486466 - ], - [ - -2.6408121, - 55.2590039 - ], - [ - -2.6247896, - 55.2615631 - ], - [ - -2.6045186, - 55.2823081 - ], - [ - -2.5693176, - 55.296132 - ], - [ - -2.5479542, - 55.3121617 - ], - [ - -2.5091116, - 55.3234891 - ], - [ - -2.4780376, - 55.3494471 - ], - [ - -2.4421083, - 55.3533118 - ], - [ - -2.4052079, - 55.3439256 - ], - [ - -2.3726772, - 55.3447539 - ], - [ - -2.3221819, - 55.3687665 - ], - [ - -2.3241241, - 55.3999337 - ], - [ - -2.2576062, - 55.425015 - ], - [ - -2.1985547, - 55.4273529 - ], - [ - -2.1484296, - 55.4717466 - ], - [ - -2.1944348, - 55.484199 - ], - [ - -2.2040479, - 55.529306 - ], - [ - -2.2960584, - 55.6379722 - ], - [ - -2.2177808, - 55.6379722 - ], - [ - -2.1059266, - 55.7452498 - ], - [ - -1.9716874, - 55.7462161 - ], - [ - -1.9697453, - 55.9190951 - ], - [ - -2.1201694, - 55.9207115 - ], - [ - -2.1242893, - 55.9776133 - ], - [ - -2.3440159, - 55.9783817 - ], - [ - -2.3440159, - 56.0390349 - ], - [ - -2.5046909, - 56.0413363 - ], - [ - -2.500571, - 56.1003588 - ], - [ - -2.8823459, - 56.0957629 - ], - [ - -2.8823459, - 56.1722898 - ], - [ - -2.4126804, - 56.1692316 - ], - [ - -2.4181736, - 56.2334017 - ], - [ - -2.5857151, - 56.2303484 - ], - [ - -2.5719822, - 56.3416356 - ], - [ - -2.7257908, - 56.3462022 - ], - [ - -2.7312839, - 56.4343808 - ], - [ - -2.6928318, - 56.4343808 - ], - [ - -2.6928318, - 56.4859769 - ], - [ - -2.5307834, - 56.4935587 - ], - [ - -2.5307834, - 56.570806 - ], - [ - -2.5302878, - 56.6047947 - ], - [ - -2.3732428, - 56.6044452 - ], - [ - -2.3684363, - 56.7398824 - ], - [ - -2.3292975, - 56.7398824 - ], - [ - -2.3292975, - 56.7888065 - ], - [ - -2.3145346, - 56.7891826 - ], - [ - -2.3148779, - 56.7967036 - ], - [ - -2.171369, - 56.7967036 - ], - [ - -2.1703979, - 56.9710595 - ], - [ - -2.0101725, - 56.9694716 - ], - [ - -2.0101725, - 57.0846832 - ], - [ - -2.0817687, - 57.085349 - ], - [ - -2.0488097, - 57.1259963 - ], - [ - -2.0409133, - 57.126369 - ], - [ - -2.0383434, - 57.2411129 - ], - [ - -1.878118, - 57.2421638 - ], - [ - -1.8771469, - 57.2978175 - ], - [ - -1.9868771, - 57.2983422 - ], - [ - -1.9082209, - 57.3560063 - ], - [ - -1.8752048, - 57.3560063 - ], - [ - -1.8761758, - 57.3769527 - ], - [ - -1.8120857, - 57.4120111 - ], - [ - -1.7120661, - 57.4120111 - ], - [ - -1.7034646, - 57.6441388 - ], - [ - -1.8666032, - 57.6451781 - ], - [ - -1.8646611, - 57.7033351 - ], - [ - -3.1204292, - 57.7064705 - ], - [ - -3.1218025, - 57.7504652 - ], - [ - -3.4445259, - 57.7526635 - ], - [ - -3.4472724, - 57.7138067 - ], - [ - -3.5145637, - 57.7094052 - ], - [ - -3.5118171, - 57.6939956 - ], - [ - -3.7645027, - 57.6917938 - ], - [ - -3.7672492, - 57.6344975 - ], - [ - -3.842378, - 57.6288312 - ], - [ - -3.8438346, - 57.5965825 - ], - [ - -3.9414265, - 57.5916386 - ], - [ - -3.9404554, - 57.6537782 - ], - [ - -3.8894746, - 57.6529989 - ], - [ - -3.8826772, - 57.7676408 - ], - [ - -3.7224517, - 57.766087 - ], - [ - -3.7195385, - 57.8819201 - ], - [ - -3.9146888, - 57.8853352 - ], - [ - -3.916062, - 57.9546243 - ], - [ - -3.745774, - 57.9538956 - ], - [ - -3.7471473, - 58.0688409 - ], - [ - -3.5837256, - 58.0695672 - ], - [ - -3.5837256, - 58.1116689 - ], - [ - -3.4560096, - 58.1138452 - ], - [ - -3.4544646, - 58.228503 - ], - [ - -3.4379851, - 58.2283222 - ], - [ - -3.4243233, - 58.2427725 - ], - [ - -3.412307, - 58.2438567 - ], - [ - -3.3735115, - 58.2695057 - ], - [ - -3.3063919, - 58.2862038 - ], - [ - -3.1229154, - 58.2859395 - ], - [ - -3.123602, - 58.3443661 - ], - [ - -2.9574338, - 58.3447264 - ], - [ - -2.951254, - 58.6422011 - ], - [ - -2.8812162, - 58.6429157 - ], - [ - -2.8851004, - 58.8112825 - ], - [ - -2.7180775, - 58.8142997 - ], - [ - -2.7161354, - 58.8715749 - ], - [ - -2.556881, - 58.8775984 - ], - [ - -2.5544533, - 58.9923453 - ], - [ - -2.5567617, - 59.0483775 - ], - [ - -2.391893, - 59.0485996 - ], - [ - -2.3918002, - 59.1106996 - ], - [ - -2.4733695, - 59.1106996 - ], - [ - -2.5591563, - 59.1783028 - ], - [ - -2.5630406, - 59.2210646 - ], - [ - -2.3921334, - 59.224046 - ], - [ - -2.3911409, - 59.2740075 - ], - [ - -2.3639512, - 59.2745036 - ], - [ - -2.3658933, - 59.285417 - ], - [ - -2.3911409, - 59.284921 - ], - [ - -2.3911409, - 59.3379505 - ], - [ - -2.2221759, - 59.3381981 - ], - [ - -2.2233897, - 59.395965 - ], - [ - -2.3758467, - 59.396583 - ], - [ - -2.3899271, - 59.4026383 - ], - [ - -2.4008516, - 59.3962122 - ], - [ - -2.5637882, - 59.3952604 - ], - [ - -2.5637882, - 59.3385811 - ], - [ - -2.7320164, - 59.3375306 - ], - [ - -2.7333896, - 59.3952604 - ], - [ - -3.0726511, - 59.3931174 - ], - [ - -3.0703404, - 59.3354759 - ], - [ - -3.0753186, - 59.3355634 - ], - [ - -3.0749753, - 59.3292593 - ], - [ - -3.0698254, - 59.3289091 - ], - [ - -3.069801, - 59.2196159 - ], - [ - -3.2363384, - 59.2166341 - ], - [ - -3.2336751, - 59.1606496 - ], - [ - -3.4032766, - 59.1588895 - ], - [ - -3.394086, - 58.9279316 - ], - [ - -3.5664497, - 58.9259268 - ], - [ - -3.5611089, - 58.8679885 - ], - [ - -3.392508, - 58.8699339 - ], - [ - -3.3894734, - 58.8698711 - ], - [ - -3.3891093, - 58.8684905 - ], - [ - -3.3912942, - 58.868616 - ], - [ - -3.3884161, - 58.7543084 - ], - [ - -3.2238208, - 58.7555677 - ], - [ - -3.2189655, - 58.691289 - ], - [ - -3.4634113, - 58.6905753 - ], - [ - -3.4551716, - 58.6341518 - ], - [ - -3.787508, - 58.6341518 - ], - [ - -3.7861347, - 58.5769211 - ], - [ - -3.9028645, - 58.5733411 - ], - [ - -3.9028645, - 58.6477304 - ], - [ - -4.0690327, - 58.6491594 - ], - [ - -4.0690327, - 58.5912376 - ], - [ - -4.7364521, - 58.5933845 - ], - [ - -4.7364521, - 58.6505884 - ], - [ - -5.0715351, - 58.6520173 - ], - [ - -5.0654779, - 58.5325854 - ], - [ - -5.2332047, - 58.5316087 - ], - [ - -5.2283494, - 58.4719947 - ], - [ - -5.2424298, - 58.4719947 - ], - [ - -5.2366034, - 58.4089731 - ], - [ - -5.2283494, - 58.4094818 - ], - [ - -5.2210664, - 58.3005859 - ], - [ - -5.5657939, - 58.2959933 - ], - [ - -5.5580254, - 58.2372573 - ], - [ - -5.4146722, - 58.2401326 - ], - [ - -5.4141866, - 58.2267768 - ], - [ - -5.3885749, - 58.2272242 - ], - [ - -5.382714, - 58.1198615 - ], - [ - -5.51043, - 58.1191362 - ], - [ - -5.5114011, - 58.006214 - ], - [ - -5.6745397, - 58.0041559 - ], - [ - -5.6716266, - 57.9449366 - ], - [ - -5.6716266, - 57.8887166 - ], - [ - -5.8347652, - 57.8856193 - ], - [ - -5.8277052, - 57.5988958 - ], - [ - -6.0384259, - 57.5986357 - ], - [ - -6.0389115, - 57.6459559 - ], - [ - -6.1981658, - 57.6456961 - ], - [ - -6.2076123, - 57.7600132 - ], - [ - -6.537067, - 57.7544033 - ], - [ - -6.5312406, - 57.6402392 - ], - [ - -6.7002056, - 57.6360809 - ], - [ - -6.6807844, - 57.5236293 - ], - [ - -6.8516915, - 57.5152857 - ], - [ - -6.8361545, - 57.3385811 - ], - [ - -6.6730158, - 57.3438213 - ], - [ - -6.674958, - 57.2850883 - ], - [ - -6.5098772, - 57.2850883 - ], - [ - -6.4982244, - 57.1757637 - ], - [ - -6.3506228, - 57.1820797 - ], - [ - -6.3312015, - 57.1251969 - ], - [ - -6.1797156, - 57.1230884 - ], - [ - -6.1719471, - 57.0682265 - ], - [ - -6.4593819, - 57.059779 - ], - [ - -6.4564687, - 57.1093806 - ], - [ - -6.6671895, - 57.1062165 - ], - [ - -6.6730158, - 57.002708 - ], - [ - -6.5021087, - 57.0048233 - ], - [ - -6.4836097, - 56.8917522 - ], - [ - -6.3266104, - 56.8894062 - ], - [ - -6.3156645, - 56.7799312 - ], - [ - -6.2146739, - 56.775675 - ], - [ - -6.2146739, - 56.7234965 - ], - [ - -6.6866107, - 56.7224309 - ], - [ - -6.6769001, - 56.6114413 - ], - [ - -6.8419809, - 56.607166 - ], - [ - -6.8400387, - 56.5483307 - ], - [ - -7.1546633, - 56.5461895 - ], - [ - -7.1488369, - 56.4872592 - ], - [ - -6.9915246, - 56.490476 - ], - [ - -6.9876404, - 56.4325329 - ], - [ - -6.6827265, - 56.4314591 - ], - [ - -6.6769001, - 56.5472601 - ], - [ - -6.5292985, - 56.5504717 - ], - [ - -6.5234721, - 56.4379018 - ], - [ - -6.3661598, - 56.4368281 - ], - [ - -6.3642177, - 56.3766524 - ], - [ - -6.5273563, - 56.3712749 - ], - [ - -6.5171745, - 56.2428427 - ], - [ - -6.4869621, - 56.247421 - ], - [ - -6.4869621, - 56.1893882 - ], - [ - -6.3001945, - 56.1985572 - ], - [ - -6.3029411, - 56.2581017 - ], - [ - -5.9019401, - 56.256576 - ], - [ - -5.8964469, - 56.0960466 - ], - [ - -6.0282829, - 56.0883855 - ], - [ - -6.0392692, - 56.1557502 - ], - [ - -6.3853385, - 56.1542205 - ], - [ - -6.3606193, - 55.96099 - ], - [ - -6.2123039, - 55.9640647 - ], - [ - -6.2047508, - 55.9202269 - ], - [ - -6.5185478, - 55.9129158 - ], - [ - -6.5061881, - 55.7501763 - ], - [ - -6.6764762, - 55.7409005 - ], - [ - -6.6599967, - 55.6263176 - ], - [ - -6.3551261, - 55.6232161 - ], - [ - -6.3578727, - 55.5689002 - ], - [ - -6.0392692, - 55.5720059 - ], - [ - -6.0310294, - 55.6247669 - ], - [ - -5.7398917, - 55.6309694 - ], - [ - -5.7371452, - 55.4569279 - ], - [ - -5.8964469, - 55.4600426 - ], - [ - -5.8964469, - 55.2789864 - ], - [ - -5.4350211, - 55.2821151 - ], - [ - -5.4405143, - 55.4506979 - ], - [ - -5.2867057, - 55.4569279 - ], - [ - -5.3086784, - 55.4070602 - ], - [ - -4.9735954, - 55.4008223 - ], - [ - -4.9845817, - 55.2038242 - ], - [ - -5.1493766, - 55.2038242 - ], - [ - -5.1411369, - 55.037337 - ], - [ - -5.2152946, - 55.0341891 - ] - ], - [ - [ - -2.1646559, - 60.1622059 - ], - [ - -1.9930299, - 60.1609801 - ], - [ - -1.9946862, - 60.1035151 - ], - [ - -2.1663122, - 60.104743 - ] - ], - [ - [ - -1.5360658, - 59.8570831 - ], - [ - -1.3653566, - 59.8559841 - ], - [ - -1.366847, - 59.7975565 - ], - [ - -1.190628, - 59.7964199 - ], - [ - -1.1862046, - 59.9695391 - ], - [ - -1.0078652, - 59.9683948 - ], - [ - -1.0041233, - 60.114145 - ], - [ - -0.8360832, - 60.1130715 - ], - [ - -0.834574, - 60.1716772 - ], - [ - -1.0074262, - 60.1727795 - ], - [ - -1.0052165, - 60.2583924 - ], - [ - -0.8299659, - 60.2572778 - ], - [ - -0.826979, - 60.3726551 - ], - [ - -0.6507514, - 60.3715381 - ], - [ - -0.6477198, - 60.4882292 - ], - [ - -0.9984896, - 60.4904445 - ], - [ - -0.9970279, - 60.546555 - ], - [ - -0.6425288, - 60.5443201 - ], - [ - -0.6394896, - 60.6606792 - ], - [ - -0.8148133, - 60.6617806 - ], - [ - -0.8132987, - 60.7196112 - ], - [ - -0.6383298, - 60.7185141 - ], - [ - -0.635467, - 60.8275393 - ], - [ - -0.797568, - 60.8285523 - ], - [ - -0.9941426, - 60.8297807 - ], - [ - -0.9954966, - 60.7782667 - ], - [ - -1.1670282, - 60.7793403 - ], - [ - -1.1700357, - 60.6646181 - ], - [ - -1.5222599, - 60.6668304 - ], - [ - -1.5237866, - 60.6084426 - ], - [ - -1.6975673, - 60.609536 - ], - [ - -1.7021271, - 60.4345249 - ], - [ - -1.5260578, - 60.4334111 - ], - [ - -1.5275203, - 60.3770719 - ], - [ - -1.8751127, - 60.3792746 - ], - [ - -1.8781372, - 60.2624647 - ], - [ - -1.7019645, - 60.2613443 - ], - [ - -1.7049134, - 60.1470532 - ], - [ - -1.528659, - 60.1459283 - ] - ], - [ - [ - -0.9847667, - 60.8943762 - ], - [ - -0.9860347, - 60.8361105 - ], - [ - -0.8078362, - 60.8351904 - ], - [ - -0.8065683, - 60.8934578 - ] - ], - [ - [ - -7.7696901, - 56.8788231 - ], - [ - -7.7614504, - 56.7608274 - ], - [ - -7.6009049, - 56.7641903 - ], - [ - -7.5972473, - 56.819332 - ], - [ - -7.4479894, - 56.8203948 - ], - [ - -7.4489319, - 56.8794098 - ], - [ - -7.2841369, - 56.8794098 - ], - [ - -7.2813904, - 57.0471152 - ], - [ - -7.1303283, - 57.0515969 - ], - [ - -7.1330749, - 57.511801 - ], - [ - -6.96828, - 57.5147514 - ], - [ - -6.9765198, - 57.6854668 - ], - [ - -6.8062317, - 57.6913392 - ], - [ - -6.8089782, - 57.8041985 - ], - [ - -6.6496765, - 57.8071252 - ], - [ - -6.6441833, - 57.8612267 - ], - [ - -6.3200866, - 57.8626878 - ], - [ - -6.3200866, - 58.1551617 - ], - [ - -6.1607849, - 58.1522633 - ], - [ - -6.1552917, - 58.20874 - ], - [ - -5.9850036, - 58.2101869 - ], - [ - -5.9904968, - 58.2680163 - ], - [ - -6.1497986, - 58.2665717 - ], - [ - -6.1415588, - 58.5557514 - ], - [ - -6.3173401, - 58.5557514 - ], - [ - -6.3091003, - 58.4983923 - ], - [ - -6.4876282, - 58.4955218 - ], - [ - -6.4876282, - 58.4423768 - ], - [ - -6.6606628, - 58.4395018 - ], - [ - -6.6469299, - 58.3819525 - ], - [ - -6.8117248, - 58.3805125 - ], - [ - -6.8117248, - 58.3286357 - ], - [ - -6.9792663, - 58.3286357 - ], - [ - -6.9710266, - 58.2694608 - ], - [ - -7.1413147, - 58.2680163 - ], - [ - -7.1403816, - 58.0358742 - ], - [ - -7.3020636, - 58.0351031 - ], - [ - -7.3030347, - 57.9774797 - ], - [ - -7.1379539, - 57.9777372 - ], - [ - -7.1413526, - 57.9202792 - ], - [ - -7.1398961, - 57.8640206 - ], - [ - -7.3020636, - 57.862471 - ], - [ - -7.298484, - 57.7442293 - ], - [ - -7.4509193, - 57.7456951 - ], - [ - -7.4550392, - 57.6899522 - ], - [ - -7.6186131, - 57.6906048 - ], - [ - -7.6198341, - 57.7456951 - ], - [ - -7.7901222, - 57.7442293 - ], - [ - -7.7873756, - 57.6855477 - ], - [ - -7.6222332, - 57.6853817 - ], - [ - -7.6173779, - 57.5712602 - ], - [ - -7.788285, - 57.5709998 - ], - [ - -7.7892561, - 57.512109 - ], - [ - -7.7038025, - 57.5115874 - ], - [ - -7.6999183, - 57.4546902 - ], - [ - -7.5367796, - 57.4552126 - ], - [ - -7.5348375, - 57.5126306 - ], - [ - -7.4581235, - 57.5131521 - ], - [ - -7.4552103, - 57.2824165 - ], - [ - -7.6115515, - 57.2845158 - ], - [ - -7.6144647, - 57.2272651 - ], - [ - -7.451326, - 57.2256881 - ], - [ - -7.451326, - 57.1103873 - ], - [ - -7.6164068, - 57.1088053 - ], - [ - -7.603783, - 56.8792358 - ] - ], - [ - [ - -1.7106618, - 59.5626284 - ], - [ - -1.5417509, - 59.562215 - ], - [ - -1.5423082, - 59.5037224 - ], - [ - -1.7112191, - 59.5041365 - ] - ] - ], - "terms_url": "http://geo.nls.uk/maps/", - "terms_text": "National Library of Scotland Historic Maps" - }, - { - "name": "New & Misaligned TIGER Roads", - "type": "tms", - "description": "At zoom level 16+, public domain map data from the US Census. At lower zooms, only changes since 2006 minus changes already incorporated into OpenStreetMap", - "template": "http://{switch:a,b,c}.tiles.mapbox.com/v4/enf.e0b8291e/{zoom}/{x}/{y}.png?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJhNVlHd29ZIn0.ti6wATGDWOmCnCYen-Ip7Q", - "scaleExtent": [ - 0, - 22 - ], - "polygon": [ - [ - [ - -124.7617886, - 48.4130148 - ], - [ - -124.6059492, - 45.90245 - ], - [ - -124.9934269, - 40.0557614 - ], - [ - -122.5369737, - 36.8566086 - ], - [ - -119.9775867, - 33.0064099 - ], - [ - -117.675935, - 32.4630223 - ], - [ - -114.8612307, - 32.4799891 - ], - [ - -111.0089311, - 31.336015 - ], - [ - -108.1992687, - 31.3260016 - ], - [ - -108.1871123, - 31.7755116 - ], - [ - -106.5307225, - 31.7820947 - ], - [ - -106.4842052, - 31.7464455 - ], - [ - -106.429317, - 31.7520583 - ], - [ - -106.2868855, - 31.5613291 - ], - [ - -106.205248, - 31.446704 - ], - [ - -105.0205259, - 30.5360988 - ], - [ - -104.5881916, - 29.6997856 - ], - [ - -103.2518856, - 28.8908685 - ], - [ - -102.7173632, - 29.3920567 - ], - [ - -102.1513983, - 29.7475702 - ], - [ - -101.2552871, - 29.4810523 - ], - [ - -100.0062436, - 28.0082173 - ], - [ - -99.2351068, - 26.4475962 - ], - [ - -98.0109067, - 25.9928035 - ], - [ - -97.435024, - 25.8266009 - ], - [ - -96.9555259, - 25.9821589 - ], - [ - -96.8061741, - 27.7978168 - ], - [ - -95.5563349, - 28.5876066 - ], - [ - -93.7405308, - 29.4742093 - ], - [ - -90.9028456, - 28.8564513 - ], - [ - -88.0156706, - 28.9944338 - ], - [ - -88.0162494, - 30.0038862 - ], - [ - -86.0277506, - 30.0047454 - ], - [ - -84.0187909, - 28.9961781 - ], - [ - -81.9971976, - 25.9826768 - ], - [ - -81.9966618, - 25.0134917 - ], - [ - -84.0165592, - 25.0125783 - ], - [ - -84.0160068, - 24.0052745 - ], - [ - -80.0199985, - 24.007096 - ], - [ - -79.8901116, - 26.8550713 - ], - [ - -80.0245309, - 32.0161282 - ], - [ - -75.4147385, - 35.0531894 - ], - [ - -74.0211163, - 39.5727927 - ], - [ - -72.002019, - 40.9912464 - ], - [ - -69.8797398, - 40.9920457 - ], - [ - -69.8489304, - 43.2619916 - ], - [ - -66.9452845, - 44.7104937 - ], - [ - -67.7596632, - 47.0990024 - ], - [ - -69.2505131, - 47.5122328 - ], - [ - -70.4614886, - 46.2176574 - ], - [ - -71.412273, - 45.254878 - ], - [ - -72.0222508, - 45.0059846 - ], - [ - -75.0798841, - 44.9802854 - ], - [ - -76.9023061, - 43.8024568 - ], - [ - -78.7623935, - 43.6249578 - ], - [ - -79.15798, - 43.4462589 - ], - [ - -79.0060087, - 42.8005317 - ], - [ - -82.662475, - 41.6889458 - ], - [ - -82.1761642, - 43.588535 - ], - [ - -83.2813977, - 46.138853 - ], - [ - -87.5064535, - 48.0142702 - ], - [ - -88.3492194, - 48.2963271 - ], - [ - -89.4353148, - 47.9837822 - ], - [ - -93.9981078, - 49.0067142 - ], - [ - -95.1105379, - 49.412004 - ], - [ - -96.0131199, - 49.0060547 - ], - [ - -123.3228926, - 49.0042878 - ], - [ - -123.2275233, - 48.1849927 - ] - ], - [ - [ - -160.5787616, - 22.5062947 - ], - [ - -160.5782192, - 21.4984647 - ], - [ - -158.7470604, - 21.2439843 - ], - [ - -157.5083185, - 20.995803 - ], - [ - -155.9961942, - 18.7790194 - ], - [ - -154.6217803, - 18.7586966 - ], - [ - -154.6890176, - 19.8805722 - ], - [ - -156.2927622, - 21.2225888 - ], - [ - -157.5047384, - 21.9984962 - ], - [ - -159.0093692, - 22.5070181 - ] - ], - [ - [ - -167.1571546, - 68.721974 - ], - [ - -164.8553982, - 67.0255078 - ], - [ - -168.002195, - 66.0017503 - ], - [ - -169.0087448, - 66.001546 - ], - [ - -169.0075381, - 64.9987675 - ], - [ - -172.5143281, - 63.8767267 - ], - [ - -173.8197023, - 59.74014 - ], - [ - -162.5018149, - 58.0005815 - ], - [ - -160.0159024, - 58.0012389 - ], - [ - -160.0149725, - 57.000035 - ], - [ - -160.5054788, - 56.9999017 - ], - [ - -165.8092575, - 54.824847 - ], - [ - -178.000097, - 52.2446469 - ], - [ - -177.9992996, - 51.2554252 - ], - [ - -171.4689067, - 51.8215329 - ], - [ - -162.40251, - 53.956664 - ], - [ - -159.0075717, - 55.002502 - ], - [ - -158.0190709, - 55.0027849 - ], - [ - -151.9963213, - 55.9991902 - ], - [ - -151.500341, - 57.9987853 - ], - [ - -151.5012894, - 58.9919816 - ], - [ - -138.5159989, - 58.9953194 - ], - [ - -138.5150471, - 57.9986434 - ], - [ - -133.9948193, - 54.0031685 - ], - [ - -130.0044418, - 54.0043387 - ], - [ - -130.0070826, - 57.0000507 - ], - [ - -131.975877, - 56.9995156 - ], - [ - -135.1229873, - 59.756601 - ], - [ - -138.0071813, - 59.991805 - ], - [ - -139.1715881, - 60.4127229 - ], - [ - -140.9874011, - 61.0118551 - ], - [ - -140.9683975, - 69.9535069 - ], - [ - -156.176891, - 71.5633329 - ], - [ - -160.413634, - 70.7397728 - ], - [ - -163.0218273, - 69.9707435 - ], - [ - -164.9717003, - 68.994689 - ] - ] - ], - "overlay": true - }, - { - "name": "OS 1:25k historic (OSM)", - "type": "tms", - "template": "http://ooc.openstreetmap.org/os1/{zoom}/{x}/{y}.jpg", - "scaleExtent": [ - 6, - 17 - ], - "polygon": [ - [ - [ - -9, - 49.8 - ], - [ - -9, - 61.1 - ], - [ - 1.9, - 61.1 - ], - [ - 1.9, - 49.8 - ], - [ - -9, - 49.8 - ] - ] - ] - }, - { - "name": "OS New Popular Edition historic", - "type": "tms", - "template": "http://ooc.openstreetmap.org/npe/{zoom}/{x}/{y}.png", - "polygon": [ - [ - [ - -5.8, - 49.8 - ], - [ - -5.8, - 55.8 - ], - [ - 1.9, - 55.8 - ], - [ - 1.9, - 49.8 - ], - [ - -5.8, - 49.8 - ] - ] - ] - }, - { - "name": "OS OpenData Locator", - "type": "tms", - "template": "http://tiles.itoworld.com/os_locator/{zoom}/{x}/{y}.png", - "polygon": [ - [ - [ - -9, - 49.8 - ], - [ - -9, - 61.1 - ], - [ - 1.9, - 61.1 - ], - [ - 1.9, - 49.8 - ], - [ - -9, - 49.8 - ] - ] - ], - "overlay": true - }, - { - "name": "OS OpenData StreetView", - "type": "tms", - "template": "http://os.openstreetmap.org/sv/{zoom}/{x}/{y}.png", - "scaleExtent": [ - 1, - 18 - ], - "polygon": [ - [ - [ - -5.8292886, - 50.0229734 - ], - [ - -5.8292886, - 50.254819 - ], - [ - -5.373356, - 50.254819 - ], - [ - -5.373356, - 50.3530588 - ], - [ - -5.1756021, - 50.3530588 - ], - [ - -5.1756021, - 50.5925406 - ], - [ - -4.9970743, - 50.5925406 - ], - [ - -4.9970743, - 50.6935617 - ], - [ - -4.7965738, - 50.6935617 - ], - [ - -4.7965738, - 50.7822112 - ], - [ - -4.6949503, - 50.7822112 - ], - [ - -4.6949503, - 50.9607371 - ], - [ - -4.6043131, - 50.9607371 - ], - [ - -4.6043131, - 51.0692066 - ], - [ - -4.3792215, - 51.0692066 - ], - [ - -4.3792215, - 51.2521782 - ], - [ - -3.9039346, - 51.2521782 - ], - [ - -3.9039346, - 51.2916998 - ], - [ - -3.7171671, - 51.2916998 - ], - [ - -3.7171671, - 51.2453014 - ], - [ - -3.1486246, - 51.2453014 - ], - [ - -3.1486246, - 51.362067 - ], - [ - -3.7446329, - 51.362067 - ], - [ - -3.7446329, - 51.4340386 - ], - [ - -3.8297769, - 51.4340386 - ], - [ - -3.8297769, - 51.5298246 - ], - [ - -4.0852091, - 51.5298246 - ], - [ - -4.0852091, - 51.4939284 - ], - [ - -4.3792215, - 51.4939284 - ], - [ - -4.3792215, - 51.5427168 - ], - [ - -5.1444195, - 51.5427168 - ], - [ - -5.1444195, - 51.6296003 - ], - [ - -5.7387103, - 51.6296003 - ], - [ - -5.7387103, - 51.774037 - ], - [ - -5.5095393, - 51.774037 - ], - [ - -5.5095393, - 51.9802596 - ], - [ - -5.198799, - 51.9802596 - ], - [ - -5.198799, - 52.0973358 - ], - [ - -4.8880588, - 52.0973358 - ], - [ - -4.8880588, - 52.1831557 - ], - [ - -4.4957492, - 52.1831557 - ], - [ - -4.4957492, - 52.2925739 - ], - [ - -4.3015365, - 52.2925739 - ], - [ - -4.3015365, - 52.3685318 - ], - [ - -4.1811246, - 52.3685318 - ], - [ - -4.1811246, - 52.7933685 - ], - [ - -4.4413696, - 52.7933685 - ], - [ - -4.4413696, - 52.7369614 - ], - [ - -4.8569847, - 52.7369614 - ], - [ - -4.8569847, - 52.9317255 - ], - [ - -4.7288044, - 52.9317255 - ], - [ - -4.7288044, - 53.5038599 - ], - [ - -4.1578191, - 53.5038599 - ], - [ - -4.1578191, - 53.4113498 - ], - [ - -3.3110518, - 53.4113498 - ], - [ - -3.3110518, - 53.5038599 - ], - [ - -3.2333667, - 53.5038599 - ], - [ - -3.2333667, - 54.0159169 - ], - [ - -3.3926211, - 54.0159169 - ], - [ - -3.3926211, - 54.1980953 - ], - [ - -3.559644, - 54.1980953 - ], - [ - -3.559644, - 54.433732 - ], - [ - -3.7188984, - 54.433732 - ], - [ - -3.7188984, - 54.721897 - ], - [ - -4.3015365, - 54.721897 - ], - [ - -4.3015365, - 54.6140739 - ], - [ - -5.0473132, - 54.6140739 - ], - [ - -5.0473132, - 54.7532915 - ], - [ - -5.2298731, - 54.7532915 - ], - [ - -5.2298731, - 55.2190799 - ], - [ - -5.6532567, - 55.2190799 - ], - [ - -5.6532567, - 55.250088 - ], - [ - -5.8979647, - 55.250088 - ], - [ - -5.8979647, - 55.4822462 - ], - [ - -6.5933212, - 55.4822462 - ], - [ - -6.5933212, - 56.3013441 - ], - [ - -7.1727691, - 56.3013441 - ], - [ - -7.1727691, - 56.5601822 - ], - [ - -6.8171722, - 56.5601822 - ], - [ - -6.8171722, - 56.6991713 - ], - [ - -6.5315276, - 56.6991713 - ], - [ - -6.5315276, - 56.9066964 - ], - [ - -6.811679, - 56.9066964 - ], - [ - -6.811679, - 57.3716613 - ], - [ - -6.8721038, - 57.3716613 - ], - [ - -6.8721038, - 57.5518893 - ], - [ - -7.0973235, - 57.5518893 - ], - [ - -7.0973235, - 57.2411085 - ], - [ - -7.1742278, - 57.2411085 - ], - [ - -7.1742278, - 56.9066964 - ], - [ - -7.3719817, - 56.9066964 - ], - [ - -7.3719817, - 56.8075885 - ], - [ - -7.5202972, - 56.8075885 - ], - [ - -7.5202972, - 56.7142479 - ], - [ - -7.8306806, - 56.7142479 - ], - [ - -7.8306806, - 56.8994605 - ], - [ - -7.6494061, - 56.8994605 - ], - [ - -7.6494061, - 57.4739617 - ], - [ - -7.8306806, - 57.4739617 - ], - [ - -7.8306806, - 57.7915584 - ], - [ - -7.4736249, - 57.7915584 - ], - [ - -7.4736249, - 58.086063 - ], - [ - -7.1879804, - 58.086063 - ], - [ - -7.1879804, - 58.367197 - ], - [ - -6.8034589, - 58.367197 - ], - [ - -6.8034589, - 58.4155786 - ], - [ - -6.638664, - 58.4155786 - ], - [ - -6.638664, - 58.4673277 - ], - [ - -6.5178143, - 58.4673277 - ], - [ - -6.5178143, - 58.5625632 - ], - [ - -6.0536224, - 58.5625632 - ], - [ - -6.0536224, - 58.1568843 - ], - [ - -6.1470062, - 58.1568843 - ], - [ - -6.1470062, - 58.1105865 - ], - [ - -6.2799798, - 58.1105865 - ], - [ - -6.2799798, - 57.7122664 - ], - [ - -6.1591302, - 57.7122664 - ], - [ - -6.1591302, - 57.6667563 - ], - [ - -5.9339104, - 57.6667563 - ], - [ - -5.9339104, - 57.8892524 - ], - [ - -5.80643, - 57.8892524 - ], - [ - -5.80643, - 57.9621767 - ], - [ - -5.6141692, - 57.9621767 - ], - [ - -5.6141692, - 58.0911236 - ], - [ - -5.490819, - 58.0911236 - ], - [ - -5.490819, - 58.3733281 - ], - [ - -5.3199118, - 58.3733281 - ], - [ - -5.3199118, - 58.75015 - ], - [ - -3.5719977, - 58.75015 - ], - [ - -3.5719977, - 59.2091788 - ], - [ - -3.1944501, - 59.2091788 - ], - [ - -3.1944501, - 59.4759216 - ], - [ - -2.243583, - 59.4759216 - ], - [ - -2.243583, - 59.1388749 - ], - [ - -2.4611012, - 59.1388749 - ], - [ - -2.4611012, - 58.8185938 - ], - [ - -2.7407675, - 58.8185938 - ], - [ - -2.7407675, - 58.5804743 - ], - [ - -2.9116746, - 58.5804743 - ], - [ - -2.9116746, - 58.1157523 - ], - [ - -3.4865441, - 58.1157523 - ], - [ - -3.4865441, - 57.740386 - ], - [ - -1.7153245, - 57.740386 - ], - [ - -1.7153245, - 57.2225558 - ], - [ - -1.9794538, - 57.2225558 - ], - [ - -1.9794538, - 56.8760742 - ], - [ - -2.1658979, - 56.8760742 - ], - [ - -2.1658979, - 56.6333186 - ], - [ - -2.3601106, - 56.6333186 - ], - [ - -2.3601106, - 56.0477521 - ], - [ - -1.9794538, - 56.0477521 - ], - [ - -1.9794538, - 55.8650949 - ], - [ - -1.4745008, - 55.8650949 - ], - [ - -1.4745008, - 55.2499926 - ], - [ - -1.3221997, - 55.2499926 - ], - [ - -1.3221997, - 54.8221737 - ], - [ - -1.0550014, - 54.8221737 - ], - [ - -1.0550014, - 54.6746628 - ], - [ - -0.6618765, - 54.6746628 - ], - [ - -0.6618765, - 54.5527463 - ], - [ - -0.3247617, - 54.5527463 - ], - [ - -0.3247617, - 54.2865195 - ], - [ - 0.0092841, - 54.2865195 - ], - [ - 0.0092841, - 53.7938518 - ], - [ - 0.2081962, - 53.7938518 - ], - [ - 0.2081962, - 53.5217726 - ], - [ - 0.4163548, - 53.5217726 - ], - [ - 0.4163548, - 53.0298851 - ], - [ - 1.4273388, - 53.0298851 - ], - [ - 1.4273388, - 52.92021 - ], - [ - 1.8333912, - 52.92021 - ], - [ - 1.8333912, - 52.042488 - ], - [ - 1.5235504, - 52.042488 - ], - [ - 1.5235504, - 51.8261335 - ], - [ - 1.2697049, - 51.8261335 - ], - [ - 1.2697049, - 51.6967453 - ], - [ - 1.116651, - 51.6967453 - ], - [ - 1.116651, - 51.440346 - ], - [ - 1.5235504, - 51.440346 - ], - [ - 1.5235504, - 51.3331831 - ], - [ - 1.4507565, - 51.3331831 - ], - [ - 1.4507565, - 51.0207553 - ], - [ - 1.0699883, - 51.0207553 - ], - [ - 1.0699883, - 50.9008416 - ], - [ - 0.7788126, - 50.9008416 - ], - [ - 0.7788126, - 50.729843 - ], - [ - -0.7255952, - 50.729843 - ], - [ - -0.7255952, - 50.7038437 - ], - [ - -1.0074383, - 50.7038437 - ], - [ - -1.0074383, - 50.5736307 - ], - [ - -2.3625252, - 50.5736307 - ], - [ - -2.3625252, - 50.4846421 - ], - [ - -2.4987805, - 50.4846421 - ], - [ - -2.4987805, - 50.5736307 - ], - [ - -3.4096378, - 50.5736307 - ], - [ - -3.4096378, - 50.2057837 - ], - [ - -3.6922446, - 50.2057837 - ], - [ - -3.6922446, - 50.1347737 - ], - [ - -5.005468, - 50.1347737 - ], - [ - -5.005468, - 49.9474456 - ], - [ - -5.2839506, - 49.9474456 - ], - [ - -5.2839506, - 50.0229734 - ] - ], - [ - [ - -6.4580707, - 49.8673563 - ], - [ - -6.4580707, - 49.9499935 - ], - [ - -6.3978807, - 49.9499935 - ], - [ - -6.3978807, - 50.0053797 - ], - [ - -6.1799606, - 50.0053797 - ], - [ - -6.1799606, - 49.9168614 - ], - [ - -6.2540201, - 49.9168614 - ], - [ - -6.2540201, - 49.8673563 - ] - ], - [ - [ - -5.8343165, - 49.932156 - ], - [ - -5.8343165, - 49.9754641 - ], - [ - -5.7683254, - 49.9754641 - ], - [ - -5.7683254, - 49.932156 - ] - ], - [ - [ - -1.9483797, - 60.6885737 - ], - [ - -1.9483797, - 60.3058841 - ], - [ - -1.7543149, - 60.3058841 - ], - [ - -1.7543149, - 60.1284428 - ], - [ - -1.5754914, - 60.1284428 - ], - [ - -1.5754914, - 59.797917 - ], - [ - -1.0316959, - 59.797917 - ], - [ - -1.0316959, - 60.0354518 - ], - [ - -0.6626918, - 60.0354518 - ], - [ - -0.6626918, - 60.9103862 - ], - [ - -1.1034395, - 60.9103862 - ], - [ - -1.1034395, - 60.8040022 - ], - [ - -1.3506319, - 60.8040022 - ], - [ - -1.3506319, - 60.6885737 - ] - ], - [ - [ - -2.203381, - 60.1968568 - ], - [ - -2.203381, - 60.0929443 - ], - [ - -1.9864011, - 60.0929443 - ], - [ - -1.9864011, - 60.1968568 - ] - ], - [ - [ - -1.7543149, - 59.5698289 - ], - [ - -1.7543149, - 59.4639383 - ], - [ - -1.5373349, - 59.4639383 - ], - [ - -1.5373349, - 59.5698289 - ] - ], - [ - [ - -4.5585981, - 59.1370518 - ], - [ - -4.5585981, - 58.9569099 - ], - [ - -4.2867004, - 58.9569099 - ], - [ - -4.2867004, - 59.1370518 - ] - ], - [ - [ - -6.2787732, - 59.2025744 - ], - [ - -6.2787732, - 59.0227769 - ], - [ - -5.6650612, - 59.0227769 - ], - [ - -5.6650612, - 59.2025744 - ] - ], - [ - [ - -8.7163482, - 57.9440556 - ], - [ - -8.7163482, - 57.7305936 - ], - [ - -8.3592926, - 57.7305936 - ], - [ - -8.3592926, - 57.9440556 - ] - ], - [ - [ - -7.6077005, - 50.4021026 - ], - [ - -7.6077005, - 50.2688657 - ], - [ - -7.3907205, - 50.2688657 - ], - [ - -7.3907205, - 50.4021026 - ] - ], - [ - [ - -7.7304303, - 58.3579902 - ], - [ - -7.7304303, - 58.248313 - ], - [ - -7.5134503, - 58.248313 - ], - [ - -7.5134503, - 58.3579902 - ] - ] - ] - }, - { - "name": "OS Scottish Popular historic", - "type": "tms", - "template": "http://ooc.openstreetmap.org/npescotland/tiles/{zoom}/{x}/{y}.jpg", - "scaleExtent": [ - 6, - 15 - ], - "polygon": [ - [ - [ - -7.8, - 54.5 - ], - [ - -7.8, - 61.1 - ], - [ - -1.1, - 61.1 - ], - [ - -1.1, - 54.5 - ], - [ - -7.8, - 54.5 - ] - ] - ] - }, - { - "name": "OS Town Plans, Aberdeen 1866-1867 (NLS)", - "type": "tms", - "description": "Detailed town plan of Aberdeen 1866-1867, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/aberdeen/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -2.14039404, - 57.11218789 - ], - [ - -2.14064752, - 57.17894161 - ], - [ - -2.04501987, - 57.17901252 - ], - [ - -2.04493842, - 57.11225862 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/aberdeen.html", - "terms_text": "National Library of Scotland - Aberdeen 1866-1867" - }, - { - "name": "OS Town Plans, Airdrie 1858 (NLS)", - "type": "tms", - "description": "Detailed town plan of Airdrie 1858, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/airdrie/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -3.99291738, - 55.86408041 - ], - [ - -3.99338933, - 55.87329115 - ], - [ - -3.9691085, - 55.87368212 - ], - [ - -3.9686423, - 55.86447124 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/airdrie.html", - "terms_text": "National Library of Scotland - Airdrie 1858" - }, - { - "name": "OS Town Plans, Alexandria 1859 (NLS)", - "type": "tms", - "description": "Detailed town plan of Alexandria 1859, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/alexandria/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -4.58973571, - 55.97536707 - ], - [ - -4.59104461, - 55.99493153 - ], - [ - -4.55985072, - 55.99558348 - ], - [ - -4.55855754, - 55.97601855 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/alexandria.html", - "terms_text": "National Library of Scotland - Alexandria 1859" - }, - { - "name": "OS Town Plans, Alloa 1861-1862 (NLS)", - "type": "tms", - "description": "Detailed town plan of Alloa 1861-1862, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/alloa/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -3.81166061, - 56.09864363 - ], - [ - -3.81274448, - 56.12169929 - ], - [ - -3.7804609, - 56.12216898 - ], - [ - -3.77939631, - 56.09911292 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/alloa.html", - "terms_text": "National Library of Scotland - Alloa 1861-1862" - }, - { - "name": "OS Town Plans, Annan 1859 (NLS)", - "type": "tms", - "description": "Detailed town plan of Annan 1859, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/annan/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -3.27921439, - 54.98252155 - ], - [ - -3.27960062, - 54.9946601 - ], - [ - -3.24866331, - 54.99498165 - ], - [ - -3.24828642, - 54.98284297 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/annan.html", - "terms_text": "National Library of Scotland - Annan 1859" - }, - { - "name": "OS Town Plans, Arbroath 1858 (NLS)", - "type": "tms", - "description": "Detailed town plan of Arbroath 1858, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/arbroath/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -2.60716469, - 56.53995105 - ], - [ - -2.60764981, - 56.57022426 - ], - [ - -2.56498708, - 56.57042549 - ], - [ - -2.564536, - 56.54015206 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/arbroath.html", - "terms_text": "National Library of Scotland - Arbroath 1858" - }, - { - "name": "OS Town Plans, Ayr 1855 (NLS)", - "type": "tms", - "description": "Detailed town plan of Ayr 1855, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/ayr/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -4.66768105, - 55.43748864 - ], - [ - -4.67080057, - 55.48363961 - ], - [ - -4.60609844, - 55.48503484 - ], - [ - -4.60305426, - 55.43888149 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/ayr.html", - "terms_text": "National Library of Scotland - Ayr 1855" - }, - { - "name": "OS Town Plans, Berwick-upon-Tweed 1852 (NLS)", - "type": "tms", - "description": "Detailed town plan of Berwick-upon-Tweed 1852, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/berwick/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -2.02117487, - 55.75577627 - ], - [ - -2.02118763, - 55.77904118 - ], - [ - -1.98976956, - 55.77904265 - ], - [ - -1.9897755, - 55.75577774 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/berwick.html", - "terms_text": "National Library of Scotland - Berwick-upon-Tweed 1852" - }, - { - "name": "OS Town Plans, Brechin 1862 (NLS)", - "type": "tms", - "description": "Detailed town plan of Brechin 1862, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/brechin/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -2.67480248, - 56.71456775 - ], - [ - -2.67521172, - 56.73739937 - ], - [ - -2.64319679, - 56.73756872 - ], - [ - -2.64280695, - 56.71473694 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/brechin.html", - "terms_text": "National Library of Scotland - Brechin 1862" - }, - { - "name": "OS Town Plans, Burntisland 1894 (NLS)", - "type": "tms", - "description": "Detailed town plan of Burntisland 1894, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/burntisland/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -3.24879624, - 56.04240046 - ], - [ - -3.2495182, - 56.06472996 - ], - [ - -3.21830572, - 56.06504207 - ], - [ - -3.21760179, - 56.0427123 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/burntisland.html", - "terms_text": "National Library of Scotland - Burntisland 1894" - }, - { - "name": "OS Town Plans, Campbelton 1865 (NLS)", - "type": "tms", - "description": "Detailed town plan of Campbelton 1865, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/campbeltown/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -5.62345307, - 55.40255998 - ], - [ - -5.62631353, - 55.43375303 - ], - [ - -5.58276654, - 55.43503753 - ], - [ - -5.57994024, - 55.40384299 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/campbelton.html", - "terms_text": "National Library of Scotland - Campbelton 1865" - }, - { - "name": "OS Town Plans, Coatbridge 1858 (NLS)", - "type": "tms", - "description": "Detailed town plan of Coatbridge 1858, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/coatbridge/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -4.05035921, - 55.84648689 - ], - [ - -4.05157062, - 55.86947193 - ], - [ - -4.01953905, - 55.87000186 - ], - [ - -4.01834651, - 55.84701638 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/coatbridge.html", - "terms_text": "National Library of Scotland - Coatbridge 1858" - }, - { - "name": "OS Town Plans, Cupar 1854 (NLS)", - "type": "tms", - "description": "Detailed town plan of Cupar 1854, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/cupar1854/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -3.04765872, - 56.28653177 - ], - [ - -3.04890965, - 56.332192 - ], - [ - -2.98498515, - 56.33271677 - ], - [ - -2.98381041, - 56.28705563 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/cupar_1.html", - "terms_text": "National Library of Scotland - Cupar 1854" - }, - { - "name": "OS Town Plans, Cupar 1893-1894 (NLS)", - "type": "tms", - "description": "Detailed town plan of Cupar 1893-1894, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/cupar1893/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -3.0327697, - 56.30243657 - ], - [ - -3.03338443, - 56.32520139 - ], - [ - -3.00146629, - 56.32546356 - ], - [ - -3.00087054, - 56.30269852 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/cupar_2.html", - "terms_text": "National Library of Scotland - Cupar 1893-1894" - }, - { - "name": "OS Town Plans, Dalkeith 1852 (NLS)", - "type": "tms", - "description": "Detailed town plan of Dalkeith 1852, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/dalkeith1852/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -3.07862465, - 55.88900264 - ], - [ - -3.0790381, - 55.90389729 - ], - [ - -3.05835611, - 55.90407681 - ], - [ - -3.05795059, - 55.88918206 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/dalkeith_1.html", - "terms_text": "National Library of Scotland - Dalkeith 1852" - }, - { - "name": "OS Town Plans, Dalkeith 1893 (NLS)", - "type": "tms", - "description": "Detailed town plan of Dalkeith 1893, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/dalkeith1893/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -3.08600192, - 55.87936087 - ], - [ - -3.08658588, - 55.90025926 - ], - [ - -3.0436473, - 55.90063074 - ], - [ - -3.04308639, - 55.87973206 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/dalkeith_2.html", - "terms_text": "National Library of Scotland - Dalkeith 1893" - }, - { - "name": "OS Town Plans, Dumbarton 1859 (NLS)", - "type": "tms", - "description": "Detailed town plan of Dumbarton 1859, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/dumbarton/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -4.58559982, - 55.92742578 - ], - [ - -4.58714245, - 55.95056014 - ], - [ - -4.55463269, - 55.95123882 - ], - [ - -4.55310939, - 55.92810387 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/dumbarton.html", - "terms_text": "National Library of Scotland - Dumbarton 1859" - }, - { - "name": "OS Town Plans, Dumfries 1850 (NLS)", - "type": "tms", - "description": "Detailed town plan of Dumfries 1850, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/dumfries1850/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -3.63928076, - 55.03715991 - ], - [ - -3.64116352, - 55.08319002 - ], - [ - -3.57823183, - 55.08402202 - ], - [ - -3.57642118, - 55.0379905 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/dumfries_1.html", - "terms_text": "National Library of Scotland - Dumfries 1850" - }, - { - "name": "OS Town Plans, Dumfries 1893 (NLS)", - "type": "tms", - "description": "Detailed town plan of Dumfries 1893, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/dumfries1893/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -3.63179081, - 55.04150111 - ], - [ - -3.63330662, - 55.07873429 - ], - [ - -3.58259012, - 55.07940411 - ], - [ - -3.58112132, - 55.04217001 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/dumfries_2.html", - "terms_text": "National Library of Scotland - Dumfries 1893" - }, - { - "name": "OS Town Plans, Dundee 1857-1858 (NLS)", - "type": "tms", - "description": "Detailed town plan of Dundee 1857-1858, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/dundee1857/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -3.02584468, - 56.44879161 - ], - [ - -3.02656969, - 56.47566815 - ], - [ - -2.94710317, - 56.47629984 - ], - [ - -2.94643424, - 56.44942266 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/dundee_1.html", - "terms_text": "National Library of Scotland - Dundee 1857-1858" - }, - { - "name": "OS Town Plans, Dundee 1870-1872 (NLS)", - "type": "tms", - "description": "Detailed town plan of Dundee 1870-1872, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/dundee1870/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -3.03399945, - 56.448497 - ], - [ - -3.03497463, - 56.48435238 - ], - [ - -2.92352705, - 56.48523137 - ], - [ - -2.92265681, - 56.4493748 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/dundee_2.html", - "terms_text": "National Library of Scotland - Dundee 1870-1872" - }, - { - "name": "OS Town Plans, Dunfermline 1854 (NLS)", - "type": "tms", - "description": "Detailed town plan of Dunfermline 1854, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/dunfermline1854/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -3.49045481, - 56.0605979 - ], - [ - -3.49116489, - 56.07898822 - ], - [ - -3.44374075, - 56.07955208 - ], - [ - -3.44305323, - 56.06116138 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/dunfermline_1.html", - "terms_text": "National Library of Scotland - Dunfermline 1854" - }, - { - "name": "OS Town Plans, Dunfermline 1894 (NLS)", - "type": "tms", - "description": "Detailed town plan of Dunfermline 1894, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/dunfermline1893/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -3.48284159, - 56.05198219 - ], - [ - -3.48399434, - 56.08198924 - ], - [ - -3.44209721, - 56.08248587 - ], - [ - -3.44097697, - 56.05247826 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/dunfermline_2.html", - "terms_text": "National Library of Scotland - Dunfermline 1894" - }, - { - "name": "OS Town Plans, Edinburgh 1849-1851 (NLS)", - "type": "tms", - "description": "Detailed town plan of Edinburgh 1849-1851, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/edinburgh1849/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -3.2361048, - 55.921366 - ], - [ - -3.23836397, - 55.99217223 - ], - [ - -3.14197035, - 55.99310288 - ], - [ - -3.13988689, - 55.92229419 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/edinburgh1056_1.html", - "terms_text": "National Library of Scotland - Edinburgh 1849-1851" - }, - { - "name": "OS Town Plans, Edinburgh 1876-1877 (NLS)", - "type": "tms", - "description": "Detailed town plan of Edinburgh 1876-1877, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/edinburgh1876/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -3.24740498, - 55.92116518 - ], - [ - -3.24989581, - 55.99850896 - ], - [ - -3.13061127, - 55.99966059 - ], - [ - -3.12835798, - 55.92231348 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/edinburgh1056_2.html", - "terms_text": "National Library of Scotland - Edinburgh 1876-1877" - }, - { - "name": "OS Town Plans, Edinburgh 1893-1894 (NLS)", - "type": "tms", - "description": "Detailed town plan of Edinburgh 1893-1894, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/edinburgh1893/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -3.26111081, - 55.89555387 - ], - [ - -3.26450423, - 55.9997912 - ], - [ - -3.11970824, - 56.00119128 - ], - [ - -3.1167031, - 55.89694851 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/edinburgh500.html", - "terms_text": "National Library of Scotland - Edinburgh 1893-1894" - }, - { - "name": "OS Town Plans, Elgin 1868 (NLS)", - "type": "tms", - "description": "Detailed town plan of Elgin 1868, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/elgin/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -3.33665196, - 57.62879017 - ], - [ - -3.33776583, - 57.65907381 - ], - [ - -3.29380859, - 57.65953111 - ], - [ - -3.29273129, - 57.62924695 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/elgin.html", - "terms_text": "National Library of Scotland - Elgin 1868" - }, - { - "name": "OS Town Plans, Falkirk 1858-1859 (NLS)", - "type": "tms", - "description": "Detailed town plan of Falkirk 1858-1859, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/falkirk/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -3.79587441, - 55.99343101 - ], - [ - -3.79697783, - 56.01720281 - ], - [ - -3.76648151, - 56.01764348 - ], - [ - -3.76539679, - 55.99387129 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/falkirk.html", - "terms_text": "National Library of Scotland - Falkirk 1858-1859" - }, - { - "name": "OS Town Plans, Forfar 1860-1861 (NLS)", - "type": "tms", - "description": "Detailed town plan of Forfar 1860-1861, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/forfar/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -2.90326183, - 56.6289471 - ], - [ - -2.90378797, - 56.65095013 - ], - [ - -2.87228457, - 56.65117489 - ], - [ - -2.87177676, - 56.62917168 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/forfar.html", - "terms_text": "National Library of Scotland - Forfar 1860-1861" - }, - { - "name": "OS Town Plans, Forres 1868 (NLS)", - "type": "tms", - "description": "Detailed town plan of Forres 1868, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/forres/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -3.63516795, - 57.58887872 - ], - [ - -3.63647637, - 57.618002 - ], - [ - -3.57751453, - 57.61875171 - ], - [ - -3.5762532, - 57.58962759 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/forres.html", - "terms_text": "National Library of Scotland - Forres 1868" - }, - { - "name": "OS Town Plans, Galashiels 1858 (NLS)", - "type": "tms", - "description": "Detailed town plan of Galashiels 1858, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/galashiels/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -2.82918609, - 55.59586303 - ], - [ - -2.82981273, - 55.62554026 - ], - [ - -2.78895254, - 55.62580992 - ], - [ - -2.78835674, - 55.59613239 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/galashiels.html", - "terms_text": "National Library of Scotland - Galashiels 1858" - }, - { - "name": "OS Town Plans, Girvan 1857 (NLS)", - "type": "tms", - "description": "Detailed town plan of Girvan 1857, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/girvan/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -4.87424251, - 55.22679729 - ], - [ - -4.87587895, - 55.24945946 - ], - [ - -4.84447382, - 55.25019598 - ], - [ - -4.84285519, - 55.22753318 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/girvan.html", - "terms_text": "National Library of Scotland - Girvan 1857" - }, - { - "name": "OS Town Plans, Glasgow 1857-1858 (NLS)", - "type": "tms", - "description": "Detailed town plan of Glasgow 1857-1858, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/glasgow1857/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -4.31575491, - 55.82072009 - ], - [ - -4.319683, - 55.88667625 - ], - [ - -4.1771319, - 55.88928081 - ], - [ - -4.1734447, - 55.82331825 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/glasgow_1.html", - "terms_text": "National Library of Scotland - Glasgow 1857-1858" - }, - { - "name": "OS Town Plans, Glasgow 1892-1894 (NLS)", - "type": "tms", - "description": "Detailed town plan of Glasgow 1892-1894, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/glasgow1894/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -4.3465357, - 55.81456228 - ], - [ - -4.35157646, - 55.89806268 - ], - [ - -4.17788765, - 55.9012587 - ], - [ - -4.17321842, - 55.81774834 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/glasgow_2.html", - "terms_text": "National Library of Scotland - Glasgow 1892-1894" - }, - { - "name": "OS Town Plans, Greenock 1857 (NLS)", - "type": "tms", - "description": "Detailed town plan of Greenock 1857, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/greenock/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -4.78108857, - 55.92617865 - ], - [ - -4.78382957, - 55.96437481 - ], - [ - -4.7302257, - 55.96557475 - ], - [ - -4.72753731, - 55.92737687 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/greenock.html", - "terms_text": "National Library of Scotland - Greenock 1857" - }, - { - "name": "OS Town Plans, Haddington 1853 (NLS)", - "type": "tms", - "description": "Detailed town plan of Haddington 1853, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/haddington1853/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -2.78855542, - 55.9451862 - ], - [ - -2.78888196, - 55.96124194 - ], - [ - -2.76674325, - 55.9613817 - ], - [ - -2.76642588, - 55.94532587 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/haddington_1.html", - "terms_text": "National Library of Scotland - Haddington 1853" - }, - { - "name": "OS Town Plans, Haddington 1893 (NLS)", - "type": "tms", - "description": "Detailed town plan of Haddington 1893, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/haddington1893/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -2.80152293, - 55.93428734 - ], - [ - -2.80214693, - 55.96447189 - ], - [ - -2.76038069, - 55.9647367 - ], - [ - -2.75978916, - 55.93455185 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/haddington_2.html", - "terms_text": "National Library of Scotland - Haddington 1893" - }, - { - "name": "OS Town Plans, Hamilton 1858 (NLS)", - "type": "tms", - "description": "Detailed town plan of Hamilton 1858, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/hamilton/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -4.06721642, - 55.74877265 - ], - [ - -4.06924047, - 55.78698508 - ], - [ - -4.01679233, - 55.78785698 - ], - [ - -4.01481949, - 55.74964331 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/hamilton.html", - "terms_text": "National Library of Scotland - Hamilton 1858" - }, - { - "name": "OS Town Plans, Hawick 1857-1858 (NLS)", - "type": "tms", - "description": "Detailed town plan of Hawick 1857-1858, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/hawick/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -2.80130149, - 55.4102516 - ], - [ - -2.80176329, - 55.43304638 - ], - [ - -2.7708832, - 55.43324489 - ], - [ - -2.77043917, - 55.41044995 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/hawick.html", - "terms_text": "National Library of Scotland - Hawick 1857-1858" - }, - { - "name": "OS Town Plans, Inverness 1867-1868 (NLS)", - "type": "tms", - "description": "Detailed town plan of Inverness 1867-1868, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/inverness/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -4.25481758, - 57.45916363 - ], - [ - -4.25752308, - 57.50302387 - ], - [ - -4.19713638, - 57.50409032 - ], - [ - -4.1945031, - 57.46022829 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/inverness.html", - "terms_text": "National Library of Scotland - Inverness 1867-1868" - }, - { - "name": "OS Town Plans, Irvine 1859 (NLS)", - "type": "tms", - "description": "Detailed town plan of Irvine 1859, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/irvine/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -4.67540402, - 55.60649957 - ], - [ - -4.67643252, - 55.62159024 - ], - [ - -4.65537888, - 55.62204812 - ], - [ - -4.65435844, - 55.60695719 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/irvine.html", - "terms_text": "National Library of Scotland - Irvine 1859" - }, - { - "name": "OS Town Plans, Jedburgh 1858 (NLS)", - "type": "tms", - "description": "Detailed town plan of Jedburgh 1858, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/jedburgh/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -2.56332521, - 55.47105448 - ], - [ - -2.56355503, - 55.48715562 - ], - [ - -2.54168193, - 55.48725438 - ], - [ - -2.54146103, - 55.47115318 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/jedburgh.html", - "terms_text": "National Library of Scotland - Jedburgh 1858" - }, - { - "name": "OS Town Plans, Kelso 1857 (NLS)", - "type": "tms", - "description": "Detailed town plan of Kelso 1857, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/kelso/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -2.44924544, - 55.58390848 - ], - [ - -2.44949757, - 55.6059582 - ], - [ - -2.41902085, - 55.60606617 - ], - [ - -2.41878581, - 55.58401636 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/kelso.html", - "terms_text": "National Library of Scotland - Kelso 1857" - }, - { - "name": "OS Town Plans, Kilmarnock 1857-1859 (NLS)", - "type": "tms", - "description": "Detailed town plan of Kilmarnock 1857-1859, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/kilmarnock/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -4.51746876, - 55.58950933 - ], - [ - -4.5194347, - 55.62017114 - ], - [ - -4.47675652, - 55.62104083 - ], - [ - -4.4748238, - 55.59037802 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/kilmarnock.html", - "terms_text": "National Library of Scotland - Kilmarnock 1857-1859" - }, - { - "name": "OS Town Plans, Kirkcaldy 1855 (NLS)", - "type": "tms", - "description": "Detailed town plan of Kirkcaldy 1855, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/kirkcaldy1855/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -3.17455285, - 56.09518942 - ], - [ - -3.17554995, - 56.12790251 - ], - [ - -3.12991402, - 56.12832843 - ], - [ - -3.12895559, - 56.09561481 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/kirkcaldy_1.html", - "terms_text": "National Library of Scotland - Kirkcaldy 1855" - }, - { - "name": "OS Town Plans, Kirkcaldy 1894 (NLS)", - "type": "tms", - "description": "Detailed town plan of Kirkcaldy 1894, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/kirkcaldy1894/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -3.17460426, - 56.09513375 - ], - [ - -3.17560428, - 56.12794116 - ], - [ - -3.12989512, - 56.12836777 - ], - [ - -3.12893395, - 56.09555983 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/kirkcaldy_2.html", - "terms_text": "National Library of Scotland - Kirkcaldy 1894" - }, - { - "name": "OS Town Plans, Kirkcudbright 1850 (NLS)", - "type": "tms", - "description": "Detailed town plan of Kirkcudbright 1850, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/kirkcudbright1850/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -4.06154334, - 54.82586314 - ], - [ - -4.0623081, - 54.84086061 - ], - [ - -4.0420219, - 54.84120364 - ], - [ - -4.04126464, - 54.82620598 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/kirkcudbright_1.html", - "terms_text": "National Library of Scotland - Kirkcudbright 1850" - }, - { - "name": "OS Town Plans, Kirkcudbright 1893 (NLS)", - "type": "tms", - "description": "Detailed town plan of Kirkcudbright 1893, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/kirkcudbright1893/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -4.06001868, - 54.82720122 - ], - [ - -4.06079036, - 54.84234455 - ], - [ - -4.04025067, - 54.84269158 - ], - [ - -4.03948667, - 54.82754805 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/kirkcudbright_2.html", - "terms_text": "National Library of Scotland - Kirkcudbright 1893" - }, - { - "name": "OS Town Plans, Kirkintilloch 1859 (NLS)", - "type": "tms", - "description": "Detailed town plan of Kirkintilloch 1859, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/kirkintilloch/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -4.16664222, - 55.93124287 - ], - [ - -4.16748402, - 55.94631265 - ], - [ - -4.14637318, - 55.94668235 - ], - [ - -4.14553956, - 55.93161237 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/kirkintilloch.html", - "terms_text": "National Library of Scotland - Kirkintilloch 1859" - }, - { - "name": "OS Town Plans, Kirriemuir 1861 (NLS)", - "type": "tms", - "description": "Detailed town plan of Kirriemuir 1861, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/kirriemuir/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -3.01255744, - 56.65896044 - ], - [ - -3.01302683, - 56.67645382 - ], - [ - -2.98815879, - 56.67665366 - ], - [ - -2.98770092, - 56.65916014 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/kirriemuir.html", - "terms_text": "National Library of Scotland - Kirriemuir 1861" - }, - { - "name": "OS Town Plans, Lanark 1858 (NLS)", - "type": "tms", - "description": "Detailed town plan of Lanark 1858, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/lanark/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -3.78642584, - 55.66308804 - ], - [ - -3.78710605, - 55.67800854 - ], - [ - -3.76632876, - 55.67830935 - ], - [ - -3.76565645, - 55.66338868 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/lanark.html", - "terms_text": "National Library of Scotland - Lanark 1858" - }, - { - "name": "OS Town Plans, Linlithgow 1856 (NLS)", - "type": "tms", - "description": "Detailed town plan of Linlithgow 1856, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/linlithgow/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -3.61908334, - 55.95549561 - ], - [ - -3.62033259, - 55.98538615 - ], - [ - -3.57838447, - 55.98593047 - ], - [ - -3.57716753, - 55.95603932 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/linlithgow.html", - "terms_text": "National Library of Scotland - Linlithgow 1856" - }, - { - "name": "OS Town Plans, Mayole 1856-1857 (NLS)", - "type": "tms", - "description": "Detailed town plan of Mayole 1856-1857, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/maybole/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -4.69086378, - 55.34340178 - ], - [ - -4.6918884, - 55.35849731 - ], - [ - -4.67089656, - 55.35895813 - ], - [ - -4.6698799, - 55.34386234 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/maybole.html", - "terms_text": "National Library of Scotland - Mayole 1856-1857" - }, - { - "name": "OS Town Plans, Montrose 1861-1862 (NLS)", - "type": "tms", - "description": "Detailed town plan of Montrose 1861-1862, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/montrose/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -2.4859324, - 56.69645192 - ], - [ - -2.4862257, - 56.71918799 - ], - [ - -2.45405417, - 56.71930941 - ], - [ - -2.45378027, - 56.69657324 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/montrose.html", - "terms_text": "National Library of Scotland - Montrose 1861-1862" - }, - { - "name": "OS Town Plans, Musselburgh 1853 (NLS)", - "type": "tms", - "description": "Detailed town plan of Musselburgh 1853, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/musselburgh1853/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -3.07888558, - 55.93371953 - ], - [ - -3.07954151, - 55.95729781 - ], - [ - -3.03240684, - 55.95770177 - ], - [ - -3.03177952, - 55.93412313 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/musselburgh_1.html", - "terms_text": "National Library of Scotland - Musselburgh 1853" - }, - { - "name": "OS Town Plans, Musselburgh 1893 (NLS)", - "type": "tms", - "description": "Detailed town plan of Musselburgh 1893, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/musselburgh1893/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -3.07017621, - 55.92694102 - ], - [ - -3.07078961, - 55.94917624 - ], - [ - -3.03988228, - 55.94944099 - ], - [ - -3.03928658, - 55.92720556 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/musselburgh_2.html", - "terms_text": "National Library of Scotland - Musselburgh 1893" - }, - { - "name": "OS Town Plans, Nairn 1867-1868 (NLS)", - "type": "tms", - "description": "Detailed town plan of Nairn 1867-1868, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/nairn/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -3.88433907, - 57.57899149 - ], - [ - -3.88509905, - 57.5936822 - ], - [ - -3.85931017, - 57.59406441 - ], - [ - -3.85856057, - 57.57937348 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/nairn.html", - "terms_text": "National Library of Scotland - Nairn 1867-1868" - }, - { - "name": "OS Town Plans, Oban 1867-1868 (NLS)", - "type": "tms", - "description": "Detailed town plan of Oban 1867-1868, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/oban/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -5.49548449, - 56.39080407 - ], - [ - -5.49836627, - 56.42219039 - ], - [ - -5.45383984, - 56.42343933 - ], - [ - -5.45099456, - 56.39205153 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/oban.html", - "terms_text": "National Library of Scotland - Oban 1867-1868" - }, - { - "name": "OS Town Plans, Peebles 1856 (NLS)", - "type": "tms", - "description": "Detailed town plan of Peebles 1856, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/peebles/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -3.20921287, - 55.63635834 - ], - [ - -3.20990288, - 55.65873817 - ], - [ - -3.17896372, - 55.65903935 - ], - [ - -3.17829135, - 55.63665927 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/peebles.html", - "terms_text": "National Library of Scotland - Peebles 1856" - }, - { - "name": "OS Town Plans, Perth 1860 (NLS)", - "type": "tms", - "description": "Detailed town plan of Perth 1860, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/perth/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -3.45302495, - 56.37794226 - ], - [ - -3.45416664, - 56.40789908 - ], - [ - -3.41187528, - 56.40838777 - ], - [ - -3.41076676, - 56.3784304 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/perth.html", - "terms_text": "National Library of Scotland - Perth 1860" - }, - { - "name": "OS Town Plans, Peterhead 1868 (NLS)", - "type": "tms", - "description": "Detailed town plan of Peterhead 1868, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/peterhead/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -1.80513747, - 57.48046916 - ], - [ - -1.80494005, - 57.51755411 - ], - [ - -1.75135366, - 57.51746003 - ], - [ - -1.75160539, - 57.48037522 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/peterhead", - "terms_text": "National Library of Scotland - Peterhead 1868" - }, - { - "name": "OS Town Plans, Port Glasgow 1856-1857 (NLS)", - "type": "tms", - "description": "Detailed town plan of Port Glasgow 1856-1857, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/portglasgow/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -4.70063209, - 55.91995983 - ], - [ - -4.70222026, - 55.9427679 - ], - [ - -4.67084958, - 55.94345237 - ], - [ - -4.6692798, - 55.92064372 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/port-glasgow.html", - "terms_text": "National Library of Scotland - Port Glasgow 1856-1857" - }, - { - "name": "OS Town Plans, Portobello 1893-1894 (NLS)", - "type": "tms", - "description": "Detailed town plan of Portobello 1893-1894, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/portobello/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -3.12437919, - 55.93846889 - ], - [ - -3.1250234, - 55.96068605 - ], - [ - -3.09394827, - 55.96096586 - ], - [ - -3.09332184, - 55.93874847 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/portobello.html", - "terms_text": "National Library of Scotland - Portobello 1893-1894" - }, - { - "name": "OS Town Plans, Rothesay 1862-1863 (NLS)", - "type": "tms", - "description": "Detailed town plan of Rothesay 1862-1863, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/rothesay/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -5.06449893, - 55.82864114 - ], - [ - -5.06569719, - 55.84385927 - ], - [ - -5.04413114, - 55.84439519 - ], - [ - -5.04294127, - 55.82917676 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/rothesay.html", - "terms_text": "National Library of Scotland - Rothesay 1862-1863" - }, - { - "name": "OS Town Plans, Selkirk 1865 (NLS)", - "type": "tms", - "description": "Detailed town plan of Selkirk 1865, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/selkirk/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -2.85998582, - 55.53499576 - ], - [ - -2.86063259, - 55.56459732 - ], - [ - -2.82003242, - 55.56487574 - ], - [ - -2.81941615, - 55.53527387 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/selkirk.html", - "terms_text": "National Library of Scotland - Selkirk 1865" - }, - { - "name": "OS Town Plans, St Andrews 1854 (NLS)", - "type": "tms", - "description": "Detailed town plan of St Andrews 1854, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/standrews1854/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -2.81342686, - 56.32097352 - ], - [ - -2.81405804, - 56.3506222 - ], - [ - -2.77243712, - 56.35088865 - ], - [ - -2.77183819, - 56.32123967 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/st-andrews_1.html", - "terms_text": "National Library of Scotland - St Andrews 1854" - }, - { - "name": "OS Town Plans, St Andrews 1893 (NLS)", - "type": "tms", - "description": "Detailed town plan of St Andrews 1893, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/standrews1893/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -2.81545583, - 56.31861733 - ], - [ - -2.81609919, - 56.3487653 - ], - [ - -2.77387785, - 56.34903619 - ], - [ - -2.77326775, - 56.31888792 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/st-andrews_2.html", - "terms_text": "National Library of Scotland - St Andrews 1893" - }, - { - "name": "OS Town Plans, Stirling 1858 (NLS)", - "type": "tms", - "description": "Detailed town plan of Stirling 1858, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/stirling/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -3.95768489, - 56.10754239 - ], - [ - -3.95882978, - 56.13007142 - ], - [ - -3.92711024, - 56.13057046 - ], - [ - -3.92598386, - 56.10804101 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/stirling.html", - "terms_text": "National Library of Scotland - Stirling 1858" - }, - { - "name": "OS Town Plans, Stonehaven 1864 (NLS)", - "type": "tms", - "description": "Detailed town plan of Stonehaven 1864, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/stonehaven/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -2.220167, - 56.9565098 - ], - [ - -2.2202543, - 56.97129283 - ], - [ - -2.19924399, - 56.9713281 - ], - [ - -2.19916501, - 56.95654504 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/stonehaven.html", - "terms_text": "National Library of Scotland - Stonehaven 1864" - }, - { - "name": "OS Town Plans, Stranraer 1847 (NLS)", - "type": "tms", - "description": "Detailed town plan of Stranraer 1847, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/stranraer1847/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -5.04859743, - 54.8822997 - ], - [ - -5.0508954, - 54.91268061 - ], - [ - -5.0095373, - 54.91371278 - ], - [ - -5.00727037, - 54.88333071 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/stranraer_1.html", - "terms_text": "National Library of Scotland - Stranraer 1847" - }, - { - "name": "OS Town Plans, Stranraer 1863-1877 (NLS)", - "type": "tms", - "description": "Detailed town plan of Stranraer 1863-1877, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/stranraer1867/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -5.04877289, - 54.88228699 - ], - [ - -5.05107324, - 54.9126976 - ], - [ - -5.00947337, - 54.91373582 - ], - [ - -5.00720427, - 54.88332405 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/stranraer_1a.html", - "terms_text": "National Library of Scotland - Stranraer 1863-1877" - }, - { - "name": "OS Town Plans, Stranraer 1893 (NLS)", - "type": "tms", - "description": "Detailed town plan of Stranraer 1893, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/stranraer1893/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -5.04418424, - 54.89773858 - ], - [ - -5.04511026, - 54.90999885 - ], - [ - -5.0140499, - 54.91077389 - ], - [ - -5.0131333, - 54.89851327 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/stranraer_2.html", - "terms_text": "National Library of Scotland - Stranraer 1893" - }, - { - "name": "OS Town Plans, Strathaven 1858 (NLS)", - "type": "tms", - "description": "Detailed town plan of Strathaven 1858, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/strathaven/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -4.06914872, - 55.67242091 - ], - [ - -4.06954357, - 55.67989707 - ], - [ - -4.05917487, - 55.6800715 - ], - [ - -4.05878199, - 55.67259529 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/strathaven.html", - "terms_text": "National Library of Scotland - Strathaven 1858" - }, - { - "name": "OS Town Plans, Wick 1872 (NLS)", - "type": "tms", - "description": "Detailed town plan of Wick 1872, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/wick/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -3.11470001, - 58.41344839 - ], - [ - -3.11588837, - 58.45101446 - ], - [ - -3.05949843, - 58.45149284 - ], - [ - -3.05837008, - 58.41392606 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/wick.html", - "terms_text": "National Library of Scotland - Wick 1872" - }, - { - "name": "OS Town Plans, Wigtown 1848 (NLS)", - "type": "tms", - "description": "Detailed town plan of Wigtown 1848, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/wigtown1848/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -4.45235587, - 54.8572296 - ], - [ - -4.45327284, - 54.87232603 - ], - [ - -4.43254469, - 54.87274317 - ], - [ - -4.43163545, - 54.85764651 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/wigtown_1.html", - "terms_text": "National Library of Scotland - Wigtown 1848" - }, - { - "name": "OS Town Plans, Wigtown 1894 (NLS)", - "type": "tms", - "description": "Detailed town plan of Wigtown 1894, courtesy of National Library of Scotland.", - "template": "http://geo.nls.uk/maps/towns/wigtown1894/{zoom}/{x}/{-y}.png", - "scaleExtent": [ - 13, - 20 - ], - "polygon": [ - [ - [ - -4.45233361, - 54.85721131 - ], - [ - -4.45325423, - 54.87236807 - ], - [ - -4.43257837, - 54.87278416 - ], - [ - -4.43166549, - 54.85762716 - ] - ] - ], - "terms_url": "http://maps.nls.uk/townplans/wigtown_2.html", - "terms_text": "National Library of Scotland - Wigtown 1894" - }, - { - "name": "OpenPT Map (overlay)", - "type": "tms", - "template": "http://openptmap.de/tiles/{zoom}/{x}/{y}.png", - "scaleExtent": [ - 5, - 16 - ], - "polygon": [ - [ - [ - 6.4901072, - 53.665658 - ], - [ - 8.5665347, - 53.9848257 - ], - [ - 8.1339457, - 54.709715 - ], - [ - 8.317796, - 55.0952362 - ], - [ - 10.1887438, - 54.7783834 - ], - [ - 10.6321475, - 54.4778841 - ], - [ - 11.2702164, - 54.6221504 - ], - [ - 11.681176, - 54.3709243 - ], - [ - 12.0272473, - 54.3898199 - ], - [ - 13.3250145, - 54.8531617 - ], - [ - 13.9198245, - 54.6972173 - ], - [ - 14.2118221, - 54.1308273 - ], - [ - 14.493005, - 53.2665063 - ], - [ - 14.1577485, - 52.8766495 - ], - [ - 14.7525584, - 52.5819369 - ], - [ - 15.0986297, - 51.0171541 - ], - [ - 14.9364088, - 50.8399279 - ], - [ - 14.730929, - 50.7920977 - ], - [ - 14.4389313, - 50.8808862 - ], - [ - 12.9573138, - 50.3939044 - ], - [ - 12.51391, - 50.3939044 - ], - [ - 12.3084302, - 50.1173237 - ], - [ - 12.6112425, - 49.9088337 - ], - [ - 12.394948, - 49.7344006 - ], - [ - 12.7734634, - 49.4047626 - ], - [ - 14.1469337, - 48.6031036 - ], - [ - 14.6768553, - 48.6531391 - ], - [ - 15.0661855, - 49.0445497 - ], - [ - 16.2666202, - 48.7459305 - ], - [ - 16.4937294, - 48.8741286 - ], - [ - 16.904689, - 48.7173975 - ], - [ - 16.9371332, - 48.5315383 - ], - [ - 16.8384693, - 48.3823161 - ], - [ - 17.2017097, - 48.010204 - ], - [ - 17.1214145, - 47.6997605 - ], - [ - 16.777292, - 47.6585709 - ], - [ - 16.6090543, - 47.7460598 - ], - [ - 16.410228, - 47.6637214 - ], - [ - 16.7352326, - 47.6147714 - ], - [ - 16.5555242, - 47.3589738 - ], - [ - 16.4790525, - 46.9768539 - ], - [ - 16.0355168, - 46.8096295 - ], - [ - 16.0508112, - 46.6366332 - ], - [ - 14.9572663, - 46.6313822 - ], - [ - 14.574908, - 46.3892866 - ], - [ - 12.3954655, - 46.6891149 - ], - [ - 12.1507562, - 47.0550608 - ], - [ - 11.1183887, - 46.9142058 - ], - [ - 11.0342699, - 46.7729797 - ], - [ - 10.4836739, - 46.8462544 - ], - [ - 10.4607324, - 46.5472973 - ], - [ - 10.1013156, - 46.5735879 - ], - [ - 10.2007287, - 46.1831867 - ], - [ - 9.8948421, - 46.3629068 - ], - [ - 9.5966026, - 46.2889758 - ], - [ - 9.2983631, - 46.505206 - ], - [ - 9.2830687, - 46.2572605 - ], - [ - 9.0536537, - 45.7953255 - ], - [ - 8.4265861, - 46.2466846 - ], - [ - 8.4418804, - 46.4736161 - ], - [ - 7.8759901, - 45.9284607 - ], - [ - 7.0959791, - 45.8645956 - ], - [ - 6.7747981, - 46.1620044 - ], - [ - 6.8206811, - 46.4051083 - ], - [ - 6.5453831, - 46.4578142 - ], - [ - 6.3312624, - 46.3840116 - ], - [ - 6.3847926, - 46.2466846 - ], - [ - 5.8953739, - 46.0878021 - ], - [ - 6.1171418, - 46.3681838 - ], - [ - 6.0942003, - 46.5998657 - ], - [ - 6.4383228, - 46.7782169 - ], - [ - 6.4306756, - 46.9298747 - ], - [ - 7.0806847, - 47.3460216 - ], - [ - 6.8436226, - 47.3719227 - ], - [ - 6.9965659, - 47.5012373 - ], - [ - 7.1800979, - 47.5064033 - ], - [ - 7.2336281, - 47.439206 - ], - [ - 7.4553959, - 47.4805683 - ], - [ - 7.7842241, - 48.645735 - ], - [ - 8.1971711, - 49.0282701 - ], - [ - 7.6006921, - 49.0382974 - ], - [ - 7.4477487, - 49.1634679 - ], - [ - 7.2030394, - 49.1034255 - ], - [ - 6.6677378, - 49.1634679 - ], - [ - 6.6371491, - 49.3331933 - ], - [ - 6.3542039, - 49.4576194 - ], - [ - 6.5453831, - 49.8043366 - ], - [ - 6.2471436, - 49.873384 - ], - [ - 6.0789059, - 50.1534883 - ], - [ - 6.3618511, - 50.3685934 - ], - [ - 6.0865531, - 50.7039632 - ], - [ - 5.8800796, - 51.0513752 - ], - [ - 6.1247889, - 51.1618085 - ], - [ - 6.1936134, - 51.491527 - ], - [ - 5.9641984, - 51.7526501 - ], - [ - 6.0253758, - 51.8897286 - ], - [ - 6.4536171, - 51.8661241 - ], - [ - 6.8436226, - 51.9557552 - ], - [ - 6.6906793, - 52.0499105 - ], - [ - 7.0042131, - 52.2282603 - ], - [ - 7.0195074, - 52.4525245 - ], - [ - 6.6983264, - 52.4665032 - ], - [ - 6.6906793, - 52.6524628 - ], - [ - 7.0348017, - 52.6385432 - ], - [ - 7.0730376, - 52.8330151 - ], - [ - 7.2183337, - 52.9852064 - ], - [ - 7.1953922, - 53.3428087 - ], - [ - 7.0042131, - 53.3291098 - ] - ] - ], - "terms_url": "http://openstreetmap.org/", - "terms_text": "© OpenStreetMap contributors, CC-BY-SA" - }, - { - "name": "OpenStreetMap (Mapnik)", - "type": "tms", - "description": "The default OpenStreetMap layer.", - "template": "http://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png", - "scaleExtent": [ - 0, - 19 - ], - "terms_url": "http://openstreetmap.org/", - "terms_text": "© OpenStreetMap contributors, CC-BY-SA", - "id": "MAPNIK", - "default": true - }, - { - "name": "OpenStreetMap GPS traces", - "type": "tms", - "description": "Public GPS traces uploaded to OpenStreetMap.", - "template": "http://{switch:a,b,c}.gps-tile.openstreetmap.org/lines/{zoom}/{x}/{y}.png", - "scaleExtent": [ - 0, - 20 - ], - "terms_url": "http://www.openstreetmap.org/copyright", - "terms_text": "© OpenStreetMap contributors", - "terms_html": "© OpenStreetMap contributors. North: South: East: West: ", - "overlay": true - }, - { - "name": "Pangasinán/Bulacan (Phillipines HiRes)", - "type": "tms", - "template": "http://gravitystorm.dev.openstreetmap.org/imagery/philippines/{zoom}/{x}/{y}.png", - "scaleExtent": [ - 12, - 19 - ], - "polygon": [ - [ - [ - 120.336593, - 15.985768 - ], - [ - 120.445995, - 15.984 - ], - [ - 120.446134, - 15.974459 - ], - [ - 120.476464, - 15.974592 - ], - [ - 120.594247, - 15.946832 - ], - [ - 120.598064, - 16.090795 - ], - [ - 120.596537, - 16.197999 - ], - [ - 120.368537, - 16.218527 - ], - [ - 120.347576, - 16.042308 - ], - [ - 120.336593, - 15.985768 - ] - ], - [ - [ - 120.8268, - 15.3658 - ], - [ - 121.2684, - 15.2602 - ], - [ - 121.2699, - 14.7025 - ], - [ - 120.695, - 14.8423 - ] - ] - ] - }, - { - "name": "Slovakia EEA CORINE 2006", - "type": "tms", - "template": "http://www.freemap.sk/tms/clc/{zoom}/{x}/{y}.png", - "polygon": [ - [ - [ - 19.83682, - 49.25529 - ], - [ - 19.80075, - 49.42385 - ], - [ - 19.60437, - 49.48058 - ], - [ - 19.49179, - 49.63961 - ], - [ - 19.21831, - 49.52604 - ], - [ - 19.16778, - 49.42521 - ], - [ - 19.00308, - 49.42236 - ], - [ - 18.97611, - 49.5308 - ], - [ - 18.54685, - 49.51425 - ], - [ - 18.31432, - 49.33818 - ], - [ - 18.15913, - 49.2961 - ], - [ - 18.05564, - 49.11134 - ], - [ - 17.56396, - 48.84938 - ], - [ - 17.17929, - 48.88816 - ], - [ - 17.058, - 48.81105 - ], - [ - 16.90426, - 48.61947 - ], - [ - 16.79685, - 48.38561 - ], - [ - 17.06762, - 48.01116 - ], - [ - 17.32787, - 47.97749 - ], - [ - 17.51699, - 47.82535 - ], - [ - 17.74776, - 47.73093 - ], - [ - 18.29515, - 47.72075 - ], - [ - 18.67959, - 47.75541 - ], - [ - 18.89755, - 47.81203 - ], - [ - 18.79463, - 47.88245 - ], - [ - 18.84318, - 48.04046 - ], - [ - 19.46212, - 48.05333 - ], - [ - 19.62064, - 48.22938 - ], - [ - 19.89585, - 48.09387 - ], - [ - 20.33766, - 48.2643 - ], - [ - 20.55395, - 48.52358 - ], - [ - 20.82335, - 48.55714 - ], - [ - 21.10271, - 48.47096 - ], - [ - 21.45863, - 48.55513 - ], - [ - 21.74536, - 48.31435 - ], - [ - 22.15293, - 48.37179 - ], - [ - 22.61255, - 49.08914 - ], - [ - 22.09997, - 49.23814 - ], - [ - 21.9686, - 49.36363 - ], - [ - 21.6244, - 49.46989 - ], - [ - 21.06873, - 49.46402 - ], - [ - 20.94336, - 49.31088 - ], - [ - 20.73052, - 49.44006 - ], - [ - 20.22804, - 49.41714 - ], - [ - 20.05234, - 49.23052 - ], - [ - 19.83682, - 49.25529 - ] - ] - ], - "terms_url": "http://www.eea.europa.eu/data-and-maps/data/clc-2006-vector-data-version-1", - "terms_text": "EEA Corine 2006" - }, - { - "name": "Slovakia EEA GMES Urban Atlas", - "type": "tms", - "template": "http://www.freemap.sk/tms/urbanatlas/{zoom}/{x}/{y}.png", - "polygon": [ - [ - [ - 19.83682, - 49.25529 - ], - [ - 19.80075, - 49.42385 - ], - [ - 19.60437, - 49.48058 - ], - [ - 19.49179, - 49.63961 - ], - [ - 19.21831, - 49.52604 - ], - [ - 19.16778, - 49.42521 - ], - [ - 19.00308, - 49.42236 - ], - [ - 18.97611, - 49.5308 - ], - [ - 18.54685, - 49.51425 - ], - [ - 18.31432, - 49.33818 - ], - [ - 18.15913, - 49.2961 - ], - [ - 18.05564, - 49.11134 - ], - [ - 17.56396, - 48.84938 - ], - [ - 17.17929, - 48.88816 - ], - [ - 17.058, - 48.81105 - ], - [ - 16.90426, - 48.61947 - ], - [ - 16.79685, - 48.38561 - ], - [ - 17.06762, - 48.01116 - ], - [ - 17.32787, - 47.97749 - ], - [ - 17.51699, - 47.82535 - ], - [ - 17.74776, - 47.73093 - ], - [ - 18.29515, - 47.72075 - ], - [ - 18.67959, - 47.75541 - ], - [ - 18.89755, - 47.81203 - ], - [ - 18.79463, - 47.88245 - ], - [ - 18.84318, - 48.04046 - ], - [ - 19.46212, - 48.05333 - ], - [ - 19.62064, - 48.22938 - ], - [ - 19.89585, - 48.09387 - ], - [ - 20.33766, - 48.2643 - ], - [ - 20.55395, - 48.52358 - ], - [ - 20.82335, - 48.55714 - ], - [ - 21.10271, - 48.47096 - ], - [ - 21.45863, - 48.55513 - ], - [ - 21.74536, - 48.31435 - ], - [ - 22.15293, - 48.37179 - ], - [ - 22.61255, - 49.08914 - ], - [ - 22.09997, - 49.23814 - ], - [ - 21.9686, - 49.36363 - ], - [ - 21.6244, - 49.46989 - ], - [ - 21.06873, - 49.46402 - ], - [ - 20.94336, - 49.31088 - ], - [ - 20.73052, - 49.44006 - ], - [ - 20.22804, - 49.41714 - ], - [ - 20.05234, - 49.23052 - ], - [ - 19.83682, - 49.25529 - ] - ] - ], - "terms_url": "http://www.eea.europa.eu/data-and-maps/data/urban-atlas", - "terms_text": "EEA GMES Urban Atlas" - }, - { - "name": "Slovakia Historic Maps", - "type": "tms", - "template": "http://tms.freemap.sk/historicke/{zoom}/{x}/{y}.png", - "scaleExtent": [ - 0, - 12 - ], - "polygon": [ - [ - [ - 16.8196949, - 47.4927236 - ], - [ - 16.8196949, - 49.5030322 - ], - [ - 22.8388318, - 49.5030322 - ], - [ - 22.8388318, - 47.4927236 - ], - [ - 16.8196949, - 47.4927236 - ] - ] - ] - }, - { - "name": "South Africa CD:NGI Aerial", - "type": "tms", - "template": "http://{switch:a,b,c}.aerial.openstreetmap.org.za/ngi-aerial/{zoom}/{x}/{y}.jpg", - "scaleExtent": [ - 1, - 22 - ], - "polygon": [ - [ - [ - 17.8396817, - -32.7983384 - ], - [ - 17.8893509, - -32.6972835 - ], - [ - 18.00364, - -32.6982187 - ], - [ - 18.0991679, - -32.7485251 - ], - [ - 18.2898747, - -32.5526645 - ], - [ - 18.2930182, - -32.0487089 - ], - [ - 18.105455, - -31.6454966 - ], - [ - 17.8529257, - -31.3443951 - ], - [ - 17.5480046, - -30.902171 - ], - [ - 17.4044506, - -30.6374731 - ], - [ - 17.2493704, - -30.3991663 - ], - [ - 16.9936977, - -29.6543552 - ], - [ - 16.7987996, - -29.19437 - ], - [ - 16.5494139, - -28.8415949 - ], - [ - 16.4498691, - -28.691876 - ], - [ - 16.4491046, - -28.5515766 - ], - [ - 16.6002551, - -28.4825663 - ], - [ - 16.7514057, - -28.4486958 - ], - [ - 16.7462192, - -28.2458973 - ], - [ - 16.8855148, - -28.04729 - ], - [ - 16.9929502, - -28.0244005 - ], - [ - 17.0529659, - -28.0257086 - ], - [ - 17.1007562, - -28.0338839 - ], - [ - 17.2011527, - -28.0930546 - ], - [ - 17.2026346, - -28.2328424 - ], - [ - 17.2474611, - -28.2338215 - ], - [ - 17.2507953, - -28.198892 - ], - [ - 17.3511919, - -28.1975861 - ], - [ - 17.3515624, - -28.2442655 - ], - [ - 17.4015754, - -28.2452446 - ], - [ - 17.4149122, - -28.3489751 - ], - [ - 17.4008345, - -28.547997 - ], - [ - 17.4526999, - -28.5489733 - ], - [ - 17.4512071, - -28.6495106 - ], - [ - 17.4983599, - -28.6872054 - ], - [ - 17.6028204, - -28.6830048 - ], - [ - 17.6499732, - -28.6967928 - ], - [ - 17.6525928, - -28.7381457 - ], - [ - 17.801386, - -28.7381457 - ], - [ - 17.9994276, - -28.7560602 - ], - [ - 18.0002748, - -28.7956172 - ], - [ - 18.1574507, - -28.8718055 - ], - [ - 18.5063811, - -28.8718055 - ], - [ - 18.6153564, - -28.8295875 - ], - [ - 18.9087513, - -28.8277516 - ], - [ - 19.1046973, - -28.9488548 - ], - [ - 19.1969071, - -28.9378513 - ], - [ - 19.243012, - -28.8516164 - ], - [ - 19.2314858, - -28.802963 - ], - [ - 19.2587296, - -28.7009928 - ], - [ - 19.4431493, - -28.6973163 - ], - [ - 19.5500289, - -28.4958332 - ], - [ - 19.6967264, - -28.4939914 - ], - [ - 19.698822, - -28.4479358 - ], - [ - 19.8507587, - -28.4433291 - ], - [ - 19.8497109, - -28.4027818 - ], - [ - 19.9953605, - -28.399095 - ], - [ - 19.9893671, - -24.7497859 - ], - [ - 20.2916682, - -24.9192346 - ], - [ - 20.4724562, - -25.1501701 - ], - [ - 20.6532441, - -25.4529449 - ], - [ - 20.733265, - -25.6801957 - ], - [ - 20.8281046, - -25.8963498 - ], - [ - 20.8429232, - -26.215851 - ], - [ - 20.6502804, - -26.4840868 - ], - [ - 20.6532441, - -26.8204869 - ], - [ - 21.0889134, - -26.846933 - ], - [ - 21.6727695, - -26.8389998 - ], - [ - 21.7765003, - -26.6696268 - ], - [ - 21.9721069, - -26.6431395 - ], - [ - 22.2803355, - -26.3274702 - ], - [ - 22.5707817, - -26.1333967 - ], - [ - 22.7752795, - -25.6775246 - ], - [ - 23.0005235, - -25.2761948 - ], - [ - 23.4658301, - -25.2735148 - ], - [ - 23.883717, - -25.597366 - ], - [ - 24.2364017, - -25.613402 - ], - [ - 24.603905, - -25.7896563 - ], - [ - 25.110704, - -25.7389432 - ], - [ - 25.5078447, - -25.6855376 - ], - [ - 25.6441766, - -25.4823781 - ], - [ - 25.8419267, - -24.7805437 - ], - [ - 25.846641, - -24.7538456 - ], - [ - 26.3928487, - -24.6332894 - ], - [ - 26.4739066, - -24.5653312 - ], - [ - 26.5089966, - -24.4842437 - ], - [ - 26.5861946, - -24.4075775 - ], - [ - 26.7300635, - -24.3014458 - ], - [ - 26.8567384, - -24.2499463 - ], - [ - 26.8574402, - -24.1026901 - ], - [ - 26.9215471, - -23.8990957 - ], - [ - 26.931831, - -23.8461891 - ], - [ - 26.9714827, - -23.6994344 - ], - [ - 27.0006074, - -23.6367644 - ], - [ - 27.0578041, - -23.6052574 - ], - [ - 27.1360547, - -23.5203437 - ], - [ - 27.3339623, - -23.3973792 - ], - [ - 27.5144057, - -23.3593929 - ], - [ - 27.5958145, - -23.2085465 - ], - [ - 27.8098634, - -23.0994957 - ], - [ - 27.8828506, - -23.0620496 - ], - [ - 27.9382928, - -22.9496487 - ], - [ - 28.0407556, - -22.8255118 - ], - [ - 28.2056786, - -22.6552861 - ], - [ - 28.3397223, - -22.5639374 - ], - [ - 28.4906093, - -22.560697 - ], - [ - 28.6108769, - -22.5400248 - ], - [ - 28.828175, - -22.4550173 - ], - [ - 28.9285324, - -22.4232328 - ], - [ - 28.9594116, - -22.3090081 - ], - [ - 29.0162574, - -22.208335 - ], - [ - 29.2324117, - -22.1693453 - ], - [ - 29.3531213, - -22.1842926 - ], - [ - 29.6548952, - -22.1186426 - ], - [ - 29.7777102, - -22.1361956 - ], - [ - 29.9292989, - -22.1849425 - ], - [ - 30.1166795, - -22.2830348 - ], - [ - 30.2563377, - -22.2914767 - ], - [ - 30.3033582, - -22.3395204 - ], - [ - 30.5061784, - -22.3057617 - ], - [ - 30.8374279, - -22.284983 - ], - [ - 31.0058599, - -22.3077095 - ], - [ - 31.1834152, - -22.3232913 - ], - [ - 31.2930586, - -22.3674647 - ], - [ - 31.5680579, - -23.1903385 - ], - [ - 31.5568311, - -23.4430809 - ], - [ - 31.6931122, - -23.6175209 - ], - [ - 31.7119696, - -23.741136 - ], - [ - 31.7774743, - -23.8800628 - ], - [ - 31.8886337, - -23.9481098 - ], - [ - 31.9144386, - -24.1746736 - ], - [ - 31.9948307, - -24.3040878 - ], - [ - 32.0166656, - -24.4405988 - ], - [ - 32.0077331, - -24.6536578 - ], - [ - 32.019643, - -24.9140701 - ], - [ - 32.035523, - -25.0849767 - ], - [ - 32.019643, - -25.3821442 - ], - [ - 31.9928457, - -25.4493771 - ], - [ - 31.9997931, - -25.5165725 - ], - [ - 32.0057481, - -25.6078978 - ], - [ - 32.0057481, - -25.6624806 - ], - [ - 31.9362735, - -25.8403721 - ], - [ - 31.9809357, - -25.9546537 - ], - [ - 31.8687838, - -26.0037251 - ], - [ - 31.4162062, - -25.7277683 - ], - [ - 31.3229117, - -25.7438611 - ], - [ - 31.2504595, - -25.8296526 - ], - [ - 31.1393001, - -25.9162746 - ], - [ - 31.1164727, - -25.9912361 - ], - [ - 30.9656135, - -26.2665756 - ], - [ - 30.8921689, - -26.3279703 - ], - [ - 30.8534616, - -26.4035568 - ], - [ - 30.8226943, - -26.4488849 - ], - [ - 30.8022583, - -26.5240694 - ], - [ - 30.8038369, - -26.8082089 - ], - [ - 30.9020939, - -26.7807451 - ], - [ - 30.9100338, - -26.8489495 - ], - [ - 30.9824859, - -26.9082627 - ], - [ - 30.976531, - -27.0029222 - ], - [ - 31.0034434, - -27.0441587 - ], - [ - 31.1543322, - -27.1980416 - ], - [ - 31.5015607, - -27.311117 - ], - [ - 31.9700183, - -27.311117 - ], - [ - 31.9700183, - -27.120472 - ], - [ - 31.9769658, - -27.050664 - ], - [ - 32.0002464, - -26.7983892 - ], - [ - 32.1069826, - -26.7984645 - ], - [ - 32.3114546, - -26.8479493 - ], - [ - 32.899986, - -26.8516059 - ], - [ - 32.886091, - -26.9816971 - ], - [ - 32.709427, - -27.4785436 - ], - [ - 32.6240724, - -27.7775144 - ], - [ - 32.5813951, - -28.07479 - ], - [ - 32.5387178, - -28.2288046 - ], - [ - 32.4275584, - -28.5021568 - ], - [ - 32.3640388, - -28.5945699 - ], - [ - 32.0702603, - -28.8469827 - ], - [ - 31.9878832, - -28.9069497 - ], - [ - 31.7764818, - -28.969487 - ], - [ - 31.4638459, - -29.2859343 - ], - [ - 31.359634, - -29.3854348 - ], - [ - 31.1680825, - -29.6307408 - ], - [ - 31.064863, - -29.7893535 - ], - [ - 31.0534493, - -29.8470469 - ], - [ - 31.0669933, - -29.8640319 - ], - [ - 31.0455459, - -29.9502017 - ], - [ - 30.9518556, - -30.0033946 - ], - [ - 30.8651833, - -30.1024093 - ], - [ - 30.7244725, - -30.392502 - ], - [ - 30.3556256, - -30.9308873 - ], - [ - 30.0972364, - -31.2458274 - ], - [ - 29.8673136, - -31.4304296 - ], - [ - 29.7409393, - -31.5014699 - ], - [ - 29.481312, - -31.6978686 - ], - [ - 28.8943171, - -32.2898903 - ], - [ - 28.5497137, - -32.5894641 - ], - [ - 28.1436499, - -32.8320732 - ], - [ - 28.0748735, - -32.941689 - ], - [ - 27.8450942, - -33.082869 - ], - [ - 27.3757956, - -33.3860685 - ], - [ - 26.8805407, - -33.6458951 - ], - [ - 26.5916871, - -33.7480756 - ], - [ - 26.4527308, - -33.7935795 - ], - [ - 26.206754, - -33.7548943 - ], - [ - 26.0077897, - -33.7223961 - ], - [ - 25.8055494, - -33.7524272 - ], - [ - 25.7511073, - -33.8006512 - ], - [ - 25.6529079, - -33.8543597 - ], - [ - 25.6529079, - -33.9469768 - ], - [ - 25.7195789, - -34.0040115 - ], - [ - 25.7202807, - -34.0511235 - ], - [ - 25.5508915, - -34.063151 - ], - [ - 25.3504571, - -34.0502627 - ], - [ - 25.2810609, - -34.0020322 - ], - [ - 25.0476316, - -33.9994588 - ], - [ - 24.954724, - -34.0043594 - ], - [ - 24.9496586, - -34.1010363 - ], - [ - 24.8770358, - -34.1506456 - ], - [ - 24.8762914, - -34.2005281 - ], - [ - 24.8532574, - -34.2189562 - ], - [ - 24.7645287, - -34.2017946 - ], - [ - 24.5001356, - -34.2003254 - ], - [ - 24.3486733, - -34.1163824 - ], - [ - 24.1988819, - -34.1019039 - ], - [ - 23.9963377, - -34.0514443 - ], - [ - 23.8017509, - -34.0524332 - ], - [ - 23.7493589, - -34.0111855 - ], - [ - 23.4973536, - -34.009014 - ], - [ - 23.4155191, - -34.0434586 - ], - [ - 23.4154284, - -34.1140433 - ], - [ - 22.9000853, - -34.0993009 - ], - [ - 22.8412418, - -34.0547911 - ], - [ - 22.6470321, - -34.0502627 - ], - [ - 22.6459843, - -34.0072768 - ], - [ - 22.570016, - -34.0064081 - ], - [ - 22.5050499, - -34.0645866 - ], - [ - 22.2519968, - -34.0645866 - ], - [ - 22.2221334, - -34.1014701 - ], - [ - 22.1621197, - -34.1057019 - ], - [ - 22.1712431, - -34.1521766 - ], - [ - 22.1576913, - -34.2180897 - ], - [ - 22.0015632, - -34.2172232 - ], - [ - 21.9496952, - -34.3220009 - ], - [ - 21.8611528, - -34.4007145 - ], - [ - 21.5614708, - -34.4020114 - ], - [ - 21.5468011, - -34.3661242 - ], - [ - 21.501744, - -34.3669892 - ], - [ - 21.5006961, - -34.4020114 - ], - [ - 21.4194886, - -34.4465247 - ], - [ - 21.1978706, - -34.4478208 - ], - [ - 21.0988193, - -34.3991325 - ], - [ - 21.0033746, - -34.3753872 - ], - [ - 20.893192, - -34.3997115 - ], - [ - 20.8976647, - -34.4854003 - ], - [ - 20.7446802, - -34.4828092 - ], - [ - 20.5042011, - -34.486264 - ], - [ - 20.2527197, - -34.701477 - ], - [ - 20.0803502, - -34.8361855 - ], - [ - 19.9923317, - -34.8379056 - ], - [ - 19.899074, - -34.8275845 - ], - [ - 19.8938348, - -34.7936018 - ], - [ - 19.5972963, - -34.7961833 - ], - [ - 19.3929677, - -34.642015 - ], - [ - 19.2877095, - -34.6404784 - ], - [ - 19.2861377, - -34.5986563 - ], - [ - 19.3474363, - -34.5244458 - ], - [ - 19.3285256, - -34.4534372 - ], - [ - 19.098001, - -34.449981 - ], - [ - 19.0725583, - -34.3802371 - ], - [ - 19.0023531, - -34.3525593 - ], - [ - 18.9520568, - -34.3949373 - ], - [ - 18.7975006, - -34.3936403 - ], - [ - 18.7984174, - -34.1016376 - ], - [ - 18.501748, - -34.1015292 - ], - [ - 18.4999545, - -34.3616945 - ], - [ - 18.4477325, - -34.3620007 - ], - [ - 18.4479944, - -34.3522691 - ], - [ - 18.3974362, - -34.3514041 - ], - [ - 18.3971742, - -34.3022959 - ], - [ - 18.3565705, - -34.3005647 - ], - [ - 18.3479258, - -34.2020436 - ], - [ - 18.2972095, - -34.1950274 - ], - [ - 18.2951139, - -33.9937138 - ], - [ - 18.3374474, - -33.9914079 - ], - [ - 18.3476638, - -33.8492427 - ], - [ - 18.3479258, - -33.781555 - ], - [ - 18.4124718, - -33.7448849 - ], - [ - 18.3615477, - -33.6501624 - ], - [ - 18.2992013, - -33.585591 - ], - [ - 18.2166839, - -33.448872 - ], - [ - 18.1389858, - -33.3974083 - ], - [ - 17.9473472, - -33.1602647 - ], - [ - 17.8855247, - -33.0575732 - ], - [ - 17.8485884, - -32.9668505 - ], - [ - 17.8396817, - -32.8507302 - ] - ] - ] - }, - { - "name": "South Tyrol Orthofoto 2011", - "type": "tms", - "template": "http://sdi.provincia.bz.it/geoserver/gwc/service/tms/1.0.0/WMTS_OF2011_APB-PAB@GoogleMapsCompatible@png8/{z}/{x}/{-y}.png", - "polygon": [ - [ - [ - 10.373383, - 46.213553 - ], - [ - 10.373383, - 47.098175 - ], - [ - 12.482758, - 47.098175 - ], - [ - 12.482758, - 46.213553 - ], - [ - 10.373383, - 46.213553 - ] - ] - ], - "id": "sdi.provinz.bz.it-WMTS_OF2011_APB-PAB" - }, - { - "name": "South Tyrol Topomap", - "type": "tms", - "template": "http://sdi.provincia.bz.it/geoserver/gwc/service/tms/1.0.0/WMTS_TOPOMAP_APB-PAB@GoogleMapsCompatible@png8/{z}/{x}/{-y}.png", - "polygon": [ - [ - [ - 10.373383, - 46.213553 - ], - [ - 10.373383, - 47.098175 - ], - [ - 12.482758, - 47.098175 - ], - [ - 12.482758, - 46.213553 - ], - [ - 10.373383, - 46.213553 - ] - ] - ], - "id": "sdi.provinz.bz.it-WMTS_TOPOMAP_APB-PAB" - }, - { - "name": "Stadt Uster Orthophoto 2008 10cm", - "type": "tms", - "template": "http://mapproxy.sosm.ch:8080/tiles/uster/EPSG900913/{zoom}/{x}/{y}.png?origin=nw", - "polygon": [ - [ - [ - 8.6, - 47.31 - ], - [ - 8.6, - 47.39 - ], - [ - 8.77, - 47.39 - ], - [ - 8.77, - 47.31 - ], - [ - 8.6, - 47.31 - ] - ] - ], - "terms_text": "Stadt Uster Vermessung Orthophoto 2008" - }, - { - "name": "Stadt Zürich Luftbild 2011", - "type": "tms", - "template": "http://mapproxy.sosm.ch:8080/tiles/zh_luftbild2011/EPSG900913/{z}/{x}/{y}.png?origin=nw", - "polygon": [ - [ - [ - 8.4441, - 47.3141 - ], - [ - 8.4441, - 47.4411 - ], - [ - 8.6284, - 47.4411 - ], - [ - 8.6284, - 47.3141 - ], - [ - 8.4441, - 47.3141 - ] - ] - ], - "terms_text": "Stadt Zürich Luftbild 2011" - }, - { - "name": "Stevns (Denmark)", - "type": "tms", - "template": "http://{switch:a,b,c}.tile.openstreetmap.dk/stevns/2009/{zoom}/{x}/{y}.png", - "scaleExtent": [ - 0, - 20 - ], - "polygon": [ - [ - [ - 12.0913942, - 55.3491574 - ], - [ - 12.0943104, - 55.3842256 - ], - [ - 12.1573875, - 55.3833103 - ], - [ - 12.1587287, - 55.4013326 - ], - [ - 12.1903468, - 55.400558 - ], - [ - 12.1931411, - 55.4364665 - ], - [ - 12.2564251, - 55.4347995 - ], - [ - 12.2547073, - 55.4168882 - ], - [ - 12.3822489, - 55.4134349 - ], - [ - 12.3795942, - 55.3954143 - ], - [ - 12.4109213, - 55.3946958 - ], - [ - 12.409403, - 55.3766417 - ], - [ - 12.4407807, - 55.375779 - ], - [ - 12.4394142, - 55.3578314 - ], - [ - 12.4707413, - 55.3569971 - ], - [ - 12.4629475, - 55.2672214 - ], - [ - 12.4315633, - 55.2681491 - ], - [ - 12.430045, - 55.2502103 - ], - [ - 12.3672011, - 55.2519673 - ], - [ - 12.3656858, - 55.2340267 - ], - [ - 12.2714604, - 55.2366031 - ], - [ - 12.2744467, - 55.272476 - ], - [ - 12.2115654, - 55.2741475 - ], - [ - 12.2130078, - 55.2920322 - ], - [ - 12.1815665, - 55.2928638 - ], - [ - 12.183141, - 55.3107091 - ], - [ - 12.2144897, - 55.3100981 - ], - [ - 12.2159927, - 55.3279764 - ], - [ - 12.1214458, - 55.3303379 - ], - [ - 12.1229489, - 55.3483291 - ] - ] - ], - "terms_text": "Stevns Kommune" - }, - { - "name": "Surrey Air Survey", - "type": "tms", - "template": "http://gravitystorm.dev.openstreetmap.org/surrey/{zoom}/{x}/{y}.png", - "scaleExtent": [ - 8, - 19 - ], - "polygon": [ - [ - [ - -0.752478, - 51.0821941 - ], - [ - -0.7595183, - 51.0856254 - ], - [ - -0.8014342, - 51.1457917 - ], - [ - -0.8398864, - 51.1440686 - ], - [ - -0.8357665, - 51.1802397 - ], - [ - -0.8529549, - 51.2011266 - ], - [ - -0.8522683, - 51.2096231 - ], - [ - -0.8495217, - 51.217903 - ], - [ - -0.8266907, - 51.2403696 - ], - [ - -0.8120995, - 51.2469248 - ], - [ - -0.7736474, - 51.2459577 - ], - [ - -0.7544213, - 51.2381127 - ], - [ - -0.754078, - 51.233921 - ], - [ - -0.7446366, - 51.2333836 - ], - [ - -0.7430693, - 51.2847178 - ], - [ - -0.751503, - 51.3069524 - ], - [ - -0.7664376, - 51.3121032 - ], - [ - -0.7820588, - 51.3270157 - ], - [ - -0.7815438, - 51.3388135 - ], - [ - -0.7374268, - 51.3720456 - ], - [ - -0.7192307, - 51.3769748 - ], - [ - -0.6795769, - 51.3847961 - ], - [ - -0.6807786, - 51.3901523 - ], - [ - -0.6531411, - 51.3917591 - ], - [ - -0.6301385, - 51.3905808 - ], - [ - -0.6291085, - 51.3970074 - ], - [ - -0.6234437, - 51.3977572 - ], - [ - -0.613144, - 51.4295552 - ], - [ - -0.6002471, - 51.4459121 - ], - [ - -0.5867081, - 51.4445365 - ], - [ - -0.5762368, - 51.453202 - ], - [ - -0.5626755, - 51.4523462 - ], - [ - -0.547741, - 51.4469972 - ], - [ - -0.5372697, - 51.4448575 - ], - [ - -0.537098, - 51.4526671 - ], - [ - -0.5439644, - 51.4545926 - ], - [ - -0.5405312, - 51.4698865 - ], - [ - -0.5309182, - 51.4760881 - ], - [ - -0.5091172, - 51.4744843 - ], - [ - -0.5086022, - 51.4695657 - ], - [ - -0.4900628, - 51.4682825 - ], - [ - -0.4526406, - 51.4606894 - ], - [ - -0.4486924, - 51.4429316 - ], - [ - -0.4414826, - 51.4418616 - ], - [ - -0.4418259, - 51.4369394 - ], - [ - -0.4112702, - 51.4380095 - ], - [ - -0.4014855, - 51.4279498 - ], - [ - -0.3807145, - 51.4262372 - ], - [ - -0.3805428, - 51.4161749 - ], - [ - -0.3491288, - 51.4138195 - ], - [ - -0.3274994, - 51.4037544 - ], - [ - -0.3039818, - 51.3990424 - ], - [ - -0.3019219, - 51.3754747 - ], - [ - -0.309475, - 51.369688 - ], - [ - -0.3111916, - 51.3529669 - ], - [ - -0.2955704, - 51.3541462 - ], - [ - -0.2923089, - 51.3673303 - ], - [ - -0.2850991, - 51.3680805 - ], - [ - -0.2787476, - 51.3771891 - ], - [ - -0.2655297, - 51.3837247 - ], - [ - -0.2411538, - 51.3847961 - ], - [ - -0.2123147, - 51.3628288 - ], - [ - -0.2107697, - 51.3498578 - ], - [ - -0.190857, - 51.3502867 - ], - [ - -0.1542931, - 51.3338802 - ], - [ - -0.1496583, - 51.3057719 - ], - [ - -0.1074296, - 51.2966491 - ], - [ - -0.0887185, - 51.3099571 - ], - [ - -0.0878602, - 51.3220811 - ], - [ - -0.0652009, - 51.3215448 - ], - [ - -0.0641709, - 51.3264793 - ], - [ - -0.0519829, - 51.3263721 - ], - [ - -0.0528412, - 51.334631 - ], - [ - -0.0330779, - 51.3430876 - ], - [ - 0.0019187, - 51.3376339 - ], - [ - 0.0118751, - 51.3281956 - ], - [ - 0.013935, - 51.2994398 - ], - [ - 0.0202865, - 51.2994398 - ], - [ - 0.0240631, - 51.3072743 - ], - [ - 0.0331611, - 51.3086694 - ], - [ - 0.0455207, - 51.30545 - ], - [ - 0.0523872, - 51.2877392 - ], - [ - 0.0616569, - 51.2577764 - ], - [ - 0.0640602, - 51.2415518 - ], - [ - 0.0462074, - 51.2126342 - ], - [ - 0.0407142, - 51.2109136 - ], - [ - 0.0448341, - 51.1989753 - ], - [ - 0.0494689, - 51.1997283 - ], - [ - 0.0558204, - 51.1944573 - ], - [ - 0.0611419, - 51.1790713 - ], - [ - 0.0623435, - 51.1542061 - ], - [ - 0.0577087, - 51.1417146 - ], - [ - 0.0204582, - 51.1365447 - ], - [ - -0.0446015, - 51.1336364 - ], - [ - -0.1566964, - 51.1352522 - ], - [ - -0.1572114, - 51.1290043 - ], - [ - -0.2287942, - 51.1183379 - ], - [ - -0.2473336, - 51.1183379 - ], - [ - -0.2500802, - 51.1211394 - ], - [ - -0.299347, - 51.1137042 - ], - [ - -0.3221779, - 51.1119799 - ], - [ - -0.3223496, - 51.1058367 - ], - [ - -0.3596001, - 51.1019563 - ], - [ - -0.3589135, - 51.1113333 - ], - [ - -0.3863793, - 51.1117644 - ], - [ - -0.3869014, - 51.1062516 - ], - [ - -0.4281001, - 51.0947174 - ], - [ - -0.4856784, - 51.0951554 - ], - [ - -0.487135, - 51.0872266 - ], - [ - -0.5297404, - 51.0865404 - ], - [ - -0.5302259, - 51.0789914 - ], - [ - -0.61046, - 51.076551 - ], - [ - -0.6099745, - 51.080669 - ], - [ - -0.6577994, - 51.0792202 - ], - [ - -0.6582849, - 51.0743394 - ], - [ - -0.6836539, - 51.0707547 - ], - [ - -0.6997979, - 51.070831 - ], - [ - -0.7296581, - 51.0744919 - ] - ] - ] - }, - { - "name": "Szeged ortophoto 2011", - "type": "tms", - "template": "http://e.tile.openstreetmap.hu/szeged-2011-10cm/{zoom}/{x}/{y}.png", - "scaleExtent": [ - 10, - 22 - ], - "polygon": [ - [ - [ - 20.1103390994, - 46.226038352 - ], - [ - 20.1103390994, - 46.2791486357 - ], - [ - 20.1989636982, - 46.2791486357 - ], - [ - 20.1989636982, - 46.226038352 - ], - [ - 20.1103390994, - 46.226038352 - ] - ] - ], - "terms_url": "http://www.geo.u-szeged.hu", - "terms_text": "SZTE TFGT - University of Szeged" - }, - { - "name": "Toulouse - Orthophotoplan 2007", - "type": "tms", - "template": "http://wms.openstreetmap.fr/tms/1.0.0/toulouse_ortho2007/{zoom}/{x}/{y}", - "scaleExtent": [ - 0, - 22 - ], - "polygon": [ - [ - [ - 1.1919978, - 43.6328791 - ], - [ - 1.2015377, - 43.6329729 - ], - [ - 1.2011107, - 43.6554932 - ], - [ - 1.2227985, - 43.6557029 - ], - [ - 1.2226231, - 43.6653353 - ], - [ - 1.2275341, - 43.6653849 - ], - [ - 1.2275417, - 43.6656387 - ], - [ - 1.2337568, - 43.6656883 - ], - [ - 1.2337644, - 43.6650153 - ], - [ - 1.2351218, - 43.6650319 - ], - [ - 1.2350913, - 43.6670729 - ], - [ - 1.2443566, - 43.6671556 - ], - [ - 1.2441584, - 43.6743925 - ], - [ - 1.2493973, - 43.6744256 - ], - [ - 1.2493973, - 43.6746628 - ], - [ - 1.2555666, - 43.6747234 - ], - [ - 1.2555742, - 43.6744532 - ], - [ - 1.2569545, - 43.6744697 - ], - [ - 1.2568782, - 43.678529 - ], - [ - 1.2874873, - 43.6788257 - ], - [ - 1.2870803, - 43.7013229 - ], - [ - 1.3088219, - 43.7014632 - ], - [ - 1.3086493, - 43.7127673 - ], - [ - 1.3303262, - 43.7129544 - ], - [ - 1.3300242, - 43.7305221 - ], - [ - 1.3367106, - 43.7305845 - ], - [ - 1.3367322, - 43.7312235 - ], - [ - 1.3734338, - 43.7310456 - ], - [ - 1.3735848, - 43.7245772 - ], - [ - 1.4604504, - 43.7252947 - ], - [ - 1.4607783, - 43.7028034 - ], - [ - 1.4824875, - 43.7029516 - ], - [ - 1.4829828, - 43.6692071 - ], - [ - 1.5046832, - 43.6693616 - ], - [ - 1.5048383, - 43.6581174 - ], - [ - 1.5265475, - 43.6582656 - ], - [ - 1.5266945, - 43.6470298 - ], - [ - 1.548368, - 43.6471633 - ], - [ - 1.5485357, - 43.6359385 - ], - [ - 1.5702172, - 43.636082 - ], - [ - 1.5705123, - 43.6135777 - ], - [ - 1.5488166, - 43.6134276 - ], - [ - 1.549097, - 43.5909479 - ], - [ - 1.5707695, - 43.5910694 - ], - [ - 1.5709373, - 43.5798341 - ], - [ - 1.5793714, - 43.5798894 - ], - [ - 1.5794782, - 43.5737682 - ], - [ - 1.5809119, - 43.5737792 - ], - [ - 1.5810859, - 43.5573794 - ], - [ - 1.5712334, - 43.5573131 - ], - [ - 1.5716504, - 43.5235497 - ], - [ - 1.3984804, - 43.5222618 - ], - [ - 1.3986509, - 43.5110113 - ], - [ - 1.3120959, - 43.5102543 - ], - [ - 1.3118968, - 43.5215192 - ], - [ - 1.2902569, - 43.5213126 - ], - [ - 1.2898637, - 43.5438168 - ], - [ - 1.311517, - 43.5440133 - ], - [ - 1.3113271, - 43.5552596 - ], - [ - 1.3036924, - 43.5551924 - ], - [ - 1.3036117, - 43.5595099 - ], - [ - 1.2955449, - 43.5594317 - ], - [ - 1.2955449, - 43.5595489 - ], - [ - 1.2895595, - 43.5594473 - ], - [ - 1.2892899, - 43.5775366 - ], - [ - 1.2675698, - 43.5773647 - ], - [ - 1.2673973, - 43.5886141 - ], - [ - 1.25355, - 43.5885047 - ], - [ - 1.2533774, - 43.5956282 - ], - [ - 1.2518029, - 43.5956282 - ], - [ - 1.2518029, - 43.5949409 - ], - [ - 1.2350437, - 43.5947847 - ], - [ - 1.2350437, - 43.5945972 - ], - [ - 1.2239572, - 43.5945972 - ], - [ - 1.2239357, - 43.5994708 - ], - [ - 1.2139708, - 43.599299 - ], - [ - 1.2138845, - 43.6046408 - ], - [ - 1.2020647, - 43.6044846 - ], - [ - 1.2019464, - 43.61048 - ], - [ - 1.1924294, - 43.6103695 - ] - ] - ], - "terms_url": "https://wiki.openstreetmap.org/wiki/Toulouse/ToulouseMetropoleData", - "terms_text": "ToulouseMetropole" - }, - { - "name": "Toulouse - Orthophotoplan 2011", - "type": "tms", - "template": "http://wms.openstreetmap.fr/tms/1.0.0/toulouse_ortho2011/{zoom}/{x}/{y}", - "scaleExtent": [ - 0, - 22 - ], - "polygon": [ - [ - [ - 1.1135067, - 43.6867566 - ], - [ - 1.1351836, - 43.6870842 - ], - [ - 1.1348907, - 43.6983471 - ], - [ - 1.1782867, - 43.6990338 - ], - [ - 1.1779903, - 43.7102786 - ], - [ - 1.1996591, - 43.7106144 - ], - [ - 1.1993387, - 43.7218722 - ], - [ - 1.2427356, - 43.7225269 - ], - [ - 1.2424336, - 43.7337491 - ], - [ - 1.2641536, - 43.734092 - ], - [ - 1.2638301, - 43.7453588 - ], - [ - 1.2855285, - 43.7456548 - ], - [ - 1.2852481, - 43.756935 - ], - [ - 1.306925, - 43.757231 - ], - [ - 1.3066446, - 43.7684779 - ], - [ - 1.3283431, - 43.7687894 - ], - [ - 1.3280842, - 43.780034 - ], - [ - 1.4367275, - 43.7815757 - ], - [ - 1.4373098, - 43.7591004 - ], - [ - 1.4590083, - 43.7593653 - ], - [ - 1.4593318, - 43.7481479 - ], - [ - 1.4810303, - 43.7483972 - ], - [ - 1.4813322, - 43.7371777 - ], - [ - 1.5030307, - 43.7374115 - ], - [ - 1.5035915, - 43.7149664 - ], - [ - 1.5253115, - 43.7151846 - ], - [ - 1.5256135, - 43.7040057 - ], - [ - 1.5472688, - 43.7042552 - ], - [ - 1.5475708, - 43.6930431 - ], - [ - 1.5692045, - 43.6932926 - ], - [ - 1.5695712, - 43.6820316 - ], - [ - 1.5912049, - 43.6822656 - ], - [ - 1.5917441, - 43.6597998 - ], - [ - 1.613421, - 43.6600339 - ], - [ - 1.613723, - 43.6488291 - ], - [ - 1.6353783, - 43.6490788 - ], - [ - 1.6384146, - 43.5140731 - ], - [ - 1.2921649, - 43.5094658 - ], - [ - 1.2918629, - 43.5206966 - ], - [ - 1.2702076, - 43.5203994 - ], - [ - 1.2698841, - 43.5316437 - ], - [ - 1.2482288, - 43.531331 - ], - [ - 1.2476048, - 43.5537788 - ], - [ - 1.2259628, - 43.5534914 - ], - [ - 1.2256819, - 43.564716 - ], - [ - 1.2039835, - 43.564419 - ], - [ - 1.2033148, - 43.5869049 - ], - [ - 1.1816164, - 43.5865611 - ], - [ - 1.1810237, - 43.6090368 - ], - [ - 1.1592821, - 43.6086932 - ], - [ - 1.1589585, - 43.6199523 - ], - [ - 1.1372601, - 43.6196244 - ], - [ - 1.1365933, - 43.642094 - ], - [ - 1.1149055, - 43.6417629 - ] - ] - ], - "terms_url": "https://wiki.openstreetmap.org/wiki/Toulouse/ToulouseMetropoleData", - "terms_text": "ToulouseMetropole" - }, - { - "name": "Tours - Orthophotos 2008", - "type": "tms", - "template": "http://tms.mapspot.ge/tms/2/nonstandard/{zoom}/{x}/{y}.jpeg", - "polygon": [ - [ - [ - 0.5457462, - 47.465264 - ], - [ - 0.54585, - 47.4608163 - ], - [ - 0.5392188, - 47.4606983 - ], - [ - 0.5393484, - 47.456243 - ], - [ - 0.5327959, - 47.4561003 - ], - [ - 0.5329011, - 47.451565 - ], - [ - 0.52619, - 47.4514013 - ], - [ - 0.5265854, - 47.4424884 - ], - [ - 0.5000941, - 47.4420739 - ], - [ - 0.5002357, - 47.4375835 - ], - [ - 0.4936014, - 47.4374324 - ], - [ - 0.4937, - 47.4329285 - ], - [ - 0.4606141, - 47.4324593 - ], - [ - 0.4607248, - 47.4279827 - ], - [ - 0.4541016, - 47.4278125 - ], - [ - 0.454932, - 47.4053921 - ], - [ - 0.4615431, - 47.4054476 - ], - [ - 0.4619097, - 47.3964924 - ], - [ - 0.4684346, - 47.3966005 - ], - [ - 0.4691319, - 47.3786415 - ], - [ - 0.4757125, - 47.3787609 - ], - [ - 0.4762116, - 47.3652018 - ], - [ - 0.4828297, - 47.3653499 - ], - [ - 0.4832223, - 47.3518574 - ], - [ - 0.5097927, - 47.3522592 - ], - [ - 0.5095688, - 47.3567713 - ], - [ - 0.5227698, - 47.3569785 - ], - [ - 0.5226429, - 47.3614867 - ], - [ - 0.5490721, - 47.3618878 - ], - [ - 0.5489087, - 47.3663307 - ], - [ - 0.5555159, - 47.3664985 - ], - [ - 0.5559105, - 47.3575522 - ], - [ - 0.6152789, - 47.358407 - ], - [ - 0.6152963, - 47.362893 - ], - [ - 0.6285093, - 47.3630936 - ], - [ - 0.6288256, - 47.353987 - ], - [ - 0.6155012, - 47.3538823 - ], - [ - 0.6157682, - 47.3493424 - ], - [ - 0.6090956, - 47.3492991 - ], - [ - 0.6094735, - 47.3402962 - ], - [ - 0.6160477, - 47.3404448 - ], - [ - 0.616083, - 47.3369074 - ], - [ - 0.77497, - 47.3388218 - ], - [ - 0.7745786, - 47.351628 - ], - [ - 0.7680363, - 47.3515901 - ], - [ - 0.767589, - 47.3605298 - ], - [ - 0.7742443, - 47.3606238 - ], - [ - 0.7733465, - 47.3921266 - ], - [ - 0.7667434, - 47.3920195 - ], - [ - 0.7664411, - 47.4010837 - ], - [ - 0.7730647, - 47.4011115 - ], - [ - 0.7728868, - 47.4101297 - ], - [ - 0.7661849, - 47.4100226 - ], - [ - 0.7660267, - 47.4145044 - ], - [ - 0.7527613, - 47.4143038 - ], - [ - 0.7529788, - 47.4098086 - ], - [ - 0.7462373, - 47.4097016 - ], - [ - 0.7459424, - 47.4232208 - ], - [ - 0.7392324, - 47.4231451 - ], - [ - 0.738869, - 47.4366116 - ], - [ - 0.7323267, - 47.4365171 - ], - [ - 0.7321869, - 47.4410556 - ], - [ - 0.7255048, - 47.44098 - ], - [ - 0.7254209, - 47.4453479 - ], - [ - 0.7318793, - 47.4454803 - ], - [ - 0.7318514, - 47.4501126 - ], - [ - 0.7384496, - 47.450226 - ], - [ - 0.7383098, - 47.454631 - ], - [ - 0.7449359, - 47.4547444 - ], - [ - 0.7443209, - 47.4771985 - ], - [ - 0.7310685, - 47.4769717 - ], - [ - 0.7309008, - 47.4815445 - ], - [ - 0.7176205, - 47.4812611 - ], - [ - 0.7177883, - 47.4768394 - ], - [ - 0.69777, - 47.4764993 - ], - [ - 0.6980496, - 47.4719827 - ], - [ - 0.6914514, - 47.4718882 - ], - [ - 0.6917309, - 47.4630241 - ], - [ - 0.6851048, - 47.4629295 - ], - [ - 0.684937, - 47.4673524 - ], - [ - 0.678255, - 47.4673335 - ], - [ - 0.6779754, - 47.4762158 - ], - [ - 0.6714051, - 47.4761592 - ], - [ - 0.6710417, - 47.4881952 - ], - [ - 0.6577334, - 47.4879685 - ], - [ - 0.6578173, - 47.48504 - ], - [ - 0.6511911, - 47.4848322 - ], - [ - 0.6514707, - 47.4758568 - ], - [ - 0.6448166, - 47.4757245 - ], - [ - 0.6449284, - 47.4712646 - ], - [ - 0.6117976, - 47.4707543 - ], - [ - 0.6118815, - 47.4663129 - ], - [ - 0.6052833, - 47.4661239 - ], - [ - 0.6054231, - 47.4616631 - ], - [ - 0.5988808, - 47.4615497 - ], - [ - 0.5990206, - 47.4570886 - ], - [ - 0.572488, - 47.4566916 - ], - [ - 0.5721805, - 47.4656513 - ] - ] - ], - "terms_url": "http://wiki.openstreetmap.org/wiki/Tours/Orthophoto", - "terms_text": "Orthophoto Tour(s) Plus 2008" - }, - { - "name": "Tours - Orthophotos 2008-2010", - "type": "tms", - "template": "http://wms.openstreetmap.fr/tms/1.0.0/tours/{zoom}/{x}/{y}", - "scaleExtent": [ - 0, - 20 - ], - "polygon": [ - [ - [ - 0.5457462, - 47.465264 - ], - [ - 0.54585, - 47.4608163 - ], - [ - 0.5392188, - 47.4606983 - ], - [ - 0.5393484, - 47.456243 - ], - [ - 0.5327959, - 47.4561003 - ], - [ - 0.5329011, - 47.451565 - ], - [ - 0.52619, - 47.4514013 - ], - [ - 0.5265854, - 47.4424884 - ], - [ - 0.5000941, - 47.4420739 - ], - [ - 0.5002357, - 47.4375835 - ], - [ - 0.4936014, - 47.4374324 - ], - [ - 0.4937, - 47.4329285 - ], - [ - 0.4606141, - 47.4324593 - ], - [ - 0.4607248, - 47.4279827 - ], - [ - 0.4541016, - 47.4278125 - ], - [ - 0.454932, - 47.4053921 - ], - [ - 0.4615431, - 47.4054476 - ], - [ - 0.4619097, - 47.3964924 - ], - [ - 0.4684346, - 47.3966005 - ], - [ - 0.4691319, - 47.3786415 - ], - [ - 0.4757125, - 47.3787609 - ], - [ - 0.4762116, - 47.3652018 - ], - [ - 0.4828297, - 47.3653499 - ], - [ - 0.4829611, - 47.3608321 - ], - [ - 0.4763543, - 47.360743 - ], - [ - 0.476654, - 47.3517263 - ], - [ - 0.4700497, - 47.3516186 - ], - [ - 0.4701971, - 47.3471313 - ], - [ - 0.4637503, - 47.3470104 - ], - [ - 0.4571425, - 47.3424146 - ], - [ - 0.4572922, - 47.3379061 - ], - [ - 0.4506741, - 47.3378081 - ], - [ - 0.4508379, - 47.3333051 - ], - [ - 0.4442212, - 47.3332032 - ], - [ - 0.4443809, - 47.328711 - ], - [ - 0.4311392, - 47.3284977 - ], - [ - 0.4316262, - 47.3150004 - ], - [ - 0.4382432, - 47.3151136 - ], - [ - 0.4383815, - 47.3106174 - ], - [ - 0.4714487, - 47.3111374 - ], - [ - 0.4713096, - 47.3156565 - ], - [ - 0.477888, - 47.3157542 - ], - [ - 0.4780733, - 47.3112802 - ], - [ - 0.4846826, - 47.3113639 - ], - [ - 0.4848576, - 47.3068686 - ], - [ - 0.4914359, - 47.3069803 - ], - [ - 0.491745, - 47.2979733 - ], - [ - 0.4851578, - 47.2978722 - ], - [ - 0.4854269, - 47.2888744 - ], - [ - 0.4788485, - 47.2887697 - ], - [ - 0.4791574, - 47.2797818 - ], - [ - 0.4857769, - 47.2799005 - ], - [ - 0.4859107, - 47.2753885 - ], - [ - 0.492539, - 47.2755029 - ], - [ - 0.4926669, - 47.2710127 - ], - [ - 0.4992986, - 47.2711066 - ], - [ - 0.4994296, - 47.2666116 - ], - [ - 0.5192658, - 47.2669245 - ], - [ - 0.5194225, - 47.2624231 - ], - [ - 0.5260186, - 47.2625205 - ], - [ - 0.5258735, - 47.2670183 - ], - [ - 0.5456972, - 47.2673383 - ], - [ - 0.5455537, - 47.2718283 - ], - [ - 0.5587737, - 47.2720366 - ], - [ - 0.5586259, - 47.2765185 - ], - [ - 0.5652252, - 47.2766278 - ], - [ - 0.5650848, - 47.2811206 - ], - [ - 0.5716753, - 47.2812285 - ], - [ - 0.5715223, - 47.2857217 - ], - [ - 0.5781436, - 47.2858299 - ], - [ - 0.5779914, - 47.2903294 - ], - [ - 0.5846023, - 47.2904263 - ], - [ - 0.5843076, - 47.2994231 - ], - [ - 0.597499, - 47.2996094 - ], - [ - 0.5976637, - 47.2951375 - ], - [ - 0.6571596, - 47.2960036 - ], - [ - 0.6572988, - 47.2915091 - ], - [ - 0.6705019, - 47.2917186 - ], - [ - 0.6703475, - 47.2962082 - ], - [ - 0.6836175, - 47.2963688 - ], - [ - 0.6834322, - 47.3008929 - ], - [ - 0.690062, - 47.3009558 - ], - [ - 0.6899241, - 47.3054703 - ], - [ - 0.7362019, - 47.3061157 - ], - [ - 0.7360848, - 47.3106063 - ], - [ - 0.7559022, - 47.3108935 - ], - [ - 0.7557718, - 47.315392 - ], - [ - 0.7623755, - 47.3154716 - ], - [ - 0.7622314, - 47.3199941 - ], - [ - 0.7754911, - 47.3201546 - ], - [ - 0.77497, - 47.3388218 - ], - [ - 0.7745786, - 47.351628 - ], - [ - 0.7680363, - 47.3515901 - ], - [ - 0.767589, - 47.3605298 - ], - [ - 0.7742443, - 47.3606238 - ], - [ - 0.7733465, - 47.3921266 - ], - [ - 0.7667434, - 47.3920195 - ], - [ - 0.7664411, - 47.4010837 - ], - [ - 0.7730647, - 47.4011115 - ], - [ - 0.7728868, - 47.4101297 - ], - [ - 0.7661849, - 47.4100226 - ], - [ - 0.7660267, - 47.4145044 - ], - [ - 0.7527613, - 47.4143038 - ], - [ - 0.7529788, - 47.4098086 - ], - [ - 0.7462373, - 47.4097016 - ], - [ - 0.7459424, - 47.4232208 - ], - [ - 0.7392324, - 47.4231451 - ], - [ - 0.738869, - 47.4366116 - ], - [ - 0.7323267, - 47.4365171 - ], - [ - 0.7321869, - 47.4410556 - ], - [ - 0.7255048, - 47.44098 - ], - [ - 0.7254209, - 47.4453479 - ], - [ - 0.7318793, - 47.4454803 - ], - [ - 0.7318514, - 47.4501126 - ], - [ - 0.7384496, - 47.450226 - ], - [ - 0.7383098, - 47.454631 - ], - [ - 0.7449359, - 47.4547444 - ], - [ - 0.7443209, - 47.4771985 - ], - [ - 0.7310685, - 47.4769717 - ], - [ - 0.7309008, - 47.4815445 - ], - [ - 0.7176205, - 47.4812611 - ], - [ - 0.7177883, - 47.4768394 - ], - [ - 0.69777, - 47.4764993 - ], - [ - 0.6980496, - 47.4719827 - ], - [ - 0.6914514, - 47.4718882 - ], - [ - 0.6917309, - 47.4630241 - ], - [ - 0.6851048, - 47.4629295 - ], - [ - 0.684937, - 47.4673524 - ], - [ - 0.678255, - 47.4673335 - ], - [ - 0.6779754, - 47.4762158 - ], - [ - 0.6714051, - 47.4761592 - ], - [ - 0.6710417, - 47.4881952 - ], - [ - 0.6577334, - 47.4879685 - ], - [ - 0.6578173, - 47.48504 - ], - [ - 0.6511911, - 47.4848322 - ], - [ - 0.6514707, - 47.4758568 - ], - [ - 0.6448166, - 47.4757245 - ], - [ - 0.6449284, - 47.4712646 - ], - [ - 0.6117976, - 47.4707543 - ], - [ - 0.6118815, - 47.4663129 - ], - [ - 0.6052833, - 47.4661239 - ], - [ - 0.6054231, - 47.4616631 - ], - [ - 0.5988808, - 47.4615497 - ], - [ - 0.5990206, - 47.4570886 - ], - [ - 0.572488, - 47.4566916 - ], - [ - 0.5721805, - 47.4656513 - ] - ] - ], - "terms_url": "http://wiki.openstreetmap.org/wiki/Tours/Orthophoto", - "terms_text": "Orthophoto Tour(s) Plus 2008" - }, - { - "name": "U.S. Forest Service roads", - "type": "tms", - "template": "http://osm.cycle.travel/forest/{zoom}/{x}/{y}.png", - "scaleExtent": [ - 0, - 19 - ], - "polygon": [ - [ - [ - -124.7617886, - 48.4130148 - ], - [ - -124.6059492, - 45.90245 - ], - [ - -124.9934269, - 40.0557614 - ], - [ - -122.5369737, - 36.8566086 - ], - [ - -119.9775867, - 33.0064099 - ], - [ - -117.675935, - 32.4630223 - ], - [ - -114.8612307, - 32.4799891 - ], - [ - -111.0089311, - 31.336015 - ], - [ - -108.1992687, - 31.3260016 - ], - [ - -108.1871123, - 31.7755116 - ], - [ - -106.5307225, - 31.7820947 - ], - [ - -106.4842052, - 31.7464455 - ], - [ - -106.429317, - 31.7520583 - ], - [ - -106.2868855, - 31.5613291 - ], - [ - -106.205248, - 31.446704 - ], - [ - -105.0205259, - 30.5360988 - ], - [ - -104.5881916, - 29.6997856 - ], - [ - -103.2518856, - 28.8908685 - ], - [ - -102.7173632, - 29.3920567 - ], - [ - -102.1513983, - 29.7475702 - ], - [ - -101.2552871, - 29.4810523 - ], - [ - -100.0062436, - 28.0082173 - ], - [ - -99.2351068, - 26.4475962 - ], - [ - -98.0109067, - 25.9928035 - ], - [ - -97.435024, - 25.8266009 - ], - [ - -96.9555259, - 25.9821589 - ], - [ - -96.8061741, - 27.7978168 - ], - [ - -95.5563349, - 28.5876066 - ], - [ - -93.7405308, - 29.4742093 - ], - [ - -90.9028456, - 28.8564513 - ], - [ - -88.0156706, - 28.9944338 - ], - [ - -88.0162494, - 30.0038862 - ], - [ - -86.0277506, - 30.0047454 - ], - [ - -84.0187909, - 28.9961781 - ], - [ - -81.9971976, - 25.9826768 - ], - [ - -81.9966618, - 25.0134917 - ], - [ - -84.0165592, - 25.0125783 - ], - [ - -84.0160068, - 24.0052745 - ], - [ - -80.0199985, - 24.007096 - ], - [ - -79.8901116, - 26.8550713 - ], - [ - -80.0245309, - 32.0161282 - ], - [ - -75.4147385, - 35.0531894 - ], - [ - -74.0211163, - 39.5727927 - ], - [ - -72.002019, - 40.9912464 - ], - [ - -69.8797398, - 40.9920457 - ], - [ - -69.8489304, - 43.2619916 - ], - [ - -66.9452845, - 44.7104937 - ], - [ - -67.7596632, - 47.0990024 - ], - [ - -69.2505131, - 47.5122328 - ], - [ - -70.4614886, - 46.2176574 - ], - [ - -71.412273, - 45.254878 - ], - [ - -72.0222508, - 45.0059846 - ], - [ - -75.0798841, - 44.9802854 - ], - [ - -76.9023061, - 43.8024568 - ], - [ - -78.7623935, - 43.6249578 - ], - [ - -79.15798, - 43.4462589 - ], - [ - -79.0060087, - 42.8005317 - ], - [ - -82.662475, - 41.6889458 - ], - [ - -82.1761642, - 43.588535 - ], - [ - -83.2813977, - 46.138853 - ], - [ - -87.5064535, - 48.0142702 - ], - [ - -88.3492194, - 48.2963271 - ], - [ - -89.4353148, - 47.9837822 - ], - [ - -93.9981078, - 49.0067142 - ], - [ - -95.1105379, - 49.412004 - ], - [ - -96.0131199, - 49.0060547 - ], - [ - -123.3228926, - 49.0042878 - ], - [ - -123.2275233, - 48.1849927 - ] - ], - [ - [ - -160.5787616, - 22.5062947 - ], - [ - -160.5782192, - 21.4984647 - ], - [ - -158.7470604, - 21.2439843 - ], - [ - -157.5083185, - 20.995803 - ], - [ - -155.9961942, - 18.7790194 - ], - [ - -154.6217803, - 18.7586966 - ], - [ - -154.6890176, - 19.8805722 - ], - [ - -156.2927622, - 21.2225888 - ], - [ - -157.5047384, - 21.9984962 - ], - [ - -159.0093692, - 22.5070181 - ] - ], - [ - [ - -167.1571546, - 68.721974 - ], - [ - -164.8553982, - 67.0255078 - ], - [ - -168.002195, - 66.0017503 - ], - [ - -169.0087448, - 66.001546 - ], - [ - -169.0075381, - 64.9987675 - ], - [ - -172.5143281, - 63.8767267 - ], - [ - -173.8197023, - 59.74014 - ], - [ - -162.5018149, - 58.0005815 - ], - [ - -160.0159024, - 58.0012389 - ], - [ - -160.0149725, - 57.000035 - ], - [ - -160.5054788, - 56.9999017 - ], - [ - -165.8092575, - 54.824847 - ], - [ - -178.000097, - 52.2446469 - ], - [ - -177.9992996, - 51.2554252 - ], - [ - -171.4689067, - 51.8215329 - ], - [ - -162.40251, - 53.956664 - ], - [ - -159.0075717, - 55.002502 - ], - [ - -158.0190709, - 55.0027849 - ], - [ - -151.9963213, - 55.9991902 - ], - [ - -151.500341, - 57.9987853 - ], - [ - -151.5012894, - 58.9919816 - ], - [ - -138.5159989, - 58.9953194 - ], - [ - -138.5150471, - 57.9986434 - ], - [ - -133.9948193, - 54.0031685 - ], - [ - -130.0044418, - 54.0043387 - ], - [ - -130.0070826, - 57.0000507 - ], - [ - -131.975877, - 56.9995156 - ], - [ - -135.1229873, - 59.756601 - ], - [ - -138.0071813, - 59.991805 - ], - [ - -139.1715881, - 60.4127229 - ], - [ - -140.9874011, - 61.0118551 - ], - [ - -140.9683975, - 69.9535069 - ], - [ - -156.176891, - 71.5633329 - ], - [ - -160.413634, - 70.7397728 - ], - [ - -163.0218273, - 69.9707435 - ], - [ - -164.9717003, - 68.994689 - ] - ] - ] - }, - { - "name": "USGS Large Scale Imagery", - "type": "tms", - "template": "http://{switch:a,b,c}.tile.openstreetmap.us/usgs_large_scale/{zoom}/{x}/{y}.jpg", - "scaleExtent": [ - 12, - 20 - ], - "polygon": [ - [ - [ - -123.2549305, - 48.7529029 - ], - [ - -123.2549305, - 48.5592263 - ], - [ - -123.192224, - 48.5592263 - ], - [ - -123.192224, - 48.4348366 - ], - [ - -122.9419646, - 48.4348366 - ], - [ - -122.9419646, - 48.3720812 - ], - [ - -122.8806229, - 48.3720812 - ], - [ - -122.8806229, - 48.3094763 - ], - [ - -122.8167566, - 48.3094763 - ], - [ - -122.8167566, - 48.1904587 - ], - [ - -123.0041133, - 48.1904587 - ], - [ - -123.0041133, - 48.1275918 - ], - [ - -123.058416, - 48.1275918 - ], - [ - -123.058416, - 48.190514 - ], - [ - -123.254113, - 48.190514 - ], - [ - -123.254113, - 48.1274982 - ], - [ - -123.3706593, - 48.1274982 - ], - [ - -123.3706593, - 48.1908403 - ], - [ - -124.0582632, - 48.1908403 - ], - [ - -124.0582632, - 48.253442 - ], - [ - -124.1815163, - 48.253442 - ], - [ - -124.1815163, - 48.3164666 - ], - [ - -124.4319117, - 48.3164666 - ], - [ - -124.4319117, - 48.3782613 - ], - [ - -124.5564618, - 48.3782613 - ], - [ - -124.5564618, - 48.4408305 - ], - [ - -124.7555107, - 48.4408305 - ], - [ - -124.7555107, - 48.1914986 - ], - [ - -124.8185282, - 48.1914986 - ], - [ - -124.8185282, - 48.1228381 - ], - [ - -124.7552951, - 48.1228381 - ], - [ - -124.7552951, - 47.5535253 - ], - [ - -124.3812108, - 47.5535253 - ], - [ - -124.3812108, - 47.1218696 - ], - [ - -124.1928897, - 47.1218696 - ], - [ - -124.1928897, - 43.7569431 - ], - [ - -124.4443382, - 43.7569431 - ], - [ - -124.4443382, - 43.1425556 - ], - [ - -124.6398855, - 43.1425556 - ], - [ - -124.6398855, - 42.6194503 - ], - [ - -124.4438525, - 42.6194503 - ], - [ - -124.4438525, - 39.8080662 - ], - [ - -123.8815685, - 39.8080662 - ], - [ - -123.8815685, - 39.1102825 - ], - [ - -123.75805, - 39.1102825 - ], - [ - -123.75805, - 38.4968799 - ], - [ - -123.2702803, - 38.4968799 - ], - [ - -123.2702803, - 37.9331905 - ], - [ - -122.8148084, - 37.9331905 - ], - [ - -122.8148084, - 37.8019606 - ], - [ - -122.5664316, - 37.8019606 - ], - [ - -122.5664316, - 36.9319611 - ], - [ - -121.8784026, - 36.9319611 - ], - [ - -121.8784026, - 36.6897596 - ], - [ - -122.0034748, - 36.6897596 - ], - [ - -122.0034748, - 36.4341056 - ], - [ - -121.9414159, - 36.4341056 - ], - [ - -121.9414159, - 35.9297636 - ], - [ - -121.5040977, - 35.9297636 - ], - [ - -121.5040977, - 35.8100273 - ], - [ - -121.3790276, - 35.8100273 - ], - [ - -121.3790276, - 35.4239164 - ], - [ - -120.9426515, - 35.4239164 - ], - [ - -120.9426515, - 35.1849683 - ], - [ - -120.8171978, - 35.1849683 - ], - [ - -120.8171978, - 35.1219894 - ], - [ - -120.6918447, - 35.1219894 - ], - [ - -120.6918447, - 34.4966794 - ], - [ - -120.5045898, - 34.4966794 - ], - [ - -120.5045898, - 34.4339651 - ], - [ - -120.0078775, - 34.4339651 - ], - [ - -120.0078775, - 34.3682626 - ], - [ - -119.5283517, - 34.3682626 - ], - [ - -119.5283517, - 34.0576434 - ], - [ - -119.0060985, - 34.0576434 - ], - [ - -119.0060985, - 33.9975267 - ], - [ - -118.5046259, - 33.9975267 - ], - [ - -118.5046259, - 33.8694631 - ], - [ - -118.4413209, - 33.8694631 - ], - [ - -118.4413209, - 33.6865253 - ], - [ - -118.066912, - 33.6865253 - ], - [ - -118.066912, - 33.3063832 - ], - [ - -117.5030045, - 33.3063832 - ], - [ - -117.5030045, - 33.0500337 - ], - [ - -117.3188195, - 33.0500337 - ], - [ - -117.3188195, - 32.6205888 - ], - [ - -117.1917023, - 32.6205888 - ], - [ - -117.1917023, - 32.4974566 - ], - [ - -116.746496, - 32.4974566 - ], - [ - -116.746496, - 32.5609161 - ], - [ - -115.9970138, - 32.5609161 - ], - [ - -115.9970138, - 32.6264942 - ], - [ - -114.8808125, - 32.6264942 - ], - [ - -114.8808125, - 32.4340796 - ], - [ - -114.6294474, - 32.4340796 - ], - [ - -114.6294474, - 32.3731636 - ], - [ - -114.4447437, - 32.3731636 - ], - [ - -114.4447437, - 32.3075418 - ], - [ - -114.2557628, - 32.3075418 - ], - [ - -114.2557628, - 32.2444561 - ], - [ - -114.0680274, - 32.2444561 - ], - [ - -114.0680274, - 32.1829113 - ], - [ - -113.8166499, - 32.1829113 - ], - [ - -113.8166499, - 32.1207622 - ], - [ - -113.6307421, - 32.1207622 - ], - [ - -113.6307421, - 32.0565099 - ], - [ - -113.4417495, - 32.0565099 - ], - [ - -113.4417495, - 31.9984372 - ], - [ - -113.2546027, - 31.9984372 - ], - [ - -113.2546027, - 31.9325434 - ], - [ - -113.068072, - 31.9325434 - ], - [ - -113.068072, - 31.8718062 - ], - [ - -112.8161105, - 31.8718062 - ], - [ - -112.8161105, - 31.8104171 - ], - [ - -112.6308756, - 31.8104171 - ], - [ - -112.6308756, - 31.7464723 - ], - [ - -112.4418918, - 31.7464723 - ], - [ - -112.4418918, - 31.6856001 - ], - [ - -112.257192, - 31.6856001 - ], - [ - -112.257192, - 31.6210352 - ], - [ - -112.0033787, - 31.6210352 - ], - [ - -112.0033787, - 31.559584 - ], - [ - -111.815619, - 31.559584 - ], - [ - -111.815619, - 31.4970238 - ], - [ - -111.6278586, - 31.4970238 - ], - [ - -111.6278586, - 31.4339867 - ], - [ - -111.4418978, - 31.4339867 - ], - [ - -111.4418978, - 31.3733859 - ], - [ - -111.2559708, - 31.3733859 - ], - [ - -111.2559708, - 31.3113225 - ], - [ - -108.1845822, - 31.3113225 - ], - [ - -108.1845822, - 31.7459502 - ], - [ - -106.5065055, - 31.7459502 - ], - [ - -106.5065055, - 31.6842308 - ], - [ - -106.3797265, - 31.6842308 - ], - [ - -106.3797265, - 31.621752 - ], - [ - -106.317434, - 31.621752 - ], - [ - -106.317434, - 31.4968167 - ], - [ - -106.2551769, - 31.4968167 - ], - [ - -106.2551769, - 31.4344889 - ], - [ - -106.1924698, - 31.4344889 - ], - [ - -106.1924698, - 31.3721296 - ], - [ - -106.0039212, - 31.3721296 - ], - [ - -106.0039212, - 31.309328 - ], - [ - -105.9416582, - 31.309328 - ], - [ - -105.9416582, - 31.2457547 - ], - [ - -105.8798174, - 31.2457547 - ], - [ - -105.8798174, - 31.1836194 - ], - [ - -105.8162349, - 31.1836194 - ], - [ - -105.8162349, - 31.1207155 - ], - [ - -105.6921198, - 31.1207155 - ], - [ - -105.6921198, - 31.0584835 - ], - [ - -105.6302881, - 31.0584835 - ], - [ - -105.6302881, - 30.9328271 - ], - [ - -105.5044418, - 30.9328271 - ], - [ - -105.5044418, - 30.8715864 - ], - [ - -105.4412973, - 30.8715864 - ], - [ - -105.4412973, - 30.808463 - ], - [ - -105.3781497, - 30.808463 - ], - [ - -105.3781497, - 30.7471828 - ], - [ - -105.1904658, - 30.7471828 - ], - [ - -105.1904658, - 30.6843231 - ], - [ - -105.1286244, - 30.6843231 - ], - [ - -105.1286244, - 30.6199737 - ], - [ - -105.0036504, - 30.6199737 - ], - [ - -105.0036504, - 30.5589058 - ], - [ - -104.9417962, - 30.5589058 - ], - [ - -104.9417962, - 30.4963236 - ], - [ - -104.8782018, - 30.4963236 - ], - [ - -104.8782018, - 30.3098261 - ], - [ - -104.8155257, - 30.3098261 - ], - [ - -104.8155257, - 30.2478305 - ], - [ - -104.7536079, - 30.2478305 - ], - [ - -104.7536079, - 29.9353916 - ], - [ - -104.690949, - 29.9353916 - ], - [ - -104.690949, - 29.8090156 - ], - [ - -104.6291301, - 29.8090156 - ], - [ - -104.6291301, - 29.6843577 - ], - [ - -104.5659869, - 29.6843577 - ], - [ - -104.5659869, - 29.6223459 - ], - [ - -104.5037188, - 29.6223459 - ], - [ - -104.5037188, - 29.5595436 - ], - [ - -104.4410072, - 29.5595436 - ], - [ - -104.4410072, - 29.4974832 - ], - [ - -104.2537551, - 29.4974832 - ], - [ - -104.2537551, - 29.3716718 - ], - [ - -104.1291984, - 29.3716718 - ], - [ - -104.1291984, - 29.3091621 - ], - [ - -104.0688737, - 29.3091621 - ], - [ - -104.0688737, - 29.2467276 - ], - [ - -103.8187309, - 29.2467276 - ], - [ - -103.8187309, - 29.1843076 - ], - [ - -103.755736, - 29.1843076 - ], - [ - -103.755736, - 29.1223174 - ], - [ - -103.5667542, - 29.1223174 - ], - [ - -103.5667542, - 29.0598119 - ], - [ - -103.5049819, - 29.0598119 - ], - [ - -103.5049819, - 28.9967506 - ], - [ - -103.3165753, - 28.9967506 - ], - [ - -103.3165753, - 28.9346923 - ], - [ - -103.0597572, - 28.9346923 - ], - [ - -103.0597572, - 29.0592965 - ], - [ - -102.9979694, - 29.0592965 - ], - [ - -102.9979694, - 29.1212855 - ], - [ - -102.9331397, - 29.1212855 - ], - [ - -102.9331397, - 29.1848575 - ], - [ - -102.8095989, - 29.1848575 - ], - [ - -102.8095989, - 29.2526154 - ], - [ - -102.8701345, - 29.2526154 - ], - [ - -102.8701345, - 29.308096 - ], - [ - -102.8096681, - 29.308096 - ], - [ - -102.8096681, - 29.3715484 - ], - [ - -102.7475655, - 29.3715484 - ], - [ - -102.7475655, - 29.5581899 - ], - [ - -102.684554, - 29.5581899 - ], - [ - -102.684554, - 29.6847655 - ], - [ - -102.4967764, - 29.6847655 - ], - [ - -102.4967764, - 29.7457694 - ], - [ - -102.3086647, - 29.7457694 - ], - [ - -102.3086647, - 29.8086627 - ], - [ - -102.1909323, - 29.8086627 - ], - [ - -102.1909323, - 29.7460097 - ], - [ - -101.5049914, - 29.7460097 - ], - [ - -101.5049914, - 29.6846777 - ], - [ - -101.3805796, - 29.6846777 - ], - [ - -101.3805796, - 29.5594459 - ], - [ - -101.3175057, - 29.5594459 - ], - [ - -101.3175057, - 29.4958934 - ], - [ - -101.1910075, - 29.4958934 - ], - [ - -101.1910075, - 29.4326115 - ], - [ - -101.067501, - 29.4326115 - ], - [ - -101.067501, - 29.308808 - ], - [ - -100.9418897, - 29.308808 - ], - [ - -100.9418897, - 29.2456231 - ], - [ - -100.8167271, - 29.2456231 - ], - [ - -100.8167271, - 29.1190449 - ], - [ - -100.7522672, - 29.1190449 - ], - [ - -100.7522672, - 29.0578214 - ], - [ - -100.6925358, - 29.0578214 - ], - [ - -100.6925358, - 28.8720431 - ], - [ - -100.6290158, - 28.8720431 - ], - [ - -100.6290158, - 28.8095363 - ], - [ - -100.5679901, - 28.8095363 - ], - [ - -100.5679901, - 28.622554 - ], - [ - -100.5040411, - 28.622554 - ], - [ - -100.5040411, - 28.5583804 - ], - [ - -100.4421832, - 28.5583804 - ], - [ - -100.4421832, - 28.4968266 - ], - [ - -100.379434, - 28.4968266 - ], - [ - -100.379434, - 28.3092865 - ], - [ - -100.3171942, - 28.3092865 - ], - [ - -100.3171942, - 28.1835681 - ], - [ - -100.254483, - 28.1835681 - ], - [ - -100.254483, - 28.1213885 - ], - [ - -100.1282282, - 28.1213885 - ], - [ - -100.1282282, - 28.059215 - ], - [ - -100.0659537, - 28.059215 - ], - [ - -100.0659537, - 27.9966087 - ], - [ - -100.0023855, - 27.9966087 - ], - [ - -100.0023855, - 27.9332152 - ], - [ - -99.9426497, - 27.9332152 - ], - [ - -99.9426497, - 27.7454658 - ], - [ - -99.816851, - 27.7454658 - ], - [ - -99.816851, - 27.6834301 - ], - [ - -99.7541346, - 27.6834301 - ], - [ - -99.7541346, - 27.6221543 - ], - [ - -99.6291629, - 27.6221543 - ], - [ - -99.6291629, - 27.5588977 - ], - [ - -99.5672838, - 27.5588977 - ], - [ - -99.5672838, - 27.4353752 - ], - [ - -99.5041798, - 27.4353752 - ], - [ - -99.5041798, - 27.3774021 - ], - [ - -99.5671796, - 27.3774021 - ], - [ - -99.5671796, - 27.2463726 - ], - [ - -99.504975, - 27.2463726 - ], - [ - -99.504975, - 26.9965649 - ], - [ - -99.4427427, - 26.9965649 - ], - [ - -99.4427427, - 26.872803 - ], - [ - -99.3800633, - 26.872803 - ], - [ - -99.3800633, - 26.8068179 - ], - [ - -99.3190684, - 26.8068179 - ], - [ - -99.3190684, - 26.7473614 - ], - [ - -99.2537541, - 26.7473614 - ], - [ - -99.2537541, - 26.6210068 - ], - [ - -99.1910617, - 26.6210068 - ], - [ - -99.1910617, - 26.4956737 - ], - [ - -99.1300639, - 26.4956737 - ], - [ - -99.1300639, - 26.3713808 - ], - [ - -99.0029473, - 26.3713808 - ], - [ - -99.0029473, - 26.3093836 - ], - [ - -98.816572, - 26.3093836 - ], - [ - -98.816572, - 26.2457762 - ], - [ - -98.6920082, - 26.2457762 - ], - [ - -98.6920082, - 26.1837096 - ], - [ - -98.4440896, - 26.1837096 - ], - [ - -98.4440896, - 26.1217217 - ], - [ - -98.3823181, - 26.1217217 - ], - [ - -98.3823181, - 26.0596488 - ], - [ - -98.2532707, - 26.0596488 - ], - [ - -98.2532707, - 25.9986871 - ], - [ - -98.0109084, - 25.9986871 - ], - [ - -98.0109084, - 25.9932255 - ], - [ - -97.6932319, - 25.9932255 - ], - [ - -97.6932319, - 25.9334103 - ], - [ - -97.6313904, - 25.9334103 - ], - [ - -97.6313904, - 25.8695893 - ], - [ - -97.5046779, - 25.8695893 - ], - [ - -97.5046779, - 25.8073488 - ], - [ - -97.3083401, - 25.8073488 - ], - [ - -97.3083401, - 25.8731159 - ], - [ - -97.2456326, - 25.8731159 - ], - [ - -97.2456326, - 25.9353731 - ], - [ - -97.1138939, - 25.9353731 - ], - [ - -97.1138939, - 27.6809179 - ], - [ - -97.0571035, - 27.6809179 - ], - [ - -97.0571035, - 27.8108242 - ], - [ - -95.5810766, - 27.8108242 - ], - [ - -95.5810766, - 28.7468827 - ], - [ - -94.271041, - 28.7468827 - ], - [ - -94.271041, - 29.5594076 - ], - [ - -92.5029947, - 29.5594076 - ], - [ - -92.5029947, - 29.4974754 - ], - [ - -91.8776216, - 29.4974754 - ], - [ - -91.8776216, - 29.3727013 - ], - [ - -91.378418, - 29.3727013 - ], - [ - -91.378418, - 29.2468326 - ], - [ - -91.3153953, - 29.2468326 - ], - [ - -91.3153953, - 29.1844301 - ], - [ - -91.1294702, - 29.1844301 - ], - [ - -91.1294702, - 29.1232559 - ], - [ - -91.0052632, - 29.1232559 - ], - [ - -91.0052632, - 28.9968437 - ], - [ - -89.4500159, - 28.9968437 - ], - [ - -89.4500159, - 28.8677422 - ], - [ - -88.8104309, - 28.8677422 - ], - [ - -88.8104309, - 30.1841864 - ], - [ - -85.8791527, - 30.1841864 - ], - [ - -85.8791527, - 29.5455038 - ], - [ - -84.8368083, - 29.5455038 - ], - [ - -84.8368083, - 29.6225158 - ], - [ - -84.7482786, - 29.6225158 - ], - [ - -84.7482786, - 29.683624 - ], - [ - -84.685894, - 29.683624 - ], - [ - -84.685894, - 29.7468386 - ], - [ - -83.6296975, - 29.7468386 - ], - [ - -83.6296975, - 29.4324361 - ], - [ - -83.3174937, - 29.4324361 - ], - [ - -83.3174937, - 29.0579442 - ], - [ - -82.879659, - 29.0579442 - ], - [ - -82.879659, - 27.7453529 - ], - [ - -82.8182822, - 27.7453529 - ], - [ - -82.8182822, - 26.9290868 - ], - [ - -82.3796782, - 26.9290868 - ], - [ - -82.3796782, - 26.3694183 - ], - [ - -81.8777106, - 26.3694183 - ], - [ - -81.8777106, - 25.805971 - ], - [ - -81.5036862, - 25.805971 - ], - [ - -81.5036862, - 25.7474753 - ], - [ - -81.4405462, - 25.7474753 - ], - [ - -81.4405462, - 25.6851489 - ], - [ - -81.3155883, - 25.6851489 - ], - [ - -81.3155883, - 25.5600985 - ], - [ - -81.2538534, - 25.5600985 - ], - [ - -81.2538534, - 25.4342361 - ], - [ - -81.1902012, - 25.4342361 - ], - [ - -81.1902012, - 25.1234341 - ], - [ - -81.1288133, - 25.1234341 - ], - [ - -81.1288133, - 25.0619389 - ], - [ - -81.0649231, - 25.0619389 - ], - [ - -81.0649231, - 24.8157807 - ], - [ - -81.6289469, - 24.8157807 - ], - [ - -81.6289469, - 24.7538367 - ], - [ - -81.6907173, - 24.7538367 - ], - [ - -81.6907173, - 24.6899374 - ], - [ - -81.8173189, - 24.6899374 - ], - [ - -81.8173189, - 24.6279161 - ], - [ - -82.1910041, - 24.6279161 - ], - [ - -82.1910041, - 24.496294 - ], - [ - -81.6216596, - 24.496294 - ], - [ - -81.6216596, - 24.559484 - ], - [ - -81.372006, - 24.559484 - ], - [ - -81.372006, - 24.6220687 - ], - [ - -81.0593278, - 24.6220687 - ], - [ - -81.0593278, - 24.684826 - ], - [ - -80.9347147, - 24.684826 - ], - [ - -80.9347147, - 24.7474828 - ], - [ - -80.7471081, - 24.7474828 - ], - [ - -80.7471081, - 24.8100618 - ], - [ - -80.3629898, - 24.8100618 - ], - [ - -80.3629898, - 25.1175858 - ], - [ - -80.122344, - 25.1175858 - ], - [ - -80.122344, - 25.7472357 - ], - [ - -80.0588458, - 25.7472357 - ], - [ - -80.0588458, - 26.3708251 - ], - [ - -79.995837, - 26.3708251 - ], - [ - -79.995837, - 26.9398003 - ], - [ - -80.0587265, - 26.9398003 - ], - [ - -80.0587265, - 27.1277466 - ], - [ - -80.1226251, - 27.1277466 - ], - [ - -80.1226251, - 27.2534279 - ], - [ - -80.1846956, - 27.2534279 - ], - [ - -80.1846956, - 27.3781229 - ], - [ - -80.246175, - 27.3781229 - ], - [ - -80.246175, - 27.5658729 - ], - [ - -80.3094768, - 27.5658729 - ], - [ - -80.3094768, - 27.7530311 - ], - [ - -80.3721485, - 27.7530311 - ], - [ - -80.3721485, - 27.8774451 - ], - [ - -80.4351457, - 27.8774451 - ], - [ - -80.4351457, - 28.0033366 - ], - [ - -80.4966078, - 28.0033366 - ], - [ - -80.4966078, - 28.1277326 - ], - [ - -80.5587159, - 28.1277326 - ], - [ - -80.5587159, - 28.3723509 - ], - [ - -80.4966335, - 28.3723509 - ], - [ - -80.4966335, - 29.5160326 - ], - [ - -81.1213644, - 29.5160326 - ], - [ - -81.1213644, - 31.6846966 - ], - [ - -80.6018723, - 31.6846966 - ], - [ - -80.6018723, - 32.2475309 - ], - [ - -79.4921024, - 32.2475309 - ], - [ - -79.4921024, - 32.9970261 - ], - [ - -79.1116488, - 32.9970261 - ], - [ - -79.1116488, - 33.3729457 - ], - [ - -78.6153621, - 33.3729457 - ], - [ - -78.6153621, - 33.8097638 - ], - [ - -77.9316963, - 33.8097638 - ], - [ - -77.9316963, - 33.8718243 - ], - [ - -77.8692252, - 33.8718243 - ], - [ - -77.8692252, - 34.0552454 - ], - [ - -77.6826392, - 34.0552454 - ], - [ - -77.6826392, - 34.2974598 - ], - [ - -77.2453509, - 34.2974598 - ], - [ - -77.2453509, - 34.5598585 - ], - [ - -76.4973277, - 34.5598585 - ], - [ - -76.4973277, - 34.622796 - ], - [ - -76.4337602, - 34.622796 - ], - [ - -76.4337602, - 34.6849285 - ], - [ - -76.373212, - 34.6849285 - ], - [ - -76.373212, - 34.7467674 - ], - [ - -76.3059364, - 34.7467674 - ], - [ - -76.3059364, - 34.808551 - ], - [ - -76.2468017, - 34.808551 - ], - [ - -76.2468017, - 34.8728418 - ], - [ - -76.1825922, - 34.8728418 - ], - [ - -76.1825922, - 34.9335332 - ], - [ - -76.120814, - 34.9335332 - ], - [ - -76.120814, - 34.9952359 - ], - [ - -75.9979015, - 34.9952359 - ], - [ - -75.9979015, - 35.0578182 - ], - [ - -75.870338, - 35.0578182 - ], - [ - -75.870338, - 35.1219097 - ], - [ - -75.7462194, - 35.1219097 - ], - [ - -75.7462194, - 35.1818911 - ], - [ - -75.4929694, - 35.1818911 - ], - [ - -75.4929694, - 35.3082988 - ], - [ - -75.4325662, - 35.3082988 - ], - [ - -75.4325662, - 35.7542495 - ], - [ - -75.4969907, - 35.7542495 - ], - [ - -75.4969907, - 37.8105602 - ], - [ - -75.3082972, - 37.8105602 - ], - [ - -75.3082972, - 37.8720088 - ], - [ - -75.245601, - 37.8720088 - ], - [ - -75.245601, - 37.9954849 - ], - [ - -75.1828751, - 37.9954849 - ], - [ - -75.1828751, - 38.0585079 - ], - [ - -75.1184793, - 38.0585079 - ], - [ - -75.1184793, - 38.2469091 - ], - [ - -75.0592098, - 38.2469091 - ], - [ - -75.0592098, - 38.3704316 - ], - [ - -74.9948111, - 38.3704316 - ], - [ - -74.9948111, - 38.8718417 - ], - [ - -74.4878252, - 38.8718417 - ], - [ - -74.4878252, - 39.3089428 - ], - [ - -74.1766317, - 39.3089428 - ], - [ - -74.1766317, - 39.6224653 - ], - [ - -74.0567045, - 39.6224653 - ], - [ - -74.0567045, - 39.933178 - ], - [ - -73.9959035, - 39.933178 - ], - [ - -73.9959035, - 40.1854852 - ], - [ - -73.9341593, - 40.1854852 - ], - [ - -73.9341593, - 40.4959486 - ], - [ - -73.8723024, - 40.4959486 - ], - [ - -73.8723024, - 40.5527135 - ], - [ - -71.8074506, - 40.5527135 - ], - [ - -71.8074506, - 41.3088005 - ], - [ - -70.882512, - 41.3088005 - ], - [ - -70.882512, - 41.184978 - ], - [ - -70.7461947, - 41.184978 - ], - [ - -70.7461947, - 41.3091865 - ], - [ - -70.4337553, - 41.3091865 - ], - [ - -70.4337553, - 41.4963885 - ], - [ - -69.9334281, - 41.4963885 - ], - [ - -69.9334281, - 41.6230802 - ], - [ - -69.869857, - 41.6230802 - ], - [ - -69.869857, - 41.8776895 - ], - [ - -69.935791, - 41.8776895 - ], - [ - -69.935791, - 42.0032342 - ], - [ - -69.9975823, - 42.0032342 - ], - [ - -69.9975823, - 42.0650191 - ], - [ - -70.0606103, - 42.0650191 - ], - [ - -70.0606103, - 42.1294348 - ], - [ - -70.5572884, - 42.1294348 - ], - [ - -70.5572884, - 43.2487079 - ], - [ - -70.4974097, - 43.2487079 - ], - [ - -70.4974097, - 43.3092194 - ], - [ - -70.3704249, - 43.3092194 - ], - [ - -70.3704249, - 43.371963 - ], - [ - -70.3085701, - 43.371963 - ], - [ - -70.3085701, - 43.4969879 - ], - [ - -70.183921, - 43.4969879 - ], - [ - -70.183921, - 43.6223531 - ], - [ - -70.057583, - 43.6223531 - ], - [ - -70.057583, - 43.6850173 - ], - [ - -69.7455247, - 43.6850173 - ], - [ - -69.7455247, - 43.7476571 - ], - [ - -69.2472845, - 43.7476571 - ], - [ - -69.2472845, - 43.8107035 - ], - [ - -69.0560701, - 43.8107035 - ], - [ - -69.0560701, - 43.8717247 - ], - [ - -68.9950522, - 43.8717247 - ], - [ - -68.9950522, - 43.9982022 - ], - [ - -68.4963672, - 43.9982022 - ], - [ - -68.4963672, - 44.0597368 - ], - [ - -68.3081038, - 44.0597368 - ], - [ - -68.3081038, - 44.122137 - ], - [ - -68.1851802, - 44.122137 - ], - [ - -68.1851802, - 44.3081382 - ], - [ - -67.9956019, - 44.3081382 - ], - [ - -67.9956019, - 44.3727489 - ], - [ - -67.8103041, - 44.3727489 - ], - [ - -67.8103041, - 44.435178 - ], - [ - -67.4965289, - 44.435178 - ], - [ - -67.4965289, - 44.4968776 - ], - [ - -67.37102, - 44.4968776 - ], - [ - -67.37102, - 44.5600642 - ], - [ - -67.1848753, - 44.5600642 - ], - [ - -67.1848753, - 44.6213345 - ], - [ - -67.1221208, - 44.6213345 - ], - [ - -67.1221208, - 44.6867918 - ], - [ - -67.059365, - 44.6867918 - ], - [ - -67.059365, - 44.7473657 - ], - [ - -66.9311098, - 44.7473657 - ], - [ - -66.9311098, - 44.9406566 - ], - [ - -66.994683, - 44.9406566 - ], - [ - -66.994683, - 45.0024514 - ], - [ - -67.0595847, - 45.0024514 - ], - [ - -67.0595847, - 45.1273377 - ], - [ - -67.1201974, - 45.1273377 - ], - [ - -67.1201974, - 45.1910115 - ], - [ - -67.2469811, - 45.1910115 - ], - [ - -67.2469811, - 45.253442 - ], - [ - -67.3177546, - 45.253442 - ], - [ - -67.3177546, - 45.1898369 - ], - [ - -67.370749, - 45.1898369 - ], - [ - -67.370749, - 45.2534001 - ], - [ - -67.4326888, - 45.2534001 - ], - [ - -67.4326888, - 45.3083409 - ], - [ - -67.3708571, - 45.3083409 - ], - [ - -67.3708571, - 45.4396986 - ], - [ - -67.4305573, - 45.4396986 - ], - [ - -67.4305573, - 45.4950095 - ], - [ - -67.37099, - 45.4950095 - ], - [ - -67.37099, - 45.6264543 - ], - [ - -67.6214982, - 45.6264543 - ], - [ - -67.6214982, - 45.6896133 - ], - [ - -67.683828, - 45.6896133 - ], - [ - -67.683828, - 45.753259 - ], - [ - -67.7462097, - 45.753259 - ], - [ - -67.7462097, - 47.1268165 - ], - [ - -67.8700141, - 47.1268165 - ], - [ - -67.8700141, - 47.1900278 - ], - [ - -67.9323803, - 47.1900278 - ], - [ - -67.9323803, - 47.2539678 - ], - [ - -67.9959387, - 47.2539678 - ], - [ - -67.9959387, - 47.3149737 - ], - [ - -68.1206676, - 47.3149737 - ], - [ - -68.1206676, - 47.3780823 - ], - [ - -68.4423175, - 47.3780823 - ], - [ - -68.4423175, - 47.3166082 - ], - [ - -68.6314305, - 47.3166082 - ], - [ - -68.6314305, - 47.2544676 - ], - [ - -68.9978037, - 47.2544676 - ], - [ - -68.9978037, - 47.439895 - ], - [ - -69.0607223, - 47.439895 - ], - [ - -69.0607223, - 47.5047558 - ], - [ - -69.2538122, - 47.5047558 - ], - [ - -69.2538122, - 47.4398084 - ], - [ - -69.3179284, - 47.4398084 - ], - [ - -69.3179284, - 47.378601 - ], - [ - -69.4438546, - 47.378601 - ], - [ - -69.4438546, - 47.3156274 - ], - [ - -69.5038204, - 47.3156274 - ], - [ - -69.5038204, - 47.2525839 - ], - [ - -69.5667838, - 47.2525839 - ], - [ - -69.5667838, - 47.1910884 - ], - [ - -69.6303478, - 47.1910884 - ], - [ - -69.6303478, - 47.128701 - ], - [ - -69.6933103, - 47.128701 - ], - [ - -69.6933103, - 47.0654307 - ], - [ - -69.7557063, - 47.0654307 - ], - [ - -69.7557063, - 47.0042751 - ], - [ - -69.8180391, - 47.0042751 - ], - [ - -69.8180391, - 46.9415344 - ], - [ - -69.8804023, - 46.9415344 - ], - [ - -69.8804023, - 46.8792519 - ], - [ - -69.9421674, - 46.8792519 - ], - [ - -69.9421674, - 46.8177399 - ], - [ - -70.0063088, - 46.8177399 - ], - [ - -70.0063088, - 46.6920295 - ], - [ - -70.0704265, - 46.6920295 - ], - [ - -70.0704265, - 46.4425926 - ], - [ - -70.1945902, - 46.4425926 - ], - [ - -70.1945902, - 46.3785887 - ], - [ - -70.2562047, - 46.3785887 - ], - [ - -70.2562047, - 46.3152628 - ], - [ - -70.3203651, - 46.3152628 - ], - [ - -70.3203651, - 46.0651209 - ], - [ - -70.3814988, - 46.0651209 - ], - [ - -70.3814988, - 45.93552 - ], - [ - -70.3201618, - 45.93552 - ], - [ - -70.3201618, - 45.879479 - ], - [ - -70.4493131, - 45.879479 - ], - [ - -70.4493131, - 45.7538713 - ], - [ - -70.5070021, - 45.7538713 - ], - [ - -70.5070021, - 45.6916912 - ], - [ - -70.6316642, - 45.6916912 - ], - [ - -70.6316642, - 45.6291619 - ], - [ - -70.7575538, - 45.6291619 - ], - [ - -70.7575538, - 45.4414685 - ], - [ - -70.8809878, - 45.4414685 - ], - [ - -70.8809878, - 45.3780612 - ], - [ - -71.13328, - 45.3780612 - ], - [ - -71.13328, - 45.3151452 - ], - [ - -71.3830282, - 45.3151452 - ], - [ - -71.3830282, - 45.253416 - ], - [ - -71.5076448, - 45.253416 - ], - [ - -71.5076448, - 45.0655726 - ], - [ - -73.9418929, - 45.0655726 - ], - [ - -73.9418929, - 45.0031242 - ], - [ - -74.7469725, - 45.0031242 - ], - [ - -74.7469725, - 45.0649003 - ], - [ - -74.8800964, - 45.0649003 - ], - [ - -74.8800964, - 45.0029023 - ], - [ - -75.0662455, - 45.0029023 - ], - [ - -75.0662455, - 44.9415167 - ], - [ - -75.2539363, - 44.9415167 - ], - [ - -75.2539363, - 44.8776043 - ], - [ - -75.3789648, - 44.8776043 - ], - [ - -75.3789648, - 44.8153462 - ], - [ - -75.4431283, - 44.8153462 - ], - [ - -75.4431283, - 44.7536053 - ], - [ - -75.5666566, - 44.7536053 - ], - [ - -75.5666566, - 44.6909879 - ], - [ - -75.6290205, - 44.6909879 - ], - [ - -75.6290205, - 44.6284958 - ], - [ - -75.7540484, - 44.6284958 - ], - [ - -75.7540484, - 44.566385 - ], - [ - -75.817312, - 44.566385 - ], - [ - -75.817312, - 44.5028932 - ], - [ - -75.8799549, - 44.5028932 - ], - [ - -75.8799549, - 44.3784946 - ], - [ - -76.1300319, - 44.3784946 - ], - [ - -76.1300319, - 44.3159227 - ], - [ - -76.1926961, - 44.3159227 - ], - [ - -76.1926961, - 44.2534378 - ], - [ - -76.3182619, - 44.2534378 - ], - [ - -76.3182619, - 44.1916726 - ], - [ - -76.3792975, - 44.1916726 - ], - [ - -76.3792975, - 44.0653733 - ], - [ - -76.4427584, - 44.0653733 - ], - [ - -76.4427584, - 43.9963825 - ], - [ - -76.317027, - 43.9963825 - ], - [ - -76.317027, - 43.9414581 - ], - [ - -76.5076611, - 43.9414581 - ], - [ - -76.5076611, - 43.8723335 - ], - [ - -76.3829974, - 43.8723335 - ], - [ - -76.3829974, - 43.8091872 - ], - [ - -76.2534102, - 43.8091872 - ], - [ - -76.2534102, - 43.5665222 - ], - [ - -76.5064833, - 43.5665222 - ], - [ - -76.5064833, - 43.5033881 - ], - [ - -76.6331208, - 43.5033881 - ], - [ - -76.6331208, - 43.4432252 - ], - [ - -76.6951085, - 43.4432252 - ], - [ - -76.6951085, - 43.3786858 - ], - [ - -76.8177798, - 43.3786858 - ], - [ - -76.8177798, - 43.318066 - ], - [ - -77.682, - 43.318066 - ], - [ - -77.682, - 43.3789376 - ], - [ - -78.0565883, - 43.3789376 - ], - [ - -78.0565883, - 43.4396918 - ], - [ - -78.4389748, - 43.4396918 - ], - [ - -78.4389748, - 43.3794382 - ], - [ - -78.8803396, - 43.3794382 - ], - [ - -78.8803396, - 43.3149724 - ], - [ - -79.1298858, - 43.3149724 - ], - [ - -79.1298858, - 43.2429286 - ], - [ - -79.0669615, - 43.2429286 - ], - [ - -79.0669615, - 43.1299931 - ], - [ - -79.1298858, - 43.1299931 - ], - [ - -79.1298858, - 43.0577305 - ], - [ - -79.071264, - 43.0577305 - ], - [ - -79.071264, - 42.9294906 - ], - [ - -78.943264, - 42.9294906 - ], - [ - -78.943264, - 42.7542165 - ], - [ - -79.069439, - 42.7542165 - ], - [ - -79.069439, - 42.6941622 - ], - [ - -79.133439, - 42.6941622 - ], - [ - -79.133439, - 42.6296973 - ], - [ - -79.1947499, - 42.6296973 - ], - [ - -79.1947499, - 42.5663538 - ], - [ - -79.3786827, - 42.5663538 - ], - [ - -79.3786827, - 42.5033425 - ], - [ - -79.4442961, - 42.5033425 - ], - [ - -79.4442961, - 42.4410614 - ], - [ - -79.5679936, - 42.4410614 - ], - [ - -79.5679936, - 42.3775264 - ], - [ - -79.6906154, - 42.3775264 - ], - [ - -79.6906154, - 42.3171086 - ], - [ - -79.8164642, - 42.3171086 - ], - [ - -79.8164642, - 42.2534481 - ], - [ - -80.0052373, - 42.2534481 - ], - [ - -80.0052373, - 42.1909188 - ], - [ - -80.1916829, - 42.1909188 - ], - [ - -80.1916829, - 42.1272555 - ], - [ - -80.3167992, - 42.1272555 - ], - [ - -80.3167992, - 42.0669857 - ], - [ - -80.5063234, - 42.0669857 - ], - [ - -80.5063234, - 42.0034331 - ], - [ - -80.6930471, - 42.0034331 - ], - [ - -80.6930471, - 41.9415141 - ], - [ - -80.9440403, - 41.9415141 - ], - [ - -80.9440403, - 41.8781193 - ], - [ - -81.1942729, - 41.8781193 - ], - [ - -81.1942729, - 41.8166455 - ], - [ - -81.3190089, - 41.8166455 - ], - [ - -81.3190089, - 41.7545453 - ], - [ - -81.4418435, - 41.7545453 - ], - [ - -81.4418435, - 41.690965 - ], - [ - -81.5053523, - 41.690965 - ], - [ - -81.5053523, - 41.6301643 - ], - [ - -82.7470081, - 41.6301643 - ], - [ - -82.7470081, - 41.7536942 - ], - [ - -82.8839135, - 41.7536942 - ], - [ - -82.8839135, - 41.5656075 - ], - [ - -82.9957195, - 41.5656075 - ], - [ - -82.9957195, - 41.6270375 - ], - [ - -83.1257796, - 41.6270375 - ], - [ - -83.1257796, - 41.6878411 - ], - [ - -83.2474733, - 41.6878411 - ], - [ - -83.2474733, - 41.7536942 - ], - [ - -83.3737305, - 41.7536942 - ], - [ - -83.3737305, - 41.809276 - ], - [ - -83.3106019, - 41.809276 - ], - [ - -83.3106019, - 41.8716064 - ], - [ - -83.2474733, - 41.8716064 - ], - [ - -83.2474733, - 41.9361393 - ], - [ - -83.1843447, - 41.9361393 - ], - [ - -83.1843447, - 41.9960851 - ], - [ - -83.1207681, - 41.9960851 - ], - [ - -83.1207681, - 42.2464812 - ], - [ - -83.0589194, - 42.2464812 - ], - [ - -83.0589194, - 42.3089555 - ], - [ - -82.8685328, - 42.3089555 - ], - [ - -82.8685328, - 42.3717652 - ], - [ - -82.8072219, - 42.3717652 - ], - [ - -82.8072219, - 42.558553 - ], - [ - -82.7553745, - 42.558553 - ], - [ - -82.7553745, - 42.4954945 - ], - [ - -82.5599041, - 42.4954945 - ], - [ - -82.5599041, - 42.558553 - ], - [ - -82.4967755, - 42.558553 - ], - [ - -82.4967755, - 42.6833607 - ], - [ - -82.4328863, - 42.6833607 - ], - [ - -82.4328863, - 42.9342196 - ], - [ - -82.3700552, - 42.9342196 - ], - [ - -82.3700552, - 43.0648071 - ], - [ - -82.4328863, - 43.0648071 - ], - [ - -82.4328863, - 43.1917566 - ], - [ - -82.4947464, - 43.1917566 - ], - [ - -82.4947464, - 43.5034627 - ], - [ - -82.557133, - 43.5034627 - ], - [ - -82.557133, - 43.8160901 - ], - [ - -82.6197884, - 43.8160901 - ], - [ - -82.6197884, - 43.9422098 - ], - [ - -82.6839499, - 43.9422098 - ], - [ - -82.6839499, - 44.0022641 - ], - [ - -82.7465346, - 44.0022641 - ], - [ - -82.7465346, - 44.0670545 - ], - [ - -82.8708696, - 44.0670545 - ], - [ - -82.8708696, - 44.1291935 - ], - [ - -83.008517, - 44.1291935 - ], - [ - -83.008517, - 44.0664786 - ], - [ - -83.1336086, - 44.0664786 - ], - [ - -83.1336086, - 44.0053949 - ], - [ - -83.2414522, - 44.0053949 - ], - [ - -83.2414522, - 44.9962034 - ], - [ - -83.1806112, - 44.9962034 - ], - [ - -83.1806112, - 45.067302 - ], - [ - -83.2455172, - 45.067302 - ], - [ - -83.2455172, - 45.1287382 - ], - [ - -83.3065878, - 45.1287382 - ], - [ - -83.3065878, - 45.2551509 - ], - [ - -83.3706087, - 45.2551509 - ], - [ - -83.3706087, - 45.3165923 - ], - [ - -83.4325644, - 45.3165923 - ], - [ - -83.4325644, - 45.3792105 - ], - [ - -83.6178415, - 45.3792105 - ], - [ - -83.6178415, - 45.4419665 - ], - [ - -83.8084291, - 45.4419665 - ], - [ - -83.8084291, - 45.5036189 - ], - [ - -84.0550718, - 45.5036189 - ], - [ - -84.0550718, - 45.5647907 - ], - [ - -84.1235181, - 45.5647907 - ], - [ - -84.1235181, - 45.6287845 - ], - [ - -84.1807534, - 45.6287845 - ], - [ - -84.1807534, - 45.6914688 - ], - [ - -84.3111554, - 45.6914688 - ], - [ - -84.3111554, - 45.9337076 - ], - [ - -83.8209974, - 45.9337076 - ], - [ - -83.8209974, - 45.8725113 - ], - [ - -83.4968086, - 45.8725113 - ], - [ - -83.4968086, - 45.9337076 - ], - [ - -83.4338066, - 45.9337076 - ], - [ - -83.4338066, - 46.0016863 - ], - [ - -83.4962697, - 46.0016863 - ], - [ - -83.4962697, - 46.0668178 - ], - [ - -83.5599956, - 46.0668178 - ], - [ - -83.5599956, - 46.1261576 - ], - [ - -83.9954558, - 46.1261576 - ], - [ - -83.9954558, - 46.1931747 - ], - [ - -84.0591816, - 46.1931747 - ], - [ - -84.0591816, - 46.3814972 - ], - [ - -84.1152614, - 46.3814972 - ], - [ - -84.1152614, - 46.4953584 - ], - [ - -84.0591816, - 46.4953584 - ], - [ - -84.0591816, - 46.5682653 - ], - [ - -84.2579545, - 46.5682653 - ], - [ - -84.2579545, - 46.5051232 - ], - [ - -84.3071879, - 46.5051232 - ], - [ - -84.3071879, - 46.5682653 - ], - [ - -84.4415364, - 46.5682653 - ], - [ - -84.4415364, - 46.504525 - ], - [ - -84.9965729, - 46.504525 - ], - [ - -84.9965729, - 46.6842882 - ], - [ - -84.9298158, - 46.6842882 - ], - [ - -84.9298158, - 46.818077 - ], - [ - -85.3165894, - 46.818077 - ], - [ - -85.3165894, - 46.7535825 - ], - [ - -87.5562645, - 46.7535825 - ], - [ - -87.5562645, - 47.4407371 - ], - [ - -87.6825361, - 47.4407371 - ], - [ - -87.6825361, - 47.5035554 - ], - [ - -88.2560738, - 47.5035554 - ], - [ - -88.2560738, - 47.4433716 - ], - [ - -88.4417419, - 47.4433716 - ], - [ - -88.4417419, - 47.3789949 - ], - [ - -88.50683, - 47.3789949 - ], - [ - -88.50683, - 47.3153881 - ], - [ - -88.6312821, - 47.3153881 - ], - [ - -88.6312821, - 47.2539782 - ], - [ - -88.7569636, - 47.2539782 - ], - [ - -88.7569636, - 47.1934682 - ], - [ - -88.8838253, - 47.1934682 - ], - [ - -88.8838253, - 47.1284735 - ], - [ - -88.9434208, - 47.1284735 - ], - [ - -88.9434208, - 47.0662127 - ], - [ - -89.0708726, - 47.0662127 - ], - [ - -89.0708726, - 47.0026826 - ], - [ - -89.2565553, - 47.0026826 - ], - [ - -89.2565553, - 46.9410806 - ], - [ - -90.3677669, - 46.9410806 - ], - [ - -90.3677669, - 47.6844827 - ], - [ - -90.3069978, - 47.6844827 - ], - [ - -90.3069978, - 47.7460174 - ], - [ - -89.994859, - 47.7460174 - ], - [ - -89.994859, - 47.8082719 - ], - [ - -89.8048615, - 47.8082719 - ], - [ - -89.8048615, - 47.8700562 - ], - [ - -89.6797699, - 47.8700562 - ], - [ - -89.6797699, - 47.9339637 - ], - [ - -89.4933757, - 47.9339637 - ], - [ - -89.4933757, - 47.9957956 - ], - [ - -89.4284697, - 47.9957956 - ], - [ - -89.4284697, - 48.0656377 - ], - [ - -89.9932739, - 48.0656377 - ], - [ - -89.9932739, - 48.1282966 - ], - [ - -90.7455933, - 48.1282966 - ], - [ - -90.7455933, - 48.1893056 - ], - [ - -90.8087291, - 48.1893056 - ], - [ - -90.8087291, - 48.2522065 - ], - [ - -91.067763, - 48.2522065 - ], - [ - -91.067763, - 48.1916658 - ], - [ - -91.1946247, - 48.1916658 - ], - [ - -91.1946247, - 48.1279027 - ], - [ - -91.6814196, - 48.1279027 - ], - [ - -91.6814196, - 48.2525994 - ], - [ - -91.9321927, - 48.2525994 - ], - [ - -91.9321927, - 48.3142454 - ], - [ - -91.9929683, - 48.3142454 - ], - [ - -91.9929683, - 48.3780845 - ], - [ - -92.3189383, - 48.3780845 - ], - [ - -92.3189383, - 48.2529081 - ], - [ - -92.3732233, - 48.2529081 - ], - [ - -92.3732233, - 48.3153385 - ], - [ - -92.4322288, - 48.3153385 - ], - [ - -92.4322288, - 48.4411448 - ], - [ - -92.4977248, - 48.4411448 - ], - [ - -92.4977248, - 48.501781 - ], - [ - -92.5679413, - 48.501781 - ], - [ - -92.5679413, - 48.439579 - ], - [ - -92.6210462, - 48.439579 - ], - [ - -92.6210462, - 48.5650783 - ], - [ - -92.8086835, - 48.5650783 - ], - [ - -92.8086835, - 48.6286865 - ], - [ - -92.8086835, - 48.6267365 - ], - [ - -92.933185, - 48.6267365 - ], - [ - -92.933185, - 48.6922145 - ], - [ - -93.0051716, - 48.6922145 - ], - [ - -93.0051716, - 48.6282965 - ], - [ - -93.1225924, - 48.6282965 - ], - [ - -93.1225924, - 48.6922145 - ], - [ - -93.3190806, - 48.6922145 - ], - [ - -93.3190806, - 48.6267365 - ], - [ - -93.5049477, - 48.6267365 - ], - [ - -93.5049477, - 48.5635164 - ], - [ - -93.7474601, - 48.5635164 - ], - [ - -93.7474601, - 48.6267365 - ], - [ - -93.8135461, - 48.6267365 - ], - [ - -93.8135461, - 48.6898775 - ], - [ - -94.2453121, - 48.6898775 - ], - [ - -94.2453121, - 48.7554327 - ], - [ - -94.6183171, - 48.7554327 - ], - [ - -94.6183171, - 48.941036 - ], - [ - -94.6809018, - 48.941036 - ], - [ - -94.6809018, - 49.0029737 - ], - [ - -94.7441532, - 49.0029737 - ], - [ - -94.7441532, - 49.2536079 - ], - [ - -94.8084069, - 49.2536079 - ], - [ - -94.8084069, - 49.3784134 - ], - [ - -95.1192391, - 49.3784134 - ], - [ - -95.1192391, - 49.4425264 - ], - [ - -95.1934341, - 49.4425264 - ], - [ - -95.1934341, - 49.0035292 - ], - [ - -96.87069, - 49.0035292 - ], - [ - -96.87069, - 49.0656063 - ], - [ - -99.0049312, - 49.0656063 - ], - [ - -99.0049312, - 49.0050714 - ], - [ - -109.3699257, - 49.0050714 - ], - [ - -109.3699257, - 49.0668231 - ], - [ - -109.5058746, - 49.0668231 - ], - [ - -109.5058746, - 49.0050714 - ], - [ - -114.1830014, - 49.0050714 - ], - [ - -114.1830014, - 49.0687317 - ], - [ - -114.7578709, - 49.0687317 - ], - [ - -114.7578709, - 49.0050714 - ], - [ - -115.433731, - 49.0050714 - ], - [ - -115.433731, - 49.0671412 - ], - [ - -116.5062706, - 49.0671412 - ], - [ - -116.5062706, - 49.0050714 - ], - [ - -117.3089504, - 49.0050714 - ], - [ - -117.3089504, - 49.0659803 - ], - [ - -119.882945, - 49.0659803 - ], - [ - -119.882945, - 49.0050714 - ], - [ - -120.1208555, - 49.0050714 - ], - [ - -120.1208555, - 49.0678367 - ], - [ - -121.4451636, - 49.0678367 - ], - [ - -121.4451636, - 49.0050714 - ], - [ - -121.9311808, - 49.0050714 - ], - [ - -121.9311808, - 49.0656099 - ], - [ - -122.817484, - 49.0656099 - ], - [ - -122.817484, - 49.0029143 - ], - [ - -122.8795155, - 49.0029143 - ], - [ - -122.8795155, - 48.9347018 - ], - [ - -122.8174629, - 48.9347018 - ], - [ - -122.8174629, - 48.8101998 - ], - [ - -122.7538859, - 48.8101998 - ], - [ - -122.7538859, - 48.7533758 - ], - [ - -122.8712937, - 48.7533758 - ], - [ - -122.8712937, - 48.8153948 - ], - [ - -123.0055391, - 48.8153948 - ], - [ - -123.0055391, - 48.7529529 - ], - [ - -123.1296926, - 48.7529529 - ], - [ - -123.1296926, - 48.6902201 - ], - [ - -123.1838197, - 48.6902201 - ], - [ - -123.1838197, - 48.7529029 - ] - ], - [ - [ - -122.9341743, - 37.7521547 - ], - [ - -122.9347457, - 37.6842013 - ], - [ - -123.0679013, - 37.6849023 - ], - [ - -123.0673747, - 37.7475251 - ], - [ - -123.1292603, - 37.7478506 - ], - [ - -123.1286894, - 37.815685 - ], - [ - -123.0590687, - 37.8153192 - ], - [ - -123.0595947, - 37.7528143 - ] - ], - [ - [ - -71.6299464, - 41.2540893 - ], - [ - -71.4966465, - 41.2541393 - ], - [ - -71.4965596, - 41.122965 - ], - [ - -71.6298594, - 41.1229149 - ] - ], - [ - [ - -70.3184265, - 41.3775196 - ], - [ - -70.3183384, - 41.2448243 - ], - [ - -70.1906612, - 41.2448722 - ], - [ - -70.1906239, - 41.1886019 - ], - [ - -69.9336025, - 41.1886984 - ], - [ - -69.933729, - 41.3791941 - ], - [ - -69.9950664, - 41.3791712 - ], - [ - -69.995109, - 41.443159 - ], - [ - -70.0707828, - 41.4431307 - ], - [ - -70.0706972, - 41.3144915 - ], - [ - -70.2461667, - 41.3144258 - ], - [ - -70.2462087, - 41.3775467 - ] - ], - [ - [ - -68.9403374, - 43.9404062 - ], - [ - -68.6856948, - 43.9404977 - ], - [ - -68.6856475, - 43.8721797 - ], - [ - -68.7465405, - 43.8721577 - ], - [ - -68.7464976, - 43.8102529 - ], - [ - -68.8090782, - 43.8102304 - ], - [ - -68.8090343, - 43.746728 - ], - [ - -68.8773094, - 43.7467034 - ], - [ - -68.8773544, - 43.8117826 - ], - [ - -68.9402483, - 43.8117599 - ] - ], - [ - [ - -123.1291466, - 49.0645144 - ], - [ - -122.9954224, - 49.0645144 - ], - [ - -122.9954224, - 48.9343243 - ], - [ - -123.1291466, - 48.9343243 - ] - ], - [ - [ - -82.9407144, - 24.7535913 - ], - [ - -82.8719398, - 24.7535913 - ], - [ - -82.8719398, - 24.6905653 - ], - [ - -82.7446233, - 24.6905653 - ], - [ - -82.7446233, - 24.6214593 - ], - [ - -82.8088038, - 24.6214593 - ], - [ - -82.8088038, - 24.5594908 - ], - [ - -82.9407144, - 24.5594908 - ] - ] - ] - }, - { - "name": "USGS Topographic Maps", - "type": "tms", - "template": "http://{switch:a,b,c}.tile.openstreetmap.us/usgs_scanned_topos/{zoom}/{x}/{y}.png", - "polygon": [ - [ - [ - -125.990173, - 48.9962416 - ], - [ - -125.989419, - 47.9948396 - ], - [ - -123.9929739, - 47.9955062 - ], - [ - -123.9922429, - 47.0059202 - ], - [ - -125.988688, - 47.0052409 - ], - [ - -125.9879604, - 46.0015618 - ], - [ - -123.9939396, - 46.0022529 - ], - [ - -123.9925238, - 43.9961708 - ], - [ - -124.9931832, - 43.9958116 - ], - [ - -124.9918175, - 41.9942149 - ], - [ - -125.9851789, - 41.9938465 - ], - [ - -125.9838655, - 40.0076111 - ], - [ - -123.9833285, - 40.0083757 - ], - [ - -123.9814115, - 37.002615 - ], - [ - -122.21903, - 37.0033173 - ], - [ - -122.2184144, - 36.011671 - ], - [ - -122.020087, - 36.011751 - ], - [ - -122.0188591, - 33.9961766 - ], - [ - -119.9787757, - 33.9970206 - ], - [ - -119.9775867, - 31.9987658 - ], - [ - -114.0122833, - 32.00129 - ], - [ - -114.0116894, - 30.9862401 - ], - [ - -105.998294, - 30.9896679 - ], - [ - -105.9971419, - 28.9901065 - ], - [ - -102.0210506, - 28.9918418 - ], - [ - -102.0204916, - 28.00733 - ], - [ - -100.0062436, - 28.0082173 - ], - [ - -100.0051143, - 25.991909 - ], - [ - -98.0109067, - 25.9928035 - ], - [ - -98.0103613, - 25.0063461 - ], - [ - -97.0161086, - 25.0067957 - ], - [ - -97.016654, - 25.9932494 - ], - [ - -95.9824825, - 25.9937132 - ], - [ - -95.9835999, - 27.9891175 - ], - [ - -94.0200898, - 27.9899826 - ], - [ - -94.0206586, - 28.9918129 - ], - [ - -88.0156706, - 28.9944338 - ], - [ - -88.0162494, - 30.0038862 - ], - [ - -86.0277506, - 30.0047454 - ], - [ - -86.0271719, - 28.9953016 - ], - [ - -84.0187909, - 28.9961781 - ], - [ - -84.017095, - 25.9817708 - ], - [ - -81.9971976, - 25.9826768 - ], - [ - -81.9966618, - 25.0134917 - ], - [ - -84.0165592, - 25.0125783 - ], - [ - -84.0160068, - 24.0052745 - ], - [ - -80.0199985, - 24.007096 - ], - [ - -80.0245309, - 32.0161282 - ], - [ - -78.0066484, - 32.0169819 - ], - [ - -78.0072238, - 32.9894278 - ], - [ - -77.8807233, - 32.9894807 - ], - [ - -77.8813253, - 33.9955918 - ], - [ - -76.0115411, - 33.9963653 - ], - [ - -76.0121459, - 34.9952552 - ], - [ - -74.0068449, - 34.9960749 - ], - [ - -74.0099997, - 40.0084254 - ], - [ - -72.0013745, - 40.0091931 - ], - [ - -72.002019, - 40.9912464 - ], - [ - -69.8797398, - 40.9920457 - ], - [ - -69.8804173, - 42.00893 - ], - [ - -69.9927682, - 42.0088883 - ], - [ - -69.9934462, - 43.0105166 - ], - [ - -67.9845366, - 43.0112496 - ], - [ - -67.985224, - 44.0103812 - ], - [ - -65.9892568, - 44.0110975 - ], - [ - -65.9921237, - 47.9993584 - ], - [ - -70.006442, - 47.9980181 - ], - [ - -70.005708, - 47.0042007 - ], - [ - -72.023686, - 47.003514 - ], - [ - -72.0222508, - 45.0059846 - ], - [ - -78.0146667, - 45.0038705 - ], - [ - -78.0139662, - 44.0026998 - ], - [ - -80.029686, - 44.0019763 - ], - [ - -80.0290052, - 43.0122994 - ], - [ - -81.995479, - 43.011582 - ], - [ - -81.9982986, - 47.0042713 - ], - [ - -87.505706, - 47.0023972 - ], - [ - -87.5064535, - 48.0142702 - ], - [ - -88.0260889, - 48.0140968 - ], - [ - -88.026838, - 49.0086686 - ], - [ - -93.9981078, - 49.0067142 - ], - [ - -93.9988778, - 50.0086456 - ], - [ - -96.0138899, - 50.0079995 - ], - [ - -96.0131199, - 49.0060547 - ] - ], - [ - [ - -160.5787616, - 22.5062947 - ], - [ - -160.5782192, - 21.4984647 - ], - [ - -159.0030121, - 21.499196 - ], - [ - -159.0027422, - 20.9951068 - ], - [ - -157.5083185, - 20.995803 - ], - [ - -157.5080519, - 20.4960241 - ], - [ - -155.966889, - 20.4967444 - ], - [ - -155.9674267, - 21.5028287 - ], - [ - -157.5044717, - 21.5021151 - ], - [ - -157.5047384, - 21.9984962 - ], - [ - -159.0090946, - 21.9978002 - ], - [ - -159.0093692, - 22.5070181 - ] - ], - [ - [ - -168.006102, - 68.9941463 - ], - [ - -168.0047628, - 68.0107853 - ], - [ - -165.4842481, - 68.0112562 - ], - [ - -165.4829337, - 67.0037303 - ], - [ - -168.0034485, - 67.0032389 - ], - [ - -168.002195, - 66.0017503 - ], - [ - -169.0087448, - 66.001546 - ], - [ - -169.0075381, - 64.9987675 - ], - [ - -168.0009882, - 64.9989798 - ], - [ - -167.9998282, - 63.9982374 - ], - [ - -164.9871288, - 63.9988964 - ], - [ - -164.9860062, - 62.9950845 - ], - [ - -167.9987057, - 62.9944019 - ], - [ - -167.9946035, - 59.0153692 - ], - [ - -162.5027857, - 59.0167799 - ], - [ - -162.5018149, - 58.0005815 - ], - [ - -160.0159024, - 58.0012389 - ], - [ - -160.0149725, - 57.000035 - ], - [ - -160.5054788, - 56.9999017 - ], - [ - -160.5045719, - 55.9968161 - ], - [ - -164.012195, - 55.9958373 - ], - [ - -164.0113186, - 55.00107 - ], - [ - -165.994782, - 55.0005023 - ], - [ - -165.9941266, - 54.2400584 - ], - [ - -168.0002944, - 54.2394734 - ], - [ - -168.0000986, - 54.0094921 - ], - [ - -170.0156134, - 54.0089011 - ], - [ - -170.0147683, - 53.0016446 - ], - [ - -171.9993636, - 53.0010487 - ], - [ - -171.9989488, - 52.4977745 - ], - [ - -176.0083239, - 52.4965566 - ], - [ - -176.0081186, - 52.2452555 - ], - [ - -178.000097, - 52.2446469 - ], - [ - -177.9992996, - 51.2554252 - ], - [ - -176.0073212, - 51.2560472 - ], - [ - -176.0075146, - 51.4980163 - ], - [ - -171.9981395, - 51.4992617 - ], - [ - -171.9985419, - 51.9985373 - ], - [ - -167.9984317, - 51.9997661 - ], - [ - -167.9994645, - 53.2560877 - ], - [ - -165.9932968, - 53.2566866 - ], - [ - -165.9939308, - 54.0100804 - ], - [ - -159.0067205, - 54.0121291 - ], - [ - -159.0075717, - 55.002502 - ], - [ - -158.0190709, - 55.0027849 - ], - [ - -158.0199473, - 55.9975094 - ], - [ - -151.9963213, - 55.9991902 - ], - [ - -151.9981536, - 57.9986536 - ], - [ - -151.500341, - 57.9987853 - ], - [ - -151.5012894, - 58.9919816 - ], - [ - -138.5159989, - 58.9953194 - ], - [ - -138.5150471, - 57.9986434 - ], - [ - -136.6872422, - 57.9991267 - ], - [ - -136.6863158, - 57.0016688 - ], - [ - -135.9973698, - 57.001856 - ], - [ - -135.9964667, - 56.0030544 - ], - [ - -134.6717732, - 56.003424 - ], - [ - -134.6708865, - 54.9969623 - ], - [ - -133.9956734, - 54.9971556 - ], - [ - -133.9948193, - 54.0031685 - ], - [ - -130.0044418, - 54.0043387 - ], - [ - -130.0070826, - 57.0000507 - ], - [ - -131.975877, - 56.9995156 - ], - [ - -131.9787378, - 59.9933094 - ], - [ - -138.0071813, - 59.991805 - ], - [ - -138.0082158, - 61.0125755 - ], - [ - -140.9874011, - 61.0118551 - ], - [ - -140.99984, - 71.0039309 - ], - [ - -154.5023956, - 71.0017377 - ], - [ - -154.5039632, - 71.9983391 - ], - [ - -157.499048, - 71.9978773 - ], - [ - -157.4974758, - 70.9982877 - ], - [ - -163.0233611, - 70.9973899 - ], - [ - -163.0218273, - 69.9707435 - ], - [ - -164.9730896, - 69.97041 - ], - [ - -164.9717003, - 68.994689 - ] - ], - [ - [ - -168.5133204, - 62.8689586 - ], - [ - -168.5144423, - 63.8765677 - ], - [ - -172.0202755, - 63.8757975 - ], - [ - -172.0191536, - 62.8681608 - ] - ], - [ - [ - -170.9947111, - 59.9954089 - ], - [ - -170.995726, - 60.9969787 - ], - [ - -174.0045311, - 60.9962508 - ], - [ - -174.0035162, - 59.9946581 - ] - ], - [ - [ - -156.0717261, - 20.2854602 - ], - [ - -154.7940471, - 20.2860582 - ], - [ - -154.7933145, - 18.9029464 - ], - [ - -156.0709936, - 18.9023432 - ] - ] - ] - }, - { - "name": "Vejmidte (Denmark)", - "type": "tms", - "template": "http://{switch:a,b,c}.tile.openstreetmap.dk/danmark/vejmidte/{zoom}/{x}/{y}.png", - "scaleExtent": [ - 0, - 20 - ], - "polygon": [ - [ - [ - 8.3743941, - 54.9551655 - ], - [ - 8.3683809, - 55.4042149 - ], - [ - 8.2103997, - 55.4039795 - ], - [ - 8.2087314, - 55.4937345 - ], - [ - 8.0502655, - 55.4924731 - ], - [ - 8.0185123, - 56.7501399 - ], - [ - 8.1819161, - 56.7509948 - ], - [ - 8.1763274, - 57.0208898 - ], - [ - 8.3413329, - 57.0219872 - ], - [ - 8.3392467, - 57.1119574 - ], - [ - 8.5054433, - 57.1123212 - ], - [ - 8.5033923, - 57.2020499 - ], - [ - 9.3316304, - 57.2027636 - ], - [ - 9.3319079, - 57.2924835 - ], - [ - 9.4978864, - 57.2919578 - ], - [ - 9.4988593, - 57.3820608 - ], - [ - 9.6649749, - 57.3811615 - ], - [ - 9.6687295, - 57.5605591 - ], - [ - 9.8351961, - 57.5596265 - ], - [ - 9.8374896, - 57.6493322 - ], - [ - 10.1725726, - 57.6462818 - ], - [ - 10.1754245, - 57.7367768 - ], - [ - 10.5118282, - 57.7330269 - ], - [ - 10.5152095, - 57.8228945 - ], - [ - 10.6834853, - 57.8207722 - ], - [ - 10.6751613, - 57.6412021 - ], - [ - 10.5077045, - 57.6433097 - ], - [ - 10.5039992, - 57.5535088 - ], - [ - 10.671038, - 57.5514113 - ], - [ - 10.6507805, - 57.1024538 - ], - [ - 10.4857673, - 57.1045138 - ], - [ - 10.4786236, - 56.9249051 - ], - [ - 10.3143981, - 56.9267573 - ], - [ - 10.3112341, - 56.8369269 - ], - [ - 10.4750295, - 56.83509 - ], - [ - 10.4649016, - 56.5656681 - ], - [ - 10.9524239, - 56.5589761 - ], - [ - 10.9479249, - 56.4692243 - ], - [ - 11.1099335, - 56.4664675 - ], - [ - 11.1052639, - 56.376833 - ], - [ - 10.9429901, - 56.3795284 - ], - [ - 10.9341235, - 56.1994768 - ], - [ - 10.7719685, - 56.2020244 - ], - [ - 10.7694751, - 56.1120103 - ], - [ - 10.6079695, - 56.1150259 - ], - [ - 10.4466742, - 56.116717 - ], - [ - 10.2865948, - 56.118675 - ], - [ - 10.2831527, - 56.0281851 - ], - [ - 10.4439274, - 56.0270388 - ], - [ - 10.4417713, - 55.7579243 - ], - [ - 10.4334961, - 55.6693533 - ], - [ - 10.743814, - 55.6646861 - ], - [ - 10.743814, - 55.5712253 - ], - [ - 10.8969041, - 55.5712253 - ], - [ - 10.9051793, - 55.3953852 - ], - [ - 11.0613726, - 55.3812841 - ], - [ - 11.0593038, - 55.1124061 - ], - [ - 11.0458567, - 55.0318621 - ], - [ - 11.2030844, - 55.0247474 - ], - [ - 11.2030844, - 55.117139 - ], - [ - 11.0593038, - 55.1124061 - ], - [ - 11.0613726, - 55.3812841 - ], - [ - 11.0789572, - 55.5712253 - ], - [ - 10.8969041, - 55.5712253 - ], - [ - 10.9258671, - 55.6670198 - ], - [ - 10.743814, - 55.6646861 - ], - [ - 10.7562267, - 55.7579243 - ], - [ - 10.4417713, - 55.7579243 - ], - [ - 10.4439274, - 56.0270388 - ], - [ - 10.4466742, - 56.116717 - ], - [ - 10.6079695, - 56.1150259 - ], - [ - 10.6052053, - 56.0247462 - ], - [ - 10.9258671, - 56.0201215 - ], - [ - 10.9197132, - 55.9309388 - ], - [ - 11.0802782, - 55.92792 - ], - [ - 11.0858066, - 56.0178284 - ], - [ - 11.7265047, - 56.005058 - ], - [ - 11.7319981, - 56.0952142 - ], - [ - 12.0540333, - 56.0871256 - ], - [ - 12.0608477, - 56.1762576 - ], - [ - 12.7023469, - 56.1594405 - ], - [ - 12.6611131, - 55.7114318 - ], - [ - 12.9792318, - 55.7014026 - ], - [ - 12.9612912, - 55.5217294 - ], - [ - 12.3268659, - 55.5412096 - ], - [ - 12.3206071, - 55.4513655 - ], - [ - 12.4778226, - 55.447067 - ], - [ - 12.4702432, - 55.3570479 - ], - [ - 12.6269738, - 55.3523837 - ], - [ - 12.6200898, - 55.2632576 - ], - [ - 12.4627339, - 55.26722 - ], - [ - 12.4552949, - 55.1778223 - ], - [ - 12.2987046, - 55.1822303 - ], - [ - 12.2897344, - 55.0923641 - ], - [ - 12.6048608, - 55.0832904 - ], - [ - 12.5872011, - 54.9036285 - ], - [ - 12.2766618, - 54.9119031 - ], - [ - 12.2610181, - 54.7331602 - ], - [ - 12.1070691, - 54.7378161 - ], - [ - 12.0858621, - 54.4681655 - ], - [ - 11.7794953, - 54.4753579 - ], - [ - 11.7837381, - 54.5654783 - ], - [ - 11.1658525, - 54.5782155 - ], - [ - 11.1706443, - 54.6686508 - ], - [ - 10.8617173, - 54.6733956 - ], - [ - 10.8651245, - 54.7634667 - ], - [ - 10.7713646, - 54.7643888 - ], - [ - 10.7707276, - 54.7372807 - ], - [ - 10.7551428, - 54.7375776 - ], - [ - 10.7544039, - 54.7195666 - ], - [ - 10.7389074, - 54.7197588 - ], - [ - 10.7384368, - 54.7108482 - ], - [ - 10.7074486, - 54.7113045 - ], - [ - 10.7041094, - 54.6756741 - ], - [ - 10.5510973, - 54.6781698 - ], - [ - 10.5547184, - 54.7670245 - ], - [ - 10.2423994, - 54.7705935 - ], - [ - 10.2459845, - 54.8604673 - ], - [ - 10.0902268, - 54.8622134 - ], - [ - 10.0873731, - 54.7723851 - ], - [ - 9.1555798, - 54.7769557 - ], - [ - 9.1562752, - 54.8675369 - ], - [ - 8.5321973, - 54.8663765 - ], - [ - 8.531432, - 54.95516 - ] - ], - [ - [ - 11.4577738, - 56.819554 - ], - [ - 11.7849181, - 56.8127385 - ], - [ - 11.7716715, - 56.6332796 - ], - [ - 11.4459621, - 56.6401087 - ] - ], - [ - [ - 11.3274736, - 57.3612962 - ], - [ - 11.3161808, - 57.1818004 - ], - [ - 11.1508692, - 57.1847276 - ], - [ - 11.1456628, - 57.094962 - ], - [ - 10.8157703, - 57.1001693 - ], - [ - 10.8290599, - 57.3695272 - ] - ], - [ - [ - 11.5843266, - 56.2777928 - ], - [ - 11.5782882, - 56.1880397 - ], - [ - 11.7392309, - 56.1845765 - ], - [ - 11.7456428, - 56.2743186 - ] - ], - [ - [ - 14.6825922, - 55.3639405 - ], - [ - 14.8395247, - 55.3565231 - ], - [ - 14.8263755, - 55.2671261 - ], - [ - 15.1393406, - 55.2517359 - ], - [ - 15.1532015, - 55.3410836 - ], - [ - 15.309925, - 55.3330556 - ], - [ - 15.295719, - 55.2437356 - ], - [ - 15.1393406, - 55.2517359 - ], - [ - 15.1255631, - 55.1623802 - ], - [ - 15.2815819, - 55.1544167 - ], - [ - 15.2535578, - 54.9757646 - ], - [ - 14.6317464, - 55.0062496 - ] - ] - ], - "terms_url": "http://wiki.openstreetmap.org/wiki/Vejmidte", - "terms_text": "Danish municipalities" - }, - { - "name": "Vienna: Beschriftungen (annotations)", - "type": "tms", - "template": "http://www.wien.gv.at/wmts/beschriftung/normal/google3857/{zoom}/{y}/{x}.png", - "scaleExtent": [ - 0, - 19 - ], - "polygon": [ - [ - [ - 16.17, - 48.1 - ], - [ - 16.17, - 48.33 - ], - [ - 16.58, - 48.33 - ], - [ - 16.58, - 48.1 - ], - [ - 16.17, - 48.1 - ] - ] - ], - "terms_url": "http://data.wien.gv.at/", - "terms_text": "Stadt Wien" - }, - { - "name": "Vienna: Mehrzweckkarte (general purpose)", - "type": "tms", - "template": "http://www.wien.gv.at/wmts/fmzk/pastell/google3857/{zoom}/{y}/{x}.jpeg", - "scaleExtent": [ - 0, - 19 - ], - "polygon": [ - [ - [ - 16.17, - 48.1 - ], - [ - 16.17, - 48.33 - ], - [ - 16.58, - 48.33 - ], - [ - 16.58, - 48.1 - ], - [ - 16.17, - 48.1 - ] - ] - ], - "terms_url": "http://data.wien.gv.at/", - "terms_text": "Stadt Wien" - }, - { - "name": "Vienna: Orthofoto (aerial image)", - "type": "tms", - "template": "http://www.wien.gv.at/wmts/lb/farbe/google3857/{zoom}/{y}/{x}.jpeg", - "scaleExtent": [ - 0, - 19 - ], - "polygon": [ - [ - [ - 16.17, - 48.1 - ], - [ - 16.17, - 48.33 - ], - [ - 16.58, - 48.33 - ], - [ - 16.58, - 48.1 - ], - [ - 16.17, - 48.1 - ] - ] - ], - "terms_url": "http://data.wien.gv.at/", - "terms_text": "Stadt Wien" - }, - { - "name": "basemap.at", - "type": "tms", - "description": "Basemap of Austria, based on goverment data.", - "template": "http://maps.wien.gv.at/basemap/geolandbasemap/normal/google3857/{zoom}/{y}/{x}.png", - "polygon": [ - [ - [ - 16.5073284, - 46.9929304 - ], - [ - 16.283417, - 46.9929304 - ], - [ - 16.135839, - 46.8713046 - ], - [ - 15.9831722, - 46.8190947 - ], - [ - 16.0493278, - 46.655175 - ], - [ - 15.8610387, - 46.7180116 - ], - [ - 15.7592608, - 46.6900933 - ], - [ - 15.5607938, - 46.6796202 - ], - [ - 15.5760605, - 46.6342132 - ], - [ - 15.4793715, - 46.6027553 - ], - [ - 15.4335715, - 46.6516819 - ], - [ - 15.2249267, - 46.6342132 - ], - [ - 15.0468154, - 46.6481886 - ], - [ - 14.9908376, - 46.5887681 - ], - [ - 14.9603042, - 46.6237293 - ], - [ - 14.8534374, - 46.6027553 - ], - [ - 14.8330818, - 46.5012666 - ], - [ - 14.7516595, - 46.4977636 - ], - [ - 14.6804149, - 46.4381781 - ], - [ - 14.6142593, - 46.4381781 - ], - [ - 14.578637, - 46.3785275 - ], - [ - 14.4412369, - 46.4311638 - ], - [ - 14.1613476, - 46.4276563 - ], - [ - 14.1257253, - 46.4767409 - ], - [ - 14.0188585, - 46.4767409 - ], - [ - 13.9119917, - 46.5257813 - ], - [ - 13.8254805, - 46.5047694 - ], - [ - 13.4438134, - 46.560783 - ], - [ - 13.3064132, - 46.5502848 - ], - [ - 13.1283019, - 46.5887681 - ], - [ - 12.8433237, - 46.6132433 - ], - [ - 12.7262791, - 46.6412014 - ], - [ - 12.5125455, - 46.6656529 - ], - [ - 12.3598787, - 46.7040543 - ], - [ - 12.3649676, - 46.7703197 - ], - [ - 12.2886341, - 46.7772902 - ], - [ - 12.2733674, - 46.8852187 - ], - [ - 12.2072118, - 46.8747835 - ], - [ - 12.1308784, - 46.9026062 - ], - [ - 12.1156117, - 46.9998721 - ], - [ - 12.2530119, - 47.0657733 - ], - [ - 12.2123007, - 47.0934969 - ], - [ - 11.9833004, - 47.0449712 - ], - [ - 11.7339445, - 46.9616816 - ], - [ - 11.6321666, - 47.010283 - ], - [ - 11.5405665, - 46.9755722 - ], - [ - 11.4998553, - 47.0068129 - ], - [ - 11.418433, - 46.9651546 - ], - [ - 11.2555884, - 46.9755722 - ], - [ - 11.1130993, - 46.913036 - ], - [ - 11.0418548, - 46.7633482 - ], - [ - 10.8891879, - 46.7598621 - ], - [ - 10.7416099, - 46.7842599 - ], - [ - 10.7059877, - 46.8643462 - ], - [ - 10.5787653, - 46.8399847 - ], - [ - 10.4566318, - 46.8504267 - ], - [ - 10.4769874, - 46.9269392 - ], - [ - 10.3853873, - 46.9894592 - ], - [ - 10.2327204, - 46.8643462 - ], - [ - 10.1207647, - 46.8330223 - ], - [ - 9.8663199, - 46.9408389 - ], - [ - 9.9019422, - 47.0033426 - ], - [ - 9.6831197, - 47.0588402 - ], - [ - 9.6118752, - 47.0380354 - ], - [ - 9.6322307, - 47.128131 - ], - [ - 9.5813418, - 47.1662025 - ], - [ - 9.5406306, - 47.2664422 - ], - [ - 9.6067863, - 47.3492559 - ], - [ - 9.6729419, - 47.369939 - ], - [ - 9.6424085, - 47.4457079 - ], - [ - 9.5660751, - 47.4801122 - ], - [ - 9.7136531, - 47.5282405 - ], - [ - 9.7848976, - 47.5969187 - ], - [ - 9.8357866, - 47.5454185 - ], - [ - 9.9477423, - 47.538548 - ], - [ - 10.0902313, - 47.4491493 - ], - [ - 10.1105869, - 47.3664924 - ], - [ - 10.2428982, - 47.3871688 - ], - [ - 10.1869203, - 47.2698953 - ], - [ - 10.3243205, - 47.2975125 - ], - [ - 10.4820763, - 47.4491493 - ], - [ - 10.4311873, - 47.4869904 - ], - [ - 10.4413651, - 47.5900549 - ], - [ - 10.4871652, - 47.5522881 - ], - [ - 10.5482319, - 47.5351124 - ], - [ - 10.5991209, - 47.5660246 - ], - [ - 10.7568766, - 47.5316766 - ], - [ - 10.8891879, - 47.5454185 - ], - [ - 10.9400769, - 47.4869904 - ], - [ - 10.9960547, - 47.3906141 - ], - [ - 11.2352328, - 47.4422662 - ], - [ - 11.2810328, - 47.3975039 - ], - [ - 11.4235219, - 47.5144941 - ], - [ - 11.5761888, - 47.5076195 - ], - [ - 11.6067221, - 47.5900549 - ], - [ - 11.8357224, - 47.5866227 - ], - [ - 12.003656, - 47.6243647 - ], - [ - 12.2072118, - 47.6037815 - ], - [ - 12.1614117, - 47.6963421 - ], - [ - 12.2581008, - 47.7442718 - ], - [ - 12.2530119, - 47.6792136 - ], - [ - 12.4311232, - 47.7100408 - ], - [ - 12.4921899, - 47.631224 - ], - [ - 12.5685234, - 47.6277944 - ], - [ - 12.6295901, - 47.6894913 - ], - [ - 12.7720792, - 47.6689338 - ], - [ - 12.8331459, - 47.5419833 - ], - [ - 12.975635, - 47.4732332 - ], - [ - 13.0417906, - 47.4938677 - ], - [ - 13.0367017, - 47.5557226 - ], - [ - 13.0977685, - 47.6415112 - ], - [ - 13.0316128, - 47.7100408 - ], - [ - 12.9043905, - 47.7203125 - ], - [ - 13.0061684, - 47.84683 - ], - [ - 12.9451016, - 47.9355501 - ], - [ - 12.8636793, - 47.9594103 - ], - [ - 12.8636793, - 48.0036929 - ], - [ - 12.7517236, - 48.0989418 - ], - [ - 12.8738571, - 48.2109733 - ], - [ - 12.9603683, - 48.2109733 - ], - [ - 13.0417906, - 48.2652035 - ], - [ - 13.1842797, - 48.2990682 - ], - [ - 13.2606131, - 48.2922971 - ], - [ - 13.3980133, - 48.3565867 - ], - [ - 13.4438134, - 48.417418 - ], - [ - 13.4387245, - 48.5523383 - ], - [ - 13.509969, - 48.5860123 - ], - [ - 13.6117469, - 48.5725454 - ], - [ - 13.7287915, - 48.5118999 - ], - [ - 13.7847694, - 48.5725454 - ], - [ - 13.8203916, - 48.6263915 - ], - [ - 13.7949471, - 48.7171267 - ], - [ - 13.850925, - 48.7741724 - ], - [ - 14.0595697, - 48.6633774 - ], - [ - 14.0137696, - 48.6331182 - ], - [ - 14.0748364, - 48.5927444 - ], - [ - 14.2173255, - 48.5961101 - ], - [ - 14.3649034, - 48.5489696 - ], - [ - 14.4666813, - 48.6499311 - ], - [ - 14.5582815, - 48.5961101 - ], - [ - 14.5989926, - 48.6263915 - ], - [ - 14.7211261, - 48.5759124 - ], - [ - 14.7211261, - 48.6868997 - ], - [ - 14.822904, - 48.7271983 - ], - [ - 14.8178151, - 48.777526 - ], - [ - 14.9647227, - 48.7851754 - ], - [ - 14.9893637, - 49.0126611 - ], - [ - 15.1485933, - 48.9950306 - ], - [ - 15.1943934, - 48.9315502 - ], - [ - 15.3063491, - 48.9850128 - ], - [ - 15.3928603, - 48.9850128 - ], - [ - 15.4844604, - 48.9282069 - ], - [ - 15.749083, - 48.8545973 - ], - [ - 15.8406831, - 48.8880697 - ], - [ - 16.0086166, - 48.7808794 - ], - [ - 16.2070835, - 48.7339115 - ], - [ - 16.3953727, - 48.7372678 - ], - [ - 16.4920617, - 48.8110498 - ], - [ - 16.6905286, - 48.7741724 - ], - [ - 16.7057953, - 48.7339115 - ], - [ - 16.8991733, - 48.713769 - ], - [ - 16.9755067, - 48.515271 - ], - [ - 16.8482844, - 48.4511817 - ], - [ - 16.8533733, - 48.3464411 - ], - [ - 16.9551512, - 48.2516513 - ], - [ - 16.9907734, - 48.1498955 - ], - [ - 17.0925513, - 48.1397088 - ], - [ - 17.0823736, - 48.0241182 - ], - [ - 17.1739737, - 48.0207146 - ], - [ - 17.0823736, - 47.8741447 - ], - [ - 16.9856845, - 47.8673174 - ], - [ - 17.0823736, - 47.8092489 - ], - [ - 17.0925513, - 47.7031919 - ], - [ - 16.7414176, - 47.6792136 - ], - [ - 16.7057953, - 47.7511153 - ], - [ - 16.5378617, - 47.7545368 - ], - [ - 16.5480395, - 47.7066164 - ], - [ - 16.4208172, - 47.6689338 - ], - [ - 16.573484, - 47.6175045 - ], - [ - 16.670173, - 47.631224 - ], - [ - 16.7108842, - 47.538548 - ], - [ - 16.6599952, - 47.4491493 - ], - [ - 16.5429506, - 47.3940591 - ], - [ - 16.4615283, - 47.3940591 - ], - [ - 16.4920617, - 47.276801 - ], - [ - 16.425906, - 47.1973317 - ], - [ - 16.4717061, - 47.1489007 - ], - [ - 16.5480395, - 47.1489007 - ], - [ - 16.476795, - 47.0796369 - ], - [ - 16.527684, - 47.0588402 - ] - ] - ], - "terms_text": "basemap.at", - "id": "basemap.at" - }, - { - "name": "Übersichtsplan Zürich", - "type": "tms", - "template": "http://mapproxy.sosm.ch:8080/tiles/zh_uebersichtsplan/EPSG900913/{zoom}/{x}/{y}.png?origin=nw", - "scaleExtent": [ - 0, - 21 - ], - "polygon": [ - [ - [ - 8.4482, - 47.321 - ], - [ - 8.4482, - 47.4339 - ], - [ - 8.6248, - 47.4339 - ], - [ - 8.6248, - 47.321 - ], - [ - 8.4482, - 47.321 - ] - ] - ], - "terms_text": "Stadt Zürich Open Government Data" - } -]; \ No newline at end of file diff --git a/vendor/assets/iD/presets.js b/vendor/assets/iD/presets.js deleted file mode 100644 index 507c415ff..000000000 --- a/vendor/assets/iD/presets.js +++ /dev/null @@ -1,40280 +0,0 @@ -iD.data.presets = { - "presets": { - "address": { - "fields": [ - "address" - ], - "geometry": [ - "point" - ], - "tags": { - "addr:housenumber": "*" - }, - "addTags": {}, - "removeTags": {}, - "matchScore": 0.2, - "name": "Address" - }, - "aerialway": { - "fields": [ - "aerialway" - ], - "geometry": [ - "point", - "vertex", - "line" - ], - "tags": { - "aerialway": "*" - }, - "terms": [ - "ski lift", - "funifor", - "funitel" - ], - "name": "Aerialway" - }, - "aerialway/cable_car": { - "geometry": [ - "line" - ], - "terms": [ - "tramway", - "ropeway" - ], - "fields": [ - "aerialway/occupancy", - "aerialway/capacity", - "aerialway/duration", - "aerialway/heating" - ], - "tags": { - "aerialway": "cable_car" - }, - "name": "Cable Car" - }, - "aerialway/chair_lift": { - "geometry": [ - "line" - ], - "fields": [ - "aerialway/occupancy", - "aerialway/capacity", - "aerialway/duration", - "aerialway/bubble", - "aerialway/heating" - ], - "tags": { - "aerialway": "chair_lift" - }, - "name": "Chair Lift" - }, - "aerialway/gondola": { - "geometry": [ - "line" - ], - "fields": [ - "aerialway/occupancy", - "aerialway/capacity", - "aerialway/duration", - "aerialway/bubble", - "aerialway/heating" - ], - "tags": { - "aerialway": "gondola" - }, - "name": "Gondola" - }, - "aerialway/magic_carpet": { - "geometry": [ - "line" - ], - "fields": [ - "aerialway/capacity", - "aerialway/duration", - "aerialway/heating" - ], - "tags": { - "aerialway": "magic_carpet" - }, - "name": "Magic Carpet Lift" - }, - "aerialway/platter": { - "geometry": [ - "line" - ], - "terms": [ - "button lift", - "poma lift" - ], - "fields": [ - "aerialway/capacity", - "aerialway/duration" - ], - "tags": { - "aerialway": "platter" - }, - "name": "Platter Lift" - }, - "aerialway/pylon": { - "geometry": [ - "point", - "vertex" - ], - "fields": [ - "ref" - ], - "tags": { - "aerialway": "pylon" - }, - "name": "Aerialway Pylon" - }, - "aerialway/rope_tow": { - "geometry": [ - "line" - ], - "terms": [ - "handle tow", - "bugel lift" - ], - "fields": [ - "aerialway/capacity", - "aerialway/duration" - ], - "tags": { - "aerialway": "rope_tow" - }, - "name": "Rope Tow Lift" - }, - "aerialway/station": { - "geometry": [ - "point", - "vertex" - ], - "fields": [ - "aerialway/access", - "aerialway/summer/access", - "elevation" - ], - "tags": { - "aerialway": "station" - }, - "name": "Aerialway Station" - }, - "aerialway/t-bar": { - "geometry": [ - "line" - ], - "fields": [ - "aerialway/capacity", - "aerialway/duration" - ], - "tags": { - "aerialway": "t-bar" - }, - "name": "T-bar Lift" - }, - "aeroway": { - "icon": "airport", - "fields": [ - "aeroway" - ], - "geometry": [ - "point", - "vertex", - "line", - "area" - ], - "tags": { - "aeroway": "*" - }, - "name": "Aeroway" - }, - "aeroway/aerodrome": { - "icon": "airport", - "geometry": [ - "point", - "area" - ], - "terms": [ - "airplane", - "airport", - "aerodrome" - ], - "fields": [ - "ref", - "iata", - "icao", - "operator" - ], - "tags": { - "aeroway": "aerodrome" - }, - "name": "Airport" - }, - "aeroway/apron": { - "icon": "airport", - "geometry": [ - "area" - ], - "terms": [ - "ramp" - ], - "fields": [ - "ref", - "surface" - ], - "tags": { - "aeroway": "apron" - }, - "name": "Apron" - }, - "aeroway/gate": { - "icon": "airport", - "geometry": [ - "point" - ], - "fields": [ - "ref" - ], - "tags": { - "aeroway": "gate" - }, - "name": "Airport gate" - }, - "aeroway/hangar": { - "geometry": [ - "area" - ], - "fields": [ - "building_area" - ], - "tags": { - "aeroway": "hangar" - }, - "name": "Hangar" - }, - "aeroway/helipad": { - "icon": "heliport", - "geometry": [ - "point", - "area" - ], - "terms": [ - "helicopter", - "helipad", - "heliport" - ], - "tags": { - "aeroway": "helipad" - }, - "name": "Helipad" - }, - "aeroway/runway": { - "geometry": [ - "line", - "area" - ], - "terms": [ - "landing strip" - ], - "fields": [ - "ref", - "surface", - "length", - "width" - ], - "tags": { - "aeroway": "runway" - }, - "name": "Runway" - }, - "aeroway/taxiway": { - "geometry": [ - "line" - ], - "fields": [ - "ref", - "surface" - ], - "tags": { - "aeroway": "taxiway" - }, - "name": "Taxiway" - }, - "aeroway/terminal": { - "geometry": [ - "point", - "area" - ], - "terms": [ - "airport", - "aerodrome" - ], - "fields": [ - "operator", - "building_area" - ], - "tags": { - "aeroway": "terminal" - }, - "name": "Airport terminal" - }, - "amenity": { - "fields": [ - "amenity" - ], - "geometry": [ - "point", - "vertex", - "area" - ], - "tags": { - "amenity": "*" - }, - "searchable": false, - "name": "Amenity" - }, - "amenity/arts_centre": { - "icon": "theatre", - "fields": [ - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [], - "tags": { - "amenity": "arts_centre" - }, - "name": "Arts Center" - }, - "amenity/atm": { - "icon": "bank", - "fields": [ - "operator", - "drive_through" - ], - "geometry": [ - "point", - "vertex" - ], - "terms": [ - "money", - "cash", - "machine" - ], - "tags": { - "amenity": "atm" - }, - "name": "ATM" - }, - "amenity/bank": { - "icon": "bank", - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "credit union", - "check", - "deposit", - "fund", - "investment", - "repository", - "reserve", - "safe", - "savings", - "stock", - "treasury", - "trust", - "vault" - ], - "tags": { - "amenity": "bank" - }, - "name": "Bank" - }, - "amenity/bar": { - "icon": "bar", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "smoking" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "dive", - "beer", - "bier", - "booze" - ], - "tags": { - "amenity": "bar" - }, - "name": "Bar" - }, - "amenity/bbq": { - "fields": [ - "covered", - "fuel" - ], - "geometry": [ - "point" - ], - "terms": [ - "bbq" - ], - "tags": { - "amenity": "bbq" - }, - "name": "Barbecue/Grill" - }, - "amenity/bench": { - "fields": [ - "backrest" - ], - "geometry": [ - "point", - "vertex", - "line" - ], - "tags": { - "amenity": "bench" - }, - "name": "Bench" - }, - "amenity/bicycle_parking": { - "icon": "bicycle", - "fields": [ - "bicycle_parking", - "capacity", - "operator", - "covered", - "access_simple" - ], - "geometry": [ - "point", - "vertex", - "area" - ], - "terms": [ - "bike" - ], - "tags": { - "amenity": "bicycle_parking" - }, - "name": "Bicycle Parking" - }, - "amenity/bicycle_rental": { - "icon": "bicycle", - "fields": [ - "capacity", - "network", - "operator" - ], - "geometry": [ - "point", - "vertex", - "area" - ], - "terms": [ - "bike" - ], - "tags": { - "amenity": "bicycle_rental" - }, - "name": "Bicycle Rental" - }, - "amenity/bicycle_repair_station": { - "icon": "bicycle", - "fields": [ - "operator", - "brand", - "opening_hours", - "fee", - "service/bicycle/chain_tool", - "service/bicycle/pump" - ], - "geometry": [ - "point", - "vertex", - "area" - ], - "terms": [ - "bike" - ], - "tags": { - "amenity": "bicycle_repair_station" - }, - "name": "Bicycle Repair Station" - }, - "amenity/biergarten": { - "icon": "beer", - "fields": [ - "address", - "building_area", - "opening_hours", - "smoking" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "amenity": "biergarten" - }, - "terms": [ - "beer", - "bier", - "booze" - ], - "name": "Beer Garden" - }, - "amenity/boat_rental": { - "fields": [ - "operator" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "amenity": "boat_rental" - }, - "name": "Boat Rental" - }, - "amenity/bureau_de_change": { - "icon": "bank", - "fields": [ - "operator" - ], - "geometry": [ - "point", - "vertex" - ], - "terms": [ - "bureau de change", - "money changer" - ], - "tags": { - "amenity": "bureau_de_change" - }, - "name": "Currency Exchange" - }, - "amenity/bus_station": { - "icon": "bus", - "fields": [ - "building_area", - "operator" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "amenity": "bus_station" - }, - "name": "Bus Station" - }, - "amenity/cafe": { - "icon": "cafe", - "fields": [ - "cuisine", - "internet_access", - "address", - "building_area", - "opening_hours", - "smoking" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "coffee", - "tea" - ], - "tags": { - "amenity": "cafe" - }, - "name": "Cafe" - }, - "amenity/car_rental": { - "icon": "car", - "fields": [ - "operator" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "amenity": "car_rental" - }, - "name": "Car Rental" - }, - "amenity/car_sharing": { - "icon": "car", - "fields": [ - "operator", - "capacity" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "amenity": "car_sharing" - }, - "name": "Car Sharing" - }, - "amenity/car_wash": { - "icon": "car", - "fields": [ - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "amenity": "car_wash" - }, - "name": "Car Wash" - }, - "amenity/charging_station": { - "icon": "car", - "fields": [ - "operator" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "amenity": "charging_station" - }, - "terms": [ - "EV", - "Electric Vehicle", - "Supercharger" - ], - "name": "Charging Station" - }, - "amenity/childcare": { - "icon": "school", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "daycare", - "orphanage", - "playgroup" - ], - "tags": { - "amenity": "childcare" - }, - "name": "Nursery/Childcare" - }, - "amenity/cinema": { - "icon": "cinema", - "fields": [ - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "drive-in", - "film", - "flick", - "movie", - "theater", - "picture", - "show", - "screen" - ], - "tags": { - "amenity": "cinema" - }, - "name": "Cinema" - }, - "amenity/clinic": { - "icon": "hospital", - "fields": [ - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "medical", - "urgentcare" - ], - "tags": { - "amenity": "clinic" - }, - "name": "Clinic" - }, - "amenity/clock": { - "geometry": [ - "point", - "vertex" - ], - "tags": { - "amenity": "clock" - }, - "name": "Clock" - }, - "amenity/college": { - "icon": "college", - "fields": [ - "operator", - "address" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "university" - ], - "tags": { - "amenity": "college" - }, - "name": "College Grounds" - }, - "amenity/community_centre": { - "icon": "town-hall", - "fields": [ - "operator", - "address", - "building_area" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "event", - "hall" - ], - "tags": { - "amenity": "community_centre" - }, - "name": "Community Center" - }, - "amenity/compressed_air": { - "icon": "car", - "geometry": [ - "point", - "area" - ], - "tags": { - "amenity": "compressed_air" - }, - "name": "Compressed Air" - }, - "amenity/courthouse": { - "icon": "town-hall", - "fields": [ - "operator", - "address", - "building_area" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "amenity": "courthouse" - }, - "name": "Courthouse" - }, - "amenity/dentist": { - "icon": "hospital", - "fields": [ - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "tooth", - "teeth" - ], - "tags": { - "amenity": "dentist" - }, - "name": "Dentist" - }, - "amenity/doctor": { - "icon": "hospital", - "fields": [ - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "medic*" - ], - "tags": { - "amenity": "doctors" - }, - "name": "Doctor" - }, - "amenity/dojo": { - "icon": "pitch", - "fields": [ - "sport", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "martial arts", - "dojang" - ], - "tags": { - "amenity": "dojo" - }, - "name": "Dojo / Martial Arts Academy" - }, - "amenity/drinking_water": { - "icon": "water", - "geometry": [ - "point" - ], - "tags": { - "amenity": "drinking_water" - }, - "terms": [ - "fountain", - "potable" - ], - "name": "Drinking Water" - }, - "amenity/embassy": { - "icon": "embassy", - "fields": [ - "country", - "address", - "building_area" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "amenity": "embassy" - }, - "name": "Embassy" - }, - "amenity/fast_food": { - "icon": "fast-food", - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "amenity": "fast_food" - }, - "terms": [ - "restaurant" - ], - "name": "Fast Food" - }, - "amenity/fire_station": { - "icon": "fire-station", - "fields": [ - "operator", - "address", - "building_area" - ], - "geometry": [ - "point", - "area" - ], - "terms": [], - "tags": { - "amenity": "fire_station" - }, - "name": "Fire Station" - }, - "amenity/fountain": { - "geometry": [ - "point", - "area" - ], - "tags": { - "amenity": "fountain" - }, - "name": "Fountain" - }, - "amenity/fuel": { - "icon": "fuel", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "petrol", - "fuel", - "propane", - "diesel", - "lng", - "cng", - "biodiesel" - ], - "tags": { - "amenity": "fuel" - }, - "name": "Gas Station" - }, - "amenity/grave_yard": { - "icon": "cemetery", - "fields": [ - "religion", - "denomination" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "amenity": "grave_yard" - }, - "name": "Graveyard" - }, - "amenity/grit_bin": { - "fields": [ - "access_simple" - ], - "geometry": [ - "point", - "vertex" - ], - "tags": { - "amenity": "grit_bin" - }, - "terms": [ - "salt", - "sand" - ], - "name": "Grit Bin" - }, - "amenity/hospital": { - "icon": "hospital", - "fields": [ - "operator", - "address", - "emergency" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "clinic", - "doctor", - "emergency room", - "health service", - "hospice", - "infirmary", - "institution", - "nursing home", - "sanatorium", - "sanitarium", - "sick", - "surgery", - "ward" - ], - "tags": { - "amenity": "hospital" - }, - "name": "Hospital Grounds" - }, - "amenity/kindergarten": { - "icon": "school", - "fields": [ - "operator", - "address" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "kindergarden", - "pre-school" - ], - "tags": { - "amenity": "kindergarten" - }, - "name": "Preschool/Kindergarten Grounds" - }, - "amenity/library": { - "icon": "library", - "fields": [ - "operator", - "building_area", - "address", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "book" - ], - "tags": { - "amenity": "library" - }, - "name": "Library" - }, - "amenity/marketplace": { - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "amenity": "marketplace" - }, - "name": "Marketplace" - }, - "amenity/nightclub": { - "icon": "bar", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "smoking" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "amenity": "nightclub" - }, - "terms": [ - "disco*", - "night club", - "dancing", - "dance club" - ], - "name": "Nightclub" - }, - "amenity/parking": { - "icon": "parking", - "fields": [ - "operator", - "parking", - "capacity", - "fee", - "access_simple", - "supervised", - "park_ride", - "address" - ], - "geometry": [ - "point", - "vertex", - "area" - ], - "tags": { - "amenity": "parking" - }, - "terms": [], - "name": "Car Parking" - }, - "amenity/parking_entrance": { - "icon": "entrance", - "fields": [ - "access_simple", - "ref" - ], - "geometry": [ - "vertex" - ], - "tags": { - "amenity": "parking_entrance" - }, - "name": "Parking Garage Entrance/Exit" - }, - "amenity/pharmacy": { - "icon": "pharmacy", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "amenity": "pharmacy" - }, - "terms": [ - "drug", - "medicine" - ], - "name": "Pharmacy" - }, - "amenity/place_of_worship": { - "icon": "place-of-worship", - "fields": [ - "religion", - "denomination", - "address", - "building_area" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "abbey", - "basilica", - "bethel", - "cathedral", - "chancel", - "chantry", - "chapel", - "church", - "fold", - "house of God", - "house of prayer", - "house of worship", - "minster", - "mission", - "mosque", - "oratory", - "parish", - "sacellum", - "sanctuary", - "shrine", - "synagogue", - "tabernacle", - "temple" - ], - "tags": { - "amenity": "place_of_worship" - }, - "name": "Place of Worship" - }, - "amenity/place_of_worship/buddhist": { - "icon": "place-of-worship", - "fields": [ - "denomination", - "building_area", - "address" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "stupa", - "vihara", - "monastery", - "temple", - "pagoda", - "zendo", - "dojo" - ], - "tags": { - "amenity": "place_of_worship", - "religion": "buddhist" - }, - "name": "Buddhist Temple" - }, - "amenity/place_of_worship/christian": { - "icon": "religious-christian", - "fields": [ - "denomination", - "building_area", - "address" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "christian", - "abbey", - "basilica", - "bethel", - "cathedral", - "chancel", - "chantry", - "chapel", - "fold", - "house of God", - "house of prayer", - "house of worship", - "minster", - "mission", - "oratory", - "parish", - "sacellum", - "sanctuary", - "shrine", - "tabernacle", - "temple" - ], - "tags": { - "amenity": "place_of_worship", - "religion": "christian" - }, - "name": "Church" - }, - "amenity/place_of_worship/jewish": { - "icon": "religious-jewish", - "fields": [ - "denomination", - "building_area", - "address" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "jewish" - ], - "tags": { - "amenity": "place_of_worship", - "religion": "jewish" - }, - "name": "Synagogue" - }, - "amenity/place_of_worship/muslim": { - "icon": "religious-muslim", - "fields": [ - "denomination", - "building_area", - "address" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "muslim" - ], - "tags": { - "amenity": "place_of_worship", - "religion": "muslim" - }, - "name": "Mosque" - }, - "amenity/police": { - "icon": "police", - "fields": [ - "operator", - "address", - "building_area" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "badge", - "constable", - "constabulary", - "cop", - "detective", - "fed", - "law", - "enforcement", - "officer", - "patrol" - ], - "tags": { - "amenity": "police" - }, - "name": "Police" - }, - "amenity/post_box": { - "icon": "post", - "fields": [ - "operator", - "collection_times", - "drive_through" - ], - "geometry": [ - "point", - "vertex" - ], - "tags": { - "amenity": "post_box" - }, - "terms": [ - "letter", - "post" - ], - "name": "Mailbox" - }, - "amenity/post_office": { - "icon": "post", - "fields": [ - "operator", - "address", - "building_area", - "collection_times" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "letter", - "mail" - ], - "tags": { - "amenity": "post_office" - }, - "name": "Post Office" - }, - "amenity/pub": { - "icon": "beer", - "fields": [ - "address", - "building_area", - "opening_hours", - "smoking" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "amenity": "pub" - }, - "terms": [ - "dive", - "beer", - "bier", - "booze" - ], - "name": "Pub" - }, - "amenity/public_bookcase": { - "icon": "library", - "fields": [ - "name", - "operator", - "capacity", - "website" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "library", - "bookcrossing" - ], - "tags": { - "amenity": "public_bookcase" - }, - "name": "Public Bookcase" - }, - "amenity/ranger_station": { - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "visitor center", - "visitor centre", - "permit center", - "permit centre", - "backcountry office", - "warden office", - "warden center" - ], - "tags": { - "amenity": "ranger_station" - }, - "name": "Ranger Station" - }, - "amenity/recycling": { - "icon": "recycling", - "fields": [ - "operator", - "address", - "recycling/cans", - "recycling/glass", - "recycling/paper", - "recycling/clothes" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "can", - "bottle", - "garbage", - "scrap", - "trash" - ], - "tags": { - "amenity": "recycling" - }, - "name": "Recycling" - }, - "amenity/register_office": { - "icon": "town-hall", - "fields": [ - "address", - "building_area", - "opening_hours", - "operator" - ], - "geometry": [ - "point", - "area" - ], - "terms": [], - "tags": { - "amenity": "register_office" - }, - "name": "Register Office" - }, - "amenity/restaurant": { - "icon": "restaurant", - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "bar", - "breakfast", - "cafe", - "café", - "canteen", - "coffee", - "dine", - "dining", - "dinner", - "drive-in", - "eat", - "grill", - "lunch", - "table" - ], - "tags": { - "amenity": "restaurant" - }, - "name": "Restaurant" - }, - "amenity/sanitary_dump_station": { - "fields": [ - "operator", - "access_toilets", - "fee", - "water_point" - ], - "geometry": [ - "point", - "vertex", - "area" - ], - "terms": [ - "Motor Home", - "Camper", - "Sanitary", - "Dump Station", - "Elsan", - "CDP", - "CTDP", - "Chemical Toilet" - ], - "tags": { - "amenity": "sanitary_dump_station" - }, - "name": "RV Toilet Disposal" - }, - "amenity/school": { - "icon": "school", - "fields": [ - "operator", - "address" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "academy", - "elementary school", - "middle school", - "high school" - ], - "tags": { - "amenity": "school" - }, - "name": "School Grounds" - }, - "amenity/shelter": { - "fields": [ - "shelter_type" - ], - "geometry": [ - "point", - "vertex", - "area" - ], - "terms": [ - "lean-to", - "gazebo", - "picnic" - ], - "tags": { - "amenity": "shelter" - }, - "name": "Shelter" - }, - "amenity/social_facility": { - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "wheelchair", - "social_facility_for" - ], - "geometry": [ - "point", - "area" - ], - "terms": [], - "tags": { - "amenity": "social_facility" - }, - "name": "Social Facility" - }, - "amenity/social_facility/food_bank": { - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "social_facility_for" - ], - "geometry": [ - "point", - "area" - ], - "terms": [], - "tags": { - "amenity": "social_facility", - "social_facility": "food_bank" - }, - "name": "Food Bank" - }, - "amenity/social_facility/group_home": { - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "wheelchair", - "social_facility_for" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "old", - "senior", - "living" - ], - "tags": { - "amenity": "social_facility", - "social_facility": "group_home", - "social_facility:for": "senior" - }, - "name": "Elderly Group Home" - }, - "amenity/social_facility/homeless_shelter": { - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "wheelchair", - "social_facility_for" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "houseless", - "unhoused", - "displaced" - ], - "tags": { - "amenity": "social_facility", - "social_facility": "shelter", - "social_facility:for": "homeless" - }, - "name": "Homeless Shelter" - }, - "amenity/studio": { - "icon": "music", - "fields": [ - "studio_type", - "address", - "building_area" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "recording", - "radio", - "television" - ], - "tags": { - "amenity": "studio" - }, - "name": "Studio" - }, - "amenity/swimming_pool": { - "icon": "swimming", - "geometry": [ - "point", - "vertex", - "area" - ], - "tags": { - "amenity": "swimming_pool" - }, - "name": "Swimming Pool", - "searchable": false - }, - "amenity/taxi": { - "icon": "car", - "fields": [ - "operator", - "capacity" - ], - "geometry": [ - "point", - "vertex", - "area" - ], - "terms": [ - "cab" - ], - "tags": { - "amenity": "taxi" - }, - "name": "Taxi Stand" - }, - "amenity/telephone": { - "icon": "telephone", - "geometry": [ - "point", - "vertex" - ], - "tags": { - "amenity": "telephone" - }, - "terms": [ - "phone" - ], - "name": "Telephone" - }, - "amenity/theatre": { - "icon": "theatre", - "fields": [ - "operator", - "address", - "building_area" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "theatre", - "performance", - "play", - "musical" - ], - "tags": { - "amenity": "theatre" - }, - "name": "Theater" - }, - "amenity/toilets": { - "icon": "toilets", - "fields": [ - "toilets/disposal", - "operator", - "building_area", - "access_toilets", - "gender", - "fee" - ], - "geometry": [ - "point", - "vertex", - "area" - ], - "terms": [ - "bathroom", - "restroom", - "outhouse", - "privy", - "head", - "lavatory", - "latrine", - "water closet", - "WC", - "W.C." - ], - "tags": { - "amenity": "toilets" - }, - "name": "Toilets" - }, - "amenity/townhall": { - "icon": "town-hall", - "fields": [ - "operator", - "address", - "building_area" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "village", - "city", - "government", - "courthouse", - "municipal" - ], - "tags": { - "amenity": "townhall" - }, - "name": "Town Hall" - }, - "amenity/university": { - "icon": "college", - "fields": [ - "operator", - "address" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "college" - ], - "tags": { - "amenity": "university" - }, - "name": "University Grounds" - }, - "amenity/vending_machine": { - "fields": [ - "vending", - "operator" - ], - "geometry": [ - "point" - ], - "terms": [ - "snack", - "soda", - "ticket" - ], - "tags": { - "amenity": "vending_machine" - }, - "name": "Vending Machine" - }, - "amenity/veterinary": { - "icon": "dog-park", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "pet clinic", - "veterinarian", - "animal hospital", - "pet doctor" - ], - "tags": { - "amenity": "veterinary" - }, - "name": "Veterinary" - }, - "amenity/waste_basket": { - "icon": "waste-basket", - "geometry": [ - "point", - "vertex" - ], - "tags": { - "amenity": "waste_basket" - }, - "terms": [ - "rubbish", - "litter", - "trash", - "garbage" - ], - "name": "Waste Basket" - }, - "area": { - "name": "Area", - "tags": { - "area": "yes" - }, - "geometry": [ - "area" - ], - "matchScore": 0.1 - }, - "barrier": { - "geometry": [ - "point", - "vertex", - "line", - "area" - ], - "tags": { - "barrier": "*" - }, - "fields": [ - "barrier" - ], - "name": "Barrier" - }, - "barrier/block": { - "fields": [ - "access" - ], - "geometry": [ - "point", - "vertex" - ], - "tags": { - "barrier": "block" - }, - "name": "Block" - }, - "barrier/bollard": { - "fields": [ - "access" - ], - "geometry": [ - "point", - "vertex", - "line" - ], - "tags": { - "barrier": "bollard" - }, - "name": "Bollard" - }, - "barrier/cattle_grid": { - "geometry": [ - "vertex" - ], - "tags": { - "barrier": "cattle_grid" - }, - "name": "Cattle Grid" - }, - "barrier/city_wall": { - "geometry": [ - "line", - "area" - ], - "tags": { - "barrier": "city_wall" - }, - "name": "City Wall" - }, - "barrier/cycle_barrier": { - "fields": [ - "access" - ], - "geometry": [ - "vertex" - ], - "tags": { - "barrier": "cycle_barrier" - }, - "name": "Cycle Barrier" - }, - "barrier/ditch": { - "geometry": [ - "line", - "area" - ], - "tags": { - "barrier": "ditch" - }, - "name": "Ditch" - }, - "barrier/entrance": { - "icon": "entrance", - "geometry": [ - "vertex" - ], - "tags": { - "barrier": "entrance" - }, - "name": "Entrance", - "searchable": false - }, - "barrier/fence": { - "geometry": [ - "line" - ], - "tags": { - "barrier": "fence" - }, - "name": "Fence" - }, - "barrier/gate": { - "fields": [ - "access" - ], - "geometry": [ - "point", - "vertex", - "line" - ], - "tags": { - "barrier": "gate" - }, - "name": "Gate" - }, - "barrier/hedge": { - "geometry": [ - "line", - "area" - ], - "tags": { - "barrier": "hedge" - }, - "name": "Hedge" - }, - "barrier/kissing_gate": { - "fields": [ - "access" - ], - "geometry": [ - "vertex" - ], - "tags": { - "barrier": "kissing_gate" - }, - "name": "Kissing Gate" - }, - "barrier/lift_gate": { - "fields": [ - "access" - ], - "geometry": [ - "point", - "vertex" - ], - "tags": { - "barrier": "lift_gate" - }, - "name": "Lift Gate" - }, - "barrier/retaining_wall": { - "geometry": [ - "line", - "area" - ], - "tags": { - "barrier": "retaining_wall" - }, - "name": "Retaining Wall" - }, - "barrier/stile": { - "fields": [ - "access" - ], - "geometry": [ - "point", - "vertex" - ], - "tags": { - "barrier": "stile" - }, - "name": "Stile" - }, - "barrier/toll_booth": { - "fields": [ - "access" - ], - "geometry": [ - "vertex" - ], - "tags": { - "barrier": "toll_booth" - }, - "name": "Toll Booth" - }, - "barrier/wall": { - "geometry": [ - "line", - "area" - ], - "tags": { - "barrier": "wall" - }, - "name": "Wall" - }, - "boundary/administrative": { - "name": "Administrative Boundary", - "geometry": [ - "line" - ], - "tags": { - "boundary": "administrative" - }, - "fields": [ - "admin_level" - ] - }, - "building": { - "icon": "building", - "fields": [ - "building", - "levels", - "address" - ], - "geometry": [ - "area" - ], - "tags": { - "building": "*" - }, - "terms": [], - "name": "Building" - }, - "building/apartments": { - "icon": "commercial", - "fields": [ - "address", - "levels" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "building": "apartments" - }, - "name": "Apartments" - }, - "building/barn": { - "icon": "building", - "fields": [ - "address", - "levels" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "building": "barn" - }, - "name": "Barn" - }, - "building/bunker": { - "fields": [ - "address", - "levels" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "building": "bunker" - }, - "name": "Bunker", - "searchable": false - }, - "building/cabin": { - "icon": "building", - "fields": [ - "address", - "levels" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "building": "cabin" - }, - "name": "Cabin" - }, - "building/cathedral": { - "icon": "place-of-worship", - "fields": [ - "address", - "levels" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "building": "cathedral" - }, - "name": "Cathedral" - }, - "building/chapel": { - "icon": "place-of-worship", - "fields": [ - "address", - "levels" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "building": "chapel" - }, - "name": "Chapel" - }, - "building/church": { - "icon": "place-of-worship", - "fields": [ - "address", - "levels" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "building": "church" - }, - "name": "Church" - }, - "building/college": { - "icon": "building", - "fields": [ - "address", - "levels" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "university" - ], - "tags": { - "building": "college" - }, - "name": "College Building" - }, - "building/commercial": { - "icon": "commercial", - "fields": [ - "address", - "levels", - "smoking" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "building": "commercial" - }, - "name": "Commercial Building" - }, - "building/construction": { - "icon": "building", - "fields": [ - "address", - "levels" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "building": "construction" - }, - "name": "Building Under Construction" - }, - "building/detached": { - "icon": "building", - "fields": [ - "address", - "levels" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "building": "detached" - }, - "name": "Detached Home" - }, - "building/dormitory": { - "icon": "building", - "fields": [ - "address", - "levels", - "smoking" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "building": "dormitory" - }, - "name": "Dormitory" - }, - "building/entrance": { - "icon": "entrance", - "geometry": [ - "vertex" - ], - "tags": { - "building": "entrance" - }, - "name": "Entrance/Exit", - "searchable": false - }, - "building/garage": { - "fields": [ - "capacity" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "building": "garage" - }, - "name": "Garage", - "icon": "warehouse" - }, - "building/garages": { - "icon": "warehouse", - "fields": [ - "capacity" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "building": "garages" - }, - "name": "Garages" - }, - "building/greenhouse": { - "icon": "building", - "fields": [ - "address", - "levels" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "building": "greenhouse" - }, - "name": "Greenhouse" - }, - "building/hospital": { - "icon": "building", - "fields": [ - "address", - "levels" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "building": "hospital" - }, - "name": "Hospital Building" - }, - "building/hotel": { - "icon": "building", - "fields": [ - "address", - "levels", - "smoking" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "building": "hotel" - }, - "name": "Hotel Building" - }, - "building/house": { - "icon": "building", - "fields": [ - "address", - "levels" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "building": "house" - }, - "name": "House" - }, - "building/hut": { - "geometry": [ - "point", - "area" - ], - "tags": { - "building": "hut" - }, - "name": "Hut" - }, - "building/industrial": { - "icon": "industrial", - "fields": [ - "address", - "levels" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "building": "industrial" - }, - "name": "Industrial Building" - }, - "building/kindergarten": { - "icon": "building", - "fields": [ - "address", - "levels" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "kindergarden", - "pre-school" - ], - "tags": { - "building": "kindergarten" - }, - "name": "Preschool/Kindergarten Building" - }, - "building/public": { - "icon": "building", - "fields": [ - "address", - "levels", - "smoking" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "building": "public" - }, - "name": "Public Building" - }, - "building/residential": { - "icon": "building", - "fields": [ - "address", - "levels" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "building": "residential" - }, - "name": "Residential Building" - }, - "building/retail": { - "icon": "building", - "fields": [ - "address", - "levels", - "smoking" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "building": "retail" - }, - "name": "Retail Building" - }, - "building/roof": { - "icon": "building", - "fields": [ - "address" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "building": "roof" - }, - "name": "Roof" - }, - "building/school": { - "icon": "building", - "fields": [ - "address", - "levels" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "academy", - "elementary school", - "middle school", - "high school" - ], - "tags": { - "building": "school" - }, - "name": "School Building" - }, - "building/shed": { - "icon": "building", - "fields": [ - "address", - "levels" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "building": "shed" - }, - "name": "Shed" - }, - "building/stable": { - "icon": "building", - "fields": [ - "address", - "levels" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "building": "stable" - }, - "name": "Stable" - }, - "building/static_caravan": { - "icon": "building", - "fields": [ - "address", - "levels" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "building": "static_caravan" - }, - "name": "Static Mobile Home" - }, - "building/terrace": { - "icon": "building", - "fields": [ - "address", - "levels" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "building": "terrace" - }, - "name": "Row Houses" - }, - "building/train_station": { - "icon": "building", - "fields": [ - "address", - "levels" - ], - "geometry": [ - "point", - "vertex", - "area" - ], - "tags": { - "building": "train_station" - }, - "name": "Train Station", - "searchable": false - }, - "building/university": { - "icon": "building", - "fields": [ - "address", - "levels" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "college" - ], - "tags": { - "building": "university" - }, - "name": "University Building" - }, - "building/warehouse": { - "icon": "building", - "fields": [ - "address", - "levels" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "building": "warehouse" - }, - "name": "Warehouse" - }, - "craft": { - "icon": "marker-stroked", - "fields": [ - "craft", - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "craft": "*" - }, - "terms": [], - "name": "Craft" - }, - "craft/basket_maker": { - "icon": "art-gallery", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "craft": "basket_maker" - }, - "name": "Basket Maker" - }, - "craft/beekeeper": { - "icon": "farm", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "craft": "beekeeper" - }, - "name": "Beekeeper" - }, - "craft/blacksmith": { - "icon": "farm", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "craft": "blacksmith" - }, - "name": "Blacksmith" - }, - "craft/boatbuilder": { - "icon": "marker-stroked", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "craft": "boatbuilder" - }, - "name": "Boat Builder" - }, - "craft/bookbinder": { - "icon": "library", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "book repair" - ], - "tags": { - "craft": "bookbinder" - }, - "name": "Bookbinder" - }, - "craft/brewery": { - "icon": "beer", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "beer", - "bier" - ], - "tags": { - "craft": "brewery" - }, - "name": "Brewery" - }, - "craft/carpenter": { - "icon": "logging", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "woodworker" - ], - "tags": { - "craft": "carpenter" - }, - "name": "Carpenter" - }, - "craft/carpet_layer": { - "icon": "square", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "craft": "carpet_layer" - }, - "name": "Carpet Layer" - }, - "craft/caterer": { - "icon": "bakery", - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "craft": "caterer" - }, - "name": "Caterer" - }, - "craft/clockmaker": { - "icon": "circle-stroked", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "craft": "clockmaker" - }, - "name": "Clockmaker" - }, - "craft/confectionery": { - "icon": "bakery", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "sweets", - "candy" - ], - "tags": { - "craft": "confectionery" - }, - "name": "Confectionery" - }, - "craft/dressmaker": { - "icon": "clothing-store", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "seamstress" - ], - "tags": { - "craft": "dressmaker" - }, - "name": "Dressmaker" - }, - "craft/electrician": { - "icon": "marker-stroked", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "power", - "wire" - ], - "tags": { - "craft": "electrician" - }, - "name": "Electrician" - }, - "craft/gardener": { - "icon": "garden", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "landscaper", - "grounds keeper" - ], - "tags": { - "craft": "gardener" - }, - "name": "Gardener" - }, - "craft/glaziery": { - "icon": "fire-station", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "glass", - "stained-glass", - "window" - ], - "tags": { - "craft": "glaziery" - }, - "name": "Glaziery" - }, - "craft/handicraft": { - "icon": "art-gallery", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "craft": "handicraft" - }, - "name": "Handicraft" - }, - "craft/hvac": { - "icon": "marker-stroked", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "heat*", - "vent*", - "air conditioning" - ], - "tags": { - "craft": "hvac" - }, - "name": "HVAC" - }, - "craft/insulator": { - "icon": "marker-stroked", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "craft": "insulation" - }, - "name": "Insulator" - }, - "craft/jeweler": { - "icon": "marker-stroked", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "craft": "jeweler" - }, - "name": "Jeweler", - "searchable": false - }, - "craft/key_cutter": { - "icon": "marker-stroked", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "craft": "key_cutter" - }, - "name": "Key Cutter" - }, - "craft/locksmith": { - "icon": "marker-stroked", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "craft": "locksmith" - }, - "name": "Locksmith", - "searchable": false - }, - "craft/metal_construction": { - "icon": "marker-stroked", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "craft": "metal_construction" - }, - "name": "Metal Construction" - }, - "craft/optician": { - "icon": "marker-stroked", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "craft": "optician" - }, - "name": "Optician", - "searchable": false - }, - "craft/painter": { - "icon": "art-gallery", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "craft": "painter" - }, - "name": "Painter" - }, - "craft/photographer": { - "icon": "camera", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "craft": "photographer" - }, - "name": "Photographer" - }, - "craft/photographic_laboratory": { - "icon": "camera", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "film" - ], - "tags": { - "craft": "photographic_laboratory" - }, - "name": "Photographic Laboratory" - }, - "craft/plasterer": { - "icon": "marker-stroked", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "craft": "plasterer" - }, - "name": "Plasterer" - }, - "craft/plumber": { - "icon": "marker-stroked", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "pipe" - ], - "tags": { - "craft": "plumber" - }, - "name": "Plumber" - }, - "craft/pottery": { - "icon": "art-gallery", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "ceramic" - ], - "tags": { - "craft": "pottery" - }, - "name": "Pottery" - }, - "craft/rigger": { - "icon": "marker-stroked", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "craft": "rigger" - }, - "name": "Rigger" - }, - "craft/roofer": { - "icon": "marker-stroked", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "craft": "roofer" - }, - "name": "Roofer" - }, - "craft/saddler": { - "icon": "marker-stroked", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "craft": "saddler" - }, - "name": "Saddler" - }, - "craft/sailmaker": { - "icon": "marker-stroked", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "craft": "sailmaker" - }, - "name": "Sailmaker" - }, - "craft/sawmill": { - "icon": "park", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "lumber" - ], - "tags": { - "craft": "sawmill" - }, - "name": "Sawmill" - }, - "craft/scaffolder": { - "icon": "marker-stroked", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "craft": "scaffolder" - }, - "name": "Scaffolder" - }, - "craft/sculpter": { - "icon": "art-gallery", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "craft": "sculpter" - }, - "name": "Sculpter" - }, - "craft/shoemaker": { - "icon": "marker-stroked", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "cobbler" - ], - "tags": { - "craft": "shoemaker" - }, - "name": "Shoemaker" - }, - "craft/stonemason": { - "icon": "marker-stroked", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "masonry" - ], - "tags": { - "craft": "stonemason" - }, - "name": "Stonemason" - }, - "craft/sweep": { - "icon": "marker-stroked", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "craft": "sweep" - }, - "name": "Chimney Sweep" - }, - "craft/tailor": { - "icon": "clothing-store", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "clothes", - "suit" - ], - "tags": { - "craft": "tailor" - }, - "name": "Tailor", - "searchable": false - }, - "craft/tiler": { - "icon": "marker-stroked", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "craft": "tiler" - }, - "name": "Tiler" - }, - "craft/tinsmith": { - "icon": "marker-stroked", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "craft": "tinsmith" - }, - "name": "Tinsmith" - }, - "craft/upholsterer": { - "icon": "marker-stroked", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "craft": "upholsterer" - }, - "name": "Upholsterer" - }, - "craft/watchmaker": { - "icon": "circle-stroked", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "craft": "watchmaker" - }, - "name": "Watchmaker" - }, - "craft/window_construction": { - "icon": "marker-stroked", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "glass" - ], - "tags": { - "craft": "window_construction" - }, - "name": "Window Construction" - }, - "craft/winery": { - "icon": "alcohol-shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "craft": "winery" - }, - "name": "Winery" - }, - "embankment": { - "geometry": [ - "line" - ], - "tags": { - "embankment": "yes" - }, - "name": "Embankment", - "matchScore": 0.2 - }, - "emergency/ambulance_station": { - "icon": "hospital", - "fields": [ - "operator", - "building_area", - "address" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "EMS", - "EMT", - "rescue" - ], - "tags": { - "emergency": "ambulance_station" - }, - "name": "Ambulance Station" - }, - "emergency/fire_hydrant": { - "fields": [ - "fire_hydrant/type" - ], - "geometry": [ - "point", - "vertex" - ], - "tags": { - "emergency": "fire_hydrant" - }, - "name": "Fire Hydrant" - }, - "emergency/phone": { - "icon": "emergency-telephone", - "fields": [ - "operator" - ], - "geometry": [ - "point", - "vertex" - ], - "tags": { - "emergency": "phone" - }, - "name": "Emergency Phone" - }, - "entrance": { - "icon": "entrance", - "geometry": [ - "vertex" - ], - "tags": { - "entrance": "*" - }, - "fields": [ - "entrance", - "access_simple", - "address" - ], - "name": "Entrance/Exit" - }, - "footway/crossing": { - "fields": [ - "crossing", - "access", - "surface", - "sloped_curb", - "tactile_paving" - ], - "geometry": [ - "line" - ], - "tags": { - "highway": "footway", - "footway": "crossing" - }, - "terms": [], - "name": "Crossing" - }, - "footway/crosswalk": { - "fields": [ - "crossing", - "access", - "surface", - "sloped_curb", - "tactile_paving" - ], - "geometry": [ - "line" - ], - "tags": { - "highway": "footway", - "footway": "crossing", - "crossing": "zebra" - }, - "terms": [ - "zebra crossing" - ], - "name": "Crosswalk" - }, - "footway/sidewalk": { - "fields": [ - "surface", - "lit", - "width", - "structure", - "access" - ], - "geometry": [ - "line" - ], - "tags": { - "highway": "footway", - "footway": "sidewalk" - }, - "terms": [], - "name": "Sidewalk" - }, - "ford": { - "geometry": [ - "vertex" - ], - "tags": { - "ford": "yes" - }, - "name": "Ford" - }, - "golf/bunker": { - "icon": "golf", - "geometry": [ - "area" - ], - "tags": { - "golf": "bunker", - "natural": "sand" - }, - "terms": [ - "hazard", - "bunker" - ], - "name": "Sand Trap" - }, - "golf/fairway": { - "icon": "golf", - "geometry": [ - "area" - ], - "tags": { - "golf": "fairway", - "landuse": "grass" - }, - "name": "Fairway" - }, - "golf/green": { - "icon": "golf", - "geometry": [ - "area" - ], - "tags": { - "golf": "green", - "landuse": "grass", - "leisure": "pitch", - "sport": "golf" - }, - "name": "Putting Green" - }, - "golf/hole": { - "icon": "golf", - "fields": [ - "golf_hole", - "par", - "handicap" - ], - "geometry": [ - "line" - ], - "tags": { - "golf": "hole" - }, - "name": "Golf Hole" - }, - "golf/lateral_water_hazard": { - "icon": "golf", - "geometry": [ - "line", - "area" - ], - "tags": { - "golf": "lateral_water_hazard", - "natural": "water" - }, - "name": "Lateral Water Hazard" - }, - "golf/rough": { - "icon": "golf", - "geometry": [ - "area" - ], - "tags": { - "golf": "rough", - "landuse": "grass" - }, - "name": "Rough" - }, - "golf/tee": { - "icon": "golf", - "geometry": [ - "area" - ], - "tags": { - "golf": "tee", - "landuse": "grass" - }, - "terms": [ - "teeing ground" - ], - "name": "Tee Box" - }, - "golf/water_hazard": { - "icon": "golf", - "geometry": [ - "line", - "area" - ], - "tags": { - "golf": "water_hazard", - "natural": "water" - }, - "name": "Water Hazard" - }, - "highway": { - "fields": [ - "highway" - ], - "geometry": [ - "point", - "vertex", - "line", - "area" - ], - "tags": { - "highway": "*" - }, - "name": "Highway" - }, - "highway/bridleway": { - "fields": [ - "surface", - "width", - "structure", - "access" - ], - "icon": "highway-bridleway", - "geometry": [ - "line" - ], - "tags": { - "highway": "bridleway" - }, - "terms": [ - "bridleway", - "equestrian", - "horse" - ], - "name": "Bridle Path" - }, - "highway/bus_stop": { - "icon": "bus", - "fields": [ - "network", - "operator", - "bench", - "shelter", - "covered" - ], - "geometry": [ - "point", - "vertex" - ], - "tags": { - "highway": "bus_stop" - }, - "terms": [], - "name": "Bus Stop" - }, - "highway/crossing": { - "fields": [ - "crossing", - "sloped_curb", - "tactile_paving" - ], - "geometry": [ - "vertex" - ], - "tags": { - "highway": "crossing" - }, - "terms": [], - "name": "Crossing" - }, - "highway/crosswalk": { - "fields": [ - "crossing", - "sloped_curb", - "tactile_paving" - ], - "geometry": [ - "vertex" - ], - "tags": { - "highway": "crossing", - "crossing": "zebra" - }, - "terms": [ - "zebra crossing" - ], - "name": "Crosswalk" - }, - "highway/cycleway": { - "icon": "highway-cycleway", - "fields": [ - "surface", - "lit", - "width", - "oneway", - "structure", - "access" - ], - "geometry": [ - "line" - ], - "tags": { - "highway": "cycleway" - }, - "terms": [ - "bike" - ], - "name": "Cycle Path" - }, - "highway/footway": { - "icon": "highway-footway", - "fields": [ - "surface", - "lit", - "width", - "structure", - "access" - ], - "geometry": [ - "line", - "area" - ], - "terms": [ - "hike", - "hiking", - "trackway", - "trail", - "walk" - ], - "tags": { - "highway": "footway" - }, - "name": "Foot Path" - }, - "highway/living_street": { - "icon": "highway-living-street", - "fields": [ - "oneway", - "maxspeed", - "structure", - "access", - "surface" - ], - "geometry": [ - "line" - ], - "tags": { - "highway": "living_street" - }, - "name": "Living Street" - }, - "highway/mini_roundabout": { - "geometry": [ - "vertex" - ], - "tags": { - "highway": "mini_roundabout" - }, - "fields": [ - "clock_direction" - ], - "name": "Mini-Roundabout" - }, - "highway/motorway": { - "icon": "highway-motorway", - "fields": [ - "oneway_yes", - "maxspeed", - "structure", - "access", - "lanes", - "surface", - "ref" - ], - "geometry": [ - "line" - ], - "tags": { - "highway": "motorway" - }, - "terms": [], - "name": "Motorway" - }, - "highway/motorway_junction": { - "geometry": [ - "vertex" - ], - "tags": { - "highway": "motorway_junction" - }, - "fields": [ - "ref" - ], - "name": "Motorway Junction / Exit" - }, - "highway/motorway_link": { - "icon": "highway-motorway-link", - "fields": [ - "oneway_yes", - "maxspeed", - "structure", - "access", - "surface", - "ref" - ], - "geometry": [ - "line" - ], - "tags": { - "highway": "motorway_link" - }, - "addTags": { - "highway": "motorway_link", - "oneway": "yes" - }, - "removeTags": { - "highway": "motorway_link", - "oneway": "yes" - }, - "terms": [ - "ramp", - "on ramp", - "off ramp" - ], - "name": "Motorway Link" - }, - "highway/path": { - "icon": "highway-path", - "fields": [ - "surface", - "width", - "structure", - "access", - "incline", - "sac_scale", - "trail_visibility", - "mtb/scale", - "mtb/scale/uphill", - "mtb/scale/imba", - "ref" - ], - "geometry": [ - "line" - ], - "terms": [ - "hike", - "hiking", - "trackway", - "trail", - "walk" - ], - "tags": { - "highway": "path" - }, - "name": "Path" - }, - "highway/pedestrian": { - "fields": [ - "surface", - "lit", - "width", - "oneway", - "structure", - "access" - ], - "geometry": [ - "line", - "area" - ], - "tags": { - "highway": "pedestrian" - }, - "terms": [], - "name": "Pedestrian" - }, - "highway/primary": { - "icon": "highway-primary", - "fields": [ - "oneway", - "maxspeed", - "structure", - "access", - "lanes", - "surface", - "ref" - ], - "geometry": [ - "line" - ], - "tags": { - "highway": "primary" - }, - "terms": [], - "name": "Primary Road" - }, - "highway/primary_link": { - "icon": "highway-primary-link", - "fields": [ - "oneway", - "maxspeed", - "structure", - "access", - "surface", - "ref" - ], - "geometry": [ - "line" - ], - "tags": { - "highway": "primary_link" - }, - "terms": [ - "ramp", - "on ramp", - "off ramp" - ], - "name": "Primary Link" - }, - "highway/raceway": { - "icon": "highway-unclassified", - "fields": [ - "oneway", - "surface", - "sport_racing", - "structure" - ], - "geometry": [ - "line" - ], - "tags": { - "highway": "raceway" - }, - "addTags": { - "highway": "raceway", - "sport": "motor" - }, - "terms": [ - "auto*", - "race*", - "nascar" - ], - "name": "Motor Raceway" - }, - "highway/residential": { - "icon": "highway-residential", - "fields": [ - "oneway", - "maxspeed", - "structure", - "access", - "surface" - ], - "geometry": [ - "line" - ], - "tags": { - "highway": "residential" - }, - "terms": [], - "name": "Residential Road" - }, - "highway/rest_area": { - "geometry": [ - "point", - "vertex", - "area" - ], - "tags": { - "highway": "rest_area" - }, - "terms": [ - "rest stop" - ], - "name": "Rest Area" - }, - "highway/road": { - "icon": "highway-road", - "fields": [ - "oneway", - "maxspeed", - "structure", - "access", - "surface" - ], - "geometry": [ - "line" - ], - "tags": { - "highway": "road" - }, - "terms": [], - "name": "Unknown Road" - }, - "highway/secondary": { - "icon": "highway-secondary", - "fields": [ - "oneway", - "maxspeed", - "structure", - "access", - "lanes", - "surface", - "ref" - ], - "geometry": [ - "line" - ], - "tags": { - "highway": "secondary" - }, - "terms": [], - "name": "Secondary Road" - }, - "highway/secondary_link": { - "icon": "highway-secondary-link", - "fields": [ - "oneway", - "maxspeed", - "structure", - "access", - "surface", - "ref" - ], - "geometry": [ - "line" - ], - "tags": { - "highway": "secondary_link" - }, - "terms": [ - "ramp", - "on ramp", - "off ramp" - ], - "name": "Secondary Link" - }, - "highway/service": { - "icon": "highway-service", - "fields": [ - "service", - "oneway", - "maxspeed", - "structure", - "access", - "surface" - ], - "geometry": [ - "line" - ], - "tags": { - "highway": "service" - }, - "terms": [], - "name": "Service Road" - }, - "highway/service/alley": { - "icon": "highway-service", - "fields": [ - "oneway", - "access", - "surface" - ], - "geometry": [ - "line" - ], - "tags": { - "highway": "service", - "service": "alley" - }, - "name": "Alley" - }, - "highway/service/drive-through": { - "icon": "highway-service", - "fields": [ - "oneway", - "access", - "surface" - ], - "geometry": [ - "line" - ], - "tags": { - "highway": "service", - "service": "drive-through" - }, - "name": "Drive-Through" - }, - "highway/service/driveway": { - "icon": "highway-service", - "fields": [ - "oneway", - "access", - "surface" - ], - "geometry": [ - "line" - ], - "tags": { - "highway": "service", - "service": "driveway" - }, - "name": "Driveway" - }, - "highway/service/emergency_access": { - "icon": "highway-service", - "fields": [ - "oneway", - "access", - "surface" - ], - "geometry": [ - "line" - ], - "tags": { - "highway": "service", - "service": "emergency_access" - }, - "name": "Emergency Access" - }, - "highway/service/parking_aisle": { - "icon": "highway-service", - "fields": [ - "oneway", - "access", - "surface" - ], - "geometry": [ - "line" - ], - "tags": { - "highway": "service", - "service": "parking_aisle" - }, - "name": "Parking Aisle" - }, - "highway/services": { - "geometry": [ - "point", - "vertex", - "area" - ], - "tags": { - "highway": "services" - }, - "terms": [ - "services", - "travel plaza", - "service station" - ], - "name": "Service Area" - }, - "highway/steps": { - "fields": [ - "surface", - "lit", - "width", - "incline_steps", - "access" - ], - "icon": "highway-steps", - "geometry": [ - "line" - ], - "tags": { - "highway": "steps" - }, - "terms": [ - "stairs", - "staircase" - ], - "name": "Steps" - }, - "highway/stop": { - "geometry": [ - "vertex" - ], - "tags": { - "highway": "stop" - }, - "terms": [ - "stop sign" - ], - "name": "Stop Sign" - }, - "highway/street_lamp": { - "geometry": [ - "point", - "vertex" - ], - "tags": { - "highway": "street_lamp" - }, - "fields": [ - "lamp_type", - "ref" - ], - "terms": [ - "streetlight", - "street light", - "lamp", - "light", - "gaslight" - ], - "name": "Street Lamp" - }, - "highway/tertiary": { - "icon": "highway-tertiary", - "fields": [ - "oneway", - "maxspeed", - "structure", - "access", - "lanes", - "surface", - "ref" - ], - "geometry": [ - "line" - ], - "tags": { - "highway": "tertiary" - }, - "terms": [], - "name": "Tertiary Road" - }, - "highway/tertiary_link": { - "icon": "highway-tertiary-link", - "fields": [ - "oneway", - "maxspeed", - "structure", - "access", - "surface", - "ref" - ], - "geometry": [ - "line" - ], - "tags": { - "highway": "tertiary_link" - }, - "terms": [ - "ramp", - "on ramp", - "off ramp" - ], - "name": "Tertiary Link" - }, - "highway/track": { - "icon": "highway-track", - "fields": [ - "surface", - "width", - "structure", - "access", - "incline", - "tracktype", - "smoothness", - "mtb/scale", - "mtb/scale/uphill", - "mtb/scale/imba" - ], - "geometry": [ - "line" - ], - "tags": { - "highway": "track" - }, - "terms": [ - "woods road", - "fire road" - ], - "name": "Track" - }, - "highway/traffic_signals": { - "geometry": [ - "vertex" - ], - "tags": { - "highway": "traffic_signals" - }, - "terms": [ - "light", - "stoplight", - "traffic light" - ], - "name": "Traffic Signals" - }, - "highway/trunk": { - "icon": "highway-trunk", - "fields": [ - "oneway", - "maxspeed", - "structure", - "access", - "lanes", - "surface", - "ref" - ], - "geometry": [ - "line" - ], - "tags": { - "highway": "trunk" - }, - "terms": [], - "name": "Trunk Road" - }, - "highway/trunk_link": { - "icon": "highway-trunk-link", - "fields": [ - "oneway", - "maxspeed", - "structure", - "access", - "surface", - "ref" - ], - "geometry": [ - "line" - ], - "tags": { - "highway": "trunk_link" - }, - "terms": [ - "ramp", - "on ramp", - "off ramp" - ], - "name": "Trunk Link" - }, - "highway/turning_circle": { - "icon": "circle", - "geometry": [ - "vertex" - ], - "tags": { - "highway": "turning_circle" - }, - "terms": [ - "cul-de-sac" - ], - "name": "Turning Circle" - }, - "highway/unclassified": { - "icon": "highway-unclassified", - "fields": [ - "oneway", - "maxspeed", - "structure", - "access", - "surface" - ], - "geometry": [ - "line" - ], - "tags": { - "highway": "unclassified" - }, - "terms": [], - "name": "Unclassified Road" - }, - "historic": { - "fields": [ - "historic" - ], - "geometry": [ - "point", - "vertex", - "area" - ], - "tags": { - "historic": "*" - }, - "name": "Historic Site" - }, - "historic/archaeological_site": { - "geometry": [ - "point", - "vertex", - "area" - ], - "tags": { - "historic": "archaeological_site" - }, - "name": "Archaeological Site" - }, - "historic/boundary_stone": { - "geometry": [ - "point", - "vertex" - ], - "tags": { - "historic": "boundary_stone" - }, - "name": "Boundary Stone" - }, - "historic/castle": { - "geometry": [ - "point", - "area" - ], - "tags": { - "historic": "castle" - }, - "name": "Castle" - }, - "historic/memorial": { - "icon": "monument", - "geometry": [ - "point", - "vertex", - "area" - ], - "tags": { - "historic": "memorial" - }, - "name": "Memorial" - }, - "historic/monument": { - "icon": "monument", - "geometry": [ - "point", - "vertex", - "area" - ], - "tags": { - "historic": "monument" - }, - "name": "Monument" - }, - "historic/ruins": { - "geometry": [ - "point", - "vertex", - "area" - ], - "tags": { - "historic": "ruins" - }, - "name": "Ruins" - }, - "historic/wayside_cross": { - "geometry": [ - "point", - "vertex", - "area" - ], - "tags": { - "historic": "wayside_cross" - }, - "name": "Wayside Cross" - }, - "historic/wayside_shrine": { - "geometry": [ - "point", - "vertex", - "area" - ], - "tags": { - "historic": "wayside_shrine" - }, - "name": "Wayside Shrine" - }, - "junction": { - "geometry": [ - "vertex", - "area" - ], - "tags": { - "junction": "yes" - }, - "name": "Junction" - }, - "landuse": { - "fields": [ - "landuse" - ], - "geometry": [ - "area" - ], - "tags": { - "landuse": "*" - }, - "name": "Landuse" - }, - "landuse/allotments": { - "geometry": [ - "area" - ], - "tags": { - "landuse": "allotments" - }, - "terms": [], - "name": "Allotments" - }, - "landuse/basin": { - "geometry": [ - "area" - ], - "tags": { - "landuse": "basin" - }, - "terms": [], - "name": "Basin" - }, - "landuse/cemetery": { - "icon": "cemetery", - "fields": [ - "religion", - "denomination" - ], - "geometry": [ - "area" - ], - "tags": { - "landuse": "cemetery" - }, - "terms": [], - "name": "Cemetery" - }, - "landuse/churchyard": { - "fields": [ - "religion", - "denomination" - ], - "geometry": [ - "area" - ], - "tags": { - "landuse": "churchyard" - }, - "terms": [], - "name": "Churchyard" - }, - "landuse/commercial": { - "icon": "commercial", - "geometry": [ - "area" - ], - "tags": { - "landuse": "commercial" - }, - "terms": [], - "name": "Commercial Area" - }, - "landuse/construction": { - "fields": [ - "construction", - "operator" - ], - "geometry": [ - "area" - ], - "tags": { - "landuse": "construction" - }, - "terms": [], - "name": "Construction" - }, - "landuse/farm": { - "icon": "farm", - "fields": [ - "crop" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "landuse": "farm" - }, - "terms": [], - "name": "Farmland", - "searchable": false - }, - "landuse/farmland": { - "icon": "farm", - "fields": [ - "crop" - ], - "geometry": [ - "area" - ], - "tags": { - "landuse": "farmland" - }, - "terms": [], - "name": "Farmland" - }, - "landuse/farmyard": { - "icon": "farm", - "fields": [ - "crop" - ], - "geometry": [ - "area" - ], - "tags": { - "landuse": "farmyard" - }, - "terms": [], - "name": "Farmyard" - }, - "landuse/forest": { - "icon": "park2", - "fields": [ - "leaf_type", - "leaf_cycle" - ], - "geometry": [ - "area" - ], - "tags": { - "landuse": "forest" - }, - "terms": [ - "tree" - ], - "name": "Forest" - }, - "landuse/garages": { - "geometry": [ - "area" - ], - "tags": { - "landuse": "garages" - }, - "terms": [], - "name": "Garages" - }, - "landuse/grass": { - "geometry": [ - "area" - ], - "tags": { - "landuse": "grass" - }, - "terms": [], - "name": "Grass" - }, - "landuse/industrial": { - "icon": "industrial", - "geometry": [ - "area" - ], - "tags": { - "landuse": "industrial" - }, - "terms": [], - "name": "Industrial Area" - }, - "landuse/landfill": { - "geometry": [ - "area" - ], - "tags": { - "landuse": "landfill" - }, - "terms": [ - "dump" - ], - "name": "Landfill" - }, - "landuse/meadow": { - "geometry": [ - "area" - ], - "tags": { - "landuse": "meadow" - }, - "terms": [], - "name": "Meadow" - }, - "landuse/military": { - "geometry": [ - "area" - ], - "tags": { - "landuse": "military" - }, - "terms": [], - "name": "Military Area" - }, - "landuse/orchard": { - "icon": "park2", - "fields": [ - "trees" - ], - "geometry": [ - "area" - ], - "tags": { - "landuse": "orchard" - }, - "terms": [], - "name": "Orchard" - }, - "landuse/quarry": { - "geometry": [ - "area" - ], - "tags": { - "landuse": "quarry" - }, - "terms": [], - "name": "Quarry" - }, - "landuse/residential": { - "icon": "building", - "geometry": [ - "area" - ], - "tags": { - "landuse": "residential" - }, - "terms": [], - "name": "Residential Area" - }, - "landuse/retail": { - "icon": "shop", - "geometry": [ - "area" - ], - "tags": { - "landuse": "retail" - }, - "name": "Retail Area" - }, - "landuse/vineyard": { - "geometry": [ - "area" - ], - "tags": { - "landuse": "vineyard" - }, - "terms": [], - "name": "Vineyard" - }, - "leisure": { - "fields": [ - "leisure" - ], - "geometry": [ - "point", - "vertex", - "area" - ], - "tags": { - "leisure": "*" - }, - "name": "Leisure" - }, - "leisure/common": { - "geometry": [ - "point", - "area" - ], - "terms": [ - "open space" - ], - "tags": { - "leisure": "common" - }, - "name": "Common" - }, - "leisure/dog_park": { - "icon": "dog-park", - "geometry": [ - "point", - "area" - ], - "terms": [], - "tags": { - "leisure": "dog_park" - }, - "name": "Dog Park" - }, - "leisure/firepit": { - "geometry": [ - "point", - "area" - ], - "tags": { - "leisure": "firepit" - }, - "terms": [ - "fireplace", - "campfire" - ], - "name": "Firepit" - }, - "leisure/garden": { - "icon": "garden", - "geometry": [ - "point", - "vertex", - "area" - ], - "tags": { - "leisure": "garden" - }, - "name": "Garden" - }, - "leisure/golf_course": { - "icon": "golf", - "fields": [ - "operator", - "address", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "links" - ], - "tags": { - "leisure": "golf_course" - }, - "name": "Golf Course" - }, - "leisure/ice_rink": { - "icon": "pitch", - "fields": [ - "seasonal", - "sport_ice", - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "hockey", - "skating", - "curling" - ], - "tags": { - "leisure": "ice_rink" - }, - "name": "Ice Rink" - }, - "leisure/marina": { - "icon": "harbor", - "fields": [ - "operator", - "address", - "capacity", - "fee", - "sanitary_dump_station", - "power_supply", - "internet_access" - ], - "geometry": [ - "point", - "vertex", - "area" - ], - "terms": [ - "boat" - ], - "tags": { - "leisure": "marina" - }, - "name": "Marina" - }, - "leisure/nature_reserve": { - "icon": "park", - "geometry": [ - "point", - "area" - ], - "tags": { - "leisure": "nature_reserve" - }, - "terms": [ - "protected", - "wildlife" - ], - "name": "Nature Reserve" - }, - "leisure/park": { - "icon": "park", - "geometry": [ - "point", - "area" - ], - "terms": [ - "esplanade", - "estate", - "forest", - "garden", - "grass", - "green", - "grounds", - "lawn", - "lot", - "meadow", - "parkland", - "place", - "playground", - "plaza", - "pleasure garden", - "recreation area", - "square", - "tract", - "village green", - "woodland" - ], - "tags": { - "leisure": "park" - }, - "name": "Park" - }, - "leisure/picnic_table": { - "geometry": [ - "point" - ], - "tags": { - "leisure": "picnic_table" - }, - "terms": [ - "bench" - ], - "name": "Picnic Table" - }, - "leisure/pitch": { - "icon": "pitch", - "fields": [ - "sport", - "surface", - "lit" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "leisure": "pitch" - }, - "terms": [ - "field" - ], - "name": "Sport Pitch" - }, - "leisure/pitch/american_football": { - "icon": "america-football", - "fields": [ - "surface", - "lit" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "leisure": "pitch", - "sport": "american_football" - }, - "terms": [], - "name": "American Football Field" - }, - "leisure/pitch/baseball": { - "icon": "baseball", - "fields": [ - "lit" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "leisure": "pitch", - "sport": "baseball" - }, - "terms": [], - "name": "Baseball Diamond" - }, - "leisure/pitch/basketball": { - "icon": "basketball", - "fields": [ - "surface", - "hoops", - "lit" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "leisure": "pitch", - "sport": "basketball" - }, - "terms": [], - "name": "Basketball Court" - }, - "leisure/pitch/skateboard": { - "icon": "pitch", - "fields": [ - "surface", - "lit" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "leisure": "pitch", - "sport": "skateboard" - }, - "terms": [], - "name": "Skate Park" - }, - "leisure/pitch/soccer": { - "icon": "soccer", - "fields": [ - "surface", - "lit" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "leisure": "pitch", - "sport": "soccer" - }, - "terms": [], - "name": "Soccer Field" - }, - "leisure/pitch/tennis": { - "icon": "tennis", - "fields": [ - "surface", - "lit" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "leisure": "pitch", - "sport": "tennis" - }, - "terms": [], - "name": "Tennis Court" - }, - "leisure/pitch/volleyball": { - "icon": "pitch", - "fields": [ - "surface", - "lit" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "leisure": "pitch", - "sport": "volleyball" - }, - "terms": [], - "name": "Volleyball Court" - }, - "leisure/playground": { - "icon": "playground", - "geometry": [ - "point", - "area" - ], - "terms": [ - "jungle gym", - "play area" - ], - "tags": { - "leisure": "playground" - }, - "name": "Playground" - }, - "leisure/running_track": { - "icon": "pitch", - "fields": [ - "surface", - "sport_racing", - "lit", - "width", - "lanes" - ], - "geometry": [ - "point", - "line" - ], - "tags": { - "leisure": "track", - "sport": "running" - }, - "name": "Running Track" - }, - "leisure/slipway": { - "geometry": [ - "point", - "line" - ], - "terms": [ - "boat launch", - "boat ramp" - ], - "tags": { - "leisure": "slipway" - }, - "name": "Slipway" - }, - "leisure/sports_center": { - "icon": "pitch", - "fields": [ - "sport", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "leisure": "sports_centre" - }, - "terms": [ - "gym" - ], - "name": "Sports Center / Gym" - }, - "leisure/stadium": { - "icon": "pitch", - "fields": [ - "sport", - "address" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "leisure": "stadium" - }, - "name": "Stadium" - }, - "leisure/swimming_pool": { - "icon": "swimming", - "fields": [ - "access_simple", - "operator", - "address" - ], - "geometry": [ - "point", - "vertex", - "area" - ], - "tags": { - "leisure": "swimming_pool" - }, - "name": "Swimming Pool" - }, - "leisure/track": { - "icon": "highway-road", - "fields": [ - "surface", - "sport_racing", - "lit", - "width", - "lanes" - ], - "geometry": [ - "point", - "line" - ], - "tags": { - "leisure": "track" - }, - "name": "Racetrack (non-Motorsport)" - }, - "line": { - "name": "Line", - "tags": {}, - "geometry": [ - "line" - ], - "matchScore": 0.1 - }, - "man_made": { - "fields": [ - "man_made" - ], - "geometry": [ - "point", - "vertex", - "line", - "area" - ], - "tags": { - "man_made": "*" - }, - "name": "Man Made" - }, - "man_made/breakwater": { - "geometry": [ - "line", - "area" - ], - "tags": { - "man_made": "breakwater" - }, - "name": "Breakwater" - }, - "man_made/cutline": { - "geometry": [ - "line" - ], - "tags": { - "man_made": "cutline" - }, - "name": "Cut line" - }, - "man_made/embankment": { - "geometry": [ - "line" - ], - "tags": { - "man_made": "embankment" - }, - "name": "Embankment", - "searchable": false - }, - "man_made/flagpole": { - "geometry": [ - "point" - ], - "tags": { - "man_made": "flagpole" - }, - "name": "Flagpole", - "icon": "embassy" - }, - "man_made/lighthouse": { - "icon": "lighthouse", - "fields": [ - "building_area" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "man_made": "lighthouse" - }, - "name": "Lighthouse" - }, - "man_made/mast": { - "geometry": [ - "point" - ], - "terms": [ - "broadcast tower", - "cell phone tower", - "cell tower", - "guyed tower", - "mobile phone tower", - "radio tower", - "television tower", - "transmission mast", - "transmission tower", - "tv tower" - ], - "tags": { - "man_made": "mast" - }, - "name": "Radio Mast" - }, - "man_made/observation": { - "geometry": [ - "point", - "area" - ], - "terms": [ - "lookout tower", - "fire tower" - ], - "tags": { - "man_made": "tower", - "tower:type": "observation" - }, - "name": "Observation Tower" - }, - "man_made/petroleum_well": { - "geometry": [ - "point" - ], - "terms": [ - "drilling rig", - "oil derrick", - "oil drill", - "oil horse", - "oil rig", - "oil pump", - "petroleum well", - "pumpjack" - ], - "tags": { - "man_made": "petroleum_well" - }, - "name": "Oil Well" - }, - "man_made/pier": { - "geometry": [ - "line", - "area" - ], - "tags": { - "man_made": "pier" - }, - "name": "Pier" - }, - "man_made/pipeline": { - "icon": "pipeline", - "fields": [ - "location", - "operator" - ], - "geometry": [ - "line" - ], - "tags": { - "man_made": "pipeline" - }, - "name": "Pipeline" - }, - "man_made/silo": { - "fields": [ - "building_area", - "crop" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "grain", - "corn", - "wheat" - ], - "tags": { - "man_made": "silo" - }, - "name": "Silo" - }, - "man_made/storage_tank": { - "fields": [ - "building_area", - "content" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "water", - "oil", - "gas", - "petrol" - ], - "tags": { - "man_made": "storage_tank" - }, - "name": "Storage Tank" - }, - "man_made/survey_point": { - "icon": "monument", - "fields": [ - "ref" - ], - "geometry": [ - "point", - "vertex" - ], - "tags": { - "man_made": "survey_point" - }, - "name": "Survey Point" - }, - "man_made/tower": { - "fields": [ - "towertype" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "man_made": "tower" - }, - "name": "Tower" - }, - "man_made/wastewater_plant": { - "icon": "water", - "fields": [ - "operator", - "address" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "sewage*", - "water treatment plant", - "reclamation plant" - ], - "tags": { - "man_made": "wastewater_plant" - }, - "name": "Wastewater Plant" - }, - "man_made/water_tower": { - "icon": "water", - "fields": [ - "operator" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "man_made": "water_tower" - }, - "name": "Water Tower" - }, - "man_made/water_well": { - "fields": [ - "operator" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "man_made": "water_well" - }, - "name": "Water Well" - }, - "man_made/water_works": { - "icon": "water", - "fields": [ - "operator", - "address" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "man_made": "water_works" - }, - "name": "Water Works" - }, - "military/airfield": { - "icon": "airfield", - "geometry": [ - "point", - "vertex", - "area" - ], - "terms": [], - "tags": { - "military": "airfield" - }, - "name": "Airfield" - }, - "military/barracks": { - "geometry": [ - "point", - "vertex", - "area" - ], - "terms": [], - "tags": { - "military": "barracks" - }, - "name": "Barracks" - }, - "military/bunker": { - "geometry": [ - "point", - "vertex", - "area" - ], - "terms": [], - "tags": { - "military": "bunker" - }, - "name": "Bunker" - }, - "military/range": { - "geometry": [ - "point", - "vertex", - "area" - ], - "terms": [], - "tags": { - "military": "range" - }, - "name": "Military Range" - }, - "natural": { - "fields": [ - "natural" - ], - "geometry": [ - "point", - "vertex", - "area" - ], - "tags": { - "natural": "*" - }, - "name": "Natural" - }, - "natural/bay": { - "geometry": [ - "point", - "area" - ], - "terms": [], - "tags": { - "natural": "bay" - }, - "name": "Bay" - }, - "natural/beach": { - "fields": [ - "surface" - ], - "geometry": [ - "point", - "area" - ], - "terms": [], - "tags": { - "natural": "beach" - }, - "name": "Beach" - }, - "natural/cave_entrance": { - "geometry": [ - "point", - "area" - ], - "fields": [ - "fee", - "access_simple" - ], - "terms": [], - "tags": { - "natural": "cave_entrance" - }, - "name": "Cave Entrance" - }, - "natural/cliff": { - "geometry": [ - "point", - "vertex", - "line", - "area" - ], - "terms": [], - "tags": { - "natural": "cliff" - }, - "name": "Cliff" - }, - "natural/coastline": { - "geometry": [ - "line" - ], - "terms": [ - "shore" - ], - "tags": { - "natural": "coastline" - }, - "name": "Coastline" - }, - "natural/fell": { - "geometry": [ - "area" - ], - "terms": [], - "tags": { - "natural": "fell" - }, - "name": "Fell" - }, - "natural/glacier": { - "geometry": [ - "area" - ], - "terms": [], - "tags": { - "natural": "glacier" - }, - "name": "Glacier" - }, - "natural/grassland": { - "geometry": [ - "point", - "area" - ], - "terms": [], - "tags": { - "natural": "grassland" - }, - "name": "Grassland" - }, - "natural/heath": { - "geometry": [ - "area" - ], - "terms": [], - "tags": { - "natural": "heath" - }, - "name": "Heath" - }, - "natural/peak": { - "icon": "triangle", - "fields": [ - "elevation" - ], - "geometry": [ - "point", - "vertex" - ], - "tags": { - "natural": "peak" - }, - "terms": [ - "acme", - "aiguille", - "alp", - "climax", - "crest", - "crown", - "hill", - "mount", - "mountain", - "pinnacle", - "summit", - "tip", - "top" - ], - "name": "Peak" - }, - "natural/scree": { - "geometry": [ - "area" - ], - "tags": { - "natural": "scree" - }, - "terms": [ - "loose rocks" - ], - "name": "Scree" - }, - "natural/scrub": { - "geometry": [ - "area" - ], - "tags": { - "natural": "scrub" - }, - "terms": [], - "name": "Scrub" - }, - "natural/spring": { - "geometry": [ - "point", - "vertex" - ], - "terms": [], - "tags": { - "natural": "spring" - }, - "name": "Spring" - }, - "natural/tree": { - "fields": [ - "leaf_type", - "leaf_cycle", - "denotation" - ], - "icon": "park", - "geometry": [ - "point", - "vertex" - ], - "terms": [], - "tags": { - "natural": "tree" - }, - "name": "Tree" - }, - "natural/water": { - "fields": [ - "water" - ], - "geometry": [ - "area" - ], - "tags": { - "natural": "water" - }, - "icon": "water", - "name": "Water" - }, - "natural/water/lake": { - "geometry": [ - "area" - ], - "tags": { - "natural": "water", - "water": "lake" - }, - "terms": [ - "lakelet", - "loch", - "mere" - ], - "icon": "water", - "name": "Lake" - }, - "natural/water/pond": { - "geometry": [ - "area" - ], - "tags": { - "natural": "water", - "water": "pond" - }, - "terms": [ - "lakelet", - "millpond", - "tarn", - "pool", - "mere" - ], - "icon": "water", - "name": "Pond" - }, - "natural/water/reservoir": { - "geometry": [ - "area" - ], - "tags": { - "natural": "water", - "water": "reservoir" - }, - "icon": "water", - "name": "Reservoir" - }, - "natural/wetland": { - "icon": "wetland", - "fields": [ - "wetland" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "natural": "wetland" - }, - "terms": [], - "name": "Wetland" - }, - "natural/wood": { - "icon": "park2", - "fields": [ - "leaf_type", - "leaf_cycle" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "natural": "wood" - }, - "terms": [ - "tree" - ], - "name": "Wood" - }, - "office": { - "icon": "commercial", - "fields": [ - "office", - "address", - "building_area", - "opening_hours", - "smoking" - ], - "geometry": [ - "point", - "vertex", - "area" - ], - "tags": { - "office": "*" - }, - "terms": [], - "name": "Office" - }, - "office/accountant": { - "icon": "commercial", - "fields": [ - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "vertex", - "area" - ], - "tags": { - "office": "accountant" - }, - "terms": [], - "name": "Accountant" - }, - "office/administrative": { - "icon": "commercial", - "fields": [ - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "vertex", - "area" - ], - "tags": { - "office": "administrative" - }, - "terms": [], - "name": "Administrative Office" - }, - "office/architect": { - "icon": "commercial", - "fields": [ - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "vertex", - "area" - ], - "tags": { - "office": "architect" - }, - "terms": [], - "name": "Architect" - }, - "office/company": { - "icon": "commercial", - "fields": [ - "address", - "building_area", - "opening_hours", - "smoking" - ], - "geometry": [ - "point", - "vertex", - "area" - ], - "tags": { - "office": "company" - }, - "terms": [], - "name": "Company Office" - }, - "office/educational_institution": { - "icon": "commercial", - "fields": [ - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "vertex", - "area" - ], - "tags": { - "office": "educational_institution" - }, - "terms": [], - "name": "Educational Institution" - }, - "office/employment_agency": { - "icon": "commercial", - "fields": [ - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "vertex", - "area" - ], - "tags": { - "office": "employment_agency" - }, - "terms": [ - "job" - ], - "name": "Employment Agency" - }, - "office/estate_agent": { - "icon": "commercial", - "fields": [ - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "vertex", - "area" - ], - "tags": { - "office": "estate_agent" - }, - "terms": [], - "name": "Real Estate Office" - }, - "office/financial": { - "icon": "commercial", - "fields": [ - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "vertex", - "area" - ], - "tags": { - "office": "financial" - }, - "terms": [], - "name": "Financial Office" - }, - "office/government": { - "icon": "commercial", - "fields": [ - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "vertex", - "area" - ], - "tags": { - "office": "government" - }, - "terms": [], - "name": "Government Office" - }, - "office/insurance": { - "icon": "commercial", - "fields": [ - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "vertex", - "area" - ], - "tags": { - "office": "insurance" - }, - "terms": [], - "name": "Insurance Office" - }, - "office/it": { - "icon": "commercial", - "fields": [ - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "vertex", - "area" - ], - "tags": { - "office": "it" - }, - "terms": [], - "name": "IT Office" - }, - "office/lawyer": { - "icon": "commercial", - "fields": [ - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "vertex", - "area" - ], - "tags": { - "office": "lawyer" - }, - "terms": [], - "name": "Law Office" - }, - "office/newspaper": { - "icon": "commercial", - "fields": [ - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "vertex", - "area" - ], - "tags": { - "office": "newspaper" - }, - "terms": [], - "name": "Newspaper" - }, - "office/ngo": { - "icon": "commercial", - "fields": [ - "address", - "building_area", - "opening_hours", - "smoking" - ], - "geometry": [ - "point", - "vertex", - "area" - ], - "tags": { - "office": "ngo" - }, - "terms": [], - "name": "NGO Office" - }, - "office/physician": { - "icon": "commercial", - "fields": [ - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "vertex", - "area" - ], - "tags": { - "office": "physician" - }, - "terms": [], - "name": "Physician" - }, - "office/political_party": { - "icon": "commercial", - "fields": [ - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "vertex", - "area" - ], - "tags": { - "office": "political_party" - }, - "terms": [], - "name": "Political Party" - }, - "office/research": { - "icon": "commercial", - "fields": [ - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "vertex", - "area" - ], - "tags": { - "office": "research" - }, - "terms": [], - "name": "Research Office" - }, - "office/telecommunication": { - "icon": "commercial", - "fields": [ - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "vertex", - "area" - ], - "tags": { - "office": "telecommunication" - }, - "terms": [], - "name": "Telecom Office" - }, - "office/therapist": { - "icon": "commercial", - "fields": [ - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "vertex", - "area" - ], - "tags": { - "office": "therapist" - }, - "terms": [], - "name": "Therapist" - }, - "office/travel_agent": { - "icon": "suitcase", - "fields": [ - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "vertex", - "area" - ], - "tags": { - "office": "travel_agent" - }, - "terms": [], - "name": "Travel Agency", - "searchable": false - }, - "piste": { - "icon": "skiing", - "fields": [ - "piste/type", - "piste/difficulty", - "piste/grooming", - "oneway", - "lit" - ], - "geometry": [ - "point", - "line", - "area" - ], - "terms": [ - "ski", - "sled", - "sleigh", - "snowboard", - "nordic", - "downhill", - "snowmobile" - ], - "tags": { - "piste:type": "*" - }, - "name": "Piste/Ski Trail" - }, - "place": { - "fields": [ - "place" - ], - "geometry": [ - "point", - "vertex", - "area" - ], - "tags": { - "place": "*" - }, - "name": "Place" - }, - "place/city": { - "icon": "city", - "fields": [ - "population" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "place": "city" - }, - "name": "City" - }, - "place/farm": { - "icon": "farm", - "geometry": [ - "point", - "area" - ], - "tags": { - "place": "farm" - }, - "name": "Farm" - }, - "place/hamlet": { - "icon": "triangle-stroked", - "fields": [ - "population" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "place": "hamlet" - }, - "name": "Hamlet" - }, - "place/island": { - "geometry": [ - "point", - "area" - ], - "terms": [ - "archipelago", - "atoll", - "bar", - "cay", - "isle", - "islet", - "key", - "reef" - ], - "tags": { - "place": "island" - }, - "name": "Island" - }, - "place/isolated_dwelling": { - "geometry": [ - "point", - "area" - ], - "tags": { - "place": "isolated_dwelling" - }, - "name": "Isolated Dwelling" - }, - "place/locality": { - "icon": "marker", - "fields": [ - "population" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "place": "locality" - }, - "name": "Locality" - }, - "place/neighbourhood": { - "icon": "triangle-stroked", - "fields": [ - "population" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "place": "neighbourhood" - }, - "terms": [ - "neighbourhood" - ], - "name": "Neighborhood" - }, - "place/suburb": { - "icon": "triangle-stroked", - "fields": [ - "population" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "place": "suburb" - }, - "terms": [ - "Boro", - "Quarter" - ], - "name": "Borough" - }, - "place/town": { - "icon": "town", - "fields": [ - "population" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "place": "town" - }, - "name": "Town" - }, - "place/village": { - "icon": "village", - "fields": [ - "population" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "place": "village" - }, - "name": "Village" - }, - "point": { - "name": "Point", - "tags": {}, - "geometry": [ - "point" - ], - "matchScore": 0.1 - }, - "power": { - "geometry": [ - "point", - "vertex", - "line", - "area" - ], - "tags": { - "power": "*" - }, - "fields": [ - "power" - ], - "name": "Power" - }, - "power/generator": { - "fields": [ - "operator", - "generator/source", - "generator/method", - "generator/type" - ], - "geometry": [ - "point", - "vertex", - "area" - ], - "tags": { - "power": "generator" - }, - "name": "Power Generator" - }, - "power/line": { - "geometry": [ - "line" - ], - "tags": { - "power": "line" - }, - "name": "Power Line", - "icon": "power-line" - }, - "power/minor_line": { - "geometry": [ - "line" - ], - "tags": { - "power": "minor_line" - }, - "name": "Minor Power Line", - "icon": "power-line" - }, - "power/pole": { - "geometry": [ - "vertex" - ], - "tags": { - "power": "pole" - }, - "name": "Power Pole" - }, - "power/sub_station": { - "fields": [ - "substation", - "operator", - "building" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "power": "sub_station" - }, - "name": "Substation", - "searchable": false - }, - "power/substation": { - "fields": [ - "substation", - "operator", - "building" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "power": "substation" - }, - "name": "Substation" - }, - "power/tower": { - "geometry": [ - "vertex" - ], - "tags": { - "power": "tower" - }, - "name": "High-Voltage Tower" - }, - "power/transformer": { - "geometry": [ - "point", - "vertex", - "area" - ], - "tags": { - "power": "transformer" - }, - "name": "Transformer" - }, - "public_transport/platform": { - "fields": [ - "ref", - "network", - "operator", - "shelter" - ], - "geometry": [ - "point", - "vertex", - "line", - "area" - ], - "tags": { - "public_transport": "platform" - }, - "name": "Platform" - }, - "public_transport/stop_position": { - "icon": "bus", - "fields": [ - "ref", - "network", - "operator" - ], - "geometry": [ - "vertex" - ], - "tags": { - "public_transport": "stop_position" - }, - "name": "Stop Position" - }, - "railway": { - "fields": [ - "railway" - ], - "geometry": [ - "point", - "vertex", - "line", - "area" - ], - "tags": { - "railway": "*" - }, - "name": "Railway" - }, - "railway/abandoned": { - "icon": "railway-abandoned", - "geometry": [ - "line" - ], - "tags": { - "railway": "abandoned" - }, - "fields": [ - "structure", - "service_rail" - ], - "terms": [], - "name": "Abandoned Railway" - }, - "railway/disused": { - "icon": "railway-disused", - "geometry": [ - "line" - ], - "tags": { - "railway": "disused" - }, - "fields": [ - "structure", - "service_rail" - ], - "terms": [], - "name": "Disused Railway" - }, - "railway/funicular": { - "geometry": [ - "line" - ], - "terms": [ - "venicular", - "cliff railway", - "cable car", - "cable railway", - "funicular railway" - ], - "fields": [ - "structure", - "gauge", - "service_rail" - ], - "tags": { - "railway": "funicular" - }, - "icon": "railway-rail", - "name": "Funicular" - }, - "railway/halt": { - "icon": "rail", - "geometry": [ - "point", - "vertex" - ], - "tags": { - "railway": "halt" - }, - "name": "Railway Halt", - "terms": [ - "break", - "interrupt", - "rest", - "wait", - "interruption" - ] - }, - "railway/level_crossing": { - "icon": "cross", - "geometry": [ - "vertex" - ], - "tags": { - "railway": "level_crossing" - }, - "terms": [ - "crossing", - "railroad crossing", - "railway crossing", - "grade crossing", - "road through railroad", - "train crossing" - ], - "name": "Level Crossing" - }, - "railway/monorail": { - "icon": "railway-monorail", - "geometry": [ - "line" - ], - "tags": { - "railway": "monorail" - }, - "fields": [ - "structure", - "electrified", - "service_rail" - ], - "terms": [], - "name": "Monorail" - }, - "railway/narrow_gauge": { - "icon": "railway-rail", - "geometry": [ - "line" - ], - "tags": { - "railway": "narrow_gauge" - }, - "fields": [ - "structure", - "gauge", - "electrified", - "service_rail" - ], - "terms": [ - "narrow gauge railway", - "narrow gauge railroad" - ], - "name": "Narrow Gauge Rail" - }, - "railway/platform": { - "geometry": [ - "point", - "vertex", - "line", - "area" - ], - "tags": { - "railway": "platform" - }, - "name": "Railway Platform" - }, - "railway/rail": { - "icon": "railway-rail", - "geometry": [ - "line" - ], - "tags": { - "railway": "rail" - }, - "fields": [ - "structure", - "gauge", - "electrified", - "service_rail" - ], - "terms": [], - "name": "Rail" - }, - "railway/station": { - "icon": "rail", - "fields": [ - "network", - "operator", - "address", - "building_area" - ], - "geometry": [ - "point", - "vertex", - "area" - ], - "tags": { - "railway": "station" - }, - "terms": [ - "train station", - "station" - ], - "name": "Railway Station" - }, - "railway/subway": { - "icon": "railway-subway", - "geometry": [ - "line" - ], - "tags": { - "railway": "subway" - }, - "fields": [ - "structure", - "gauge", - "electrified", - "service_rail" - ], - "terms": [], - "name": "Subway" - }, - "railway/subway_entrance": { - "icon": "rail-metro", - "geometry": [ - "point" - ], - "tags": { - "railway": "subway_entrance" - }, - "terms": [], - "name": "Subway Entrance" - }, - "railway/tram": { - "icon": "railway-light-rail", - "geometry": [ - "line" - ], - "tags": { - "railway": "tram" - }, - "fields": [ - "structure", - "gauge", - "electrified", - "service_rail" - ], - "terms": [ - "streetcar" - ], - "name": "Tram" - }, - "relation": { - "name": "Relation", - "icon": "relation", - "tags": {}, - "geometry": [ - "relation" - ], - "fields": [ - "relation" - ] - }, - "roundabout": { - "geometry": [ - "vertex", - "line" - ], - "tags": { - "junction": "roundabout" - }, - "name": "Roundabout", - "searchable": false - }, - "route/ferry": { - "icon": "ferry", - "geometry": [ - "line" - ], - "tags": { - "route": "ferry" - }, - "name": "Ferry Route" - }, - "shop": { - "icon": "shop", - "fields": [ - "shop", - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "*" - }, - "terms": [], - "name": "Shop" - }, - "shop/alcohol": { - "icon": "alcohol-shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "alcohol", - "beer", - "booze", - "wine" - ], - "tags": { - "shop": "alcohol" - }, - "name": "Liquor Store" - }, - "shop/anime": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "anime" - }, - "name": "Anime Shop" - }, - "shop/antiques": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "antiques" - }, - "name": "Antiques Shop" - }, - "shop/art": { - "icon": "art-gallery", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "art" - }, - "name": "Art Gallery" - }, - "shop/baby_goods": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "baby_goods" - }, - "name": "Baby Goods Store" - }, - "shop/bag": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "handbag", - "purse" - ], - "tags": { - "shop": "bag" - }, - "name": "Bag/Luggage Store" - }, - "shop/bakery": { - "icon": "bakery", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "bakery" - }, - "name": "Bakery" - }, - "shop/bathroom_furnishing": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "bathroom_furnishing" - }, - "name": "Bathroom Furnishing Store" - }, - "shop/beauty": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "nail spa", - "spa", - "salon", - "tanning" - ], - "tags": { - "shop": "beauty" - }, - "name": "Beauty Shop" - }, - "shop/bed": { - "icon": "lodging", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "bed" - }, - "name": "Bedding/Mattress Store" - }, - "shop/beverages": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "beverages" - }, - "name": "Beverage Store" - }, - "shop/bicycle": { - "icon": "bicycle", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "bicycle" - }, - "name": "Bicycle Shop" - }, - "shop/bookmaker": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "bookmaker" - }, - "name": "Bookmaker" - }, - "shop/books": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "books" - }, - "name": "Book Store" - }, - "shop/boutique": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "boutique" - }, - "name": "Boutique" - }, - "shop/butcher": { - "icon": "slaughterhouse", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "meat" - ], - "tags": { - "shop": "butcher" - }, - "name": "Butcher" - }, - "shop/candles": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "candles" - }, - "name": "Candle Shop" - }, - "shop/car": { - "icon": "car", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "auto" - ], - "tags": { - "shop": "car" - }, - "name": "Car Dealership" - }, - "shop/car_parts": { - "icon": "car", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "auto" - ], - "tags": { - "shop": "car_parts" - }, - "name": "Car Parts Store" - }, - "shop/car_repair": { - "icon": "car", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "auto" - ], - "tags": { - "shop": "car_repair" - }, - "name": "Car Repair Shop" - }, - "shop/carpet": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "rug" - ], - "tags": { - "shop": "carpet" - }, - "name": "Carpet Store" - }, - "shop/cheese": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "cheese" - }, - "name": "Cheese Store" - }, - "shop/chemist": { - "icon": "chemist", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "chemist" - }, - "name": "Chemist" - }, - "shop/chocolate": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "chocolate" - }, - "name": "Chocolate Store" - }, - "shop/clothes": { - "icon": "clothing-store", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "clothes" - }, - "name": "Clothing Store" - }, - "shop/computer": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "computer" - }, - "name": "Computer Store" - }, - "shop/confectionery": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "confectionery" - }, - "name": "Candy Store" - }, - "shop/convenience": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "convenience" - }, - "name": "Convenience Store" - }, - "shop/copyshop": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "copyshop" - }, - "name": "Copy Store" - }, - "shop/cosmetics": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "cosmetics" - }, - "name": "Cosmetics Store" - }, - "shop/craft": { - "icon": "art-gallery", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "craft" - }, - "name": "Arts and Crafts Store" - }, - "shop/curtain": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "drape*", - "window" - ], - "tags": { - "shop": "curtain" - }, - "name": "Curtain Store" - }, - "shop/dairy": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "milk", - "egg", - "cheese" - ], - "tags": { - "shop": "dairy" - }, - "name": "Dairy Store" - }, - "shop/deli": { - "icon": "restaurant", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "lunch", - "meat", - "sandwich" - ], - "tags": { - "shop": "deli" - }, - "name": "Deli" - }, - "shop/department_store": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "department_store" - }, - "name": "Department Store" - }, - "shop/doityourself": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "doityourself" - }, - "name": "DIY Store" - }, - "shop/dry_cleaning": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "dry_cleaning" - }, - "name": "Dry Cleaner" - }, - "shop/electronics": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "appliance", - "audio", - "computer", - "tv" - ], - "tags": { - "shop": "electronics" - }, - "name": "Electronics Store" - }, - "shop/erotic": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "sex", - "porn" - ], - "tags": { - "shop": "erotic" - }, - "name": "Erotic Store" - }, - "shop/fabric": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "sew" - ], - "tags": { - "shop": "fabric" - }, - "name": "Fabric Store" - }, - "shop/farm": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "farm shop", - "farm stand" - ], - "tags": { - "shop": "farm" - }, - "name": "Produce Stand" - }, - "shop/fashion": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "fashion" - }, - "name": "Fashion Store" - }, - "shop/fishmonger": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "fishmonger" - }, - "name": "Fishmonger", - "searchable": false - }, - "shop/florist": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "flower" - ], - "tags": { - "shop": "florist" - }, - "name": "Florist" - }, - "shop/frame": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "frame" - }, - "name": "Framing Shop" - }, - "shop/funeral_directors": { - "icon": "cemetery", - "fields": [ - "operator", - "address", - "building_area", - "religion", - "denomination" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "undertaker", - "memorial home" - ], - "tags": { - "shop": "funeral_directors" - }, - "name": "Funeral Home" - }, - "shop/furnace": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "oven", - "stove" - ], - "tags": { - "shop": "furnace" - }, - "name": "Furnace Store" - }, - "shop/furniture": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "chair", - "sofa", - "table" - ], - "tags": { - "shop": "furniture" - }, - "name": "Furniture Store" - }, - "shop/garden_centre": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "landscape", - "mulch", - "shrub", - "tree" - ], - "tags": { - "shop": "garden_centre" - }, - "name": "Garden Center" - }, - "shop/gift": { - "icon": "gift", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "gift" - }, - "name": "Gift Shop" - }, - "shop/greengrocer": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "fruit", - "vegetable" - ], - "tags": { - "shop": "greengrocer" - }, - "name": "Greengrocer" - }, - "shop/hairdresser": { - "icon": "hairdresser", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "hairdresser" - }, - "name": "Hairdresser" - }, - "shop/hardware": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "hardware" - }, - "name": "Hardware Store" - }, - "shop/hearing_aids": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "hearing_aids" - }, - "name": "Hearing Aids Store" - }, - "shop/herbalist": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "herbalist" - }, - "name": "Herbalist" - }, - "shop/hifi": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "stereo", - "video" - ], - "tags": { - "shop": "hifi" - }, - "name": "Hifi Store" - }, - "shop/houseware": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "home", - "household" - ], - "tags": { - "shop": "houseware" - }, - "name": "Houseware Store" - }, - "shop/interior_decoration": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "interior_decoration" - }, - "name": "Interior Decoration Store" - }, - "shop/jewelry": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "diamond", - "gem", - "ring" - ], - "tags": { - "shop": "jewelry" - }, - "name": "Jeweler" - }, - "shop/kiosk": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "kiosk" - }, - "name": "News Kiosk" - }, - "shop/kitchen": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "kitchen" - }, - "name": "Kitchen Design Store" - }, - "shop/laundry": { - "icon": "laundry", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "laundry" - }, - "name": "Laundry" - }, - "shop/leather": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "leather" - }, - "name": "Leather Store" - }, - "shop/locksmith": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "key", - "lockpick" - ], - "tags": { - "shop": "locksmith" - }, - "name": "Locksmith" - }, - "shop/lottery": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "lottery" - }, - "name": "Lottery Shop" - }, - "shop/mall": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "mall" - }, - "name": "Mall" - }, - "shop/massage": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "massage" - }, - "name": "Massage Shop" - }, - "shop/medical_supply": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "medical_supply" - }, - "name": "Medical Supply Store" - }, - "shop/mobile_phone": { - "icon": "mobilephone", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "mobile_phone" - }, - "name": "Mobile Phone Store" - }, - "shop/money_lender": { - "icon": "bank", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "money_lender" - }, - "name": "Money Lender" - }, - "shop/motorcycle": { - "icon": "scooter", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "motorcycle" - }, - "name": "Motorcycle Dealership" - }, - "shop/music": { - "icon": "music", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "CD", - "vinyl" - ], - "tags": { - "shop": "music" - }, - "name": "Music Store" - }, - "shop/musical_instrument": { - "icon": "music", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "musical_instrument" - }, - "name": "Musical Instrument Store" - }, - "shop/newsagent": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "newsagent" - }, - "name": "Newspaper/Magazine Shop" - }, - "shop/optician": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "eye", - "glasses" - ], - "tags": { - "shop": "optician" - }, - "name": "Optician" - }, - "shop/organic": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "supermarket", - "organic": "only" - }, - "name": "Organic Goods Store" - }, - "shop/outdoor": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "camping", - "climbing", - "hiking" - ], - "tags": { - "shop": "outdoor" - }, - "name": "Outdoors Store" - }, - "shop/paint": { - "icon": "water", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "paint" - }, - "name": "Paint Store" - }, - "shop/pawnbroker": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "pawnbroker" - }, - "name": "Pawn Shop" - }, - "shop/pet": { - "icon": "dog-park", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "cat", - "dog", - "fish" - ], - "tags": { - "shop": "pet" - }, - "name": "Pet Store" - }, - "shop/photo": { - "icon": "camera", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "camera", - "film" - ], - "tags": { - "shop": "photo" - }, - "name": "Photography Store" - }, - "shop/pyrotechnics": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "pyrotechnics" - }, - "name": "Fireworks Store" - }, - "shop/radiotechnics": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "radiotechnics" - }, - "name": "Radio/Electronic Component Store" - }, - "shop/religion": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "religion", - "denomination" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "religion" - }, - "name": "Religious Store" - }, - "shop/scuba_diving": { - "icon": "swimming", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "scuba_diving" - }, - "name": "Scuba Diving Shop" - }, - "shop/seafood": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "fishmonger" - ], - "tags": { - "shop": "seafood" - }, - "name": "Seafood Shop" - }, - "shop/second_hand": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "secondhand", - "second hand", - "resale", - "thrift", - "used" - ], - "tags": { - "shop": "second_hand" - }, - "name": "Consignment/Thrift Store" - }, - "shop/shoes": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "shoes" - }, - "name": "Shoe Store" - }, - "shop/sports": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "sports" - }, - "name": "Sporting Goods Store" - }, - "shop/stationery": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "card", - "paper" - ], - "tags": { - "shop": "stationery" - }, - "name": "Stationery Store" - }, - "shop/supermarket": { - "icon": "grocery", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "grocery", - "store", - "shop" - ], - "tags": { - "shop": "supermarket" - }, - "name": "Supermarket" - }, - "shop/tailor": { - "icon": "clothing-store", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "clothes", - "suit" - ], - "tags": { - "shop": "tailor" - }, - "name": "Tailor" - }, - "shop/tattoo": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "tattoo" - }, - "name": "Tattoo Parlor" - }, - "shop/tea": { - "icon": "cafe", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "tea" - }, - "name": "Tea Store" - }, - "shop/ticket": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "ticket" - }, - "name": "Ticket Seller" - }, - "shop/tobacco": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "tobacco" - }, - "name": "Tobacco Shop" - }, - "shop/toys": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "toys" - }, - "name": "Toy Store" - }, - "shop/travel_agency": { - "icon": "suitcase", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "travel_agency" - }, - "name": "Travel Agency" - }, - "shop/tyres": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "tyres" - }, - "name": "Tire Store" - }, - "shop/vacant": { - "icon": "shop", - "fields": [ - "address", - "building_area" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "vacant" - }, - "name": "Vacant Shop", - "searchable": false - }, - "shop/vacuum_cleaner": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "vacuum_cleaner" - }, - "name": "Vacuum Cleaner Store" - }, - "shop/variety_store": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "variety_store" - }, - "name": "Variety Store" - }, - "shop/video": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "DVD" - ], - "tags": { - "shop": "video" - }, - "name": "Video Store" - }, - "shop/video_games": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "video_games" - }, - "name": "Video Game Store" - }, - "shop/water_sports": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "water_sports" - }, - "name": "Watersport/Swim Shop" - }, - "shop/weapons": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "ammo", - "gun", - "knife", - "knives" - ], - "tags": { - "shop": "weapons" - }, - "name": "Weapon Shop" - }, - "shop/window_blind": { - "icon": "shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "window_blind" - }, - "name": "Window Blind Store" - }, - "shop/wine": { - "icon": "alcohol-shop", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "shop": "wine" - }, - "name": "Wine Shop" - }, - "tourism": { - "fields": [ - "tourism" - ], - "geometry": [ - "point", - "vertex", - "area" - ], - "tags": { - "tourism": "*" - }, - "name": "Tourism" - }, - "tourism/alpine_hut": { - "icon": "lodging", - "fields": [ - "operator", - "address", - "building_area" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "tourism": "alpine_hut" - }, - "name": "Alpine Hut" - }, - "tourism/artwork": { - "icon": "art-gallery", - "fields": [ - "artwork_type", - "artist" - ], - "geometry": [ - "point", - "vertex", - "area" - ], - "tags": { - "tourism": "artwork" - }, - "terms": [ - "mural", - "sculpture", - "statue" - ], - "name": "Artwork" - }, - "tourism/attraction": { - "icon": "monument", - "fields": [ - "operator", - "address" - ], - "geometry": [ - "point", - "vertex", - "area" - ], - "tags": { - "tourism": "attraction" - }, - "name": "Tourist Attraction" - }, - "tourism/camp_site": { - "icon": "campsite", - "fields": [ - "operator", - "address", - "capacity", - "fee" - ], - "geometry": [ - "point", - "vertex", - "area" - ], - "terms": [ - "Tent" - ], - "tags": { - "tourism": "camp_site" - }, - "name": "Camp Site" - }, - "tourism/caravan_site": { - "icon": "bus", - "fields": [ - "operator", - "address", - "capacity", - "fee", - "sanitary_dump_station", - "power_supply", - "internet_access" - ], - "geometry": [ - "point", - "vertex", - "area" - ], - "terms": [ - "Motor Home", - "Camper" - ], - "tags": { - "tourism": "caravan_site" - }, - "name": "RV Park" - }, - "tourism/chalet": { - "icon": "lodging", - "fields": [ - "operator", - "address", - "building_area", - "smoking" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "tourism": "chalet" - }, - "name": "Chalet" - }, - "tourism/guest_house": { - "icon": "lodging", - "fields": [ - "operator", - "address", - "building_area", - "smoking" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "tourism": "guest_house" - }, - "terms": [ - "B&B", - "Bed and Breakfast" - ], - "name": "Guest House" - }, - "tourism/hostel": { - "icon": "lodging", - "fields": [ - "operator", - "address", - "building_area", - "smoking" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "tourism": "hostel" - }, - "name": "Hostel" - }, - "tourism/hotel": { - "icon": "lodging", - "fields": [ - "operator", - "address", - "building_area", - "smoking" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "tourism": "hotel" - }, - "name": "Hotel" - }, - "tourism/information": { - "fields": [ - "information", - "operator", - "address", - "building_area" - ], - "geometry": [ - "point", - "vertex", - "area" - ], - "tags": { - "tourism": "information" - }, - "name": "Information" - }, - "tourism/motel": { - "icon": "lodging", - "fields": [ - "operator", - "address", - "building_area", - "smoking" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "tourism": "motel" - }, - "name": "Motel" - }, - "tourism/museum": { - "icon": "museum", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "exhibition", - "foundation", - "gallery", - "hall", - "institution" - ], - "tags": { - "tourism": "museum" - }, - "name": "Museum" - }, - "tourism/picnic_site": { - "icon": "park", - "fields": [ - "operator", - "address", - "smoking" - ], - "geometry": [ - "point", - "vertex", - "area" - ], - "terms": [ - "camp" - ], - "tags": { - "tourism": "picnic_site" - }, - "name": "Picnic Site" - }, - "tourism/theme_park": { - "fields": [ - "operator", - "address", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "tourism": "theme_park" - }, - "name": "Theme Park" - }, - "tourism/viewpoint": { - "geometry": [ - "point", - "vertex" - ], - "tags": { - "tourism": "viewpoint" - }, - "name": "Viewpoint" - }, - "tourism/zoo": { - "icon": "zoo", - "fields": [ - "operator", - "address", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "tags": { - "tourism": "zoo" - }, - "name": "Zoo" - }, - "traffic_calming/bump": { - "fields": [ - "surface" - ], - "geometry": [ - "vertex" - ], - "tags": { - "traffic_calming": "bump" - }, - "terms": [ - "speed hump" - ], - "name": "Speed Bump" - }, - "traffic_calming/hump": { - "fields": [ - "surface" - ], - "geometry": [ - "vertex" - ], - "tags": { - "traffic_calming": "hump" - }, - "terms": [ - "speed bump" - ], - "name": "Speed Hump" - }, - "traffic_calming/rumble_strip": { - "geometry": [ - "vertex" - ], - "tags": { - "traffic_calming": "rumble_strip" - }, - "terms": [ - "sleeper lines", - "audible lines", - "growlers" - ], - "name": "Rumble Strip" - }, - "traffic_calming/table": { - "fields": [ - "surface" - ], - "geometry": [ - "vertex" - ], - "tags": { - "highway": "crossing", - "traffic_calming": "table" - }, - "terms": [ - "speed table", - "flat top hump" - ], - "name": "Raised Pedestrian Crossing" - }, - "type/boundary": { - "geometry": [ - "relation" - ], - "tags": { - "type": "boundary" - }, - "name": "Boundary", - "icon": "boundary", - "fields": [ - "boundary" - ] - }, - "type/boundary/administrative": { - "name": "Administrative Boundary", - "geometry": [ - "relation" - ], - "tags": { - "type": "boundary", - "boundary": "administrative" - }, - "fields": [ - "admin_level" - ], - "icon": "boundary" - }, - "type/multipolygon": { - "geometry": [ - "area", - "relation" - ], - "tags": { - "type": "multipolygon" - }, - "removeTags": {}, - "name": "Multipolygon", - "icon": "multipolygon", - "searchable": false, - "matchScore": 0.1 - }, - "type/restriction": { - "geometry": [ - "relation" - ], - "tags": { - "type": "restriction" - }, - "name": "Restriction", - "icon": "restriction", - "fields": [ - "restriction", - "except" - ] - }, - "type/restriction/no_left_turn": { - "name": "No Left Turn", - "geometry": [ - "relation" - ], - "tags": { - "type": "restriction", - "restriction": "no_left_turn" - }, - "fields": [ - "except" - ], - "icon": "restriction-no-left-turn" - }, - "type/restriction/no_right_turn": { - "name": "No Right Turn", - "geometry": [ - "relation" - ], - "tags": { - "type": "restriction", - "restriction": "no_right_turn" - }, - "fields": [ - "except" - ], - "icon": "restriction-no-right-turn" - }, - "type/restriction/no_straight_on": { - "name": "No Straight On", - "geometry": [ - "relation" - ], - "tags": { - "type": "restriction", - "restriction": "no_straight_on" - }, - "fields": [ - "except" - ], - "icon": "restriction-no-straight-on" - }, - "type/restriction/no_u_turn": { - "name": "No U-turn", - "geometry": [ - "relation" - ], - "tags": { - "type": "restriction", - "restriction": "no_u_turn" - }, - "fields": [ - "except" - ], - "icon": "restriction-no-u-turn" - }, - "type/restriction/only_left_turn": { - "name": "Left Turn Only", - "geometry": [ - "relation" - ], - "tags": { - "type": "restriction", - "restriction": "only_left_turn" - }, - "fields": [ - "except" - ], - "icon": "restriction-only-left-turn" - }, - "type/restriction/only_right_turn": { - "name": "Right Turn Only", - "geometry": [ - "relation" - ], - "tags": { - "type": "restriction", - "restriction": "only_right_turn" - }, - "fields": [ - "except" - ], - "icon": "restriction-only-right-turn" - }, - "type/restriction/only_straight_on": { - "name": "No Turns", - "geometry": [ - "relation" - ], - "tags": { - "type": "restriction", - "restriction": "only_straight_on" - }, - "fields": [ - "except" - ], - "icon": "restriction-only-straight-on" - }, - "type/route": { - "geometry": [ - "relation" - ], - "tags": { - "type": "route" - }, - "name": "Route", - "icon": "route", - "fields": [ - "route", - "ref" - ] - }, - "type/route/bicycle": { - "geometry": [ - "relation" - ], - "tags": { - "type": "route", - "route": "bicycle" - }, - "name": "Cycle Route", - "icon": "route-bicycle", - "fields": [ - "ref", - "network" - ] - }, - "type/route/bus": { - "geometry": [ - "relation" - ], - "tags": { - "type": "route", - "route": "bus" - }, - "name": "Bus Route", - "icon": "route-bus", - "fields": [ - "ref", - "operator", - "network" - ] - }, - "type/route/detour": { - "geometry": [ - "relation" - ], - "tags": { - "type": "route", - "route": "detour" - }, - "name": "Detour Route", - "icon": "route-detour", - "fields": [ - "ref" - ] - }, - "type/route/ferry": { - "geometry": [ - "relation" - ], - "tags": { - "type": "route", - "route": "ferry" - }, - "name": "Ferry Route", - "icon": "route-ferry", - "fields": [ - "ref", - "operator", - "network" - ] - }, - "type/route/foot": { - "geometry": [ - "relation" - ], - "tags": { - "type": "route", - "route": "foot" - }, - "name": "Foot Route", - "icon": "route-foot", - "fields": [ - "ref", - "operator", - "network" - ] - }, - "type/route/hiking": { - "geometry": [ - "relation" - ], - "tags": { - "type": "route", - "route": "hiking" - }, - "name": "Hiking Route", - "icon": "route-foot", - "fields": [ - "ref", - "operator", - "network" - ] - }, - "type/route/pipeline": { - "geometry": [ - "relation" - ], - "tags": { - "type": "route", - "route": "pipeline" - }, - "name": "Pipeline Route", - "icon": "route-pipeline", - "fields": [ - "ref", - "operator" - ] - }, - "type/route/power": { - "geometry": [ - "relation" - ], - "tags": { - "type": "route", - "route": "power" - }, - "name": "Power Route", - "icon": "route-power", - "fields": [ - "ref", - "operator" - ] - }, - "type/route/road": { - "geometry": [ - "relation" - ], - "tags": { - "type": "route", - "route": "road" - }, - "name": "Road Route", - "icon": "route-road", - "fields": [ - "ref", - "network" - ] - }, - "type/route/train": { - "geometry": [ - "relation" - ], - "tags": { - "type": "route", - "route": "train" - }, - "name": "Train Route", - "icon": "route-train", - "fields": [ - "ref", - "operator" - ] - }, - "type/route/tram": { - "geometry": [ - "relation" - ], - "tags": { - "type": "route", - "route": "tram" - }, - "name": "Tram Route", - "icon": "route-tram", - "fields": [ - "ref", - "operator" - ] - }, - "type/route_master": { - "geometry": [ - "relation" - ], - "tags": { - "type": "route_master" - }, - "name": "Route Master", - "icon": "route-master", - "fields": [ - "route_master", - "ref", - "operator", - "network" - ] - }, - "vertex": { - "name": "Other", - "tags": {}, - "geometry": [ - "vertex" - ], - "matchScore": 0.1 - }, - "waterway": { - "fields": [ - "waterway" - ], - "geometry": [ - "point", - "vertex", - "line", - "area" - ], - "tags": { - "waterway": "*" - }, - "name": "Waterway" - }, - "waterway/canal": { - "icon": "waterway-canal", - "fields": [ - "width" - ], - "geometry": [ - "line" - ], - "tags": { - "waterway": "canal" - }, - "name": "Canal" - }, - "waterway/dam": { - "icon": "dam", - "geometry": [ - "point", - "vertex", - "line", - "area" - ], - "tags": { - "waterway": "dam" - }, - "name": "Dam" - }, - "waterway/ditch": { - "icon": "waterway-ditch", - "fields": [ - "tunnel" - ], - "geometry": [ - "line" - ], - "tags": { - "waterway": "ditch" - }, - "name": "Ditch" - }, - "waterway/drain": { - "icon": "waterway-stream", - "fields": [ - "tunnel" - ], - "geometry": [ - "line" - ], - "tags": { - "waterway": "drain" - }, - "name": "Drain" - }, - "waterway/fuel": { - "icon": "fuel", - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "geometry": [ - "point", - "area" - ], - "terms": [ - "petrol", - "gas", - "diesel", - "boat" - ], - "tags": { - "waterway": "fuel" - }, - "name": "Marine Fuel Station" - }, - "waterway/river": { - "icon": "waterway-river", - "fields": [ - "tunnel", - "width" - ], - "geometry": [ - "line" - ], - "terms": [ - "beck", - "branch", - "brook", - "course", - "creek", - "estuary", - "rill", - "rivulet", - "run", - "runnel", - "stream", - "tributary", - "watercourse" - ], - "tags": { - "waterway": "river" - }, - "name": "River" - }, - "waterway/riverbank": { - "icon": "water", - "geometry": [ - "area" - ], - "tags": { - "waterway": "riverbank" - }, - "name": "Riverbank" - }, - "waterway/sanitary_dump_station": { - "fields": [ - "operator", - "access_toilets", - "fee", - "water_point" - ], - "geometry": [ - "point", - "vertex", - "area" - ], - "terms": [ - "Boat", - "Watercraft", - "Sanitary", - "Dump Station", - "Pumpout", - "Pump out", - "Elsan", - "CDP", - "CTDP", - "Chemical Toilet" - ], - "tags": { - "waterway": "sanitary_dump_station" - }, - "name": "Marine Toilet Disposal" - }, - "waterway/stream": { - "icon": "waterway-stream", - "fields": [ - "tunnel", - "width" - ], - "geometry": [ - "line" - ], - "terms": [ - "beck", - "branch", - "brook", - "burn", - "course", - "creek", - "current", - "drift", - "flood", - "flow", - "freshet", - "race", - "rill", - "rindle", - "rivulet", - "run", - "runnel", - "rush", - "spate", - "spritz", - "surge", - "tide", - "torrent", - "tributary", - "watercourse" - ], - "tags": { - "waterway": "stream" - }, - "name": "Stream" - }, - "waterway/weir": { - "icon": "dam", - "geometry": [ - "vertex", - "line" - ], - "tags": { - "waterway": "weir" - }, - "name": "Weir" - }, - "amenity/fuel/76": { - "tags": { - "name": "76", - "amenity": "fuel" - }, - "name": "76", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Neste": { - "tags": { - "name": "Neste", - "amenity": "fuel" - }, - "name": "Neste", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/BP": { - "tags": { - "name": "BP", - "amenity": "fuel" - }, - "name": "BP", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Shell": { - "tags": { - "name": "Shell", - "amenity": "fuel" - }, - "name": "Shell", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Agip": { - "tags": { - "name": "Agip", - "amenity": "fuel" - }, - "name": "Agip", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Migrol": { - "tags": { - "name": "Migrol", - "amenity": "fuel" - }, - "name": "Migrol", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Avia": { - "tags": { - "name": "Avia", - "amenity": "fuel" - }, - "name": "Avia", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Texaco": { - "tags": { - "name": "Texaco", - "amenity": "fuel" - }, - "name": "Texaco", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Total": { - "tags": { - "name": "Total", - "amenity": "fuel" - }, - "name": "Total", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Statoil": { - "tags": { - "name": "Statoil", - "amenity": "fuel" - }, - "name": "Statoil", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Esso": { - "tags": { - "name": "Esso", - "amenity": "fuel" - }, - "name": "Esso", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Jet": { - "tags": { - "name": "Jet", - "amenity": "fuel" - }, - "name": "Jet", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Avanti": { - "tags": { - "name": "Avanti", - "amenity": "fuel" - }, - "name": "Avanti", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/OMV": { - "tags": { - "name": "OMV", - "amenity": "fuel" - }, - "name": "OMV", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Aral": { - "tags": { - "name": "Aral", - "amenity": "fuel" - }, - "name": "Aral", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/JET": { - "tags": { - "name": "JET", - "amenity": "fuel" - }, - "name": "JET", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/United": { - "tags": { - "name": "United", - "amenity": "fuel" - }, - "name": "United", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Mobil": { - "tags": { - "name": "Mobil", - "amenity": "fuel" - }, - "name": "Mobil", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Caltex": { - "tags": { - "name": "Caltex", - "amenity": "fuel" - }, - "name": "Caltex", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Sunoco": { - "tags": { - "name": "Sunoco", - "amenity": "fuel" - }, - "name": "Sunoco", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Q8": { - "tags": { - "name": "Q8", - "amenity": "fuel" - }, - "name": "Q8", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/ARAL": { - "tags": { - "name": "ARAL", - "amenity": "fuel" - }, - "name": "ARAL", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/CEPSA": { - "tags": { - "name": "CEPSA", - "amenity": "fuel" - }, - "name": "CEPSA", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/BFT": { - "tags": { - "name": "BFT", - "amenity": "fuel" - }, - "name": "BFT", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Petron": { - "tags": { - "name": "Petron", - "amenity": "fuel" - }, - "name": "Petron", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Total Access": { - "tags": { - "name": "Total Access", - "amenity": "fuel" - }, - "name": "Total Access", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Elf": { - "tags": { - "name": "Elf", - "amenity": "fuel" - }, - "name": "Elf", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Station Service E. Leclerc": { - "tags": { - "name": "Station Service E. Leclerc", - "amenity": "fuel" - }, - "name": "Station Service E. Leclerc", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Shell Express": { - "tags": { - "name": "Shell Express", - "amenity": "fuel" - }, - "name": "Shell Express", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Hess": { - "tags": { - "name": "Hess", - "amenity": "fuel" - }, - "name": "Hess", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Flying V": { - "tags": { - "name": "Flying V", - "amenity": "fuel" - }, - "name": "Flying V", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/bft": { - "tags": { - "name": "bft", - "amenity": "fuel" - }, - "name": "bft", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Gulf": { - "tags": { - "name": "Gulf", - "amenity": "fuel" - }, - "name": "Gulf", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/PTT": { - "tags": { - "name": "PTT", - "amenity": "fuel" - }, - "name": "PTT", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/St1": { - "tags": { - "name": "St1", - "amenity": "fuel" - }, - "name": "St1", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Teboil": { - "tags": { - "name": "Teboil", - "amenity": "fuel" - }, - "name": "Teboil", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/HEM": { - "tags": { - "name": "HEM", - "amenity": "fuel" - }, - "name": "HEM", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/GALP": { - "tags": { - "name": "GALP", - "amenity": "fuel" - }, - "name": "GALP", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/OK": { - "tags": { - "name": "OK", - "amenity": "fuel" - }, - "name": "OK", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/ÖMV": { - "tags": { - "name": "ÖMV", - "amenity": "fuel" - }, - "name": "ÖMV", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Tinq": { - "tags": { - "name": "Tinq", - "amenity": "fuel" - }, - "name": "Tinq", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/OKQ8": { - "tags": { - "name": "OKQ8", - "amenity": "fuel" - }, - "name": "OKQ8", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Repsol": { - "tags": { - "name": "Repsol", - "amenity": "fuel" - }, - "name": "Repsol", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Westfalen": { - "tags": { - "name": "Westfalen", - "amenity": "fuel" - }, - "name": "Westfalen", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Esso Express": { - "tags": { - "name": "Esso Express", - "amenity": "fuel" - }, - "name": "Esso Express", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Tamoil": { - "tags": { - "name": "Tamoil", - "amenity": "fuel" - }, - "name": "Tamoil", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Engen": { - "tags": { - "name": "Engen", - "amenity": "fuel" - }, - "name": "Engen", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Sasol": { - "tags": { - "name": "Sasol", - "amenity": "fuel" - }, - "name": "Sasol", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Topaz": { - "tags": { - "name": "Topaz", - "amenity": "fuel" - }, - "name": "Topaz", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/LPG": { - "tags": { - "name": "LPG", - "amenity": "fuel" - }, - "name": "LPG", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Orlen": { - "tags": { - "name": "Orlen", - "amenity": "fuel" - }, - "name": "Orlen", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Oilibya": { - "tags": { - "name": "Oilibya", - "amenity": "fuel" - }, - "name": "Oilibya", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Tango": { - "tags": { - "name": "Tango", - "amenity": "fuel" - }, - "name": "Tango", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Star": { - "tags": { - "name": "Star", - "amenity": "fuel" - }, - "name": "Star", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Петрол": { - "tags": { - "name": "Петрол", - "amenity": "fuel" - }, - "name": "Петрол", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Cepsa": { - "tags": { - "name": "Cepsa", - "amenity": "fuel" - }, - "name": "Cepsa", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/OIL!": { - "tags": { - "name": "OIL!", - "amenity": "fuel" - }, - "name": "OIL!", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Ultramar": { - "tags": { - "name": "Ultramar", - "amenity": "fuel" - }, - "name": "Ultramar", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Irving": { - "tags": { - "name": "Irving", - "amenity": "fuel" - }, - "name": "Irving", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Lukoil": { - "tags": { - "name": "Lukoil", - "amenity": "fuel" - }, - "name": "Lukoil", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Petro-Canada": { - "tags": { - "name": "Petro-Canada", - "amenity": "fuel" - }, - "name": "Petro-Canada", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Agrola": { - "tags": { - "name": "Agrola", - "amenity": "fuel" - }, - "name": "Agrola", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Husky": { - "tags": { - "name": "Husky", - "amenity": "fuel" - }, - "name": "Husky", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Slovnaft": { - "tags": { - "name": "Slovnaft", - "amenity": "fuel" - }, - "name": "Slovnaft", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Sheetz": { - "tags": { - "name": "Sheetz", - "amenity": "fuel" - }, - "name": "Sheetz", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Mol": { - "tags": { - "name": "Mol", - "amenity": "fuel" - }, - "name": "Mol", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Petronas": { - "tags": { - "name": "Petronas", - "amenity": "fuel" - }, - "name": "Petronas", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Газпромнефть": { - "tags": { - "name": "Газпромнефть", - "amenity": "fuel" - }, - "name": "Газпромнефть", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Лукойл": { - "tags": { - "name": "Лукойл", - "amenity": "fuel" - }, - "name": "Лукойл", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Elan": { - "tags": { - "name": "Elan", - "amenity": "fuel" - }, - "name": "Elan", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Роснефть": { - "tags": { - "name": "Роснефть", - "amenity": "fuel" - }, - "name": "Роснефть", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Turmöl": { - "tags": { - "name": "Turmöl", - "amenity": "fuel" - }, - "name": "Turmöl", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Neste A24": { - "tags": { - "name": "Neste A24", - "amenity": "fuel" - }, - "name": "Neste A24", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Marathon": { - "tags": { - "name": "Marathon", - "amenity": "fuel" - }, - "name": "Marathon", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Valero": { - "tags": { - "name": "Valero", - "amenity": "fuel" - }, - "name": "Valero", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Eni": { - "tags": { - "name": "Eni", - "amenity": "fuel" - }, - "name": "Eni", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Chevron": { - "tags": { - "name": "Chevron", - "amenity": "fuel" - }, - "name": "Chevron", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/ТНК": { - "tags": { - "name": "ТНК", - "amenity": "fuel" - }, - "name": "ТНК", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/REPSOL": { - "tags": { - "name": "REPSOL", - "amenity": "fuel" - }, - "name": "REPSOL", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/MOL": { - "tags": { - "name": "MOL", - "amenity": "fuel" - }, - "name": "MOL", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Bliska": { - "tags": { - "name": "Bliska", - "amenity": "fuel" - }, - "name": "Bliska", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Api": { - "tags": { - "name": "Api", - "amenity": "fuel" - }, - "name": "Api", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Arco": { - "tags": { - "name": "Arco", - "amenity": "fuel" - }, - "name": "Arco", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Pemex": { - "tags": { - "name": "Pemex", - "amenity": "fuel" - }, - "name": "Pemex", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Exxon": { - "tags": { - "name": "Exxon", - "amenity": "fuel" - }, - "name": "Exxon", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Coles Express": { - "tags": { - "name": "Coles Express", - "amenity": "fuel" - }, - "name": "Coles Express", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Petrom": { - "tags": { - "name": "Petrom", - "amenity": "fuel" - }, - "name": "Petrom", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/PETRONOR": { - "tags": { - "name": "PETRONOR", - "amenity": "fuel" - }, - "name": "PETRONOR", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Rompetrol": { - "tags": { - "name": "Rompetrol", - "amenity": "fuel" - }, - "name": "Rompetrol", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Lotos": { - "tags": { - "name": "Lotos", - "amenity": "fuel" - }, - "name": "Lotos", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/ОМВ": { - "tags": { - "name": "ОМВ", - "amenity": "fuel" - }, - "name": "ОМВ", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/BR": { - "tags": { - "name": "BR", - "amenity": "fuel" - }, - "name": "BR", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Copec": { - "tags": { - "name": "Copec", - "amenity": "fuel" - }, - "name": "Copec", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Petrobras": { - "tags": { - "name": "Petrobras", - "amenity": "fuel" - }, - "name": "Petrobras", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Liberty": { - "tags": { - "name": "Liberty", - "amenity": "fuel" - }, - "name": "Liberty", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/IP": { - "tags": { - "name": "IP", - "amenity": "fuel" - }, - "name": "IP", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Erg": { - "tags": { - "name": "Erg", - "amenity": "fuel" - }, - "name": "Erg", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Eneos": { - "tags": { - "name": "Eneos", - "amenity": "fuel" - }, - "name": "Eneos", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Citgo": { - "tags": { - "name": "Citgo", - "amenity": "fuel" - }, - "name": "Citgo", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Metano": { - "tags": { - "name": "Metano", - "amenity": "fuel" - }, - "name": "Metano", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Сургутнефтегаз": { - "tags": { - "name": "Сургутнефтегаз", - "amenity": "fuel" - }, - "name": "Сургутнефтегаз", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/EKO": { - "tags": { - "name": "EKO", - "amenity": "fuel" - }, - "name": "EKO", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Eko": { - "tags": { - "name": "Eko", - "amenity": "fuel" - }, - "name": "Eko", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Indipend.": { - "tags": { - "name": "Indipend.", - "amenity": "fuel" - }, - "name": "Indipend.", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/IES": { - "tags": { - "name": "IES", - "amenity": "fuel" - }, - "name": "IES", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/TotalErg": { - "tags": { - "name": "TotalErg", - "amenity": "fuel" - }, - "name": "TotalErg", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Cenex": { - "tags": { - "name": "Cenex", - "amenity": "fuel" - }, - "name": "Cenex", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/ПТК": { - "tags": { - "name": "ПТК", - "amenity": "fuel" - }, - "name": "ПТК", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/HP": { - "tags": { - "name": "HP", - "amenity": "fuel" - }, - "name": "HP", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Phillips 66": { - "tags": { - "name": "Phillips 66", - "amenity": "fuel" - }, - "name": "Phillips 66", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/CARREFOUR": { - "tags": { - "name": "CARREFOUR", - "amenity": "fuel" - }, - "name": "CARREFOUR", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/ERG": { - "tags": { - "name": "ERG", - "amenity": "fuel" - }, - "name": "ERG", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Speedway": { - "tags": { - "name": "Speedway", - "amenity": "fuel" - }, - "name": "Speedway", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Benzina": { - "tags": { - "name": "Benzina", - "amenity": "fuel" - }, - "name": "Benzina", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Татнефть": { - "tags": { - "name": "Татнефть", - "amenity": "fuel" - }, - "name": "Татнефть", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Terpel": { - "tags": { - "name": "Terpel", - "amenity": "fuel" - }, - "name": "Terpel", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/WOG": { - "tags": { - "name": "WOG", - "amenity": "fuel" - }, - "name": "WOG", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Seaoil": { - "tags": { - "name": "Seaoil", - "amenity": "fuel" - }, - "name": "Seaoil", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/АЗС": { - "tags": { - "name": "АЗС", - "amenity": "fuel" - }, - "name": "АЗС", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Kwik Trip": { - "tags": { - "name": "Kwik Trip", - "amenity": "fuel" - }, - "name": "Kwik Trip", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Pertamina": { - "tags": { - "name": "Pertamina", - "amenity": "fuel" - }, - "name": "Pertamina", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/COSMO": { - "tags": { - "name": "COSMO", - "amenity": "fuel" - }, - "name": "COSMO", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Z": { - "tags": { - "name": "Z", - "amenity": "fuel" - }, - "name": "Z", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Indian Oil": { - "tags": { - "name": "Indian Oil", - "amenity": "fuel" - }, - "name": "Indian Oil", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/АГЗС": { - "tags": { - "name": "АГЗС", - "amenity": "fuel" - }, - "name": "АГЗС", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/INA": { - "tags": { - "name": "INA", - "amenity": "fuel" - }, - "name": "INA", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/JOMO": { - "tags": { - "name": "JOMO", - "amenity": "fuel" - }, - "name": "JOMO", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Holiday": { - "tags": { - "name": "Holiday", - "amenity": "fuel" - }, - "name": "Holiday", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/YPF": { - "tags": { - "name": "YPF", - "amenity": "fuel" - }, - "name": "YPF", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/IDEMITSU": { - "tags": { - "name": "IDEMITSU", - "amenity": "fuel" - }, - "name": "IDEMITSU", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/ENEOS": { - "tags": { - "name": "ENEOS", - "amenity": "fuel" - }, - "name": "ENEOS", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Bharat Petroleum": { - "tags": { - "name": "Bharat Petroleum", - "amenity": "fuel" - }, - "name": "Bharat Petroleum", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/CAMPSA": { - "tags": { - "name": "CAMPSA", - "amenity": "fuel" - }, - "name": "CAMPSA", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Casey's General Store": { - "tags": { - "name": "Casey's General Store", - "amenity": "fuel" - }, - "name": "Casey's General Store", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Башнефть": { - "tags": { - "name": "Башнефть", - "amenity": "fuel" - }, - "name": "Башнефть", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Kangaroo": { - "tags": { - "name": "Kangaroo", - "amenity": "fuel" - }, - "name": "Kangaroo", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/コスモ石油 (COSMO)": { - "tags": { - "name": "コスモ石油 (COSMO)", - "amenity": "fuel" - }, - "name": "コスモ石油 (COSMO)", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/MEROIL": { - "tags": { - "name": "MEROIL", - "amenity": "fuel" - }, - "name": "MEROIL", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/1-2-3": { - "tags": { - "name": "1-2-3", - "amenity": "fuel" - }, - "name": "1-2-3", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/出光": { - "tags": { - "name": "出光", - "name:en": "IDEMITSU", - "amenity": "fuel" - }, - "name": "出光", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/НК Альянс": { - "tags": { - "name": "НК Альянс", - "amenity": "fuel" - }, - "name": "НК Альянс", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Sinclair": { - "tags": { - "name": "Sinclair", - "amenity": "fuel" - }, - "name": "Sinclair", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Conoco": { - "tags": { - "name": "Conoco", - "amenity": "fuel" - }, - "name": "Conoco", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/SPBU": { - "tags": { - "name": "SPBU", - "amenity": "fuel" - }, - "name": "SPBU", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Макпетрол": { - "tags": { - "name": "Макпетрол", - "amenity": "fuel" - }, - "name": "Макпетрол", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Posto Ipiranga": { - "tags": { - "name": "Posto Ipiranga", - "amenity": "fuel" - }, - "name": "Posto Ipiranga", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Posto Shell": { - "tags": { - "name": "Posto Shell", - "amenity": "fuel" - }, - "name": "Posto Shell", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Phoenix": { - "tags": { - "name": "Phoenix", - "amenity": "fuel" - }, - "name": "Phoenix", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Ipiranga": { - "tags": { - "name": "Ipiranga", - "amenity": "fuel" - }, - "name": "Ipiranga", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/OKKO": { - "tags": { - "name": "OKKO", - "amenity": "fuel" - }, - "name": "OKKO", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/ОККО": { - "tags": { - "name": "ОККО", - "amenity": "fuel" - }, - "name": "ОККО", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/บางจาก": { - "tags": { - "name": "บางจาก", - "amenity": "fuel" - }, - "name": "บางจาก", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/QuikTrip": { - "tags": { - "name": "QuikTrip", - "amenity": "fuel" - }, - "name": "QuikTrip", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Posto BR": { - "tags": { - "name": "Posto BR", - "amenity": "fuel" - }, - "name": "Posto BR", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/ป ต ท": { - "tags": { - "name": "ป ต ท", - "amenity": "fuel" - }, - "name": "ป ต ท", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/ปตท": { - "tags": { - "name": "ปตท", - "amenity": "fuel" - }, - "name": "ปตท", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/ANP": { - "tags": { - "name": "ANP", - "amenity": "fuel" - }, - "name": "ANP", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Kum & Go": { - "tags": { - "name": "Kum & Go", - "amenity": "fuel" - }, - "name": "Kum & Go", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Petrolimex": { - "tags": { - "name": "Petrolimex", - "amenity": "fuel" - }, - "name": "Petrolimex", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Sokimex": { - "tags": { - "name": "Sokimex", - "amenity": "fuel" - }, - "name": "Sokimex", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Tela": { - "tags": { - "name": "Tela", - "amenity": "fuel" - }, - "name": "Tela", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Posto": { - "tags": { - "name": "Posto", - "amenity": "fuel" - }, - "name": "Posto", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Укрнафта": { - "tags": { - "name": "Укрнафта", - "amenity": "fuel" - }, - "name": "Укрнафта", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Татнефтепродукт": { - "tags": { - "name": "Татнефтепродукт", - "amenity": "fuel" - }, - "name": "Татнефтепродукт", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Afriquia": { - "tags": { - "name": "Afriquia", - "amenity": "fuel" - }, - "name": "Afriquia", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/Murphy USA": { - "tags": { - "name": "Murphy USA", - "amenity": "fuel" - }, - "name": "Murphy USA", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/昭和シェル (Showa-shell)": { - "tags": { - "name": "昭和シェル (Showa-shell)", - "amenity": "fuel" - }, - "name": "昭和シェル (Showa-shell)", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/エネオス": { - "tags": { - "name": "エネオス", - "amenity": "fuel" - }, - "name": "エネオス", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/fuel/CNG": { - "tags": { - "name": "CNG", - "amenity": "fuel" - }, - "name": "CNG", - "icon": "fuel", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "amenity/pub/Kings Arms": { - "tags": { - "name": "Kings Arms", - "amenity": "pub" - }, - "name": "Kings Arms", - "icon": "beer", - "geometry": [ - "point", - "area" - ], - "fields": [ - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/pub/The Ship": { - "tags": { - "name": "The Ship", - "amenity": "pub" - }, - "name": "The Ship", - "icon": "beer", - "geometry": [ - "point", - "area" - ], - "fields": [ - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/pub/The White Horse": { - "tags": { - "name": "The White Horse", - "amenity": "pub" - }, - "name": "The White Horse", - "icon": "beer", - "geometry": [ - "point", - "area" - ], - "fields": [ - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/pub/The White Hart": { - "tags": { - "name": "The White Hart", - "amenity": "pub" - }, - "name": "The White Hart", - "icon": "beer", - "geometry": [ - "point", - "area" - ], - "fields": [ - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/pub/Royal Oak": { - "tags": { - "name": "Royal Oak", - "amenity": "pub" - }, - "name": "Royal Oak", - "icon": "beer", - "geometry": [ - "point", - "area" - ], - "fields": [ - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/pub/The Red Lion": { - "tags": { - "name": "The Red Lion", - "amenity": "pub" - }, - "name": "The Red Lion", - "icon": "beer", - "geometry": [ - "point", - "area" - ], - "fields": [ - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/pub/The Kings Arms": { - "tags": { - "name": "The Kings Arms", - "amenity": "pub" - }, - "name": "The Kings Arms", - "icon": "beer", - "geometry": [ - "point", - "area" - ], - "fields": [ - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/pub/The Star": { - "tags": { - "name": "The Star", - "amenity": "pub" - }, - "name": "The Star", - "icon": "beer", - "geometry": [ - "point", - "area" - ], - "fields": [ - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/pub/The Anchor": { - "tags": { - "name": "The Anchor", - "amenity": "pub" - }, - "name": "The Anchor", - "icon": "beer", - "geometry": [ - "point", - "area" - ], - "fields": [ - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/pub/The Cross Keys": { - "tags": { - "name": "The Cross Keys", - "amenity": "pub" - }, - "name": "The Cross Keys", - "icon": "beer", - "geometry": [ - "point", - "area" - ], - "fields": [ - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/pub/The Wheatsheaf": { - "tags": { - "name": "The Wheatsheaf", - "amenity": "pub" - }, - "name": "The Wheatsheaf", - "icon": "beer", - "geometry": [ - "point", - "area" - ], - "fields": [ - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/pub/The Crown Inn": { - "tags": { - "name": "The Crown Inn", - "amenity": "pub" - }, - "name": "The Crown Inn", - "icon": "beer", - "geometry": [ - "point", - "area" - ], - "fields": [ - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/pub/The Kings Head": { - "tags": { - "name": "The Kings Head", - "amenity": "pub" - }, - "name": "The Kings Head", - "icon": "beer", - "geometry": [ - "point", - "area" - ], - "fields": [ - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/pub/The Castle": { - "tags": { - "name": "The Castle", - "amenity": "pub" - }, - "name": "The Castle", - "icon": "beer", - "geometry": [ - "point", - "area" - ], - "fields": [ - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/pub/The Railway": { - "tags": { - "name": "The Railway", - "amenity": "pub" - }, - "name": "The Railway", - "icon": "beer", - "geometry": [ - "point", - "area" - ], - "fields": [ - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/pub/The White Lion": { - "tags": { - "name": "The White Lion", - "amenity": "pub" - }, - "name": "The White Lion", - "icon": "beer", - "geometry": [ - "point", - "area" - ], - "fields": [ - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/pub/The Bell": { - "tags": { - "name": "The Bell", - "amenity": "pub" - }, - "name": "The Bell", - "icon": "beer", - "geometry": [ - "point", - "area" - ], - "fields": [ - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/pub/The Bull": { - "tags": { - "name": "The Bull", - "amenity": "pub" - }, - "name": "The Bull", - "icon": "beer", - "geometry": [ - "point", - "area" - ], - "fields": [ - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/pub/The Plough": { - "tags": { - "name": "The Plough", - "amenity": "pub" - }, - "name": "The Plough", - "icon": "beer", - "geometry": [ - "point", - "area" - ], - "fields": [ - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/pub/The George": { - "tags": { - "name": "The George", - "amenity": "pub" - }, - "name": "The George", - "icon": "beer", - "geometry": [ - "point", - "area" - ], - "fields": [ - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/pub/The Royal Oak": { - "tags": { - "name": "The Royal Oak", - "amenity": "pub" - }, - "name": "The Royal Oak", - "icon": "beer", - "geometry": [ - "point", - "area" - ], - "fields": [ - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/pub/The Fox": { - "tags": { - "name": "The Fox", - "amenity": "pub" - }, - "name": "The Fox", - "icon": "beer", - "geometry": [ - "point", - "area" - ], - "fields": [ - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/pub/Prince of Wales": { - "tags": { - "name": "Prince of Wales", - "amenity": "pub" - }, - "name": "Prince of Wales", - "icon": "beer", - "geometry": [ - "point", - "area" - ], - "fields": [ - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/pub/The Rising Sun": { - "tags": { - "name": "The Rising Sun", - "amenity": "pub" - }, - "name": "The Rising Sun", - "icon": "beer", - "geometry": [ - "point", - "area" - ], - "fields": [ - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/pub/The Prince of Wales": { - "tags": { - "name": "The Prince of Wales", - "amenity": "pub" - }, - "name": "The Prince of Wales", - "icon": "beer", - "geometry": [ - "point", - "area" - ], - "fields": [ - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/pub/The Crown": { - "tags": { - "name": "The Crown", - "amenity": "pub" - }, - "name": "The Crown", - "icon": "beer", - "geometry": [ - "point", - "area" - ], - "fields": [ - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/pub/The Chequers": { - "tags": { - "name": "The Chequers", - "amenity": "pub" - }, - "name": "The Chequers", - "icon": "beer", - "geometry": [ - "point", - "area" - ], - "fields": [ - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/pub/The Swan": { - "tags": { - "name": "The Swan", - "amenity": "pub" - }, - "name": "The Swan", - "icon": "beer", - "geometry": [ - "point", - "area" - ], - "fields": [ - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/pub/Rose and Crown": { - "tags": { - "name": "Rose and Crown", - "amenity": "pub" - }, - "name": "Rose and Crown", - "icon": "beer", - "geometry": [ - "point", - "area" - ], - "fields": [ - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/pub/The Victoria": { - "tags": { - "name": "The Victoria", - "amenity": "pub" - }, - "name": "The Victoria", - "icon": "beer", - "geometry": [ - "point", - "area" - ], - "fields": [ - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/pub/New Inn": { - "tags": { - "name": "New Inn", - "amenity": "pub" - }, - "name": "New Inn", - "icon": "beer", - "geometry": [ - "point", - "area" - ], - "fields": [ - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/pub/Royal Hotel": { - "tags": { - "name": "Royal Hotel", - "amenity": "pub" - }, - "name": "Royal Hotel", - "icon": "beer", - "geometry": [ - "point", - "area" - ], - "fields": [ - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/pub/Red Lion": { - "tags": { - "name": "Red Lion", - "amenity": "pub" - }, - "name": "Red Lion", - "icon": "beer", - "geometry": [ - "point", - "area" - ], - "fields": [ - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/pub/Cross Keys": { - "tags": { - "name": "Cross Keys", - "amenity": "pub" - }, - "name": "Cross Keys", - "icon": "beer", - "geometry": [ - "point", - "area" - ], - "fields": [ - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/pub/The Greyhound": { - "tags": { - "name": "The Greyhound", - "amenity": "pub" - }, - "name": "The Greyhound", - "icon": "beer", - "geometry": [ - "point", - "area" - ], - "fields": [ - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/pub/The Black Horse": { - "tags": { - "name": "The Black Horse", - "amenity": "pub" - }, - "name": "The Black Horse", - "icon": "beer", - "geometry": [ - "point", - "area" - ], - "fields": [ - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/pub/The New Inn": { - "tags": { - "name": "The New Inn", - "amenity": "pub" - }, - "name": "The New Inn", - "icon": "beer", - "geometry": [ - "point", - "area" - ], - "fields": [ - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/pub/Kings Head": { - "tags": { - "name": "Kings Head", - "amenity": "pub" - }, - "name": "Kings Head", - "icon": "beer", - "geometry": [ - "point", - "area" - ], - "fields": [ - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/pub/The Albion": { - "tags": { - "name": "The Albion", - "amenity": "pub" - }, - "name": "The Albion", - "icon": "beer", - "geometry": [ - "point", - "area" - ], - "fields": [ - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/pub/The Angel": { - "tags": { - "name": "The Angel", - "amenity": "pub" - }, - "name": "The Angel", - "icon": "beer", - "geometry": [ - "point", - "area" - ], - "fields": [ - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/pub/The Queens Head": { - "tags": { - "name": "The Queens Head", - "amenity": "pub" - }, - "name": "The Queens Head", - "icon": "beer", - "geometry": [ - "point", - "area" - ], - "fields": [ - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/pub/The Ship Inn": { - "tags": { - "name": "The Ship Inn", - "amenity": "pub" - }, - "name": "The Ship Inn", - "icon": "beer", - "geometry": [ - "point", - "area" - ], - "fields": [ - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/pub/Rose & Crown": { - "tags": { - "name": "Rose & Crown", - "amenity": "pub" - }, - "name": "Rose & Crown", - "icon": "beer", - "geometry": [ - "point", - "area" - ], - "fields": [ - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/pub/Queens Head": { - "tags": { - "name": "Queens Head", - "amenity": "pub" - }, - "name": "Queens Head", - "icon": "beer", - "geometry": [ - "point", - "area" - ], - "fields": [ - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/pub/Irish Pub": { - "tags": { - "name": "Irish Pub", - "amenity": "pub" - }, - "name": "Irish Pub", - "icon": "beer", - "geometry": [ - "point", - "area" - ], - "fields": [ - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/Quick": { - "tags": { - "name": "Quick", - "amenity": "fast_food" - }, - "name": "Quick", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/McDonald's": { - "tags": { - "name": "McDonald's", - "cuisine": "burger", - "amenity": "fast_food" - }, - "name": "McDonald's", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/Subway": { - "tags": { - "name": "Subway", - "cuisine": "sandwich", - "amenity": "fast_food" - }, - "name": "Subway", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/Burger King": { - "tags": { - "name": "Burger King", - "cuisine": "burger", - "amenity": "fast_food" - }, - "name": "Burger King", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/Ali Baba": { - "tags": { - "name": "Ali Baba", - "amenity": "fast_food" - }, - "name": "Ali Baba", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/Hungry Jacks": { - "tags": { - "name": "Hungry Jacks", - "cuisine": "burger", - "amenity": "fast_food" - }, - "name": "Hungry Jacks", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/Red Rooster": { - "tags": { - "name": "Red Rooster", - "amenity": "fast_food" - }, - "name": "Red Rooster", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/KFC": { - "tags": { - "name": "KFC", - "cuisine": "chicken", - "amenity": "fast_food" - }, - "name": "KFC", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/Domino's Pizza": { - "tags": { - "name": "Domino's Pizza", - "cuisine": "pizza", - "amenity": "fast_food" - }, - "name": "Domino's Pizza", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/Chowking": { - "tags": { - "name": "Chowking", - "amenity": "fast_food" - }, - "name": "Chowking", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/Jollibee": { - "tags": { - "name": "Jollibee", - "amenity": "fast_food" - }, - "name": "Jollibee", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/Hesburger": { - "tags": { - "name": "Hesburger", - "amenity": "fast_food" - }, - "name": "Hesburger", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/肯德基": { - "tags": { - "name": "肯德基", - "amenity": "fast_food" - }, - "name": "肯德基", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/Wendy's": { - "tags": { - "name": "Wendy's", - "cuisine": "burger", - "amenity": "fast_food" - }, - "name": "Wendy's", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/Tim Hortons": { - "tags": { - "name": "Tim Hortons", - "amenity": "fast_food" - }, - "name": "Tim Hortons", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/Steers": { - "tags": { - "name": "Steers", - "amenity": "fast_food" - }, - "name": "Steers", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/Hardee's": { - "tags": { - "name": "Hardee's", - "cuisine": "burger", - "amenity": "fast_food" - }, - "name": "Hardee's", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/Arby's": { - "tags": { - "name": "Arby's", - "amenity": "fast_food" - }, - "name": "Arby's", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/A&W": { - "tags": { - "name": "A&W", - "amenity": "fast_food" - }, - "name": "A&W", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/Dairy Queen": { - "tags": { - "name": "Dairy Queen", - "amenity": "fast_food" - }, - "name": "Dairy Queen", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/Hallo Pizza": { - "tags": { - "name": "Hallo Pizza", - "amenity": "fast_food" - }, - "name": "Hallo Pizza", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/Fish & Chips": { - "tags": { - "name": "Fish & Chips", - "amenity": "fast_food" - }, - "name": "Fish & Chips", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/Harvey's": { - "tags": { - "name": "Harvey's", - "amenity": "fast_food" - }, - "name": "Harvey's", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/麥當勞": { - "tags": { - "name": "麥當勞", - "amenity": "fast_food" - }, - "name": "麥當勞", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/Pizza Pizza": { - "tags": { - "name": "Pizza Pizza", - "amenity": "fast_food" - }, - "name": "Pizza Pizza", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/Kotipizza": { - "tags": { - "name": "Kotipizza", - "amenity": "fast_food" - }, - "name": "Kotipizza", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/Jack in the Box": { - "tags": { - "name": "Jack in the Box", - "cuisine": "burger", - "amenity": "fast_food" - }, - "name": "Jack in the Box", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/Istanbul": { - "tags": { - "name": "Istanbul", - "amenity": "fast_food" - }, - "name": "Istanbul", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/Kochlöffel": { - "tags": { - "name": "Kochlöffel", - "amenity": "fast_food" - }, - "name": "Kochlöffel", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/Döner": { - "tags": { - "name": "Döner", - "amenity": "fast_food" - }, - "name": "Döner", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/Telepizza": { - "tags": { - "name": "Telepizza", - "amenity": "fast_food" - }, - "name": "Telepizza", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/Sibylla": { - "tags": { - "name": "Sibylla", - "amenity": "fast_food" - }, - "name": "Sibylla", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/Carl's Jr.": { - "tags": { - "name": "Carl's Jr.", - "cuisine": "burger", - "amenity": "fast_food" - }, - "name": "Carl's Jr.", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/Quiznos": { - "tags": { - "name": "Quiznos", - "cuisine": "sandwich", - "amenity": "fast_food" - }, - "name": "Quiznos", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/Wimpy": { - "tags": { - "name": "Wimpy", - "amenity": "fast_food" - }, - "name": "Wimpy", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/Sonic": { - "tags": { - "name": "Sonic", - "cuisine": "burger", - "amenity": "fast_food" - }, - "name": "Sonic", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/Taco Bell": { - "tags": { - "name": "Taco Bell", - "cuisine": "mexican", - "amenity": "fast_food" - }, - "name": "Taco Bell", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/Pizza Nova": { - "tags": { - "name": "Pizza Nova", - "amenity": "fast_food" - }, - "name": "Pizza Nova", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/Papa John's": { - "tags": { - "name": "Papa John's", - "cuisine": "pizza", - "amenity": "fast_food" - }, - "name": "Papa John's", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/Nordsee": { - "tags": { - "name": "Nordsee", - "amenity": "fast_food" - }, - "name": "Nordsee", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/Mr. Sub": { - "tags": { - "name": "Mr. Sub", - "amenity": "fast_food" - }, - "name": "Mr. Sub", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/Макдоналдс": { - "tags": { - "name": "Макдоналдс", - "name:en": "McDonald's", - "amenity": "fast_food" - }, - "name": "Макдоналдс", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/Asia Imbiss": { - "tags": { - "name": "Asia Imbiss", - "amenity": "fast_food" - }, - "name": "Asia Imbiss", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/Chipotle": { - "tags": { - "name": "Chipotle", - "cuisine": "mexican", - "amenity": "fast_food" - }, - "name": "Chipotle", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/マクドナルド": { - "tags": { - "name": "マクドナルド", - "name:en": "McDonald's", - "cuisine": "burger", - "amenity": "fast_food" - }, - "name": "マクドナルド", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/In-N-Out Burger": { - "tags": { - "name": "In-N-Out Burger", - "amenity": "fast_food" - }, - "name": "In-N-Out Burger", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/Jimmy John's": { - "tags": { - "name": "Jimmy John's", - "amenity": "fast_food" - }, - "name": "Jimmy John's", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/Jamba Juice": { - "tags": { - "name": "Jamba Juice", - "amenity": "fast_food" - }, - "name": "Jamba Juice", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/Робин Сдобин": { - "tags": { - "name": "Робин Сдобин", - "amenity": "fast_food" - }, - "name": "Робин Сдобин", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/Baskin Robbins": { - "tags": { - "name": "Baskin Robbins", - "amenity": "fast_food" - }, - "name": "Baskin Robbins", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/ケンタッキーフライドチキン": { - "tags": { - "name": "ケンタッキーフライドチキン", - "name:en": "KFC", - "cuisine": "chicken", - "amenity": "fast_food" - }, - "name": "ケンタッキーフライドチキン", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/吉野家": { - "tags": { - "name": "吉野家", - "amenity": "fast_food" - }, - "name": "吉野家", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/Taco Time": { - "tags": { - "name": "Taco Time", - "amenity": "fast_food" - }, - "name": "Taco Time", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/松屋": { - "tags": { - "name": "松屋", - "name:en": "Matsuya", - "amenity": "fast_food" - }, - "name": "松屋", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/Little Caesars": { - "tags": { - "name": "Little Caesars", - "amenity": "fast_food" - }, - "name": "Little Caesars", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/El Pollo Loco": { - "tags": { - "name": "El Pollo Loco", - "amenity": "fast_food" - }, - "name": "El Pollo Loco", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/Del Taco": { - "tags": { - "name": "Del Taco", - "amenity": "fast_food" - }, - "name": "Del Taco", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/White Castle": { - "tags": { - "name": "White Castle", - "amenity": "fast_food" - }, - "name": "White Castle", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/Boston Market": { - "tags": { - "name": "Boston Market", - "amenity": "fast_food" - }, - "name": "Boston Market", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/Chick-fil-A": { - "tags": { - "name": "Chick-fil-A", - "cuisine": "chicken", - "amenity": "fast_food" - }, - "name": "Chick-fil-A", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/Panda Express": { - "tags": { - "name": "Panda Express", - "cuisine": "chinese", - "amenity": "fast_food" - }, - "name": "Panda Express", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/Whataburger": { - "tags": { - "name": "Whataburger", - "amenity": "fast_food" - }, - "name": "Whataburger", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/Taco John's": { - "tags": { - "name": "Taco John's", - "amenity": "fast_food" - }, - "name": "Taco John's", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/Теремок": { - "tags": { - "name": "Теремок", - "amenity": "fast_food" - }, - "name": "Теремок", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/Culver's": { - "tags": { - "name": "Culver's", - "amenity": "fast_food" - }, - "name": "Culver's", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/Five Guys": { - "tags": { - "name": "Five Guys", - "amenity": "fast_food" - }, - "name": "Five Guys", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/Church's Chicken": { - "tags": { - "name": "Church's Chicken", - "amenity": "fast_food" - }, - "name": "Church's Chicken", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/Popeye's": { - "tags": { - "name": "Popeye's", - "cuisine": "chicken", - "amenity": "fast_food" - }, - "name": "Popeye's", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/Long John Silver's": { - "tags": { - "name": "Long John Silver's", - "amenity": "fast_food" - }, - "name": "Long John Silver's", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/Pollo Campero": { - "tags": { - "name": "Pollo Campero", - "amenity": "fast_food" - }, - "name": "Pollo Campero", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/Zaxby's": { - "tags": { - "name": "Zaxby's", - "amenity": "fast_food" - }, - "name": "Zaxby's", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/すき家": { - "tags": { - "name": "すき家", - "name:en": "SUKIYA", - "amenity": "fast_food" - }, - "name": "すき家", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/モスバーガー": { - "tags": { - "name": "モスバーガー", - "name:en": "MOS BURGER", - "amenity": "fast_food" - }, - "name": "モスバーガー", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/Русский Аппетит": { - "tags": { - "name": "Русский Аппетит", - "amenity": "fast_food" - }, - "name": "Русский Аппетит", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/fast_food/なか卯": { - "tags": { - "name": "なか卯", - "amenity": "fast_food" - }, - "name": "なか卯", - "icon": "fast-food", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "operator", - "address", - "building_area", - "opening_hours", - "takeaway", - "delivery", - "drive_through", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Pizza Hut": { - "tags": { - "name": "Pizza Hut", - "cuisine": "pizza", - "amenity": "restaurant" - }, - "name": "Pizza Hut", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Little Chef": { - "tags": { - "name": "Little Chef", - "amenity": "restaurant" - }, - "name": "Little Chef", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Adler": { - "tags": { - "name": "Adler", - "amenity": "restaurant" - }, - "name": "Adler", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Zur Krone": { - "tags": { - "name": "Zur Krone", - "amenity": "restaurant" - }, - "name": "Zur Krone", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Deutsches Haus": { - "tags": { - "name": "Deutsches Haus", - "amenity": "restaurant" - }, - "name": "Deutsches Haus", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Krone": { - "tags": { - "name": "Krone", - "amenity": "restaurant" - }, - "name": "Krone", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Akropolis": { - "tags": { - "name": "Akropolis", - "amenity": "restaurant" - }, - "name": "Akropolis", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Schützenhaus": { - "tags": { - "name": "Schützenhaus", - "amenity": "restaurant" - }, - "name": "Schützenhaus", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Kreuz": { - "tags": { - "name": "Kreuz", - "amenity": "restaurant" - }, - "name": "Kreuz", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Waldschänke": { - "tags": { - "name": "Waldschänke", - "amenity": "restaurant" - }, - "name": "Waldschänke", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/La Piazza": { - "tags": { - "name": "La Piazza", - "amenity": "restaurant" - }, - "name": "La Piazza", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Lamm": { - "tags": { - "name": "Lamm", - "amenity": "restaurant" - }, - "name": "Lamm", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Zur Sonne": { - "tags": { - "name": "Zur Sonne", - "amenity": "restaurant" - }, - "name": "Zur Sonne", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Zur Linde": { - "tags": { - "name": "Zur Linde", - "amenity": "restaurant" - }, - "name": "Zur Linde", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Poseidon": { - "tags": { - "name": "Poseidon", - "amenity": "restaurant" - }, - "name": "Poseidon", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Shanghai": { - "tags": { - "name": "Shanghai", - "amenity": "restaurant" - }, - "name": "Shanghai", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Red Lobster": { - "tags": { - "name": "Red Lobster", - "amenity": "restaurant" - }, - "name": "Red Lobster", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Zum Löwen": { - "tags": { - "name": "Zum Löwen", - "amenity": "restaurant" - }, - "name": "Zum Löwen", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Swiss Chalet": { - "tags": { - "name": "Swiss Chalet", - "amenity": "restaurant" - }, - "name": "Swiss Chalet", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Olympia": { - "tags": { - "name": "Olympia", - "amenity": "restaurant" - }, - "name": "Olympia", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Wagamama": { - "tags": { - "name": "Wagamama", - "amenity": "restaurant" - }, - "name": "Wagamama", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Frankie & Benny's": { - "tags": { - "name": "Frankie & Benny's", - "amenity": "restaurant" - }, - "name": "Frankie & Benny's", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Hooters": { - "tags": { - "name": "Hooters", - "amenity": "restaurant" - }, - "name": "Hooters", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Sternen": { - "tags": { - "name": "Sternen", - "amenity": "restaurant" - }, - "name": "Sternen", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Hirschen": { - "tags": { - "name": "Hirschen", - "amenity": "restaurant" - }, - "name": "Hirschen", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Denny's": { - "tags": { - "name": "Denny's", - "amenity": "restaurant" - }, - "name": "Denny's", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Athen": { - "tags": { - "name": "Athen", - "amenity": "restaurant" - }, - "name": "Athen", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Sonne": { - "tags": { - "name": "Sonne", - "amenity": "restaurant" - }, - "name": "Sonne", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Hirsch": { - "tags": { - "name": "Hirsch", - "amenity": "restaurant" - }, - "name": "Hirsch", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Ratskeller": { - "tags": { - "name": "Ratskeller", - "amenity": "restaurant" - }, - "name": "Ratskeller", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/La Cantina": { - "tags": { - "name": "La Cantina", - "amenity": "restaurant" - }, - "name": "La Cantina", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Gasthaus Krone": { - "tags": { - "name": "Gasthaus Krone", - "amenity": "restaurant" - }, - "name": "Gasthaus Krone", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/El Greco": { - "tags": { - "name": "El Greco", - "amenity": "restaurant" - }, - "name": "El Greco", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Gasthof zur Post": { - "tags": { - "name": "Gasthof zur Post", - "amenity": "restaurant" - }, - "name": "Gasthof zur Post", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Nando's": { - "tags": { - "name": "Nando's", - "amenity": "restaurant" - }, - "name": "Nando's", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Löwen": { - "tags": { - "name": "Löwen", - "amenity": "restaurant" - }, - "name": "Löwen", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/La Pataterie": { - "tags": { - "name": "La Pataterie", - "amenity": "restaurant" - }, - "name": "La Pataterie", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Bella Napoli": { - "tags": { - "name": "Bella Napoli", - "amenity": "restaurant" - }, - "name": "Bella Napoli", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Pizza Express": { - "tags": { - "name": "Pizza Express", - "amenity": "restaurant" - }, - "name": "Pizza Express", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Mandarin": { - "tags": { - "name": "Mandarin", - "amenity": "restaurant" - }, - "name": "Mandarin", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Hong Kong": { - "tags": { - "name": "Hong Kong", - "amenity": "restaurant" - }, - "name": "Hong Kong", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Zizzi": { - "tags": { - "name": "Zizzi", - "amenity": "restaurant" - }, - "name": "Zizzi", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Cracker Barrel": { - "tags": { - "name": "Cracker Barrel", - "amenity": "restaurant" - }, - "name": "Cracker Barrel", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Rhodos": { - "tags": { - "name": "Rhodos", - "amenity": "restaurant" - }, - "name": "Rhodos", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Lindenhof": { - "tags": { - "name": "Lindenhof", - "amenity": "restaurant" - }, - "name": "Lindenhof", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Milano": { - "tags": { - "name": "Milano", - "amenity": "restaurant" - }, - "name": "Milano", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Dolce Vita": { - "tags": { - "name": "Dolce Vita", - "amenity": "restaurant" - }, - "name": "Dolce Vita", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Kirchenwirt": { - "tags": { - "name": "Kirchenwirt", - "amenity": "restaurant" - }, - "name": "Kirchenwirt", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Kantine": { - "tags": { - "name": "Kantine", - "amenity": "restaurant" - }, - "name": "Kantine", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Ochsen": { - "tags": { - "name": "Ochsen", - "amenity": "restaurant" - }, - "name": "Ochsen", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Spur": { - "tags": { - "name": "Spur", - "amenity": "restaurant" - }, - "name": "Spur", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Mykonos": { - "tags": { - "name": "Mykonos", - "amenity": "restaurant" - }, - "name": "Mykonos", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Lotus": { - "tags": { - "name": "Lotus", - "amenity": "restaurant" - }, - "name": "Lotus", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Applebee's": { - "tags": { - "name": "Applebee's", - "amenity": "restaurant" - }, - "name": "Applebee's", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Flunch": { - "tags": { - "name": "Flunch", - "amenity": "restaurant" - }, - "name": "Flunch", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Zur Post": { - "tags": { - "name": "Zur Post", - "amenity": "restaurant" - }, - "name": "Zur Post", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/China Town": { - "tags": { - "name": "China Town", - "amenity": "restaurant" - }, - "name": "China Town", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/La Dolce Vita": { - "tags": { - "name": "La Dolce Vita", - "amenity": "restaurant" - }, - "name": "La Dolce Vita", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Waffle House": { - "tags": { - "name": "Waffle House", - "amenity": "restaurant" - }, - "name": "Waffle House", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Delphi": { - "tags": { - "name": "Delphi", - "amenity": "restaurant" - }, - "name": "Delphi", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Linde": { - "tags": { - "name": "Linde", - "amenity": "restaurant" - }, - "name": "Linde", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Outback Steakhouse": { - "tags": { - "name": "Outback Steakhouse", - "amenity": "restaurant" - }, - "name": "Outback Steakhouse", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Dionysos": { - "tags": { - "name": "Dionysos", - "amenity": "restaurant" - }, - "name": "Dionysos", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Kelsey's": { - "tags": { - "name": "Kelsey's", - "amenity": "restaurant" - }, - "name": "Kelsey's", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Boston Pizza": { - "tags": { - "name": "Boston Pizza", - "amenity": "restaurant" - }, - "name": "Boston Pizza", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Bella Italia": { - "tags": { - "name": "Bella Italia", - "amenity": "restaurant" - }, - "name": "Bella Italia", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Sizzler": { - "tags": { - "name": "Sizzler", - "amenity": "restaurant" - }, - "name": "Sizzler", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Grüner Baum": { - "tags": { - "name": "Grüner Baum", - "amenity": "restaurant" - }, - "name": "Grüner Baum", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Taj Mahal": { - "tags": { - "name": "Taj Mahal", - "amenity": "restaurant" - }, - "name": "Taj Mahal", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Rössli": { - "tags": { - "name": "Rössli", - "amenity": "restaurant" - }, - "name": "Rössli", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Traube": { - "tags": { - "name": "Traube", - "amenity": "restaurant" - }, - "name": "Traube", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Adria": { - "tags": { - "name": "Adria", - "amenity": "restaurant" - }, - "name": "Adria", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Red Robin": { - "tags": { - "name": "Red Robin", - "amenity": "restaurant" - }, - "name": "Red Robin", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Roma": { - "tags": { - "name": "Roma", - "amenity": "restaurant" - }, - "name": "Roma", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/San Marco": { - "tags": { - "name": "San Marco", - "amenity": "restaurant" - }, - "name": "San Marco", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Hellas": { - "tags": { - "name": "Hellas", - "amenity": "restaurant" - }, - "name": "Hellas", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/La Perla": { - "tags": { - "name": "La Perla", - "amenity": "restaurant" - }, - "name": "La Perla", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Vips": { - "tags": { - "name": "Vips", - "amenity": "restaurant" - }, - "name": "Vips", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Panera Bread": { - "tags": { - "name": "Panera Bread", - "amenity": "restaurant" - }, - "name": "Panera Bread", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Da Vinci": { - "tags": { - "name": "Da Vinci", - "amenity": "restaurant" - }, - "name": "Da Vinci", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Hippopotamus": { - "tags": { - "name": "Hippopotamus", - "amenity": "restaurant" - }, - "name": "Hippopotamus", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Prezzo": { - "tags": { - "name": "Prezzo", - "amenity": "restaurant" - }, - "name": "Prezzo", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Courtepaille": { - "tags": { - "name": "Courtepaille", - "amenity": "restaurant" - }, - "name": "Courtepaille", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Hard Rock Cafe": { - "tags": { - "name": "Hard Rock Cafe", - "amenity": "restaurant" - }, - "name": "Hard Rock Cafe", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Panorama": { - "tags": { - "name": "Panorama", - "amenity": "restaurant" - }, - "name": "Panorama", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/デニーズ": { - "tags": { - "name": "デニーズ", - "amenity": "restaurant" - }, - "name": "デニーズ", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Sportheim": { - "tags": { - "name": "Sportheim", - "amenity": "restaurant" - }, - "name": "Sportheim", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/餃子の王将": { - "tags": { - "name": "餃子の王将", - "amenity": "restaurant" - }, - "name": "餃子の王将", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Bären": { - "tags": { - "name": "Bären", - "amenity": "restaurant" - }, - "name": "Bären", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Alte Post": { - "tags": { - "name": "Alte Post", - "amenity": "restaurant" - }, - "name": "Alte Post", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Pizzeria Roma": { - "tags": { - "name": "Pizzeria Roma", - "amenity": "restaurant" - }, - "name": "Pizzeria Roma", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/China Garden": { - "tags": { - "name": "China Garden", - "amenity": "restaurant" - }, - "name": "China Garden", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Vapiano": { - "tags": { - "name": "Vapiano", - "amenity": "restaurant" - }, - "name": "Vapiano", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Mamma Mia": { - "tags": { - "name": "Mamma Mia", - "amenity": "restaurant" - }, - "name": "Mamma Mia", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Schwarzer Adler": { - "tags": { - "name": "Schwarzer Adler", - "amenity": "restaurant" - }, - "name": "Schwarzer Adler", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/IHOP": { - "tags": { - "name": "IHOP", - "amenity": "restaurant" - }, - "name": "IHOP", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Chili's": { - "tags": { - "name": "Chili's", - "amenity": "restaurant" - }, - "name": "Chili's", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Asia": { - "tags": { - "name": "Asia", - "amenity": "restaurant" - }, - "name": "Asia", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Olive Garden": { - "tags": { - "name": "Olive Garden", - "amenity": "restaurant" - }, - "name": "Olive Garden", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/TGI Friday's": { - "tags": { - "name": "TGI Friday's", - "amenity": "restaurant" - }, - "name": "TGI Friday's", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Friendly's": { - "tags": { - "name": "Friendly's", - "amenity": "restaurant" - }, - "name": "Friendly's", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Buffalo Grill": { - "tags": { - "name": "Buffalo Grill", - "amenity": "restaurant" - }, - "name": "Buffalo Grill", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Texas Roadhouse": { - "tags": { - "name": "Texas Roadhouse", - "amenity": "restaurant" - }, - "name": "Texas Roadhouse", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/ガスト": { - "tags": { - "name": "ガスト", - "name:en": "Gusto", - "amenity": "restaurant" - }, - "name": "ガスト", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Sakura": { - "tags": { - "name": "Sakura", - "amenity": "restaurant" - }, - "name": "Sakura", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Mensa": { - "tags": { - "name": "Mensa", - "amenity": "restaurant" - }, - "name": "Mensa", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/The Keg": { - "tags": { - "name": "The Keg", - "amenity": "restaurant" - }, - "name": "The Keg", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/サイゼリヤ": { - "tags": { - "name": "サイゼリヤ", - "amenity": "restaurant" - }, - "name": "サイゼリヤ", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/La Strada": { - "tags": { - "name": "La Strada", - "amenity": "restaurant" - }, - "name": "La Strada", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Village Inn": { - "tags": { - "name": "Village Inn", - "amenity": "restaurant" - }, - "name": "Village Inn", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Buffalo Wild Wings": { - "tags": { - "name": "Buffalo Wild Wings", - "amenity": "restaurant" - }, - "name": "Buffalo Wild Wings", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Peking": { - "tags": { - "name": "Peking", - "amenity": "restaurant" - }, - "name": "Peking", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Round Table Pizza": { - "tags": { - "name": "Round Table Pizza", - "amenity": "restaurant" - }, - "name": "Round Table Pizza", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/California Pizza Kitchen": { - "tags": { - "name": "California Pizza Kitchen", - "amenity": "restaurant" - }, - "name": "California Pizza Kitchen", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Якитория": { - "tags": { - "name": "Якитория", - "amenity": "restaurant" - }, - "name": "Якитория", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Golden Corral": { - "tags": { - "name": "Golden Corral", - "amenity": "restaurant" - }, - "name": "Golden Corral", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Perkins": { - "tags": { - "name": "Perkins", - "amenity": "restaurant" - }, - "name": "Perkins", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Ruby Tuesday": { - "tags": { - "name": "Ruby Tuesday", - "amenity": "restaurant" - }, - "name": "Ruby Tuesday", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Shari's": { - "tags": { - "name": "Shari's", - "amenity": "restaurant" - }, - "name": "Shari's", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Bob Evans": { - "tags": { - "name": "Bob Evans", - "amenity": "restaurant" - }, - "name": "Bob Evans", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/바다횟집 (Bada Fish Restaurant)": { - "tags": { - "name": "바다횟집 (Bada Fish Restaurant)", - "amenity": "restaurant" - }, - "name": "바다횟집 (Bada Fish Restaurant)", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Mang Inasal": { - "tags": { - "name": "Mang Inasal", - "amenity": "restaurant" - }, - "name": "Mang Inasal", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Евразия": { - "tags": { - "name": "Евразия", - "amenity": "restaurant" - }, - "name": "Евразия", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/ジョナサン": { - "tags": { - "name": "ジョナサン", - "amenity": "restaurant" - }, - "name": "ジョナサン", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/restaurant/Longhorn Steakhouse": { - "tags": { - "name": "Longhorn Steakhouse", - "amenity": "restaurant" - }, - "name": "Longhorn Steakhouse", - "icon": "restaurant", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "address", - "building_area", - "opening_hours", - "capacity", - "takeaway", - "delivery", - "smoking" - ], - "suggestion": true - }, - "amenity/bank/Chase": { - "tags": { - "name": "Chase", - "amenity": "bank" - }, - "name": "Chase", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Commonwealth Bank": { - "tags": { - "name": "Commonwealth Bank", - "amenity": "bank" - }, - "name": "Commonwealth Bank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Citibank": { - "tags": { - "name": "Citibank", - "amenity": "bank" - }, - "name": "Citibank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/HSBC": { - "tags": { - "name": "HSBC", - "amenity": "bank" - }, - "name": "HSBC", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Barclays": { - "tags": { - "name": "Barclays", - "amenity": "bank" - }, - "name": "Barclays", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Westpac": { - "tags": { - "name": "Westpac", - "amenity": "bank" - }, - "name": "Westpac", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/NAB": { - "tags": { - "name": "NAB", - "amenity": "bank" - }, - "name": "NAB", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/ANZ": { - "tags": { - "name": "ANZ", - "amenity": "bank" - }, - "name": "ANZ", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Lloyds Bank": { - "tags": { - "name": "Lloyds Bank", - "amenity": "bank" - }, - "name": "Lloyds Bank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Landbank": { - "tags": { - "name": "Landbank", - "amenity": "bank" - }, - "name": "Landbank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Sparkasse": { - "tags": { - "name": "Sparkasse", - "amenity": "bank" - }, - "name": "Sparkasse", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/UCPB": { - "tags": { - "name": "UCPB", - "amenity": "bank" - }, - "name": "UCPB", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/PNB": { - "tags": { - "name": "PNB", - "amenity": "bank" - }, - "name": "PNB", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Metrobank": { - "tags": { - "name": "Metrobank", - "amenity": "bank" - }, - "name": "Metrobank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/BDO": { - "tags": { - "name": "BDO", - "amenity": "bank" - }, - "name": "BDO", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Volksbank": { - "tags": { - "name": "Volksbank", - "amenity": "bank" - }, - "name": "Volksbank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/BPI": { - "tags": { - "name": "BPI", - "amenity": "bank" - }, - "name": "BPI", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Postbank": { - "tags": { - "name": "Postbank", - "amenity": "bank" - }, - "name": "Postbank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/NatWest": { - "tags": { - "name": "NatWest", - "amenity": "bank" - }, - "name": "NatWest", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Raiffeisenbank": { - "tags": { - "name": "Raiffeisenbank", - "amenity": "bank" - }, - "name": "Raiffeisenbank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Yorkshire Bank": { - "tags": { - "name": "Yorkshire Bank", - "amenity": "bank" - }, - "name": "Yorkshire Bank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/ABSA": { - "tags": { - "name": "ABSA", - "amenity": "bank" - }, - "name": "ABSA", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Standard Bank": { - "tags": { - "name": "Standard Bank", - "amenity": "bank" - }, - "name": "Standard Bank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/FNB": { - "tags": { - "name": "FNB", - "amenity": "bank" - }, - "name": "FNB", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Deutsche Bank": { - "tags": { - "name": "Deutsche Bank", - "amenity": "bank" - }, - "name": "Deutsche Bank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/SEB": { - "tags": { - "name": "SEB", - "amenity": "bank" - }, - "name": "SEB", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Commerzbank": { - "tags": { - "name": "Commerzbank", - "amenity": "bank" - }, - "name": "Commerzbank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Targobank": { - "tags": { - "name": "Targobank", - "amenity": "bank" - }, - "name": "Targobank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/ABN AMRO": { - "tags": { - "name": "ABN AMRO", - "amenity": "bank" - }, - "name": "ABN AMRO", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Handelsbanken": { - "tags": { - "name": "Handelsbanken", - "amenity": "bank" - }, - "name": "Handelsbanken", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Swedbank": { - "tags": { - "name": "Swedbank", - "amenity": "bank" - }, - "name": "Swedbank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Kreissparkasse": { - "tags": { - "name": "Kreissparkasse", - "amenity": "bank" - }, - "name": "Kreissparkasse", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/UniCredit Bank": { - "tags": { - "name": "UniCredit Bank", - "amenity": "bank" - }, - "name": "UniCredit Bank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Monte dei Paschi di Siena": { - "tags": { - "name": "Monte dei Paschi di Siena", - "amenity": "bank" - }, - "name": "Monte dei Paschi di Siena", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Caja Rural": { - "tags": { - "name": "Caja Rural", - "amenity": "bank" - }, - "name": "Caja Rural", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Dresdner Bank": { - "tags": { - "name": "Dresdner Bank", - "amenity": "bank" - }, - "name": "Dresdner Bank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Sparda-Bank": { - "tags": { - "name": "Sparda-Bank", - "amenity": "bank" - }, - "name": "Sparda-Bank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/VÚB": { - "tags": { - "name": "VÚB", - "amenity": "bank" - }, - "name": "VÚB", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Slovenská sporiteľňa": { - "tags": { - "name": "Slovenská sporiteľňa", - "amenity": "bank" - }, - "name": "Slovenská sporiteľňa", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Bank of Montreal": { - "tags": { - "name": "Bank of Montreal", - "amenity": "bank" - }, - "name": "Bank of Montreal", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/KBC": { - "tags": { - "name": "KBC", - "amenity": "bank" - }, - "name": "KBC", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Royal Bank of Scotland": { - "tags": { - "name": "Royal Bank of Scotland", - "amenity": "bank" - }, - "name": "Royal Bank of Scotland", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/TSB": { - "tags": { - "name": "TSB", - "amenity": "bank" - }, - "name": "TSB", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/US Bank": { - "tags": { - "name": "US Bank", - "amenity": "bank" - }, - "name": "US Bank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/HypoVereinsbank": { - "tags": { - "name": "HypoVereinsbank", - "amenity": "bank" - }, - "name": "HypoVereinsbank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Bank Austria": { - "tags": { - "name": "Bank Austria", - "amenity": "bank" - }, - "name": "Bank Austria", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/ING": { - "tags": { - "name": "ING", - "amenity": "bank" - }, - "name": "ING", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Erste Bank": { - "tags": { - "name": "Erste Bank", - "amenity": "bank" - }, - "name": "Erste Bank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/CIBC": { - "tags": { - "name": "CIBC", - "amenity": "bank" - }, - "name": "CIBC", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Scotiabank": { - "tags": { - "name": "Scotiabank", - "amenity": "bank" - }, - "name": "Scotiabank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Caisse d'Épargne": { - "tags": { - "name": "Caisse d'Épargne", - "amenity": "bank" - }, - "name": "Caisse d'Épargne", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Santander": { - "tags": { - "name": "Santander", - "amenity": "bank" - }, - "name": "Santander", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Bank of Scotland": { - "tags": { - "name": "Bank of Scotland", - "amenity": "bank" - }, - "name": "Bank of Scotland", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/TD Canada Trust": { - "tags": { - "name": "TD Canada Trust", - "amenity": "bank" - }, - "name": "TD Canada Trust", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/BMO": { - "tags": { - "name": "BMO", - "amenity": "bank" - }, - "name": "BMO", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Danske Bank": { - "tags": { - "name": "Danske Bank", - "amenity": "bank" - }, - "name": "Danske Bank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/OTP": { - "tags": { - "name": "OTP", - "amenity": "bank" - }, - "name": "OTP", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Crédit Agricole": { - "tags": { - "name": "Crédit Agricole", - "amenity": "bank" - }, - "name": "Crédit Agricole", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/LCL": { - "tags": { - "name": "LCL", - "amenity": "bank" - }, - "name": "LCL", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/VR-Bank": { - "tags": { - "name": "VR-Bank", - "amenity": "bank" - }, - "name": "VR-Bank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/ČSOB": { - "tags": { - "name": "ČSOB", - "amenity": "bank" - }, - "name": "ČSOB", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Česká spořitelna": { - "tags": { - "name": "Česká spořitelna", - "amenity": "bank" - }, - "name": "Česká spořitelna", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/BNP": { - "tags": { - "name": "BNP", - "amenity": "bank" - }, - "name": "BNP", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Royal Bank": { - "tags": { - "name": "Royal Bank", - "amenity": "bank" - }, - "name": "Royal Bank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Nationwide": { - "tags": { - "name": "Nationwide", - "amenity": "bank" - }, - "name": "Nationwide", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Halifax": { - "tags": { - "name": "Halifax", - "amenity": "bank" - }, - "name": "Halifax", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/BAWAG PSK": { - "tags": { - "name": "BAWAG PSK", - "amenity": "bank" - }, - "name": "BAWAG PSK", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/National Bank": { - "tags": { - "name": "National Bank", - "amenity": "bank" - }, - "name": "National Bank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Nedbank": { - "tags": { - "name": "Nedbank", - "amenity": "bank" - }, - "name": "Nedbank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/First National Bank": { - "tags": { - "name": "First National Bank", - "amenity": "bank" - }, - "name": "First National Bank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Nordea": { - "tags": { - "name": "Nordea", - "amenity": "bank" - }, - "name": "Nordea", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Rabobank": { - "tags": { - "name": "Rabobank", - "amenity": "bank" - }, - "name": "Rabobank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Sparkasse KölnBonn": { - "tags": { - "name": "Sparkasse KölnBonn", - "amenity": "bank" - }, - "name": "Sparkasse KölnBonn", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Tatra banka": { - "tags": { - "name": "Tatra banka", - "amenity": "bank" - }, - "name": "Tatra banka", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Berliner Sparkasse": { - "tags": { - "name": "Berliner Sparkasse", - "amenity": "bank" - }, - "name": "Berliner Sparkasse", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Berliner Volksbank": { - "tags": { - "name": "Berliner Volksbank", - "amenity": "bank" - }, - "name": "Berliner Volksbank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Wells Fargo": { - "tags": { - "name": "Wells Fargo", - "amenity": "bank" - }, - "name": "Wells Fargo", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Credit Suisse": { - "tags": { - "name": "Credit Suisse", - "amenity": "bank" - }, - "name": "Credit Suisse", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Société Générale": { - "tags": { - "name": "Société Générale", - "amenity": "bank" - }, - "name": "Société Générale", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Osuuspankki": { - "tags": { - "name": "Osuuspankki", - "amenity": "bank" - }, - "name": "Osuuspankki", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Sparkasse Aachen": { - "tags": { - "name": "Sparkasse Aachen", - "amenity": "bank" - }, - "name": "Sparkasse Aachen", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Hamburger Sparkasse": { - "tags": { - "name": "Hamburger Sparkasse", - "amenity": "bank" - }, - "name": "Hamburger Sparkasse", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Cassa di Risparmio del Veneto": { - "tags": { - "name": "Cassa di Risparmio del Veneto", - "amenity": "bank" - }, - "name": "Cassa di Risparmio del Veneto", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/BNP Paribas": { - "tags": { - "name": "BNP Paribas", - "amenity": "bank" - }, - "name": "BNP Paribas", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Banque Populaire": { - "tags": { - "name": "Banque Populaire", - "amenity": "bank" - }, - "name": "Banque Populaire", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/BNP Paribas Fortis": { - "tags": { - "name": "BNP Paribas Fortis", - "amenity": "bank" - }, - "name": "BNP Paribas Fortis", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Banco Popular": { - "tags": { - "name": "Banco Popular", - "amenity": "bank" - }, - "name": "Banco Popular", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Bancaja": { - "tags": { - "name": "Bancaja", - "amenity": "bank" - }, - "name": "Bancaja", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Banesto": { - "tags": { - "name": "Banesto", - "amenity": "bank" - }, - "name": "Banesto", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/La Caixa": { - "tags": { - "name": "La Caixa", - "amenity": "bank" - }, - "name": "La Caixa", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Santander Consumer Bank": { - "tags": { - "name": "Santander Consumer Bank", - "amenity": "bank" - }, - "name": "Santander Consumer Bank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/BRD": { - "tags": { - "name": "BRD", - "amenity": "bank" - }, - "name": "BRD", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/BCR": { - "tags": { - "name": "BCR", - "amenity": "bank" - }, - "name": "BCR", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Banca Transilvania": { - "tags": { - "name": "Banca Transilvania", - "amenity": "bank" - }, - "name": "Banca Transilvania", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/BW-Bank": { - "tags": { - "name": "BW-Bank", - "amenity": "bank" - }, - "name": "BW-Bank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Komerční banka": { - "tags": { - "name": "Komerční banka", - "amenity": "bank" - }, - "name": "Komerční banka", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Banco Pastor": { - "tags": { - "name": "Banco Pastor", - "amenity": "bank" - }, - "name": "Banco Pastor", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Stadtsparkasse": { - "tags": { - "name": "Stadtsparkasse", - "amenity": "bank" - }, - "name": "Stadtsparkasse", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Ulster Bank": { - "tags": { - "name": "Ulster Bank", - "amenity": "bank" - }, - "name": "Ulster Bank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Sberbank": { - "tags": { - "name": "Sberbank", - "amenity": "bank" - }, - "name": "Sberbank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/CIC": { - "tags": { - "name": "CIC", - "amenity": "bank" - }, - "name": "CIC", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Bancpost": { - "tags": { - "name": "Bancpost", - "amenity": "bank" - }, - "name": "Bancpost", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Caja Madrid": { - "tags": { - "name": "Caja Madrid", - "amenity": "bank" - }, - "name": "Caja Madrid", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Maybank": { - "tags": { - "name": "Maybank", - "amenity": "bank" - }, - "name": "Maybank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/中国银行": { - "tags": { - "name": "中国银行", - "amenity": "bank" - }, - "name": "中国银行", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Unicredit Banca": { - "tags": { - "name": "Unicredit Banca", - "amenity": "bank" - }, - "name": "Unicredit Banca", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Crédit Mutuel": { - "tags": { - "name": "Crédit Mutuel", - "amenity": "bank" - }, - "name": "Crédit Mutuel", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/BBVA": { - "tags": { - "name": "BBVA", - "amenity": "bank" - }, - "name": "BBVA", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Intesa San Paolo": { - "tags": { - "name": "Intesa San Paolo", - "amenity": "bank" - }, - "name": "Intesa San Paolo", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/TD Bank": { - "tags": { - "name": "TD Bank", - "amenity": "bank" - }, - "name": "TD Bank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Belfius": { - "tags": { - "name": "Belfius", - "amenity": "bank" - }, - "name": "Belfius", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Bank of America": { - "tags": { - "name": "Bank of America", - "amenity": "bank" - }, - "name": "Bank of America", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/RBC": { - "tags": { - "name": "RBC", - "amenity": "bank" - }, - "name": "RBC", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Alpha Bank": { - "tags": { - "name": "Alpha Bank", - "amenity": "bank" - }, - "name": "Alpha Bank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Сбербанк": { - "tags": { - "name": "Сбербанк", - "amenity": "bank" - }, - "name": "Сбербанк", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Россельхозбанк": { - "tags": { - "name": "Россельхозбанк", - "amenity": "bank" - }, - "name": "Россельхозбанк", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Crédit du Nord": { - "tags": { - "name": "Crédit du Nord", - "amenity": "bank" - }, - "name": "Crédit du Nord", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/BancoEstado": { - "tags": { - "name": "BancoEstado", - "amenity": "bank" - }, - "name": "BancoEstado", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Millennium Bank": { - "tags": { - "name": "Millennium Bank", - "amenity": "bank" - }, - "name": "Millennium Bank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/State Bank of India": { - "tags": { - "name": "State Bank of India", - "amenity": "bank" - }, - "name": "State Bank of India", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Беларусбанк": { - "tags": { - "name": "Беларусбанк", - "amenity": "bank" - }, - "name": "Беларусбанк", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/ING Bank Śląski": { - "tags": { - "name": "ING Bank Śląski", - "amenity": "bank" - }, - "name": "ING Bank Śląski", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Caixa Geral de Depósitos": { - "tags": { - "name": "Caixa Geral de Depósitos", - "amenity": "bank" - }, - "name": "Caixa Geral de Depósitos", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Kreissparkasse Köln": { - "tags": { - "name": "Kreissparkasse Köln", - "amenity": "bank" - }, - "name": "Kreissparkasse Köln", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Banco BCI": { - "tags": { - "name": "Banco BCI", - "amenity": "bank" - }, - "name": "Banco BCI", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Banco de Chile": { - "tags": { - "name": "Banco de Chile", - "amenity": "bank" - }, - "name": "Banco de Chile", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/ВТБ24": { - "tags": { - "name": "ВТБ24", - "amenity": "bank" - }, - "name": "ВТБ24", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/UBS": { - "tags": { - "name": "UBS", - "amenity": "bank" - }, - "name": "UBS", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/PKO BP": { - "tags": { - "name": "PKO BP", - "amenity": "bank" - }, - "name": "PKO BP", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Chinabank": { - "tags": { - "name": "Chinabank", - "amenity": "bank" - }, - "name": "Chinabank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/PSBank": { - "tags": { - "name": "PSBank", - "amenity": "bank" - }, - "name": "PSBank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Union Bank": { - "tags": { - "name": "Union Bank", - "amenity": "bank" - }, - "name": "Union Bank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/China Bank": { - "tags": { - "name": "China Bank", - "amenity": "bank" - }, - "name": "China Bank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/RCBC": { - "tags": { - "name": "RCBC", - "amenity": "bank" - }, - "name": "RCBC", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Unicaja": { - "tags": { - "name": "Unicaja", - "amenity": "bank" - }, - "name": "Unicaja", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/BBK": { - "tags": { - "name": "BBK", - "amenity": "bank" - }, - "name": "BBK", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Ibercaja": { - "tags": { - "name": "Ibercaja", - "amenity": "bank" - }, - "name": "Ibercaja", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/RBS": { - "tags": { - "name": "RBS", - "amenity": "bank" - }, - "name": "RBS", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Commercial Bank of Ceylon PLC": { - "tags": { - "name": "Commercial Bank of Ceylon PLC", - "amenity": "bank" - }, - "name": "Commercial Bank of Ceylon PLC", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Bank of Ireland": { - "tags": { - "name": "Bank of Ireland", - "amenity": "bank" - }, - "name": "Bank of Ireland", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/BNL": { - "tags": { - "name": "BNL", - "amenity": "bank" - }, - "name": "BNL", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Banco Santander": { - "tags": { - "name": "Banco Santander", - "amenity": "bank" - }, - "name": "Banco Santander", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Banco Itaú": { - "tags": { - "name": "Banco Itaú", - "amenity": "bank" - }, - "name": "Banco Itaú", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/AIB": { - "tags": { - "name": "AIB", - "amenity": "bank" - }, - "name": "AIB", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/BZ WBK": { - "tags": { - "name": "BZ WBK", - "amenity": "bank" - }, - "name": "BZ WBK", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Banco do Brasil": { - "tags": { - "name": "Banco do Brasil", - "amenity": "bank" - }, - "name": "Banco do Brasil", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Caixa Econômica Federal": { - "tags": { - "name": "Caixa Econômica Federal", - "amenity": "bank" - }, - "name": "Caixa Econômica Federal", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Fifth Third Bank": { - "tags": { - "name": "Fifth Third Bank", - "amenity": "bank" - }, - "name": "Fifth Third Bank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Banca Popolare di Vicenza": { - "tags": { - "name": "Banca Popolare di Vicenza", - "amenity": "bank" - }, - "name": "Banca Popolare di Vicenza", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Wachovia": { - "tags": { - "name": "Wachovia", - "amenity": "bank" - }, - "name": "Wachovia", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/OLB": { - "tags": { - "name": "OLB", - "amenity": "bank" - }, - "name": "OLB", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/みずほ銀行": { - "tags": { - "name": "みずほ銀行", - "amenity": "bank" - }, - "name": "みずほ銀行", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/BES": { - "tags": { - "name": "BES", - "amenity": "bank" - }, - "name": "BES", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/ICICI Bank": { - "tags": { - "name": "ICICI Bank", - "amenity": "bank" - }, - "name": "ICICI Bank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/HDFC Bank": { - "tags": { - "name": "HDFC Bank", - "amenity": "bank" - }, - "name": "HDFC Bank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/La Banque Postale": { - "tags": { - "name": "La Banque Postale", - "amenity": "bank" - }, - "name": "La Banque Postale", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Pekao SA": { - "tags": { - "name": "Pekao SA", - "amenity": "bank" - }, - "name": "Pekao SA", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Oberbank": { - "tags": { - "name": "Oberbank", - "amenity": "bank" - }, - "name": "Oberbank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Bradesco": { - "tags": { - "name": "Bradesco", - "amenity": "bank" - }, - "name": "Bradesco", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Oldenburgische Landesbank": { - "tags": { - "name": "Oldenburgische Landesbank", - "amenity": "bank" - }, - "name": "Oldenburgische Landesbank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Bendigo Bank": { - "tags": { - "name": "Bendigo Bank", - "amenity": "bank" - }, - "name": "Bendigo Bank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Argenta": { - "tags": { - "name": "Argenta", - "amenity": "bank" - }, - "name": "Argenta", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/AXA": { - "tags": { - "name": "AXA", - "amenity": "bank" - }, - "name": "AXA", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Axis Bank": { - "tags": { - "name": "Axis Bank", - "amenity": "bank" - }, - "name": "Axis Bank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Banco Nación": { - "tags": { - "name": "Banco Nación", - "amenity": "bank" - }, - "name": "Banco Nación", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/GE Money Bank": { - "tags": { - "name": "GE Money Bank", - "amenity": "bank" - }, - "name": "GE Money Bank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Альфа-Банк": { - "tags": { - "name": "Альфа-Банк", - "amenity": "bank" - }, - "name": "Альфа-Банк", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Белагропромбанк": { - "tags": { - "name": "Белагропромбанк", - "amenity": "bank" - }, - "name": "Белагропромбанк", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Caja Círculo": { - "tags": { - "name": "Caja Círculo", - "amenity": "bank" - }, - "name": "Caja Círculo", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Banco Galicia": { - "tags": { - "name": "Banco Galicia", - "amenity": "bank" - }, - "name": "Banco Galicia", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Eurobank": { - "tags": { - "name": "Eurobank", - "amenity": "bank" - }, - "name": "Eurobank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Banca Intesa": { - "tags": { - "name": "Banca Intesa", - "amenity": "bank" - }, - "name": "Banca Intesa", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Canara Bank": { - "tags": { - "name": "Canara Bank", - "amenity": "bank" - }, - "name": "Canara Bank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Cajamar": { - "tags": { - "name": "Cajamar", - "amenity": "bank" - }, - "name": "Cajamar", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Banamex": { - "tags": { - "name": "Banamex", - "amenity": "bank" - }, - "name": "Banamex", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Crédit Mutuel de Bretagne": { - "tags": { - "name": "Crédit Mutuel de Bretagne", - "amenity": "bank" - }, - "name": "Crédit Mutuel de Bretagne", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Davivienda": { - "tags": { - "name": "Davivienda", - "amenity": "bank" - }, - "name": "Davivienda", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Bank Spółdzielczy": { - "tags": { - "name": "Bank Spółdzielczy", - "amenity": "bank" - }, - "name": "Bank Spółdzielczy", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Credit Agricole": { - "tags": { - "name": "Credit Agricole", - "amenity": "bank" - }, - "name": "Credit Agricole", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Bankinter": { - "tags": { - "name": "Bankinter", - "amenity": "bank" - }, - "name": "Bankinter", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Banque Nationale": { - "tags": { - "name": "Banque Nationale", - "amenity": "bank" - }, - "name": "Banque Nationale", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Bank of the West": { - "tags": { - "name": "Bank of the West", - "amenity": "bank" - }, - "name": "Bank of the West", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Key Bank": { - "tags": { - "name": "Key Bank", - "amenity": "bank" - }, - "name": "Key Bank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Western Union": { - "tags": { - "name": "Western Union", - "amenity": "bank" - }, - "name": "Western Union", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Citizens Bank": { - "tags": { - "name": "Citizens Bank", - "amenity": "bank" - }, - "name": "Citizens Bank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/ПриватБанк": { - "tags": { - "name": "ПриватБанк", - "amenity": "bank" - }, - "name": "ПриватБанк", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Security Bank": { - "tags": { - "name": "Security Bank", - "amenity": "bank" - }, - "name": "Security Bank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Millenium": { - "tags": { - "name": "Millenium", - "amenity": "bank" - }, - "name": "Millenium", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Bankia": { - "tags": { - "name": "Bankia", - "amenity": "bank" - }, - "name": "Bankia", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/三菱東京UFJ銀行": { - "tags": { - "name": "三菱東京UFJ銀行", - "amenity": "bank" - }, - "name": "三菱東京UFJ銀行", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Caixa": { - "tags": { - "name": "Caixa", - "amenity": "bank" - }, - "name": "Caixa", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Banco de Costa Rica": { - "tags": { - "name": "Banco de Costa Rica", - "amenity": "bank" - }, - "name": "Banco de Costa Rica", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/SunTrust Bank": { - "tags": { - "name": "SunTrust Bank", - "amenity": "bank" - }, - "name": "SunTrust Bank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Itaú": { - "tags": { - "name": "Itaú", - "amenity": "bank" - }, - "name": "Itaú", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/PBZ": { - "tags": { - "name": "PBZ", - "amenity": "bank" - }, - "name": "PBZ", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/中国工商银行": { - "tags": { - "name": "中国工商银行", - "amenity": "bank" - }, - "name": "中国工商银行", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Bancolombia": { - "tags": { - "name": "Bancolombia", - "amenity": "bank" - }, - "name": "Bancolombia", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Райффайзен Банк Аваль": { - "tags": { - "name": "Райффайзен Банк Аваль", - "amenity": "bank" - }, - "name": "Райффайзен Банк Аваль", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Bancomer": { - "tags": { - "name": "Bancomer", - "amenity": "bank" - }, - "name": "Bancomer", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Banorte": { - "tags": { - "name": "Banorte", - "amenity": "bank" - }, - "name": "Banorte", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Alior Bank": { - "tags": { - "name": "Alior Bank", - "amenity": "bank" - }, - "name": "Alior Bank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/BOC": { - "tags": { - "name": "BOC", - "amenity": "bank" - }, - "name": "BOC", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Банк Москвы": { - "tags": { - "name": "Банк Москвы", - "amenity": "bank" - }, - "name": "Банк Москвы", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/ВТБ": { - "tags": { - "name": "ВТБ", - "amenity": "bank" - }, - "name": "ВТБ", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Getin Bank": { - "tags": { - "name": "Getin Bank", - "amenity": "bank" - }, - "name": "Getin Bank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Caja Duero": { - "tags": { - "name": "Caja Duero", - "amenity": "bank" - }, - "name": "Caja Duero", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Regions Bank": { - "tags": { - "name": "Regions Bank", - "amenity": "bank" - }, - "name": "Regions Bank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Росбанк": { - "tags": { - "name": "Росбанк", - "amenity": "bank" - }, - "name": "Росбанк", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Banco Estado": { - "tags": { - "name": "Banco Estado", - "amenity": "bank" - }, - "name": "Banco Estado", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/BCI": { - "tags": { - "name": "BCI", - "amenity": "bank" - }, - "name": "BCI", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/SunTrust": { - "tags": { - "name": "SunTrust", - "amenity": "bank" - }, - "name": "SunTrust", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/PNC Bank": { - "tags": { - "name": "PNC Bank", - "amenity": "bank" - }, - "name": "PNC Bank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/신한은행": { - "tags": { - "name": "신한은행", - "name:en": "Sinhan Bank", - "amenity": "bank" - }, - "name": "신한은행", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/우리은행": { - "tags": { - "name": "우리은행", - "name:en": "Uri Bank", - "amenity": "bank" - }, - "name": "우리은행", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/국민은행": { - "tags": { - "name": "국민은행", - "name:en": "Gungmin Bank", - "amenity": "bank" - }, - "name": "국민은행", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/중소기업은행": { - "tags": { - "name": "중소기업은행", - "name:en": "Industrial Bank of Korea", - "amenity": "bank" - }, - "name": "중소기업은행", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/광주은행": { - "tags": { - "name": "광주은행", - "name:en": "Gwangju Bank", - "amenity": "bank" - }, - "name": "ê´‘주은행", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Газпромбанк": { - "tags": { - "name": "Газпромбанк", - "amenity": "bank" - }, - "name": "Газпромбанк", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/M&T Bank": { - "tags": { - "name": "M&T Bank", - "amenity": "bank" - }, - "name": "M&T Bank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Caja de Burgos": { - "tags": { - "name": "Caja de Burgos", - "amenity": "bank" - }, - "name": "Caja de Burgos", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Santander Totta": { - "tags": { - "name": "Santander Totta", - "amenity": "bank" - }, - "name": "Santander Totta", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/УкрСиббанк": { - "tags": { - "name": "УкрСиббанк", - "amenity": "bank" - }, - "name": "УкрСиббанк", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Ощадбанк": { - "tags": { - "name": "Ощадбанк", - "amenity": "bank" - }, - "name": "Ощадбанк", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Уралсиб": { - "tags": { - "name": "Уралсиб", - "amenity": "bank" - }, - "name": "Уралсиб", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/りそな銀行": { - "tags": { - "name": "りそな銀行", - "name:en": "Mizuho Bank", - "amenity": "bank" - }, - "name": "りそな銀行", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Ecobank": { - "tags": { - "name": "Ecobank", - "amenity": "bank" - }, - "name": "Ecobank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Cajero Automatico Bancared": { - "tags": { - "name": "Cajero Automatico Bancared", - "amenity": "bank" - }, - "name": "Cajero Automatico Bancared", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Промсвязьбанк": { - "tags": { - "name": "Промсвязьбанк", - "amenity": "bank" - }, - "name": "Промсвязьбанк", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/三井住友銀行": { - "tags": { - "name": "三井住友銀行", - "amenity": "bank" - }, - "name": "三井住友銀行", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Banco Provincia": { - "tags": { - "name": "Banco Provincia", - "amenity": "bank" - }, - "name": "Banco Provincia", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/BB&T": { - "tags": { - "name": "BB&T", - "amenity": "bank" - }, - "name": "BB&T", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Возрождение": { - "tags": { - "name": "Возрождение", - "amenity": "bank" - }, - "name": "Возрождение", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Capital One": { - "tags": { - "name": "Capital One", - "amenity": "bank" - }, - "name": "Capital One", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/横浜銀行": { - "tags": { - "name": "横浜銀行", - "amenity": "bank" - }, - "name": "横浜銀行", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Bank Mandiri": { - "tags": { - "name": "Bank Mandiri", - "amenity": "bank" - }, - "name": "Bank Mandiri", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Banco de la Nación": { - "tags": { - "name": "Banco de la Nación", - "amenity": "bank" - }, - "name": "Banco de la Nación", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Banco G&T Continental": { - "tags": { - "name": "Banco G&T Continental", - "amenity": "bank" - }, - "name": "Banco G&T Continental", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Peoples Bank": { - "tags": { - "name": "Peoples Bank", - "amenity": "bank" - }, - "name": "Peoples Bank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/工商银行": { - "tags": { - "name": "工商银行", - "amenity": "bank" - }, - "name": "工商银行", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Совкомбанк": { - "tags": { - "name": "Совкомбанк", - "amenity": "bank" - }, - "name": "Совкомбанк", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Provincial": { - "tags": { - "name": "Provincial", - "amenity": "bank" - }, - "name": "Provincial", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Banco de Desarrollo Banrural": { - "tags": { - "name": "Banco de Desarrollo Banrural", - "amenity": "bank" - }, - "name": "Banco de Desarrollo Banrural", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Banco Bradesco": { - "tags": { - "name": "Banco Bradesco", - "amenity": "bank" - }, - "name": "Banco Bradesco", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Bicentenario": { - "tags": { - "name": "Bicentenario", - "amenity": "bank" - }, - "name": "Bicentenario", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/ლიბერთი ბანკი": { - "tags": { - "name": "ლიბერთი ბანკი", - "name:en": "Liberty Bank", - "amenity": "bank" - }, - "name": "ლიბერთი ბანკი", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Banesco": { - "tags": { - "name": "Banesco", - "amenity": "bank" - }, - "name": "Banesco", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Mercantil": { - "tags": { - "name": "Mercantil", - "amenity": "bank" - }, - "name": "Mercantil", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Bank BRI": { - "tags": { - "name": "Bank BRI", - "amenity": "bank" - }, - "name": "Bank BRI", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/Del Tesoro": { - "tags": { - "name": "Del Tesoro", - "amenity": "bank" - }, - "name": "Del Tesoro", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/하나은행": { - "tags": { - "name": "하나은행", - "amenity": "bank" - }, - "name": "하나은행", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/CityCommerce Bank": { - "tags": { - "name": "CityCommerce Bank", - "amenity": "bank" - }, - "name": "CityCommerce Bank", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/bank/De Venezuela": { - "tags": { - "name": "De Venezuela", - "amenity": "bank" - }, - "name": "De Venezuela", - "icon": "bank", - "geometry": [ - "point", - "area" - ], - "fields": [ - "atm", - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/car_rental/Europcar": { - "tags": { - "name": "Europcar", - "amenity": "car_rental" - }, - "name": "Europcar", - "icon": "car", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator" - ], - "suggestion": true - }, - "amenity/car_rental/Budget": { - "tags": { - "name": "Budget", - "amenity": "car_rental" - }, - "name": "Budget", - "icon": "car", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator" - ], - "suggestion": true - }, - "amenity/car_rental/Sixt": { - "tags": { - "name": "Sixt", - "amenity": "car_rental" - }, - "name": "Sixt", - "icon": "car", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator" - ], - "suggestion": true - }, - "amenity/car_rental/Avis": { - "tags": { - "name": "Avis", - "amenity": "car_rental" - }, - "name": "Avis", - "icon": "car", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator" - ], - "suggestion": true - }, - "amenity/car_rental/Hertz": { - "tags": { - "name": "Hertz", - "amenity": "car_rental" - }, - "name": "Hertz", - "icon": "car", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator" - ], - "suggestion": true - }, - "amenity/car_rental/Enterprise": { - "tags": { - "name": "Enterprise", - "amenity": "car_rental" - }, - "name": "Enterprise", - "icon": "car", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator" - ], - "suggestion": true - }, - "amenity/car_rental/stadtmobil CarSharing-Station": { - "tags": { - "name": "stadtmobil CarSharing-Station", - "amenity": "car_rental" - }, - "name": "stadtmobil CarSharing-Station", - "icon": "car", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator" - ], - "suggestion": true - }, - "amenity/pharmacy/Rowlands Pharmacy": { - "tags": { - "name": "Rowlands Pharmacy", - "amenity": "pharmacy" - }, - "name": "Rowlands Pharmacy", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/Boots": { - "tags": { - "name": "Boots", - "amenity": "pharmacy" - }, - "name": "Boots", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/Marien-Apotheke": { - "tags": { - "name": "Marien-Apotheke", - "amenity": "pharmacy" - }, - "name": "Marien-Apotheke", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/Mercury Drug": { - "tags": { - "name": "Mercury Drug", - "amenity": "pharmacy" - }, - "name": "Mercury Drug", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/Löwen-Apotheke": { - "tags": { - "name": "Löwen-Apotheke", - "amenity": "pharmacy" - }, - "name": "Löwen-Apotheke", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/Superdrug": { - "tags": { - "name": "Superdrug", - "amenity": "pharmacy" - }, - "name": "Superdrug", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/Sonnen-Apotheke": { - "tags": { - "name": "Sonnen-Apotheke", - "amenity": "pharmacy" - }, - "name": "Sonnen-Apotheke", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/Rathaus-Apotheke": { - "tags": { - "name": "Rathaus-Apotheke", - "amenity": "pharmacy" - }, - "name": "Rathaus-Apotheke", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/Engel-Apotheke": { - "tags": { - "name": "Engel-Apotheke", - "amenity": "pharmacy" - }, - "name": "Engel-Apotheke", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/Hirsch-Apotheke": { - "tags": { - "name": "Hirsch-Apotheke", - "amenity": "pharmacy" - }, - "name": "Hirsch-Apotheke", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/Stern-Apotheke": { - "tags": { - "name": "Stern-Apotheke", - "amenity": "pharmacy" - }, - "name": "Stern-Apotheke", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/Lloyds Pharmacy": { - "tags": { - "name": "Lloyds Pharmacy", - "amenity": "pharmacy" - }, - "name": "Lloyds Pharmacy", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/Rosen-Apotheke": { - "tags": { - "name": "Rosen-Apotheke", - "amenity": "pharmacy" - }, - "name": "Rosen-Apotheke", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/Stadt-Apotheke": { - "tags": { - "name": "Stadt-Apotheke", - "amenity": "pharmacy" - }, - "name": "Stadt-Apotheke", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/Markt-Apotheke": { - "tags": { - "name": "Markt-Apotheke", - "amenity": "pharmacy" - }, - "name": "Markt-Apotheke", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/Аптека": { - "tags": { - "name": "Аптека", - "amenity": "pharmacy" - }, - "name": "Аптека", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/Pharmasave": { - "tags": { - "name": "Pharmasave", - "amenity": "pharmacy" - }, - "name": "Pharmasave", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/Brunnen-Apotheke": { - "tags": { - "name": "Brunnen-Apotheke", - "amenity": "pharmacy" - }, - "name": "Brunnen-Apotheke", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/Shoppers Drug Mart": { - "tags": { - "name": "Shoppers Drug Mart", - "amenity": "pharmacy" - }, - "name": "Shoppers Drug Mart", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/Apotheke am Markt": { - "tags": { - "name": "Apotheke am Markt", - "amenity": "pharmacy" - }, - "name": "Apotheke am Markt", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/Alte Apotheke": { - "tags": { - "name": "Alte Apotheke", - "amenity": "pharmacy" - }, - "name": "Alte Apotheke", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/Neue Apotheke": { - "tags": { - "name": "Neue Apotheke", - "amenity": "pharmacy" - }, - "name": "Neue Apotheke", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/Gintarinė vaistinė": { - "tags": { - "name": "Gintarinė vaistinė", - "amenity": "pharmacy" - }, - "name": "Gintarinė vaistinė", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/Rats-Apotheke": { - "tags": { - "name": "Rats-Apotheke", - "amenity": "pharmacy" - }, - "name": "Rats-Apotheke", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/Adler Apotheke": { - "tags": { - "name": "Adler Apotheke", - "amenity": "pharmacy" - }, - "name": "Adler Apotheke", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/Pharmacie Centrale": { - "tags": { - "name": "Pharmacie Centrale", - "amenity": "pharmacy" - }, - "name": "Pharmacie Centrale", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/Walgreens": { - "tags": { - "name": "Walgreens", - "amenity": "pharmacy" - }, - "name": "Walgreens", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/Rite Aid": { - "tags": { - "name": "Rite Aid", - "amenity": "pharmacy" - }, - "name": "Rite Aid", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/Apotheke": { - "tags": { - "name": "Apotheke", - "amenity": "pharmacy" - }, - "name": "Apotheke", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/Linden-Apotheke": { - "tags": { - "name": "Linden-Apotheke", - "amenity": "pharmacy" - }, - "name": "Linden-Apotheke", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/Bahnhof-Apotheke": { - "tags": { - "name": "Bahnhof-Apotheke", - "amenity": "pharmacy" - }, - "name": "Bahnhof-Apotheke", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/Burg-Apotheke": { - "tags": { - "name": "Burg-Apotheke", - "amenity": "pharmacy" - }, - "name": "Burg-Apotheke", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/Jean Coutu": { - "tags": { - "name": "Jean Coutu", - "amenity": "pharmacy" - }, - "name": "Jean Coutu", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/Pharmaprix": { - "tags": { - "name": "Pharmaprix", - "amenity": "pharmacy" - }, - "name": "Pharmaprix", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/Farmacias Ahumada": { - "tags": { - "name": "Farmacias Ahumada", - "amenity": "pharmacy" - }, - "name": "Farmacias Ahumada", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/Farmacia Comunale": { - "tags": { - "name": "Farmacia Comunale", - "amenity": "pharmacy" - }, - "name": "Farmacia Comunale", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/Farmacias Cruz Verde": { - "tags": { - "name": "Farmacias Cruz Verde", - "amenity": "pharmacy" - }, - "name": "Farmacias Cruz Verde", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/Cruz Verde": { - "tags": { - "name": "Cruz Verde", - "amenity": "pharmacy" - }, - "name": "Cruz Verde", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/Hubertus Apotheke": { - "tags": { - "name": "Hubertus Apotheke", - "amenity": "pharmacy" - }, - "name": "Hubertus Apotheke", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/CVS": { - "tags": { - "name": "CVS", - "amenity": "pharmacy" - }, - "name": "CVS", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/Farmacias SalcoBrand": { - "tags": { - "name": "Farmacias SalcoBrand", - "amenity": "pharmacy" - }, - "name": "Farmacias SalcoBrand", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/Фармация": { - "tags": { - "name": "Фармация", - "amenity": "pharmacy" - }, - "name": "Фармация", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/Bären-Apotheke": { - "tags": { - "name": "Bären-Apotheke", - "amenity": "pharmacy" - }, - "name": "Bären-Apotheke", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/Clicks": { - "tags": { - "name": "Clicks", - "amenity": "pharmacy" - }, - "name": "Clicks", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/セイジョー": { - "tags": { - "name": "セイジョー", - "amenity": "pharmacy" - }, - "name": "セイジョー", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/マツモトキヨシ": { - "tags": { - "name": "マツモトキヨシ", - "amenity": "pharmacy" - }, - "name": "マツモトキヨシ", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/Dr. Max": { - "tags": { - "name": "Dr. Max", - "amenity": "pharmacy" - }, - "name": "Dr. Max", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/Вита": { - "tags": { - "name": "Вита", - "amenity": "pharmacy" - }, - "name": "Вита", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/サンドラッグ": { - "tags": { - "name": "サンドラッグ", - "amenity": "pharmacy" - }, - "name": "サンドラッグ", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/Apteka": { - "tags": { - "name": "Apteka", - "amenity": "pharmacy" - }, - "name": "Apteka", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/Первая помощь": { - "tags": { - "name": "Первая помощь", - "amenity": "pharmacy" - }, - "name": "Первая помощь", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/Ригла": { - "tags": { - "name": "Ригла", - "amenity": "pharmacy" - }, - "name": "Ригла", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/Имплозия": { - "tags": { - "name": "Имплозия", - "amenity": "pharmacy" - }, - "name": "Имплозия", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/Kinney Drugs": { - "tags": { - "name": "Kinney Drugs", - "amenity": "pharmacy" - }, - "name": "Kinney Drugs", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/Классика": { - "tags": { - "name": "Классика", - "amenity": "pharmacy" - }, - "name": "Классика", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/Ljekarna": { - "tags": { - "name": "Ljekarna", - "amenity": "pharmacy" - }, - "name": "Ljekarna", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/SalcoBrand": { - "tags": { - "name": "SalcoBrand", - "amenity": "pharmacy" - }, - "name": "SalcoBrand", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/Аптека 36,6": { - "tags": { - "name": "Аптека 36,6", - "amenity": "pharmacy" - }, - "name": "Аптека 36,6", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/Фармакор": { - "tags": { - "name": "Фармакор", - "amenity": "pharmacy" - }, - "name": "Фармакор", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/スギ薬局": { - "tags": { - "name": "スギ薬局", - "amenity": "pharmacy" - }, - "name": "スギ薬局", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/Аптечный пункт": { - "tags": { - "name": "Аптечный пункт", - "amenity": "pharmacy" - }, - "name": "Аптечный пункт", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/Невис": { - "tags": { - "name": "Невис", - "amenity": "pharmacy" - }, - "name": "Невис", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/トモズ (Tomod's)": { - "tags": { - "name": "トモズ (Tomod's)", - "amenity": "pharmacy" - }, - "name": "トモズ (Tomod's)", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/Eurovaistinė": { - "tags": { - "name": "Eurovaistinė", - "amenity": "pharmacy" - }, - "name": "Eurovaistinė", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/Farmacity": { - "tags": { - "name": "Farmacity", - "amenity": "pharmacy" - }, - "name": "Farmacity", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/аптека": { - "tags": { - "name": "аптека", - "amenity": "pharmacy" - }, - "name": "аптека", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/The Generics Pharmacy": { - "tags": { - "name": "The Generics Pharmacy", - "amenity": "pharmacy" - }, - "name": "The Generics Pharmacy", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/Farmatodo": { - "tags": { - "name": "Farmatodo", - "amenity": "pharmacy" - }, - "name": "Farmatodo", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/Duane Reade": { - "tags": { - "name": "Duane Reade", - "amenity": "pharmacy" - }, - "name": "Duane Reade", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/Фармленд": { - "tags": { - "name": "Фармленд", - "amenity": "pharmacy" - }, - "name": "Фармленд", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/ドラッグてらしま (Drug Terashima)": { - "tags": { - "name": "ドラッグてらしま (Drug Terashima)", - "amenity": "pharmacy" - }, - "name": "ドラッグてらしま (Drug Terashima)", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/Арніка": { - "tags": { - "name": "Арніка", - "amenity": "pharmacy" - }, - "name": "Арніка", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/ავერსი (Aversi)": { - "tags": { - "name": "ავერსი (Aversi)", - "amenity": "pharmacy" - }, - "name": "ავერსი (Aversi)", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/pharmacy/Farmahorro": { - "tags": { - "name": "Farmahorro", - "amenity": "pharmacy" - }, - "name": "Farmahorro", - "icon": "pharmacy", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "amenity/cafe/Starbucks": { - "tags": { - "name": "Starbucks", - "cuisine": "coffee_shop", - "amenity": "cafe" - }, - "name": "Starbucks", - "icon": "cafe", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "internet_access", - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/cafe/Cafeteria": { - "tags": { - "name": "Cafeteria", - "amenity": "cafe" - }, - "name": "Cafeteria", - "icon": "cafe", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "internet_access", - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/cafe/Costa": { - "tags": { - "name": "Costa", - "amenity": "cafe" - }, - "name": "Costa", - "icon": "cafe", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "internet_access", - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/cafe/Caffè Nero": { - "tags": { - "name": "Caffè Nero", - "amenity": "cafe" - }, - "name": "Caffè Nero", - "icon": "cafe", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "internet_access", - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/cafe/Кафе": { - "tags": { - "name": "Кафе", - "amenity": "cafe" - }, - "name": "Кафе", - "icon": "cafe", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "internet_access", - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/cafe/Café Central": { - "tags": { - "name": "Café Central", - "amenity": "cafe" - }, - "name": "Café Central", - "icon": "cafe", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "internet_access", - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/cafe/Second Cup": { - "tags": { - "name": "Second Cup", - "amenity": "cafe" - }, - "name": "Second Cup", - "icon": "cafe", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "internet_access", - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/cafe/Dunkin Donuts": { - "tags": { - "name": "Dunkin Donuts", - "cuisine": "donut", - "amenity": "cafe" - }, - "name": "Dunkin Donuts", - "icon": "cafe", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "internet_access", - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/cafe/Espresso House": { - "tags": { - "name": "Espresso House", - "amenity": "cafe" - }, - "name": "Espresso House", - "icon": "cafe", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "internet_access", - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/cafe/Segafredo": { - "tags": { - "name": "Segafredo", - "amenity": "cafe" - }, - "name": "Segafredo", - "icon": "cafe", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "internet_access", - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/cafe/Coffee Time": { - "tags": { - "name": "Coffee Time", - "amenity": "cafe" - }, - "name": "Coffee Time", - "icon": "cafe", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "internet_access", - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/cafe/Cafe Coffee Day": { - "tags": { - "name": "Cafe Coffee Day", - "amenity": "cafe" - }, - "name": "Cafe Coffee Day", - "icon": "cafe", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "internet_access", - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/cafe/Eiscafe Venezia": { - "tags": { - "name": "Eiscafe Venezia", - "amenity": "cafe" - }, - "name": "Eiscafe Venezia", - "icon": "cafe", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "internet_access", - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/cafe/スターバックス": { - "tags": { - "name": "スターバックス", - "name:en": "Starbucks", - "amenity": "cafe" - }, - "name": "スターバックス", - "icon": "cafe", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "internet_access", - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/cafe/Шоколадница": { - "tags": { - "name": "Шоколадница", - "amenity": "cafe" - }, - "name": "Шоколадница", - "icon": "cafe", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "internet_access", - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/cafe/Pret A Manger": { - "tags": { - "name": "Pret A Manger", - "amenity": "cafe" - }, - "name": "Pret A Manger", - "icon": "cafe", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "internet_access", - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/cafe/Столовая": { - "tags": { - "name": "Столовая", - "amenity": "cafe" - }, - "name": "Столовая", - "icon": "cafe", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "internet_access", - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/cafe/ドトール": { - "tags": { - "name": "ドトール", - "name:en": "DOUTOR", - "amenity": "cafe" - }, - "name": "ドトール", - "icon": "cafe", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "internet_access", - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/cafe/Tchibo": { - "tags": { - "name": "Tchibo", - "amenity": "cafe" - }, - "name": "Tchibo", - "icon": "cafe", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "internet_access", - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/cafe/Кофе Хауз": { - "tags": { - "name": "Кофе Хауз", - "amenity": "cafe" - }, - "name": "Кофе Хауз", - "icon": "cafe", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "internet_access", - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/cafe/Caribou Coffee": { - "tags": { - "name": "Caribou Coffee", - "amenity": "cafe" - }, - "name": "Caribou Coffee", - "icon": "cafe", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "internet_access", - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/cafe/Уют": { - "tags": { - "name": "Уют", - "amenity": "cafe" - }, - "name": "Уют", - "icon": "cafe", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "internet_access", - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/cafe/Шашлычная": { - "tags": { - "name": "Шашлычная", - "amenity": "cafe" - }, - "name": "Шашлычная", - "icon": "cafe", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "internet_access", - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/cafe/คาเฟ่ อเมซอน": { - "tags": { - "name": "คาเฟ่ อเมซอน", - "amenity": "cafe" - }, - "name": "คาเฟ่ อเมซอน", - "icon": "cafe", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "internet_access", - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/cafe/Traveler's Coffee": { - "tags": { - "name": "Traveler's Coffee", - "amenity": "cafe" - }, - "name": "Traveler's Coffee", - "icon": "cafe", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "internet_access", - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/cafe/カフェ・ド・クリエ": { - "tags": { - "name": "カフェ・ド・クリエ", - "name:en": "Cafe de CRIE", - "amenity": "cafe" - }, - "name": "カフェ・ド・クリエ", - "icon": "cafe", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "internet_access", - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "amenity/cafe/Cafe Amazon": { - "tags": { - "name": "Cafe Amazon", - "amenity": "cafe" - }, - "name": "Cafe Amazon", - "icon": "cafe", - "geometry": [ - "point", - "area" - ], - "fields": [ - "cuisine", - "internet_access", - "address", - "building_area", - "opening_hours", - "smoking" - ], - "suggestion": true - }, - "shop/supermarket/Budgens": { - "tags": { - "name": "Budgens", - "shop": "supermarket" - }, - "name": "Budgens", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Morrisons": { - "tags": { - "name": "Morrisons", - "shop": "supermarket" - }, - "name": "Morrisons", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Interspar": { - "tags": { - "name": "Interspar", - "shop": "supermarket" - }, - "name": "Interspar", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Merkur": { - "tags": { - "name": "Merkur", - "shop": "supermarket" - }, - "name": "Merkur", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Sainsbury's": { - "tags": { - "name": "Sainsbury's", - "shop": "supermarket" - }, - "name": "Sainsbury's", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Lidl": { - "tags": { - "name": "Lidl", - "shop": "supermarket" - }, - "name": "Lidl", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Edeka": { - "tags": { - "name": "Edeka", - "shop": "supermarket" - }, - "name": "Edeka", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Coles": { - "tags": { - "name": "Coles", - "shop": "supermarket" - }, - "name": "Coles", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Iceland": { - "tags": { - "name": "Iceland", - "shop": "supermarket" - }, - "name": "Iceland", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Coop": { - "tags": { - "name": "Coop", - "shop": "supermarket" - }, - "name": "Coop", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Tesco": { - "tags": { - "name": "Tesco", - "shop": "supermarket" - }, - "name": "Tesco", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Woolworths": { - "tags": { - "name": "Woolworths", - "shop": "supermarket" - }, - "name": "Woolworths", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Zielpunkt": { - "tags": { - "name": "Zielpunkt", - "shop": "supermarket" - }, - "name": "Zielpunkt", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Nahkauf": { - "tags": { - "name": "Nahkauf", - "shop": "supermarket" - }, - "name": "Nahkauf", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Billa": { - "tags": { - "name": "Billa", - "shop": "supermarket" - }, - "name": "Billa", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Kaufland": { - "tags": { - "name": "Kaufland", - "shop": "supermarket" - }, - "name": "Kaufland", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Plus": { - "tags": { - "name": "Plus", - "shop": "supermarket" - }, - "name": "Plus", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/ALDI": { - "tags": { - "name": "ALDI", - "shop": "supermarket" - }, - "name": "ALDI", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Checkers": { - "tags": { - "name": "Checkers", - "shop": "supermarket" - }, - "name": "Checkers", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Tesco Metro": { - "tags": { - "name": "Tesco Metro", - "shop": "supermarket" - }, - "name": "Tesco Metro", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/NP": { - "tags": { - "name": "NP", - "shop": "supermarket" - }, - "name": "NP", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Penny": { - "tags": { - "name": "Penny", - "shop": "supermarket" - }, - "name": "Penny", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Norma": { - "tags": { - "name": "Norma", - "shop": "supermarket" - }, - "name": "Norma", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Asda": { - "tags": { - "name": "Asda", - "shop": "supermarket" - }, - "name": "Asda", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Netto": { - "tags": { - "name": "Netto", - "shop": "supermarket" - }, - "name": "Netto", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Rewe": { - "tags": { - "name": "Rewe", - "shop": "supermarket" - }, - "name": "Rewe", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Aldi Süd": { - "tags": { - "name": "Aldi Süd", - "shop": "supermarket" - }, - "name": "Aldi Süd", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Real": { - "tags": { - "name": "Real", - "shop": "supermarket" - }, - "name": "Real", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/King Soopers": { - "tags": { - "name": "King Soopers", - "shop": "supermarket" - }, - "name": "King Soopers", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Kiwi": { - "tags": { - "name": "Kiwi", - "shop": "supermarket" - }, - "name": "Kiwi", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Pick n Pay": { - "tags": { - "name": "Pick n Pay", - "shop": "supermarket" - }, - "name": "Pick n Pay", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/ICA": { - "tags": { - "name": "ICA", - "shop": "supermarket" - }, - "name": "ICA", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Tengelmann": { - "tags": { - "name": "Tengelmann", - "shop": "supermarket" - }, - "name": "Tengelmann", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Carrefour": { - "tags": { - "name": "Carrefour", - "shop": "supermarket" - }, - "name": "Carrefour", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Waitrose": { - "tags": { - "name": "Waitrose", - "shop": "supermarket" - }, - "name": "Waitrose", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Spar": { - "tags": { - "name": "Spar", - "shop": "supermarket" - }, - "name": "Spar", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Hofer": { - "tags": { - "name": "Hofer", - "shop": "supermarket" - }, - "name": "Hofer", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/M-Preis": { - "tags": { - "name": "M-Preis", - "shop": "supermarket" - }, - "name": "M-Preis", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/tegut": { - "tags": { - "name": "tegut", - "shop": "supermarket" - }, - "name": "tegut", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Sainsbury's Local": { - "tags": { - "name": "Sainsbury's Local", - "shop": "supermarket" - }, - "name": "Sainsbury's Local", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/E-Center": { - "tags": { - "name": "E-Center", - "shop": "supermarket" - }, - "name": "E-Center", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Aldi Nord": { - "tags": { - "name": "Aldi Nord", - "shop": "supermarket" - }, - "name": "Aldi Nord", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/nahkauf": { - "tags": { - "name": "nahkauf", - "shop": "supermarket" - }, - "name": "nahkauf", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Meijer": { - "tags": { - "name": "Meijer", - "shop": "supermarket" - }, - "name": "Meijer", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Safeway": { - "tags": { - "name": "Safeway", - "shop": "supermarket" - }, - "name": "Safeway", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Costco": { - "tags": { - "name": "Costco", - "shop": "supermarket" - }, - "name": "Costco", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Albert": { - "tags": { - "name": "Albert", - "shop": "supermarket" - }, - "name": "Albert", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Jumbo": { - "tags": { - "name": "Jumbo", - "shop": "supermarket" - }, - "name": "Jumbo", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Shoprite": { - "tags": { - "name": "Shoprite", - "shop": "supermarket" - }, - "name": "Shoprite", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/MPreis": { - "tags": { - "name": "MPreis", - "shop": "supermarket" - }, - "name": "MPreis", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Penny Market": { - "tags": { - "name": "Penny Market", - "shop": "supermarket" - }, - "name": "Penny Market", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Tesco Extra": { - "tags": { - "name": "Tesco Extra", - "shop": "supermarket" - }, - "name": "Tesco Extra", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Albert Heijn": { - "tags": { - "name": "Albert Heijn", - "shop": "supermarket" - }, - "name": "Albert Heijn", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/IGA": { - "tags": { - "name": "IGA", - "shop": "supermarket" - }, - "name": "IGA", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Super U": { - "tags": { - "name": "Super U", - "shop": "supermarket" - }, - "name": "Super U", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Metro": { - "tags": { - "name": "Metro", - "shop": "supermarket" - }, - "name": "Metro", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Neukauf": { - "tags": { - "name": "Neukauf", - "shop": "supermarket" - }, - "name": "Neukauf", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Migros": { - "tags": { - "name": "Migros", - "shop": "supermarket" - }, - "name": "Migros", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Marktkauf": { - "tags": { - "name": "Marktkauf", - "shop": "supermarket" - }, - "name": "Marktkauf", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Delikatesy Centrum": { - "tags": { - "name": "Delikatesy Centrum", - "shop": "supermarket" - }, - "name": "Delikatesy Centrum", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/C1000": { - "tags": { - "name": "C1000", - "shop": "supermarket" - }, - "name": "C1000", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Hoogvliet": { - "tags": { - "name": "Hoogvliet", - "shop": "supermarket" - }, - "name": "Hoogvliet", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Food Basics": { - "tags": { - "name": "Food Basics", - "shop": "supermarket" - }, - "name": "Food Basics", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Casino": { - "tags": { - "name": "Casino", - "shop": "supermarket" - }, - "name": "Casino", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Penny Markt": { - "tags": { - "name": "Penny Markt", - "shop": "supermarket" - }, - "name": "Penny Markt", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Giant": { - "tags": { - "name": "Giant", - "shop": "supermarket" - }, - "name": "Giant", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Rema 1000": { - "tags": { - "name": "Rema 1000", - "shop": "supermarket" - }, - "name": "Rema 1000", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Kaufpark": { - "tags": { - "name": "Kaufpark", - "shop": "supermarket" - }, - "name": "Kaufpark", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/ALDI SÜD": { - "tags": { - "name": "ALDI SÜD", - "shop": "supermarket" - }, - "name": "ALDI SÜD", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Simply Market": { - "tags": { - "name": "Simply Market", - "shop": "supermarket" - }, - "name": "Simply Market", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Konzum": { - "tags": { - "name": "Konzum", - "shop": "supermarket" - }, - "name": "Konzum", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Carrefour Express": { - "tags": { - "name": "Carrefour Express", - "shop": "supermarket" - }, - "name": "Carrefour Express", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Eurospar": { - "tags": { - "name": "Eurospar", - "shop": "supermarket" - }, - "name": "Eurospar", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Mercator": { - "tags": { - "name": "Mercator", - "shop": "supermarket" - }, - "name": "Mercator", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Famila": { - "tags": { - "name": "Famila", - "shop": "supermarket" - }, - "name": "Famila", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Hemköp": { - "tags": { - "name": "Hemköp", - "shop": "supermarket" - }, - "name": "Hemköp", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/real,-": { - "tags": { - "name": "real,-", - "shop": "supermarket" - }, - "name": "real,-", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Markant": { - "tags": { - "name": "Markant", - "shop": "supermarket" - }, - "name": "Markant", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Volg": { - "tags": { - "name": "Volg", - "shop": "supermarket" - }, - "name": "Volg", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Leader Price": { - "tags": { - "name": "Leader Price", - "shop": "supermarket" - }, - "name": "Leader Price", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Treff 3000": { - "tags": { - "name": "Treff 3000", - "shop": "supermarket" - }, - "name": "Treff 3000", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/SuperBrugsen": { - "tags": { - "name": "SuperBrugsen", - "shop": "supermarket" - }, - "name": "SuperBrugsen", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Kaiser's": { - "tags": { - "name": "Kaiser's", - "shop": "supermarket" - }, - "name": "Kaiser's", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/K+K": { - "tags": { - "name": "K+K", - "shop": "supermarket" - }, - "name": "K+K", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Unimarkt": { - "tags": { - "name": "Unimarkt", - "shop": "supermarket" - }, - "name": "Unimarkt", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Carrefour City": { - "tags": { - "name": "Carrefour City", - "shop": "supermarket" - }, - "name": "Carrefour City", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Sobeys": { - "tags": { - "name": "Sobeys", - "shop": "supermarket" - }, - "name": "Sobeys", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/S-Market": { - "tags": { - "name": "S-Market", - "shop": "supermarket" - }, - "name": "S-Market", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Combi": { - "tags": { - "name": "Combi", - "shop": "supermarket" - }, - "name": "Combi", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Denner": { - "tags": { - "name": "Denner", - "shop": "supermarket" - }, - "name": "Denner", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Konsum": { - "tags": { - "name": "Konsum", - "shop": "supermarket" - }, - "name": "Konsum", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Franprix": { - "tags": { - "name": "Franprix", - "shop": "supermarket" - }, - "name": "Franprix", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Monoprix": { - "tags": { - "name": "Monoprix", - "shop": "supermarket" - }, - "name": "Monoprix", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Diska": { - "tags": { - "name": "Diska", - "shop": "supermarket" - }, - "name": "Diska", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/PENNY": { - "tags": { - "name": "PENNY", - "shop": "supermarket" - }, - "name": "PENNY", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Dia": { - "tags": { - "name": "Dia", - "shop": "supermarket" - }, - "name": "Dia", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Giant Eagle": { - "tags": { - "name": "Giant Eagle", - "shop": "supermarket" - }, - "name": "Giant Eagle", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/NORMA": { - "tags": { - "name": "NORMA", - "shop": "supermarket" - }, - "name": "NORMA", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/AD Delhaize": { - "tags": { - "name": "AD Delhaize", - "shop": "supermarket" - }, - "name": "AD Delhaize", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Auchan": { - "tags": { - "name": "Auchan", - "shop": "supermarket" - }, - "name": "Auchan", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Mercadona": { - "tags": { - "name": "Mercadona", - "shop": "supermarket" - }, - "name": "Mercadona", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Consum": { - "tags": { - "name": "Consum", - "shop": "supermarket" - }, - "name": "Consum", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Carrefour Market": { - "tags": { - "name": "Carrefour Market", - "shop": "supermarket" - }, - "name": "Carrefour Market", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Whole Foods": { - "tags": { - "name": "Whole Foods", - "shop": "supermarket" - }, - "name": "Whole Foods", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Pam": { - "tags": { - "name": "Pam", - "shop": "supermarket" - }, - "name": "Pam", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/sky": { - "tags": { - "name": "sky", - "shop": "supermarket" - }, - "name": "sky", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Despar": { - "tags": { - "name": "Despar", - "shop": "supermarket" - }, - "name": "Despar", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Eroski": { - "tags": { - "name": "Eroski", - "shop": "supermarket" - }, - "name": "Eroski", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Maxi": { - "tags": { - "name": "Maxi", - "shop": "supermarket" - }, - "name": "Maxi", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Colruyt": { - "tags": { - "name": "Colruyt", - "shop": "supermarket" - }, - "name": "Colruyt", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/The Co-operative": { - "tags": { - "name": "The Co-operative", - "shop": "supermarket" - }, - "name": "The Co-operative", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Intermarché": { - "tags": { - "name": "Intermarché", - "shop": "supermarket" - }, - "name": "Intermarché", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Delhaize": { - "tags": { - "name": "Delhaize", - "shop": "supermarket" - }, - "name": "Delhaize", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/CBA": { - "tags": { - "name": "CBA", - "shop": "supermarket" - }, - "name": "CBA", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Shopi": { - "tags": { - "name": "Shopi", - "shop": "supermarket" - }, - "name": "Shopi", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Walmart": { - "tags": { - "name": "Walmart", - "shop": "supermarket" - }, - "name": "Walmart", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Kroger": { - "tags": { - "name": "Kroger", - "shop": "supermarket" - }, - "name": "Kroger", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Albertsons": { - "tags": { - "name": "Albertsons", - "shop": "supermarket" - }, - "name": "Albertsons", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Trader Joe's": { - "tags": { - "name": "Trader Joe's", - "shop": "supermarket" - }, - "name": "Trader Joe's", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Feneberg": { - "tags": { - "name": "Feneberg", - "shop": "supermarket" - }, - "name": "Feneberg", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/denn's Biomarkt": { - "tags": { - "name": "denn's Biomarkt", - "shop": "supermarket" - }, - "name": "denn's Biomarkt", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Kvickly": { - "tags": { - "name": "Kvickly", - "shop": "supermarket" - }, - "name": "Kvickly", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Makro": { - "tags": { - "name": "Makro", - "shop": "supermarket" - }, - "name": "Makro", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Dico": { - "tags": { - "name": "Dico", - "shop": "supermarket" - }, - "name": "Dico", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Nah & Frisch": { - "tags": { - "name": "Nah & Frisch", - "shop": "supermarket" - }, - "name": "Nah & Frisch", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Champion": { - "tags": { - "name": "Champion", - "shop": "supermarket" - }, - "name": "Champion", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/ICA Supermarket": { - "tags": { - "name": "ICA Supermarket", - "shop": "supermarket" - }, - "name": "ICA Supermarket", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Fakta": { - "tags": { - "name": "Fakta", - "shop": "supermarket" - }, - "name": "Fakta", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Магнит": { - "tags": { - "name": "Магнит", - "shop": "supermarket" - }, - "name": "Магнит", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Caprabo": { - "tags": { - "name": "Caprabo", - "shop": "supermarket" - }, - "name": "Caprabo", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Famiglia Cooperativa": { - "tags": { - "name": "Famiglia Cooperativa", - "shop": "supermarket" - }, - "name": "Famiglia Cooperativa", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Народная 7Я семьЯ": { - "tags": { - "name": "Народная 7Я семьЯ", - "shop": "supermarket" - }, - "name": "Народная 7Я семьЯ", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Esselunga": { - "tags": { - "name": "Esselunga", - "shop": "supermarket" - }, - "name": "Esselunga", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Maxima": { - "tags": { - "name": "Maxima", - "shop": "supermarket" - }, - "name": "Maxima", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Wasgau": { - "tags": { - "name": "Wasgau", - "shop": "supermarket" - }, - "name": "Wasgau", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Pingo Doce": { - "tags": { - "name": "Pingo Doce", - "shop": "supermarket" - }, - "name": "Pingo Doce", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Match": { - "tags": { - "name": "Match", - "shop": "supermarket" - }, - "name": "Match", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Profi": { - "tags": { - "name": "Profi", - "shop": "supermarket" - }, - "name": "Profi", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Lider": { - "tags": { - "name": "Lider", - "shop": "supermarket" - }, - "name": "Lider", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Unimarc": { - "tags": { - "name": "Unimarc", - "shop": "supermarket" - }, - "name": "Unimarc", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/The Co-operative Food": { - "tags": { - "name": "The Co-operative Food", - "shop": "supermarket" - }, - "name": "The Co-operative Food", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Santa Isabel": { - "tags": { - "name": "Santa Isabel", - "shop": "supermarket" - }, - "name": "Santa Isabel", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Седьмой континент": { - "tags": { - "name": "Седьмой континент", - "shop": "supermarket" - }, - "name": "Седьмой континент", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/HIT": { - "tags": { - "name": "HIT", - "shop": "supermarket" - }, - "name": "HIT", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Rimi": { - "tags": { - "name": "Rimi", - "shop": "supermarket" - }, - "name": "Rimi", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Conad": { - "tags": { - "name": "Conad", - "shop": "supermarket" - }, - "name": "Conad", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Фуршет": { - "tags": { - "name": "Фуршет", - "shop": "supermarket" - }, - "name": "Фуршет", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Willys": { - "tags": { - "name": "Willys", - "shop": "supermarket" - }, - "name": "Willys", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Farmfoods": { - "tags": { - "name": "Farmfoods", - "shop": "supermarket" - }, - "name": "Farmfoods", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/U Express": { - "tags": { - "name": "U Express", - "shop": "supermarket" - }, - "name": "U Express", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Фора": { - "tags": { - "name": "Фора", - "shop": "supermarket" - }, - "name": "Фора", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Dunnes Stores": { - "tags": { - "name": "Dunnes Stores", - "shop": "supermarket" - }, - "name": "Dunnes Stores", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Сільпо": { - "tags": { - "name": "Сільпо", - "shop": "supermarket" - }, - "name": "Сільпо", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/マルエツ": { - "tags": { - "name": "マルエツ", - "shop": "supermarket" - }, - "name": "マルエツ", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Piggly Wiggly": { - "tags": { - "name": "Piggly Wiggly", - "shop": "supermarket" - }, - "name": "Piggly Wiggly", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Crai": { - "tags": { - "name": "Crai", - "shop": "supermarket" - }, - "name": "Crai", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/El Árbol": { - "tags": { - "name": "El Árbol", - "shop": "supermarket" - }, - "name": "El Árbol", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Centre Commercial E. Leclerc": { - "tags": { - "name": "Centre Commercial E. Leclerc", - "shop": "supermarket" - }, - "name": "Centre Commercial E. Leclerc", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Foodland": { - "tags": { - "name": "Foodland", - "shop": "supermarket" - }, - "name": "Foodland", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Super Brugsen": { - "tags": { - "name": "Super Brugsen", - "shop": "supermarket" - }, - "name": "Super Brugsen", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Дикси": { - "tags": { - "name": "Дикси", - "shop": "supermarket" - }, - "name": "Дикси", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Пятёрочка": { - "tags": { - "name": "Пятёрочка", - "shop": "supermarket" - }, - "name": "Пятёрочка", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Publix": { - "tags": { - "name": "Publix", - "shop": "supermarket" - }, - "name": "Publix", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Føtex": { - "tags": { - "name": "Føtex", - "shop": "supermarket" - }, - "name": "Føtex", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/coop": { - "tags": { - "name": "coop", - "shop": "supermarket" - }, - "name": "coop", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Coop Konsum": { - "tags": { - "name": "Coop Konsum", - "shop": "supermarket" - }, - "name": "Coop Konsum", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Carrefour Contact": { - "tags": { - "name": "Carrefour Contact", - "shop": "supermarket" - }, - "name": "Carrefour Contact", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/No Frills": { - "tags": { - "name": "No Frills", - "shop": "supermarket" - }, - "name": "No Frills", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Plodine": { - "tags": { - "name": "Plodine", - "shop": "supermarket" - }, - "name": "Plodine", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/ADEG": { - "tags": { - "name": "ADEG", - "shop": "supermarket" - }, - "name": "ADEG", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Minipreço": { - "tags": { - "name": "Minipreço", - "shop": "supermarket" - }, - "name": "Minipreço", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Biedronka": { - "tags": { - "name": "Biedronka", - "shop": "supermarket" - }, - "name": "Biedronka", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Eurospin": { - "tags": { - "name": "Eurospin", - "shop": "supermarket" - }, - "name": "Eurospin", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Семья": { - "tags": { - "name": "Семья", - "shop": "supermarket" - }, - "name": "Семья", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Gadis": { - "tags": { - "name": "Gadis", - "shop": "supermarket" - }, - "name": "Gadis", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Евроопт": { - "tags": { - "name": "Евроопт", - "shop": "supermarket" - }, - "name": "Евроопт", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Квартал": { - "tags": { - "name": "Квартал", - "shop": "supermarket" - }, - "name": "Квартал", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/New World": { - "tags": { - "name": "New World", - "shop": "supermarket" - }, - "name": "New World", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Countdown": { - "tags": { - "name": "Countdown", - "shop": "supermarket" - }, - "name": "Countdown", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Reliance Fresh": { - "tags": { - "name": "Reliance Fresh", - "shop": "supermarket" - }, - "name": "Reliance Fresh", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Stokrotka": { - "tags": { - "name": "Stokrotka", - "shop": "supermarket" - }, - "name": "Stokrotka", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Coop Jednota": { - "tags": { - "name": "Coop Jednota", - "shop": "supermarket" - }, - "name": "Coop Jednota", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Fred Meyer": { - "tags": { - "name": "Fred Meyer", - "shop": "supermarket" - }, - "name": "Fred Meyer", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Irma": { - "tags": { - "name": "Irma", - "shop": "supermarket" - }, - "name": "Irma", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Continente": { - "tags": { - "name": "Continente", - "shop": "supermarket" - }, - "name": "Continente", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Price Chopper": { - "tags": { - "name": "Price Chopper", - "shop": "supermarket" - }, - "name": "Price Chopper", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Game": { - "tags": { - "name": "Game", - "shop": "supermarket" - }, - "name": "Game", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Soriana": { - "tags": { - "name": "Soriana", - "shop": "supermarket" - }, - "name": "Soriana", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Alimerka": { - "tags": { - "name": "Alimerka", - "shop": "supermarket" - }, - "name": "Alimerka", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Piotr i Paweł": { - "tags": { - "name": "Piotr i Paweł", - "shop": "supermarket" - }, - "name": "Piotr i Paweł", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Перекресток": { - "tags": { - "name": "Перекресток", - "shop": "supermarket" - }, - "name": "Перекресток", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Maxima X": { - "tags": { - "name": "Maxima X", - "shop": "supermarket" - }, - "name": "Maxima X", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Карусель": { - "tags": { - "name": "Карусель", - "shop": "supermarket" - }, - "name": "Карусель", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/ALDI Nord": { - "tags": { - "name": "ALDI Nord", - "shop": "supermarket" - }, - "name": "ALDI Nord", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Condis": { - "tags": { - "name": "Condis", - "shop": "supermarket" - }, - "name": "Condis", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Sam's Club": { - "tags": { - "name": "Sam's Club", - "shop": "supermarket" - }, - "name": "Sam's Club", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Копейка": { - "tags": { - "name": "Копейка", - "shop": "supermarket" - }, - "name": "Копейка", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Géant Casino": { - "tags": { - "name": "Géant Casino", - "shop": "supermarket" - }, - "name": "Géant Casino", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/ASDA": { - "tags": { - "name": "ASDA", - "shop": "supermarket" - }, - "name": "ASDA", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Intermarche": { - "tags": { - "name": "Intermarche", - "shop": "supermarket" - }, - "name": "Intermarche", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Stop & Shop": { - "tags": { - "name": "Stop & Shop", - "shop": "supermarket" - }, - "name": "Stop & Shop", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Food Lion": { - "tags": { - "name": "Food Lion", - "shop": "supermarket" - }, - "name": "Food Lion", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Harris Teeter": { - "tags": { - "name": "Harris Teeter", - "shop": "supermarket" - }, - "name": "Harris Teeter", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Foodworks": { - "tags": { - "name": "Foodworks", - "shop": "supermarket" - }, - "name": "Foodworks", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Polo Market": { - "tags": { - "name": "Polo Market", - "shop": "supermarket" - }, - "name": "Polo Market", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Лента": { - "tags": { - "name": "Лента", - "shop": "supermarket" - }, - "name": "Лента", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/西友 (SEIYU)": { - "tags": { - "name": "西友 (SEIYU)", - "shop": "supermarket" - }, - "name": "西友 (SEIYU)", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/H-E-B": { - "tags": { - "name": "H-E-B", - "shop": "supermarket" - }, - "name": "H-E-B", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Атак": { - "tags": { - "name": "Атак", - "shop": "supermarket" - }, - "name": "Атак", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Полушка": { - "tags": { - "name": "Полушка", - "shop": "supermarket" - }, - "name": "Полушка", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Extra": { - "tags": { - "name": "Extra", - "shop": "supermarket" - }, - "name": "Extra", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Sigma": { - "tags": { - "name": "Sigma", - "shop": "supermarket" - }, - "name": "Sigma", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/АТБ": { - "tags": { - "name": "АТБ", - "shop": "supermarket" - }, - "name": "АТБ", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Bodega Aurrera": { - "tags": { - "name": "Bodega Aurrera", - "shop": "supermarket" - }, - "name": "Bodega Aurrera", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Tesco Lotus": { - "tags": { - "name": "Tesco Lotus", - "shop": "supermarket" - }, - "name": "Tesco Lotus", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Мария-Ра": { - "tags": { - "name": "Мария-Ра", - "shop": "supermarket" - }, - "name": "Мария-Ра", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Магнолия": { - "tags": { - "name": "Магнолия", - "shop": "supermarket" - }, - "name": "Магнолия", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Монетка": { - "tags": { - "name": "Монетка", - "shop": "supermarket" - }, - "name": "Монетка", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Hy-Vee": { - "tags": { - "name": "Hy-Vee", - "shop": "supermarket" - }, - "name": "Hy-Vee", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Walmart Supercenter": { - "tags": { - "name": "Walmart Supercenter", - "shop": "supermarket" - }, - "name": "Walmart Supercenter", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Hannaford": { - "tags": { - "name": "Hannaford", - "shop": "supermarket" - }, - "name": "Hannaford", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Wegmans": { - "tags": { - "name": "Wegmans", - "shop": "supermarket" - }, - "name": "Wegmans", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/業務スーパー": { - "tags": { - "name": "業務スーパー", - "shop": "supermarket" - }, - "name": "業務スーパー", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Norfa XL": { - "tags": { - "name": "Norfa XL", - "shop": "supermarket" - }, - "name": "Norfa XL", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/ヨークマート (YorkMart)": { - "tags": { - "name": "ヨークマート (YorkMart)", - "shop": "supermarket" - }, - "name": "ヨークマート (YorkMart)", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/supermarket/Leclerc Drive": { - "tags": { - "name": "Leclerc Drive", - "shop": "supermarket" - }, - "name": "Leclerc Drive", - "icon": "grocery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/electronics/Media Markt": { - "tags": { - "name": "Media Markt", - "shop": "electronics" - }, - "name": "Media Markt", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/electronics/Maplin": { - "tags": { - "name": "Maplin", - "shop": "electronics" - }, - "name": "Maplin", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/electronics/Best Buy": { - "tags": { - "name": "Best Buy", - "shop": "electronics" - }, - "name": "Best Buy", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/electronics/Future Shop": { - "tags": { - "name": "Future Shop", - "shop": "electronics" - }, - "name": "Future Shop", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/electronics/Saturn": { - "tags": { - "name": "Saturn", - "shop": "electronics" - }, - "name": "Saturn", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/electronics/Currys": { - "tags": { - "name": "Currys", - "shop": "electronics" - }, - "name": "Currys", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/electronics/Radio Shack": { - "tags": { - "name": "Radio Shack", - "shop": "electronics" - }, - "name": "Radio Shack", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/electronics/Euronics": { - "tags": { - "name": "Euronics", - "shop": "electronics" - }, - "name": "Euronics", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/electronics/Expert": { - "tags": { - "name": "Expert", - "shop": "electronics" - }, - "name": "Expert", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/electronics/Эльдорадо": { - "tags": { - "name": "Эльдорадо", - "shop": "electronics" - }, - "name": "Эльдорадо", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/electronics/Darty": { - "tags": { - "name": "Darty", - "shop": "electronics" - }, - "name": "Darty", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/electronics/М.Видео": { - "tags": { - "name": "М.Видео", - "shop": "electronics" - }, - "name": "М.Видео", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/electronics/ヤマダ電機": { - "tags": { - "name": "ヤマダ電機", - "shop": "electronics" - }, - "name": "ヤマダ電機", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/McColl's": { - "tags": { - "name": "McColl's", - "shop": "convenience" - }, - "name": "McColl's", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Tesco Express": { - "tags": { - "name": "Tesco Express", - "shop": "convenience" - }, - "name": "Tesco Express", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/One Stop": { - "tags": { - "name": "One Stop", - "shop": "convenience" - }, - "name": "One Stop", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Londis": { - "tags": { - "name": "Londis", - "shop": "convenience" - }, - "name": "Londis", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/7-Eleven": { - "tags": { - "name": "7-Eleven", - "shop": "convenience" - }, - "name": "7-Eleven", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Sale": { - "tags": { - "name": "Sale", - "shop": "convenience" - }, - "name": "Sale", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Siwa": { - "tags": { - "name": "Siwa", - "shop": "convenience" - }, - "name": "Siwa", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/COOP Jednota": { - "tags": { - "name": "COOP Jednota", - "shop": "convenience" - }, - "name": "COOP Jednota", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Mac's": { - "tags": { - "name": "Mac's", - "shop": "convenience" - }, - "name": "Mac's", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Alepa": { - "tags": { - "name": "Alepa", - "shop": "convenience" - }, - "name": "Alepa", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Hasty Market": { - "tags": { - "name": "Hasty Market", - "shop": "convenience" - }, - "name": "Hasty Market", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/K-Market": { - "tags": { - "name": "K-Market", - "shop": "convenience" - }, - "name": "K-Market", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Costcutter": { - "tags": { - "name": "Costcutter", - "shop": "convenience" - }, - "name": "Costcutter", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Valintatalo": { - "tags": { - "name": "Valintatalo", - "shop": "convenience" - }, - "name": "Valintatalo", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Circle K": { - "tags": { - "name": "Circle K", - "shop": "convenience" - }, - "name": "Circle K", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/セブンイレブン": { - "tags": { - "name": "セブンイレブン", - "name:en": "7-Eleven", - "shop": "convenience" - }, - "name": "セブンイレブン", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/ローソン": { - "tags": { - "name": "ローソン", - "name:en": "LAWSON", - "shop": "convenience" - }, - "name": "ローソン", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Petit Casino": { - "tags": { - "name": "Petit Casino", - "shop": "convenience" - }, - "name": "Petit Casino", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Mace": { - "tags": { - "name": "Mace", - "shop": "convenience" - }, - "name": "Mace", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Mini Market": { - "tags": { - "name": "Mini Market", - "shop": "convenience" - }, - "name": "Mini Market", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Nisa Local": { - "tags": { - "name": "Nisa Local", - "shop": "convenience" - }, - "name": "Nisa Local", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Dorfladen": { - "tags": { - "name": "Dorfladen", - "shop": "convenience" - }, - "name": "Dorfladen", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Продукты": { - "tags": { - "name": "Продукты", - "shop": "convenience" - }, - "name": "Продукты", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Mini Stop": { - "tags": { - "name": "Mini Stop", - "shop": "convenience" - }, - "name": "Mini Stop", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/LAWSON": { - "tags": { - "name": "LAWSON", - "shop": "convenience" - }, - "name": "LAWSON", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/デイリーヤマザキ": { - "tags": { - "name": "デイリーヤマザキ", - "shop": "convenience" - }, - "name": "デイリーヤマザキ", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Надежда": { - "tags": { - "name": "Надежда", - "shop": "convenience" - }, - "name": "Надежда", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Nisa": { - "tags": { - "name": "Nisa", - "shop": "convenience" - }, - "name": "Nisa", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Premier": { - "tags": { - "name": "Premier", - "shop": "convenience" - }, - "name": "Premier", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/ABC": { - "tags": { - "name": "ABC", - "shop": "convenience" - }, - "name": "ABC", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/ミニストップ": { - "tags": { - "name": "ミニストップ", - "name:en": "MINISTOP", - "shop": "convenience" - }, - "name": "ミニストップ", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/サンクス": { - "tags": { - "name": "サンクス", - "name:en": "sunkus", - "shop": "convenience" - }, - "name": "サンクス", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/スリーエフ": { - "tags": { - "name": "スリーエフ", - "shop": "convenience" - }, - "name": "スリーエフ", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/8 à Huit": { - "tags": { - "name": "8 à Huit", - "shop": "convenience" - }, - "name": "8 à Huit", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Å»abka": { - "tags": { - "name": "Å»abka", - "shop": "convenience" - }, - "name": "Å»abka", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Almacen": { - "tags": { - "name": "Almacen", - "shop": "convenience" - }, - "name": "Almacen", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Vival": { - "tags": { - "name": "Vival", - "shop": "convenience" - }, - "name": "Vival", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/FamilyMart": { - "tags": { - "name": "FamilyMart", - "shop": "convenience" - }, - "name": "FamilyMart", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/ファミリーマート": { - "tags": { - "name": "ファミリーマート", - "name:en": "FamilyMart", - "shop": "convenience" - }, - "name": "ファミリーマート", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Sunkus": { - "tags": { - "name": "Sunkus", - "shop": "convenience" - }, - "name": "Sunkus", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/セブンイレブン(Seven-Eleven)": { - "tags": { - "name": "セブンイレブン(Seven-Eleven)", - "shop": "convenience" - }, - "name": "セブンイレブン(Seven-Eleven)", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Jednota": { - "tags": { - "name": "Jednota", - "shop": "convenience" - }, - "name": "Jednota", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Магазин": { - "tags": { - "name": "Магазин", - "shop": "convenience" - }, - "name": "Магазин", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Гастроном": { - "tags": { - "name": "Гастроном", - "shop": "convenience" - }, - "name": "Гастроном", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Centra": { - "tags": { - "name": "Centra", - "shop": "convenience" - }, - "name": "Centra", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/サークルK": { - "tags": { - "name": "サークルK", - "name:en": "Circle K", - "shop": "convenience" - }, - "name": "サークルK", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Wawa": { - "tags": { - "name": "Wawa", - "shop": "convenience" - }, - "name": "Wawa", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Proxi": { - "tags": { - "name": "Proxi", - "shop": "convenience" - }, - "name": "Proxi", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Универсам": { - "tags": { - "name": "Универсам", - "shop": "convenience" - }, - "name": "Универсам", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Groszek": { - "tags": { - "name": "Groszek", - "shop": "convenience" - }, - "name": "Groszek", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Select": { - "tags": { - "name": "Select", - "shop": "convenience" - }, - "name": "Select", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Večerka": { - "tags": { - "name": "Večerka", - "shop": "convenience" - }, - "name": "Večerka", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Potraviny": { - "tags": { - "name": "Potraviny", - "shop": "convenience" - }, - "name": "Potraviny", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Смак": { - "tags": { - "name": "Смак", - "shop": "convenience" - }, - "name": "Смак", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Эконом": { - "tags": { - "name": "Эконом", - "shop": "convenience" - }, - "name": "Эконом", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Березка": { - "tags": { - "name": "Березка", - "shop": "convenience" - }, - "name": "Березка", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Społem": { - "tags": { - "name": "Społem", - "shop": "convenience" - }, - "name": "Społem", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Cumberland Farms": { - "tags": { - "name": "Cumberland Farms", - "shop": "convenience" - }, - "name": "Cumberland Farms", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Tesco Lotus Express": { - "tags": { - "name": "Tesco Lotus Express", - "shop": "convenience" - }, - "name": "Tesco Lotus Express", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Kiosk": { - "tags": { - "name": "Kiosk", - "shop": "convenience" - }, - "name": "Kiosk", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Sklep spożywczy": { - "tags": { - "name": "Sklep spożywczy", - "shop": "convenience" - }, - "name": "Sklep spożywczy", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/24 часа": { - "tags": { - "name": "24 часа", - "shop": "convenience" - }, - "name": "24 часа", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Минимаркет": { - "tags": { - "name": "Минимаркет", - "shop": "convenience" - }, - "name": "Минимаркет", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Oxxo": { - "tags": { - "name": "Oxxo", - "shop": "convenience" - }, - "name": "Oxxo", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/abc": { - "tags": { - "name": "abc", - "shop": "convenience" - }, - "name": "abc", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/7/11": { - "tags": { - "name": "7/11", - "shop": "convenience" - }, - "name": "7/11", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Stewart's": { - "tags": { - "name": "Stewart's", - "shop": "convenience" - }, - "name": "Stewart's", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Продукти": { - "tags": { - "name": "Продукти", - "shop": "convenience" - }, - "name": "Продукти", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/ローソンストア100 (LAWSON STORE 100)": { - "tags": { - "name": "ローソンストア100 (LAWSON STORE 100)", - "shop": "convenience" - }, - "name": "ローソンストア100 (LAWSON STORE 100)", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Радуга": { - "tags": { - "name": "Радуга", - "shop": "convenience" - }, - "name": "Радуга", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/ローソンストア100": { - "tags": { - "name": "ローソンストア100", - "shop": "convenience" - }, - "name": "ローソンストア100", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/เซเว่นอีเลฟเว่น": { - "tags": { - "name": "เซเว่นอีเลฟเว่น", - "shop": "convenience" - }, - "name": "เซเว่นอีเลฟเว่น", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Фортуна": { - "tags": { - "name": "Фортуна", - "shop": "convenience" - }, - "name": "Фортуна", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Picard": { - "tags": { - "name": "Picard", - "shop": "convenience" - }, - "name": "Picard", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Four Square": { - "tags": { - "name": "Four Square", - "shop": "convenience" - }, - "name": "Four Square", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Визит": { - "tags": { - "name": "Визит", - "shop": "convenience" - }, - "name": "Визит", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Авоська": { - "tags": { - "name": "Авоська", - "shop": "convenience" - }, - "name": "Авоська", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Dollar General": { - "tags": { - "name": "Dollar General", - "shop": "convenience" - }, - "name": "Dollar General", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Studenac": { - "tags": { - "name": "Studenac", - "shop": "convenience" - }, - "name": "Studenac", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Central Convenience Store": { - "tags": { - "name": "Central Convenience Store", - "shop": "convenience" - }, - "name": "Central Convenience Store", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/продукты": { - "tags": { - "name": "продукты", - "shop": "convenience" - }, - "name": "продукты", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Кулинария": { - "tags": { - "name": "Кулинария", - "shop": "convenience" - }, - "name": "Кулинария", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/全家": { - "tags": { - "name": "全家", - "shop": "convenience" - }, - "name": "全家", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Мечта": { - "tags": { - "name": "Мечта", - "shop": "convenience" - }, - "name": "Мечта", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Epicerie": { - "tags": { - "name": "Epicerie", - "shop": "convenience" - }, - "name": "Epicerie", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Кировский": { - "tags": { - "name": "Кировский", - "shop": "convenience" - }, - "name": "Кировский", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Food Mart": { - "tags": { - "name": "Food Mart", - "shop": "convenience" - }, - "name": "Food Mart", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Delikatesy": { - "tags": { - "name": "Delikatesy", - "shop": "convenience" - }, - "name": "Delikatesy", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/ポプラ": { - "tags": { - "name": "ポプラ", - "shop": "convenience" - }, - "name": "ポプラ", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Lewiatan": { - "tags": { - "name": "Lewiatan", - "shop": "convenience" - }, - "name": "Lewiatan", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Продуктовый магазин": { - "tags": { - "name": "Продуктовый магазин", - "shop": "convenience" - }, - "name": "Продуктовый магазин", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Продуктовый": { - "tags": { - "name": "Продуктовый", - "shop": "convenience" - }, - "name": "Продуктовый", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/セイコーマート (Seicomart)": { - "tags": { - "name": "セイコーマート (Seicomart)", - "shop": "convenience" - }, - "name": "セイコーマート (Seicomart)", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Виктория": { - "tags": { - "name": "Виктория", - "shop": "convenience" - }, - "name": "Виктория", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Весна": { - "tags": { - "name": "Весна", - "shop": "convenience" - }, - "name": "Весна", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Mini Market Non-Stop": { - "tags": { - "name": "Mini Market Non-Stop", - "shop": "convenience" - }, - "name": "Mini Market Non-Stop", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Копеечка": { - "tags": { - "name": "Копеечка", - "shop": "convenience" - }, - "name": "Копеечка", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Royal Farms": { - "tags": { - "name": "Royal Farms", - "shop": "convenience" - }, - "name": "Royal Farms", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Alfamart": { - "tags": { - "name": "Alfamart", - "shop": "convenience" - }, - "name": "Alfamart", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Indomaret": { - "tags": { - "name": "Indomaret", - "shop": "convenience" - }, - "name": "Indomaret", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/магазин": { - "tags": { - "name": "магазин", - "shop": "convenience" - }, - "name": "магазин", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/全家便利商店": { - "tags": { - "name": "全家便利商店", - "shop": "convenience" - }, - "name": "全家便利商店", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Boutique": { - "tags": { - "name": "Boutique", - "shop": "convenience" - }, - "name": "Boutique", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/მარკეტი (Market)": { - "tags": { - "name": "მარკეტი (Market)", - "shop": "convenience" - }, - "name": "მარკეტი (Market)", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/convenience/Stores": { - "tags": { - "name": "Stores", - "shop": "convenience" - }, - "name": "Stores", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/chemist/dm": { - "tags": { - "name": "dm", - "shop": "chemist" - }, - "name": "dm", - "icon": "chemist", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/chemist/Müller": { - "tags": { - "name": "Müller", - "shop": "chemist" - }, - "name": "Müller", - "icon": "chemist", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/chemist/Schlecker": { - "tags": { - "name": "Schlecker", - "shop": "chemist" - }, - "name": "Schlecker", - "icon": "chemist", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/chemist/Etos": { - "tags": { - "name": "Etos", - "shop": "chemist" - }, - "name": "Etos", - "icon": "chemist", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/chemist/Bipa": { - "tags": { - "name": "Bipa", - "shop": "chemist" - }, - "name": "Bipa", - "icon": "chemist", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/chemist/Rossmann": { - "tags": { - "name": "Rossmann", - "shop": "chemist" - }, - "name": "Rossmann", - "icon": "chemist", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/chemist/DM Drogeriemarkt": { - "tags": { - "name": "DM Drogeriemarkt", - "shop": "chemist" - }, - "name": "DM Drogeriemarkt", - "icon": "chemist", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/chemist/Ihr Platz": { - "tags": { - "name": "Ihr Platz", - "shop": "chemist" - }, - "name": "Ihr Platz", - "icon": "chemist", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/chemist/Douglas": { - "tags": { - "name": "Douglas", - "shop": "chemist" - }, - "name": "Douglas", - "icon": "chemist", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/chemist/Kruidvat": { - "tags": { - "name": "Kruidvat", - "shop": "chemist" - }, - "name": "Kruidvat", - "icon": "chemist", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/car_repair/Kwik Fit": { - "tags": { - "name": "Kwik Fit", - "shop": "car_repair" - }, - "name": "Kwik Fit", - "icon": "car", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/car_repair/ATU": { - "tags": { - "name": "ATU", - "shop": "car_repair" - }, - "name": "ATU", - "icon": "car", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/car_repair/Midas": { - "tags": { - "name": "Midas", - "shop": "car_repair" - }, - "name": "Midas", - "icon": "car", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/car_repair/Feu Vert": { - "tags": { - "name": "Feu Vert", - "shop": "car_repair" - }, - "name": "Feu Vert", - "icon": "car", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/car_repair/Norauto": { - "tags": { - "name": "Norauto", - "shop": "car_repair" - }, - "name": "Norauto", - "icon": "car", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/car_repair/Speedy": { - "tags": { - "name": "Speedy", - "shop": "car_repair" - }, - "name": "Speedy", - "icon": "car", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/car_repair/Pit Stop": { - "tags": { - "name": "Pit Stop", - "shop": "car_repair" - }, - "name": "Pit Stop", - "icon": "car", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/car_repair/Jiffy Lube": { - "tags": { - "name": "Jiffy Lube", - "shop": "car_repair" - }, - "name": "Jiffy Lube", - "icon": "car", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/car_repair/Шиномонтаж": { - "tags": { - "name": "Шиномонтаж", - "shop": "car_repair" - }, - "name": "Шиномонтаж", - "icon": "car", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/car_repair/СТО": { - "tags": { - "name": "СТО", - "shop": "car_repair" - }, - "name": "СТО", - "icon": "car", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/car_repair/O'Reilly Auto Parts": { - "tags": { - "name": "O'Reilly Auto Parts", - "shop": "car_repair" - }, - "name": "O'Reilly Auto Parts", - "icon": "car", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/car_repair/Carglass": { - "tags": { - "name": "Carglass", - "shop": "car_repair" - }, - "name": "Carglass", - "icon": "car", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/car_repair/шиномонтаж": { - "tags": { - "name": "шиномонтаж", - "shop": "car_repair" - }, - "name": "шиномонтаж", - "icon": "car", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/car_repair/Euromaster": { - "tags": { - "name": "Euromaster", - "shop": "car_repair" - }, - "name": "Euromaster", - "icon": "car", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/car_repair/Firestone": { - "tags": { - "name": "Firestone", - "shop": "car_repair" - }, - "name": "Firestone", - "icon": "car", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/car_repair/Автосервис": { - "tags": { - "name": "Автосервис", - "shop": "car_repair" - }, - "name": "Автосервис", - "icon": "car", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/car_repair/Advance Auto Parts": { - "tags": { - "name": "Advance Auto Parts", - "shop": "car_repair" - }, - "name": "Advance Auto Parts", - "icon": "car", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/car_repair/Roady": { - "tags": { - "name": "Roady", - "shop": "car_repair" - }, - "name": "Roady", - "icon": "car", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/furniture/IKEA": { - "tags": { - "name": "IKEA", - "shop": "furniture" - }, - "name": "IKEA", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/furniture/Jysk": { - "tags": { - "name": "Jysk", - "shop": "furniture" - }, - "name": "Jysk", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/furniture/Roller": { - "tags": { - "name": "Roller", - "shop": "furniture" - }, - "name": "Roller", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/furniture/Dänisches Bettenlager": { - "tags": { - "name": "Dänisches Bettenlager", - "shop": "furniture" - }, - "name": "Dänisches Bettenlager", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/furniture/Conforama": { - "tags": { - "name": "Conforama", - "shop": "furniture" - }, - "name": "Conforama", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/furniture/Matratzen Concord": { - "tags": { - "name": "Matratzen Concord", - "shop": "furniture" - }, - "name": "Matratzen Concord", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/furniture/Мебель": { - "tags": { - "name": "Мебель", - "shop": "furniture" - }, - "name": "Мебель", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/furniture/But": { - "tags": { - "name": "But", - "shop": "furniture" - }, - "name": "But", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/doityourself/Hornbach": { - "tags": { - "name": "Hornbach", - "shop": "doityourself" - }, - "name": "Hornbach", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/doityourself/B&Q": { - "tags": { - "name": "B&Q", - "shop": "doityourself" - }, - "name": "B&Q", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/doityourself/Hubo": { - "tags": { - "name": "Hubo", - "shop": "doityourself" - }, - "name": "Hubo", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/doityourself/Mr Bricolage": { - "tags": { - "name": "Mr Bricolage", - "shop": "doityourself" - }, - "name": "Mr Bricolage", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/doityourself/Gamma": { - "tags": { - "name": "Gamma", - "shop": "doityourself" - }, - "name": "Gamma", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/doityourself/OBI": { - "tags": { - "name": "OBI", - "shop": "doityourself" - }, - "name": "OBI", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/doityourself/Lowes": { - "tags": { - "name": "Lowes", - "shop": "doityourself" - }, - "name": "Lowes", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/doityourself/Wickes": { - "tags": { - "name": "Wickes", - "shop": "doityourself" - }, - "name": "Wickes", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/doityourself/Hagebau": { - "tags": { - "name": "Hagebau", - "shop": "doityourself" - }, - "name": "Hagebau", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/doityourself/Max Bahr": { - "tags": { - "name": "Max Bahr", - "shop": "doityourself" - }, - "name": "Max Bahr", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/doityourself/Castorama": { - "tags": { - "name": "Castorama", - "shop": "doityourself" - }, - "name": "Castorama", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/doityourself/Rona": { - "tags": { - "name": "Rona", - "shop": "doityourself" - }, - "name": "Rona", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/doityourself/Home Depot": { - "tags": { - "name": "Home Depot", - "shop": "doityourself" - }, - "name": "Home Depot", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/doityourself/Toom Baumarkt": { - "tags": { - "name": "Toom Baumarkt", - "shop": "doityourself" - }, - "name": "Toom Baumarkt", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/doityourself/Homebase": { - "tags": { - "name": "Homebase", - "shop": "doityourself" - }, - "name": "Homebase", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/doityourself/Baumax": { - "tags": { - "name": "Baumax", - "shop": "doityourself" - }, - "name": "Baumax", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/doityourself/Lagerhaus": { - "tags": { - "name": "Lagerhaus", - "shop": "doityourself" - }, - "name": "Lagerhaus", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/doityourself/Bauhaus": { - "tags": { - "name": "Bauhaus", - "shop": "doityourself" - }, - "name": "Bauhaus", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/doityourself/Canadian Tire": { - "tags": { - "name": "Canadian Tire", - "shop": "doityourself" - }, - "name": "Canadian Tire", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/doityourself/Leroy Merlin": { - "tags": { - "name": "Leroy Merlin", - "shop": "doityourself" - }, - "name": "Leroy Merlin", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/doityourself/Hellweg": { - "tags": { - "name": "Hellweg", - "shop": "doityourself" - }, - "name": "Hellweg", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/doityourself/Brico": { - "tags": { - "name": "Brico", - "shop": "doityourself" - }, - "name": "Brico", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/doityourself/Bricomarché": { - "tags": { - "name": "Bricomarché", - "shop": "doityourself" - }, - "name": "Bricomarché", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/doityourself/Toom": { - "tags": { - "name": "Toom", - "shop": "doityourself" - }, - "name": "Toom", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/doityourself/Hagebaumarkt": { - "tags": { - "name": "Hagebaumarkt", - "shop": "doityourself" - }, - "name": "Hagebaumarkt", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/doityourself/Praktiker": { - "tags": { - "name": "Praktiker", - "shop": "doityourself" - }, - "name": "Praktiker", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/doityourself/Menards": { - "tags": { - "name": "Menards", - "shop": "doityourself" - }, - "name": "Menards", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/doityourself/Weldom": { - "tags": { - "name": "Weldom", - "shop": "doityourself" - }, - "name": "Weldom", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/doityourself/Bunnings Warehouse": { - "tags": { - "name": "Bunnings Warehouse", - "shop": "doityourself" - }, - "name": "Bunnings Warehouse", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/doityourself/Ace Hardware": { - "tags": { - "name": "Ace Hardware", - "shop": "doityourself" - }, - "name": "Ace Hardware", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/doityourself/Home Hardware": { - "tags": { - "name": "Home Hardware", - "shop": "doityourself" - }, - "name": "Home Hardware", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/doityourself/Стройматериалы": { - "tags": { - "name": "Стройматериалы", - "shop": "doityourself" - }, - "name": "Стройматериалы", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/doityourself/Bricorama": { - "tags": { - "name": "Bricorama", - "shop": "doityourself" - }, - "name": "Bricorama", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/doityourself/Point P": { - "tags": { - "name": "Point P", - "shop": "doityourself" - }, - "name": "Point P", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/stationery/Staples": { - "tags": { - "name": "Staples", - "shop": "stationery" - }, - "name": "Staples", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/stationery/McPaper": { - "tags": { - "name": "McPaper", - "shop": "stationery" - }, - "name": "McPaper", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/stationery/Office Depot": { - "tags": { - "name": "Office Depot", - "shop": "stationery" - }, - "name": "Office Depot", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/stationery/Канцтовары": { - "tags": { - "name": "Канцтовары", - "shop": "stationery" - }, - "name": "Канцтовары", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/car/Skoda": { - "tags": { - "name": "Skoda", - "shop": "car" - }, - "name": "Skoda", - "icon": "car", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/car/BMW": { - "tags": { - "name": "BMW", - "shop": "car" - }, - "name": "BMW", - "icon": "car", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/car/Citroen": { - "tags": { - "name": "Citroen", - "shop": "car" - }, - "name": "Citroen", - "icon": "car", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/car/Renault": { - "tags": { - "name": "Renault", - "shop": "car" - }, - "name": "Renault", - "icon": "car", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/car/Mercedes-Benz": { - "tags": { - "name": "Mercedes-Benz", - "shop": "car" - }, - "name": "Mercedes-Benz", - "icon": "car", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/car/Volvo": { - "tags": { - "name": "Volvo", - "shop": "car" - }, - "name": "Volvo", - "icon": "car", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/car/Ford": { - "tags": { - "name": "Ford", - "shop": "car" - }, - "name": "Ford", - "icon": "car", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/car/Volkswagen": { - "tags": { - "name": "Volkswagen", - "shop": "car" - }, - "name": "Volkswagen", - "icon": "car", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/car/Mazda": { - "tags": { - "name": "Mazda", - "shop": "car" - }, - "name": "Mazda", - "icon": "car", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/car/Mitsubishi": { - "tags": { - "name": "Mitsubishi", - "shop": "car" - }, - "name": "Mitsubishi", - "icon": "car", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/car/Fiat": { - "tags": { - "name": "Fiat", - "shop": "car" - }, - "name": "Fiat", - "icon": "car", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/car/Автозапчасти": { - "tags": { - "name": "Автозапчасти", - "shop": "car" - }, - "name": "Автозапчасти", - "icon": "car", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/car/Opel": { - "tags": { - "name": "Opel", - "shop": "car" - }, - "name": "Opel", - "icon": "car", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/car/Audi": { - "tags": { - "name": "Audi", - "shop": "car" - }, - "name": "Audi", - "icon": "car", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/car/Toyota": { - "tags": { - "name": "Toyota", - "shop": "car" - }, - "name": "Toyota", - "icon": "car", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/car/Nissan": { - "tags": { - "name": "Nissan", - "shop": "car" - }, - "name": "Nissan", - "icon": "car", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/car/Suzuki": { - "tags": { - "name": "Suzuki", - "shop": "car" - }, - "name": "Suzuki", - "icon": "car", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/car/Honda": { - "tags": { - "name": "Honda", - "shop": "car" - }, - "name": "Honda", - "icon": "car", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/car/Peugeot": { - "tags": { - "name": "Peugeot", - "shop": "car" - }, - "name": "Peugeot", - "icon": "car", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/car/Hyundai": { - "tags": { - "name": "Hyundai", - "shop": "car" - }, - "name": "Hyundai", - "icon": "car", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/car/Subaru": { - "tags": { - "name": "Subaru", - "shop": "car" - }, - "name": "Subaru", - "icon": "car", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/car/Chevrolet": { - "tags": { - "name": "Chevrolet", - "shop": "car" - }, - "name": "Chevrolet", - "icon": "car", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/car/Автомагазин": { - "tags": { - "name": "Автомагазин", - "shop": "car" - }, - "name": "Автомагазин", - "icon": "car", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/Matalan": { - "tags": { - "name": "Matalan", - "shop": "clothes" - }, - "name": "Matalan", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/KiK": { - "tags": { - "name": "KiK", - "shop": "clothes" - }, - "name": "KiK", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/H&M": { - "tags": { - "name": "H&M", - "shop": "clothes" - }, - "name": "H&M", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/Urban Outfitters": { - "tags": { - "name": "Urban Outfitters", - "shop": "clothes" - }, - "name": "Urban Outfitters", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/Vögele": { - "tags": { - "name": "Vögele", - "shop": "clothes" - }, - "name": "Vögele", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/Zeeman": { - "tags": { - "name": "Zeeman", - "shop": "clothes" - }, - "name": "Zeeman", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/Takko": { - "tags": { - "name": "Takko", - "shop": "clothes" - }, - "name": "Takko", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/C&A": { - "tags": { - "name": "C&A", - "shop": "clothes" - }, - "name": "C&A", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/Zara": { - "tags": { - "name": "Zara", - "shop": "clothes" - }, - "name": "Zara", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/Vero Moda": { - "tags": { - "name": "Vero Moda", - "shop": "clothes" - }, - "name": "Vero Moda", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/NKD": { - "tags": { - "name": "NKD", - "shop": "clothes" - }, - "name": "NKD", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/Ernsting's family": { - "tags": { - "name": "Ernsting's family", - "shop": "clothes" - }, - "name": "Ernsting's family", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/Winners": { - "tags": { - "name": "Winners", - "shop": "clothes" - }, - "name": "Winners", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/River Island": { - "tags": { - "name": "River Island", - "shop": "clothes" - }, - "name": "River Island", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/Next": { - "tags": { - "name": "Next", - "shop": "clothes" - }, - "name": "Next", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/Gap": { - "tags": { - "name": "Gap", - "shop": "clothes" - }, - "name": "Gap", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/Adidas": { - "tags": { - "name": "Adidas", - "shop": "clothes" - }, - "name": "Adidas", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/Mr Price": { - "tags": { - "name": "Mr Price", - "shop": "clothes" - }, - "name": "Mr Price", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/Pep": { - "tags": { - "name": "Pep", - "shop": "clothes" - }, - "name": "Pep", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/Edgars": { - "tags": { - "name": "Edgars", - "shop": "clothes" - }, - "name": "Edgars", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/Ackermans": { - "tags": { - "name": "Ackermans", - "shop": "clothes" - }, - "name": "Ackermans", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/Truworths": { - "tags": { - "name": "Truworths", - "shop": "clothes" - }, - "name": "Truworths", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/Ross": { - "tags": { - "name": "Ross", - "shop": "clothes" - }, - "name": "Ross", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/Burton": { - "tags": { - "name": "Burton", - "shop": "clothes" - }, - "name": "Burton", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/Dorothy Perkins": { - "tags": { - "name": "Dorothy Perkins", - "shop": "clothes" - }, - "name": "Dorothy Perkins", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/Lindex": { - "tags": { - "name": "Lindex", - "shop": "clothes" - }, - "name": "Lindex", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/s.Oliver": { - "tags": { - "name": "s.Oliver", - "shop": "clothes" - }, - "name": "s.Oliver", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/Cecil": { - "tags": { - "name": "Cecil", - "shop": "clothes" - }, - "name": "Cecil", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/Dress Barn": { - "tags": { - "name": "Dress Barn", - "shop": "clothes" - }, - "name": "Dress Barn", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/Old Navy": { - "tags": { - "name": "Old Navy", - "shop": "clothes" - }, - "name": "Old Navy", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/Jack & Jones": { - "tags": { - "name": "Jack & Jones", - "shop": "clothes" - }, - "name": "Jack & Jones", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/Pimkie": { - "tags": { - "name": "Pimkie", - "shop": "clothes" - }, - "name": "Pimkie", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/Esprit": { - "tags": { - "name": "Esprit", - "shop": "clothes" - }, - "name": "Esprit", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/Primark": { - "tags": { - "name": "Primark", - "shop": "clothes" - }, - "name": "Primark", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/Bonita": { - "tags": { - "name": "Bonita", - "shop": "clothes" - }, - "name": "Bonita", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/Mexx": { - "tags": { - "name": "Mexx", - "shop": "clothes" - }, - "name": "Mexx", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/Gerry Weber": { - "tags": { - "name": "Gerry Weber", - "shop": "clothes" - }, - "name": "Gerry Weber", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/Tally Weijl": { - "tags": { - "name": "Tally Weijl", - "shop": "clothes" - }, - "name": "Tally Weijl", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/Mango": { - "tags": { - "name": "Mango", - "shop": "clothes" - }, - "name": "Mango", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/TK Maxx": { - "tags": { - "name": "TK Maxx", - "shop": "clothes" - }, - "name": "TK Maxx", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/Benetton": { - "tags": { - "name": "Benetton", - "shop": "clothes" - }, - "name": "Benetton", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/Ulla Popken": { - "tags": { - "name": "Ulla Popken", - "shop": "clothes" - }, - "name": "Ulla Popken", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/AWG": { - "tags": { - "name": "AWG", - "shop": "clothes" - }, - "name": "AWG", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/Tommy Hilfiger": { - "tags": { - "name": "Tommy Hilfiger", - "shop": "clothes" - }, - "name": "Tommy Hilfiger", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/New Yorker": { - "tags": { - "name": "New Yorker", - "shop": "clothes" - }, - "name": "New Yorker", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/Orsay": { - "tags": { - "name": "Orsay", - "shop": "clothes" - }, - "name": "Orsay", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/Jeans Fritz": { - "tags": { - "name": "Jeans Fritz", - "shop": "clothes" - }, - "name": "Jeans Fritz", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/Charles Vögele": { - "tags": { - "name": "Charles Vögele", - "shop": "clothes" - }, - "name": "Charles Vögele", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/New Look": { - "tags": { - "name": "New Look", - "shop": "clothes" - }, - "name": "New Look", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/Lacoste": { - "tags": { - "name": "Lacoste", - "shop": "clothes" - }, - "name": "Lacoste", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/Etam": { - "tags": { - "name": "Etam", - "shop": "clothes" - }, - "name": "Etam", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/Kiabi": { - "tags": { - "name": "Kiabi", - "shop": "clothes" - }, - "name": "Kiabi", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/Jack Wolfskin": { - "tags": { - "name": "Jack Wolfskin", - "shop": "clothes" - }, - "name": "Jack Wolfskin", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/American Apparel": { - "tags": { - "name": "American Apparel", - "shop": "clothes" - }, - "name": "American Apparel", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/Men's Wearhouse": { - "tags": { - "name": "Men's Wearhouse", - "shop": "clothes" - }, - "name": "Men's Wearhouse", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/Intimissimi": { - "tags": { - "name": "Intimissimi", - "shop": "clothes" - }, - "name": "Intimissimi", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/United Colors of Benetton": { - "tags": { - "name": "United Colors of Benetton", - "shop": "clothes" - }, - "name": "United Colors of Benetton", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/Jules": { - "tags": { - "name": "Jules", - "shop": "clothes" - }, - "name": "Jules", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/Second Hand": { - "tags": { - "name": "Second Hand", - "shop": "clothes" - }, - "name": "Second Hand", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/AOKI": { - "tags": { - "name": "AOKI", - "shop": "clothes" - }, - "name": "AOKI", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/Calzedonia": { - "tags": { - "name": "Calzedonia", - "shop": "clothes" - }, - "name": "Calzedonia", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/洋服の青山": { - "tags": { - "name": "洋服の青山", - "shop": "clothes" - }, - "name": "洋服の青山", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/Levi's": { - "tags": { - "name": "Levi's", - "shop": "clothes" - }, - "name": "Levi's", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/Celio": { - "tags": { - "name": "Celio", - "shop": "clothes" - }, - "name": "Celio", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/TJ Maxx": { - "tags": { - "name": "TJ Maxx", - "shop": "clothes" - }, - "name": "TJ Maxx", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/Promod": { - "tags": { - "name": "Promod", - "shop": "clothes" - }, - "name": "Promod", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/Street One": { - "tags": { - "name": "Street One", - "shop": "clothes" - }, - "name": "Street One", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/ユニクロ": { - "tags": { - "name": "ユニクロ", - "shop": "clothes" - }, - "name": "ユニクロ", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/Banana Republic": { - "tags": { - "name": "Banana Republic", - "shop": "clothes" - }, - "name": "Banana Republic", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/Одежда": { - "tags": { - "name": "Одежда", - "shop": "clothes" - }, - "name": "Одежда", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/Marshalls": { - "tags": { - "name": "Marshalls", - "shop": "clothes" - }, - "name": "Marshalls", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/La Halle": { - "tags": { - "name": "La Halle", - "shop": "clothes" - }, - "name": "La Halle", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/Peacocks": { - "tags": { - "name": "Peacocks", - "shop": "clothes" - }, - "name": "Peacocks", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/clothes/しまむら": { - "tags": { - "name": "しまむら", - "shop": "clothes" - }, - "name": "しまむら", - "icon": "clothing-store", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/books/Bruna": { - "tags": { - "name": "Bruna", - "shop": "books" - }, - "name": "Bruna", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/books/Waterstones": { - "tags": { - "name": "Waterstones", - "shop": "books" - }, - "name": "Waterstones", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/books/Libro": { - "tags": { - "name": "Libro", - "shop": "books" - }, - "name": "Libro", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/books/Barnes & Noble": { - "tags": { - "name": "Barnes & Noble", - "shop": "books" - }, - "name": "Barnes & Noble", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/books/Weltbild": { - "tags": { - "name": "Weltbild", - "shop": "books" - }, - "name": "Weltbild", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/books/Thalia": { - "tags": { - "name": "Thalia", - "shop": "books" - }, - "name": "Thalia", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/books/Книги": { - "tags": { - "name": "Книги", - "shop": "books" - }, - "name": "Книги", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/department_store/Debenhams": { - "tags": { - "name": "Debenhams", - "shop": "department_store" - }, - "name": "Debenhams", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/department_store/Karstadt": { - "tags": { - "name": "Karstadt", - "shop": "department_store" - }, - "name": "Karstadt", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/department_store/Kmart": { - "tags": { - "name": "Kmart", - "shop": "department_store" - }, - "name": "Kmart", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/department_store/Target": { - "tags": { - "name": "Target", - "shop": "department_store" - }, - "name": "Target", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/department_store/Galeria Kaufhof": { - "tags": { - "name": "Galeria Kaufhof", - "shop": "department_store" - }, - "name": "Galeria Kaufhof", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/department_store/Marks & Spencer": { - "tags": { - "name": "Marks & Spencer", - "shop": "department_store" - }, - "name": "Marks & Spencer", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/department_store/Big W": { - "tags": { - "name": "Big W", - "shop": "department_store" - }, - "name": "Big W", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/department_store/Woolworth": { - "tags": { - "name": "Woolworth", - "shop": "department_store" - }, - "name": "Woolworth", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/department_store/Универмаг": { - "tags": { - "name": "Универмаг", - "shop": "department_store" - }, - "name": "Универмаг", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/department_store/Sears": { - "tags": { - "name": "Sears", - "shop": "department_store" - }, - "name": "Sears", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/department_store/Kohl's": { - "tags": { - "name": "Kohl's", - "shop": "department_store" - }, - "name": "Kohl's", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/department_store/Macy's": { - "tags": { - "name": "Macy's", - "shop": "department_store" - }, - "name": "Macy's", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/department_store/JCPenney": { - "tags": { - "name": "JCPenney", - "shop": "department_store" - }, - "name": "JCPenney", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/alcohol/Alko": { - "tags": { - "name": "Alko", - "shop": "alcohol" - }, - "name": "Alko", - "icon": "alcohol-shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "shop/alcohol/The Beer Store": { - "tags": { - "name": "The Beer Store", - "shop": "alcohol" - }, - "name": "The Beer Store", - "icon": "alcohol-shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "shop/alcohol/Systembolaget": { - "tags": { - "name": "Systembolaget", - "shop": "alcohol" - }, - "name": "Systembolaget", - "icon": "alcohol-shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "shop/alcohol/LCBO": { - "tags": { - "name": "LCBO", - "shop": "alcohol" - }, - "name": "LCBO", - "icon": "alcohol-shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "shop/alcohol/Ароматный мир": { - "tags": { - "name": "Ароматный мир", - "shop": "alcohol" - }, - "name": "Ароматный мир", - "icon": "alcohol-shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "shop/alcohol/Bargain Booze": { - "tags": { - "name": "Bargain Booze", - "shop": "alcohol" - }, - "name": "Bargain Booze", - "icon": "alcohol-shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "shop/alcohol/Nicolas": { - "tags": { - "name": "Nicolas", - "shop": "alcohol" - }, - "name": "Nicolas", - "icon": "alcohol-shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "shop/alcohol/BWS": { - "tags": { - "name": "BWS", - "shop": "alcohol" - }, - "name": "BWS", - "icon": "alcohol-shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "shop/alcohol/Botilleria": { - "tags": { - "name": "Botilleria", - "shop": "alcohol" - }, - "name": "Botilleria", - "icon": "alcohol-shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "shop/alcohol/SAQ": { - "tags": { - "name": "SAQ", - "shop": "alcohol" - }, - "name": "SAQ", - "icon": "alcohol-shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "shop/alcohol/Gall & Gall": { - "tags": { - "name": "Gall & Gall", - "shop": "alcohol" - }, - "name": "Gall & Gall", - "icon": "alcohol-shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "shop/alcohol/Живое пиво": { - "tags": { - "name": "Живое пиво", - "shop": "alcohol" - }, - "name": "Живое пиво", - "icon": "alcohol-shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours", - "drive_through" - ], - "suggestion": true - }, - "shop/bakery/Kamps": { - "tags": { - "name": "Kamps", - "shop": "bakery" - }, - "name": "Kamps", - "icon": "bakery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/bakery/Banette": { - "tags": { - "name": "Banette", - "shop": "bakery" - }, - "name": "Banette", - "icon": "bakery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/bakery/Bäckerei Schmidt": { - "tags": { - "name": "Bäckerei Schmidt", - "shop": "bakery" - }, - "name": "Bäckerei Schmidt", - "icon": "bakery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/bakery/Anker": { - "tags": { - "name": "Anker", - "shop": "bakery" - }, - "name": "Anker", - "icon": "bakery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/bakery/Hofpfisterei": { - "tags": { - "name": "Hofpfisterei", - "shop": "bakery" - }, - "name": "Hofpfisterei", - "icon": "bakery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/bakery/Greggs": { - "tags": { - "name": "Greggs", - "shop": "bakery" - }, - "name": "Greggs", - "icon": "bakery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/bakery/Oebel": { - "tags": { - "name": "Oebel", - "shop": "bakery" - }, - "name": "Oebel", - "icon": "bakery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/bakery/Boulangerie": { - "tags": { - "name": "Boulangerie", - "shop": "bakery" - }, - "name": "Boulangerie", - "icon": "bakery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/bakery/Stadtbäckerei": { - "tags": { - "name": "Stadtbäckerei", - "shop": "bakery" - }, - "name": "Stadtbäckerei", - "icon": "bakery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/bakery/Steinecke": { - "tags": { - "name": "Steinecke", - "shop": "bakery" - }, - "name": "Steinecke", - "icon": "bakery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/bakery/Ihle": { - "tags": { - "name": "Ihle", - "shop": "bakery" - }, - "name": "Ihle", - "icon": "bakery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/bakery/Goldilocks": { - "tags": { - "name": "Goldilocks", - "shop": "bakery" - }, - "name": "Goldilocks", - "icon": "bakery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/bakery/Dat Backhus": { - "tags": { - "name": "Dat Backhus", - "shop": "bakery" - }, - "name": "Dat Backhus", - "icon": "bakery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/bakery/K&U": { - "tags": { - "name": "K&U", - "shop": "bakery" - }, - "name": "K&U", - "icon": "bakery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/bakery/Der Beck": { - "tags": { - "name": "Der Beck", - "shop": "bakery" - }, - "name": "Der Beck", - "icon": "bakery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/bakery/Thürmann": { - "tags": { - "name": "Thürmann", - "shop": "bakery" - }, - "name": "Thürmann", - "icon": "bakery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/bakery/Backwerk": { - "tags": { - "name": "Backwerk", - "shop": "bakery" - }, - "name": "Backwerk", - "icon": "bakery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/bakery/Schäfer's": { - "tags": { - "name": "Schäfer's", - "shop": "bakery" - }, - "name": "Schäfer's", - "icon": "bakery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/bakery/Panaderia": { - "tags": { - "name": "Panaderia", - "shop": "bakery" - }, - "name": "Panaderia", - "icon": "bakery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/bakery/Goeken backen": { - "tags": { - "name": "Goeken backen", - "shop": "bakery" - }, - "name": "Goeken backen", - "icon": "bakery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/bakery/Stadtbäckerei Junge": { - "tags": { - "name": "Stadtbäckerei Junge", - "shop": "bakery" - }, - "name": "Stadtbäckerei Junge", - "icon": "bakery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/bakery/Boulangerie Patisserie": { - "tags": { - "name": "Boulangerie Patisserie", - "shop": "bakery" - }, - "name": "Boulangerie Patisserie", - "icon": "bakery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/bakery/Paul": { - "tags": { - "name": "Paul", - "shop": "bakery" - }, - "name": "Paul", - "icon": "bakery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/bakery/Хлеб": { - "tags": { - "name": "Хлеб", - "shop": "bakery" - }, - "name": "Хлеб", - "icon": "bakery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/bakery/Пекарня": { - "tags": { - "name": "Пекарня", - "shop": "bakery" - }, - "name": "Пекарня", - "icon": "bakery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/bakery/Кулиничи": { - "tags": { - "name": "Кулиничи", - "shop": "bakery" - }, - "name": "Кулиничи", - "icon": "bakery", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/sports/Sports Direct": { - "tags": { - "name": "Sports Direct", - "shop": "sports" - }, - "name": "Sports Direct", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/sports/Decathlon": { - "tags": { - "name": "Decathlon", - "shop": "sports" - }, - "name": "Decathlon", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/sports/Intersport": { - "tags": { - "name": "Intersport", - "shop": "sports" - }, - "name": "Intersport", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/sports/Sports Authority": { - "tags": { - "name": "Sports Authority", - "shop": "sports" - }, - "name": "Sports Authority", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/sports/Спортмастер": { - "tags": { - "name": "Спортмастер", - "shop": "sports" - }, - "name": "Спортмастер", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/sports/Sport 2000": { - "tags": { - "name": "Sport 2000", - "shop": "sports" - }, - "name": "Sport 2000", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/sports/Dick's Sporting Goods": { - "tags": { - "name": "Dick's Sporting Goods", - "shop": "sports" - }, - "name": "Dick's Sporting Goods", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/variety_store/Tedi": { - "tags": { - "name": "Tedi", - "shop": "variety_store" - }, - "name": "Tedi", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/variety_store/Dollarama": { - "tags": { - "name": "Dollarama", - "shop": "variety_store" - }, - "name": "Dollarama", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/variety_store/Family Dollar": { - "tags": { - "name": "Family Dollar", - "shop": "variety_store" - }, - "name": "Family Dollar", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/variety_store/Dollar Tree": { - "tags": { - "name": "Dollar Tree", - "shop": "variety_store" - }, - "name": "Dollar Tree", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/pet/Fressnapf": { - "tags": { - "name": "Fressnapf", - "shop": "pet" - }, - "name": "Fressnapf", - "icon": "dog-park", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/pet/PetSmart": { - "tags": { - "name": "PetSmart", - "shop": "pet" - }, - "name": "PetSmart", - "icon": "dog-park", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/pet/Das Futterhaus": { - "tags": { - "name": "Das Futterhaus", - "shop": "pet" - }, - "name": "Das Futterhaus", - "icon": "dog-park", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/pet/Pets at Home": { - "tags": { - "name": "Pets at Home", - "shop": "pet" - }, - "name": "Pets at Home", - "icon": "dog-park", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/pet/Petco": { - "tags": { - "name": "Petco", - "shop": "pet" - }, - "name": "Petco", - "icon": "dog-park", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/pet/Зоомагазин": { - "tags": { - "name": "Зоомагазин", - "shop": "pet" - }, - "name": "Зоомагазин", - "icon": "dog-park", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/shoes/Deichmann": { - "tags": { - "name": "Deichmann", - "shop": "shoes" - }, - "name": "Deichmann", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/shoes/Reno": { - "tags": { - "name": "Reno", - "shop": "shoes" - }, - "name": "Reno", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/shoes/Ecco": { - "tags": { - "name": "Ecco", - "shop": "shoes" - }, - "name": "Ecco", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/shoes/Clarks": { - "tags": { - "name": "Clarks", - "shop": "shoes" - }, - "name": "Clarks", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/shoes/La Halle aux Chaussures": { - "tags": { - "name": "La Halle aux Chaussures", - "shop": "shoes" - }, - "name": "La Halle aux Chaussures", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/shoes/Brantano": { - "tags": { - "name": "Brantano", - "shop": "shoes" - }, - "name": "Brantano", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/shoes/Geox": { - "tags": { - "name": "Geox", - "shop": "shoes" - }, - "name": "Geox", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/shoes/Salamander": { - "tags": { - "name": "Salamander", - "shop": "shoes" - }, - "name": "Salamander", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/shoes/Обувь": { - "tags": { - "name": "Обувь", - "shop": "shoes" - }, - "name": "Обувь", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/shoes/Payless Shoe Source": { - "tags": { - "name": "Payless Shoe Source", - "shop": "shoes" - }, - "name": "Payless Shoe Source", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/shoes/Famous Footwear": { - "tags": { - "name": "Famous Footwear", - "shop": "shoes" - }, - "name": "Famous Footwear", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/shoes/Quick Schuh": { - "tags": { - "name": "Quick Schuh", - "shop": "shoes" - }, - "name": "Quick Schuh", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/shoes/Shoe Zone": { - "tags": { - "name": "Shoe Zone", - "shop": "shoes" - }, - "name": "Shoe Zone", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/shoes/Foot Locker": { - "tags": { - "name": "Foot Locker", - "shop": "shoes" - }, - "name": "Foot Locker", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/shoes/Bata": { - "tags": { - "name": "Bata", - "shop": "shoes" - }, - "name": "Bata", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/shoes/ЦентрОбувь": { - "tags": { - "name": "ЦентрОбувь", - "shop": "shoes" - }, - "name": "ЦентрОбувь", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/toys/La Grande Récré": { - "tags": { - "name": "La Grande Récré", - "shop": "toys" - }, - "name": "La Grande Récré", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/toys/Toys R Us": { - "tags": { - "name": "Toys R Us", - "shop": "toys" - }, - "name": "Toys R Us", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/toys/Intertoys": { - "tags": { - "name": "Intertoys", - "shop": "toys" - }, - "name": "Intertoys", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/toys/Детский мир": { - "tags": { - "name": "Детский мир", - "shop": "toys" - }, - "name": "Детский мир", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/toys/Игрушки": { - "tags": { - "name": "Игрушки", - "shop": "toys" - }, - "name": "Игрушки", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/travel_agency/Flight Centre": { - "tags": { - "name": "Flight Centre", - "shop": "travel_agency" - }, - "name": "Flight Centre", - "icon": "suitcase", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/travel_agency/Thomas Cook": { - "tags": { - "name": "Thomas Cook", - "shop": "travel_agency" - }, - "name": "Thomas Cook", - "icon": "suitcase", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/jewelry/Bijou Brigitte": { - "tags": { - "name": "Bijou Brigitte", - "shop": "jewelry" - }, - "name": "Bijou Brigitte", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/jewelry/Christ": { - "tags": { - "name": "Christ", - "shop": "jewelry" - }, - "name": "Christ", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/jewelry/Swarovski": { - "tags": { - "name": "Swarovski", - "shop": "jewelry" - }, - "name": "Swarovski", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/optician/Fielmann": { - "tags": { - "name": "Fielmann", - "shop": "optician" - }, - "name": "Fielmann", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/optician/Apollo Optik": { - "tags": { - "name": "Apollo Optik", - "shop": "optician" - }, - "name": "Apollo Optik", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/optician/Vision Express": { - "tags": { - "name": "Vision Express", - "shop": "optician" - }, - "name": "Vision Express", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/optician/Оптика": { - "tags": { - "name": "Оптика", - "shop": "optician" - }, - "name": "Оптика", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/optician/Optic 2000": { - "tags": { - "name": "Optic 2000", - "shop": "optician" - }, - "name": "Optic 2000", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/optician/Alain Afflelou": { - "tags": { - "name": "Alain Afflelou", - "shop": "optician" - }, - "name": "Alain Afflelou", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/optician/Specsavers": { - "tags": { - "name": "Specsavers", - "shop": "optician" - }, - "name": "Specsavers", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/optician/Krys": { - "tags": { - "name": "Krys", - "shop": "optician" - }, - "name": "Krys", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/optician/Atol": { - "tags": { - "name": "Atol", - "shop": "optician" - }, - "name": "Atol", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/video/Blockbuster": { - "tags": { - "name": "Blockbuster", - "shop": "video" - }, - "name": "Blockbuster", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/video/World of Video": { - "tags": { - "name": "World of Video", - "shop": "video" - }, - "name": "World of Video", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/mobile_phone/Билайн": { - "tags": { - "name": "Билайн", - "shop": "mobile_phone" - }, - "name": "Билайн", - "icon": "mobilephone", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/mobile_phone/ソフトバンクショップ (SoftBank shop)": { - "tags": { - "name": "ソフトバンクショップ (SoftBank shop)", - "shop": "mobile_phone" - }, - "name": "ソフトバンクショップ (SoftBank shop)", - "icon": "mobilephone", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/mobile_phone/Vodafone": { - "tags": { - "name": "Vodafone", - "shop": "mobile_phone" - }, - "name": "Vodafone", - "icon": "mobilephone", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/mobile_phone/O2": { - "tags": { - "name": "O2", - "shop": "mobile_phone" - }, - "name": "O2", - "icon": "mobilephone", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/mobile_phone/Carphone Warehouse": { - "tags": { - "name": "Carphone Warehouse", - "shop": "mobile_phone" - }, - "name": "Carphone Warehouse", - "icon": "mobilephone", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/mobile_phone/Orange": { - "tags": { - "name": "Orange", - "shop": "mobile_phone" - }, - "name": "Orange", - "icon": "mobilephone", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/mobile_phone/Verizon Wireless": { - "tags": { - "name": "Verizon Wireless", - "shop": "mobile_phone" - }, - "name": "Verizon Wireless", - "icon": "mobilephone", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/mobile_phone/Sprint": { - "tags": { - "name": "Sprint", - "shop": "mobile_phone" - }, - "name": "Sprint", - "icon": "mobilephone", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/mobile_phone/T-Mobile": { - "tags": { - "name": "T-Mobile", - "shop": "mobile_phone" - }, - "name": "T-Mobile", - "icon": "mobilephone", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/mobile_phone/МТС": { - "tags": { - "name": "МТС", - "shop": "mobile_phone" - }, - "name": "МТС", - "icon": "mobilephone", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/mobile_phone/Евросеть": { - "tags": { - "name": "Евросеть", - "shop": "mobile_phone" - }, - "name": "Евросеть", - "icon": "mobilephone", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/mobile_phone/Bell": { - "tags": { - "name": "Bell", - "shop": "mobile_phone" - }, - "name": "Bell", - "icon": "mobilephone", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/mobile_phone/The Phone House": { - "tags": { - "name": "The Phone House", - "shop": "mobile_phone" - }, - "name": "The Phone House", - "icon": "mobilephone", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/mobile_phone/SFR": { - "tags": { - "name": "SFR", - "shop": "mobile_phone" - }, - "name": "SFR", - "icon": "mobilephone", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/mobile_phone/Связной": { - "tags": { - "name": "Связной", - "shop": "mobile_phone" - }, - "name": "Связной", - "icon": "mobilephone", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/mobile_phone/Мегафон": { - "tags": { - "name": "Мегафон", - "shop": "mobile_phone" - }, - "name": "Мегафон", - "icon": "mobilephone", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/mobile_phone/AT&T": { - "tags": { - "name": "AT&T", - "shop": "mobile_phone" - }, - "name": "AT&T", - "icon": "mobilephone", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/mobile_phone/ドコモショップ (docomo shop)": { - "tags": { - "name": "ドコモショップ (docomo shop)", - "shop": "mobile_phone" - }, - "name": "ドコモショップ (docomo shop)", - "icon": "mobilephone", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/mobile_phone/au": { - "tags": { - "name": "au", - "shop": "mobile_phone" - }, - "name": "au", - "icon": "mobilephone", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/mobile_phone/Movistar": { - "tags": { - "name": "Movistar", - "shop": "mobile_phone" - }, - "name": "Movistar", - "icon": "mobilephone", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/mobile_phone/Bitė": { - "tags": { - "name": "Bitė", - "shop": "mobile_phone" - }, - "name": "Bitė", - "icon": "mobilephone", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/computer/PC World": { - "tags": { - "name": "PC World", - "shop": "computer" - }, - "name": "PC World", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/computer/DNS": { - "tags": { - "name": "DNS", - "shop": "computer" - }, - "name": "DNS", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/hairdresser/Klier": { - "tags": { - "name": "Klier", - "shop": "hairdresser" - }, - "name": "Klier", - "icon": "hairdresser", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/hairdresser/Supercuts": { - "tags": { - "name": "Supercuts", - "shop": "hairdresser" - }, - "name": "Supercuts", - "icon": "hairdresser", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/hairdresser/Hairkiller": { - "tags": { - "name": "Hairkiller", - "shop": "hairdresser" - }, - "name": "Hairkiller", - "icon": "hairdresser", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/hairdresser/Great Clips": { - "tags": { - "name": "Great Clips", - "shop": "hairdresser" - }, - "name": "Great Clips", - "icon": "hairdresser", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/hairdresser/Парикмахерская": { - "tags": { - "name": "Парикмахерская", - "shop": "hairdresser" - }, - "name": "Парикмахерская", - "icon": "hairdresser", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/hairdresser/Стиль": { - "tags": { - "name": "Стиль", - "shop": "hairdresser" - }, - "name": "Стиль", - "icon": "hairdresser", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/hairdresser/Franck Provost": { - "tags": { - "name": "Franck Provost", - "shop": "hairdresser" - }, - "name": "Franck Provost", - "icon": "hairdresser", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/hairdresser/Салон красоты": { - "tags": { - "name": "Салон красоты", - "shop": "hairdresser" - }, - "name": "Салон красоты", - "icon": "hairdresser", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/hardware/1000 мелочей": { - "tags": { - "name": "1000 мелочей", - "shop": "hardware" - }, - "name": "1000 мелочей", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/hardware/Хозтовары": { - "tags": { - "name": "Хозтовары", - "shop": "hardware" - }, - "name": "Хозтовары", - "icon": "shop", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - }, - "shop/motorcycle/Yamaha": { - "tags": { - "name": "Yamaha", - "shop": "motorcycle" - }, - "name": "Yamaha", - "icon": "scooter", - "geometry": [ - "point", - "area" - ], - "fields": [ - "operator", - "address", - "building_area", - "opening_hours" - ], - "suggestion": true - } - }, - "defaults": { - "area": [ - "category-landuse", - "category-building", - "category-water-area", - "leisure/park", - "amenity/hospital", - "amenity/place_of_worship", - "amenity/cafe", - "amenity/restaurant", - "area" - ], - "line": [ - "category-road", - "category-rail", - "category-path", - "category-water-line", - "power/line", - "line" - ], - "point": [ - "leisure/park", - "amenity/hospital", - "amenity/place_of_worship", - "amenity/cafe", - "amenity/restaurant", - "amenity/fast_food", - "amenity/bar", - "amenity/bank", - "shop/supermarket", - "point" - ], - "vertex": [ - "highway/crosswalk", - "railway/level_crossing", - "highway/traffic_signals", - "highway/turning_circle", - "highway/mini_roundabout", - "highway/motorway_junction", - "vertex" - ], - "relation": [ - "category-route", - "category-restriction", - "type/boundary", - "type/multipolygon", - "relation" - ] - }, - "categories": { - "category-building": { - "geometry": "area", - "name": "Building", - "icon": "building", - "members": [ - "building/house", - "building/apartments", - "building/commercial", - "building/industrial", - "building/residential", - "building" - ] - }, - "category-golf": { - "geometry": "area", - "name": "Golf", - "icon": "golf", - "members": [ - "golf/fairway", - "golf/green", - "golf/lateral_water_hazard", - "golf/rough", - "golf/bunker", - "golf/tee", - "golf/water_hazard" - ] - }, - "category-landuse": { - "geometry": "area", - "name": "Land Use", - "icon": "land-use", - "members": [ - "landuse/residential", - "landuse/industrial", - "landuse/commercial", - "landuse/retail", - "landuse/farmland", - "landuse/farmyard", - "landuse/forest", - "landuse/meadow", - "landuse/cemetery", - "landuse/military" - ] - }, - "category-path": { - "geometry": "line", - "name": "Path", - "icon": "category-path", - "members": [ - "highway/footway", - "highway/cycleway", - "highway/bridleway", - "highway/path", - "highway/steps" - ] - }, - "category-rail": { - "geometry": "line", - "name": "Rail", - "icon": "category-rail", - "members": [ - "railway/rail", - "railway/subway", - "railway/tram", - "railway/monorail", - "railway/disused", - "railway/abandoned" - ] - }, - "category-restriction": { - "geometry": "relation", - "name": "Restriction", - "icon": "restriction", - "members": [ - "type/restriction/no_left_turn", - "type/restriction/no_right_turn", - "type/restriction/no_straight_on", - "type/restriction/no_u_turn", - "type/restriction/only_left_turn", - "type/restriction/only_right_turn", - "type/restriction/only_straight_on", - "type/restriction" - ] - }, - "category-road": { - "geometry": "line", - "name": "Road", - "icon": "category-roads", - "members": [ - "highway/residential", - "highway/motorway", - "highway/trunk", - "highway/primary", - "highway/secondary", - "highway/tertiary", - "highway/service", - "highway/motorway_link", - "highway/trunk_link", - "highway/primary_link", - "highway/secondary_link", - "highway/tertiary_link", - "highway/unclassified", - "highway/track", - "highway/road" - ] - }, - "category-route": { - "geometry": "relation", - "name": "Route", - "icon": "route", - "members": [ - "type/route/road", - "type/route/bicycle", - "type/route/foot", - "type/route/hiking", - "type/route/bus", - "type/route/train", - "type/route/tram", - "type/route/ferry", - "type/route/power", - "type/route/pipeline", - "type/route/detour", - "type/route_master", - "type/route" - ] - }, - "category-water-area": { - "geometry": "area", - "name": "Water", - "icon": "water", - "members": [ - "natural/water/lake", - "natural/water/pond", - "natural/water/reservoir", - "natural/water" - ] - }, - "category-water-line": { - "geometry": "line", - "name": "Water", - "icon": "category-water", - "members": [ - "waterway/river", - "waterway/stream", - "waterway/canal", - "waterway/ditch", - "waterway/drain" - ] - } - }, - "fields": { - "access": { - "keys": [ - "access", - "foot", - "motor_vehicle", - "bicycle", - "horse" - ], - "reference": { - "key": "access" - }, - "type": "access", - "label": "Access", - "placeholder": "Unknown", - "strings": { - "types": { - "access": "General", - "foot": "Foot", - "motor_vehicle": "Motor Vehicles", - "bicycle": "Bicycles", - "horse": "Horses" - }, - "options": { - "yes": { - "title": "Allowed", - "description": "Access permitted by law; a right of way" - }, - "no": { - "title": "Prohibited", - "description": "Access not permitted to the general public" - }, - "permissive": { - "title": "Permissive", - "description": "Access permitted until such time as the owner revokes the permission" - }, - "private": { - "title": "Private", - "description": "Access permitted only with permission of the owner on an individual basis" - }, - "designated": { - "title": "Designated", - "description": "Access permitted according to signs or specific local laws" - }, - "destination": { - "title": "Destination", - "description": "Access permitted only to reach a destination" - } - } - } - }, - "access_simple": { - "key": "access", - "type": "combo", - "label": "Access", - "placeholder": "yes", - "options": [ - "permissive", - "private", - "customers", - "no" - ] - }, - "access_toilets": { - "key": "access", - "type": "combo", - "label": "Access", - "options": [ - "public", - "permissive", - "private", - "customers" - ] - }, - "address": { - "type": "address", - "keys": [ - "addr:housename", - "addr:housenumber", - "addr:street", - "addr:city", - "addr:postcode" - ], - "reference": { - "key": "addr" - }, - "icon": "address", - "universal": true, - "label": "Address", - "strings": { - "placeholders": { - "housename": "Housename", - "housenumber": "123", - "street": "Street", - "city": "City", - "postcode": "Postcode", - "place": "Place", - "hamlet": "Hamlet", - "suburb": "Suburb", - "subdistrict": "Subdistrict", - "district": "District", - "province": "Province", - "state": "State", - "country": "Country" - } - } - }, - "admin_level": { - "key": "admin_level", - "type": "number", - "label": "Admin Level" - }, - "aerialway": { - "key": "aerialway", - "type": "typeCombo", - "label": "Type" - }, - "aerialway/access": { - "key": "aerialway:access", - "type": "combo", - "label": "Access", - "strings": { - "options": { - "entry": "Entry", - "exit": "Exit", - "both": "Both" - } - } - }, - "aerialway/bubble": { - "key": "aerialway:bubble", - "type": "check", - "label": "Bubble" - }, - "aerialway/capacity": { - "key": "aerialway:capacity", - "type": "number", - "label": "Capacity (per hour)", - "placeholder": "500, 2500, 5000..." - }, - "aerialway/duration": { - "key": "aerialway:duration", - "type": "number", - "label": "Duration (minutes)", - "placeholder": "1, 2, 3..." - }, - "aerialway/heating": { - "key": "aerialway:heating", - "type": "check", - "label": "Heated" - }, - "aerialway/occupancy": { - "key": "aerialway:occupancy", - "type": "number", - "label": "Occupancy", - "placeholder": "2, 4, 8..." - }, - "aerialway/summer/access": { - "key": "aerialway:summer:access", - "type": "combo", - "label": "Access (summer)", - "strings": { - "options": { - "entry": "Entry", - "exit": "Exit", - "both": "Both" - } - } - }, - "aeroway": { - "key": "aeroway", - "type": "typeCombo", - "label": "Type" - }, - "amenity": { - "key": "amenity", - "type": "typeCombo", - "label": "Type" - }, - "artist": { - "key": "artist_name", - "type": "text", - "label": "Artist" - }, - "artwork_type": { - "key": "artwork_type", - "type": "combo", - "label": "Type" - }, - "atm": { - "key": "atm", - "type": "check", - "label": "ATM" - }, - "backrest": { - "key": "backrest", - "type": "check", - "label": "Backrest" - }, - "barrier": { - "key": "barrier", - "type": "typeCombo", - "label": "Type" - }, - "bench": { - "key": "bench", - "type": "check", - "label": "Bench" - }, - "bicycle_parking": { - "key": "bicycle_parking", - "type": "combo", - "label": "Type" - }, - "boundary": { - "key": "boundary", - "type": "combo", - "label": "Type" - }, - "brand": { - "key": "brand", - "type": "text", - "label": "Brand" - }, - "building": { - "key": "building", - "type": "typeCombo", - "label": "Building" - }, - "building_area": { - "key": "building", - "type": "combo", - "default": "yes", - "geometry": "area", - "label": "Building" - }, - "capacity": { - "key": "capacity", - "type": "number", - "label": "Capacity", - "placeholder": "50, 100, 200..." - }, - "cardinal_direction": { - "key": "direction", - "type": "combo", - "label": "Direction", - "strings": { - "options": { - "N": "North", - "E": "East", - "S": "South", - "W": "West", - "NE": "Northeast", - "SE": "Southeast", - "SW": "Southwest", - "NW": "Northwest", - "NNE": "North-northeast", - "ENE": "East-northeast", - "ESE": "East-southeast", - "SSE": "South-southeast", - "SSW": "South-southwest", - "WSW": "West-southwest", - "WNW": "West-northwest", - "NNW": "North-northwest" - } - } - }, - "clock_direction": { - "key": "direction", - "type": "combo", - "label": "Direction", - "strings": { - "options": { - "clockwise": "Clockwise", - "anticlockwise": "Counterclockwise" - } - } - }, - "collection_times": { - "key": "collection_times", - "type": "text", - "label": "Collection Times" - }, - "construction": { - "key": "construction", - "type": "combo", - "label": "Type" - }, - "content": { - "key": "content", - "type": "combo", - "label": "Contents" - }, - "country": { - "key": "country", - "type": "combo", - "label": "Country" - }, - "covered": { - "key": "covered", - "type": "check", - "label": "Covered" - }, - "craft": { - "key": "craft", - "type": "typeCombo", - "label": "Type" - }, - "crop": { - "key": "crop", - "type": "combo", - "label": "Crop" - }, - "crossing": { - "key": "crossing", - "type": "combo", - "label": "Type" - }, - "cuisine": { - "key": "cuisine", - "type": "combo", - "label": "Cuisine" - }, - "delivery": { - "key": "delivery", - "type": "check", - "label": "Delivery" - }, - "denomination": { - "key": "denomination", - "type": "combo", - "label": "Denomination" - }, - "denotation": { - "key": "denotation", - "type": "combo", - "label": "Denotation" - }, - "description": { - "key": "description", - "type": "textarea", - "label": "Description" - }, - "drive_through": { - "key": "drive_through", - "type": "check", - "label": "Drive-Through" - }, - "electrified": { - "key": "electrified", - "type": "combo", - "label": "Electrification", - "placeholder": "Contact Line, Electrified Rail...", - "strings": { - "options": { - "contact_line": "Contact Line", - "rail": "Electrified Rail", - "yes": "Yes (unspecified)", - "no": "No" - } - } - }, - "elevation": { - "key": "ele", - "type": "number", - "icon": "elevation", - "universal": true, - "label": "Elevation" - }, - "emergency": { - "key": "emergency", - "type": "check", - "label": "Emergency" - }, - "entrance": { - "key": "entrance", - "type": "typeCombo", - "label": "Type" - }, - "except": { - "key": "except", - "type": "combo", - "label": "Exceptions" - }, - "fax": { - "key": "fax", - "type": "tel", - "label": "Fax", - "placeholder": "+31 42 123 4567" - }, - "fee": { - "key": "fee", - "type": "check", - "label": "Fee" - }, - "fire_hydrant/type": { - "key": "fire_hydrant:type", - "type": "combo", - "label": "Type", - "strings": { - "options": { - "pillar": "Pillar/Aboveground", - "underground": "Underground", - "wall": "Wall", - "pond": "Pond" - } - } - }, - "fixme": { - "key": "fixme", - "type": "textarea", - "label": "Fix Me" - }, - "fuel": { - "key": "fuel", - "type": "combo", - "label": "Fuel" - }, - "fuel/biodiesel": { - "key": "fuel:biodiesel", - "type": "check", - "label": "Sells Biodiesel" - }, - "fuel/diesel": { - "key": "fuel:diesel", - "type": "check", - "label": "Sells Diesel" - }, - "fuel/e10": { - "key": "fuel:e10", - "type": "check", - "label": "Sells E10" - }, - "fuel/e85": { - "key": "fuel:e85", - "type": "check", - "label": "Sells E85" - }, - "fuel/lpg": { - "key": "fuel:lpg", - "type": "check", - "label": "Sells Propane" - }, - "fuel/octane_100": { - "key": "fuel:octane_100", - "type": "check", - "label": "Sells Racing Gasoline" - }, - "fuel/octane_91": { - "key": "fuel:octane_91", - "type": "check", - "label": "Sells Regular Gasoline" - }, - "fuel/octane_95": { - "key": "fuel:octane_95", - "type": "check", - "label": "Sells Midgrade Gasoline" - }, - "fuel/octane_98": { - "key": "fuel:octane_98", - "type": "check", - "label": "Sells Premium Gasoline" - }, - "gauge": { - "key": "gauge", - "type": "combo", - "label": "Gauge" - }, - "gender": { - "type": "radio", - "keys": [ - "male", - "female", - "unisex" - ], - "label": "Gender", - "placeholder": "Unknown", - "strings": { - "options": { - "male": "Male", - "female": "Female", - "unisex": "Unisex" - } - } - }, - "generator/method": { - "key": "generator:method", - "type": "combo", - "label": "Method" - }, - "generator/source": { - "key": "generator:source", - "type": "combo", - "label": "Source" - }, - "generator/type": { - "key": "generator:type", - "type": "combo", - "label": "Type" - }, - "golf_hole": { - "key": "ref", - "type": "text", - "label": "Reference", - "placeholder": "Hole number (1-18)" - }, - "handicap": { - "key": "handicap", - "type": "number", - "label": "Handicap", - "placeholder": "1-18" - }, - "highway": { - "key": "highway", - "type": "typeCombo", - "label": "Type" - }, - "historic": { - "key": "historic", - "type": "typeCombo", - "label": "Type" - }, - "hoops": { - "key": "hoops", - "type": "number", - "label": "Hoops", - "placeholder": "1, 2, 4..." - }, - "iata": { - "key": "iata", - "type": "text", - "label": "IATA" - }, - "icao": { - "key": "icao", - "type": "text", - "label": "ICAO" - }, - "incline": { - "key": "incline", - "type": "combo", - "label": "Incline" - }, - "incline_steps": { - "key": "incline", - "type": "combo", - "label": "Incline", - "strings": { - "options": { - "up": "Up", - "down": "Down" - } - } - }, - "information": { - "key": "information", - "type": "typeCombo", - "label": "Type" - }, - "internet_access": { - "key": "internet_access", - "type": "combo", - "label": "Internet Access", - "strings": { - "options": { - "yes": "Yes", - "no": "No", - "wlan": "Wifi", - "wired": "Wired", - "terminal": "Terminal" - } - } - }, - "lamp_type": { - "key": "lamp_type", - "type": "combo", - "label": "Type" - }, - "landuse": { - "key": "landuse", - "type": "typeCombo", - "label": "Type" - }, - "lanes": { - "key": "lanes", - "type": "number", - "label": "Lanes", - "placeholder": "1, 2, 3..." - }, - "layer": { - "key": "layer", - "type": "combo", - "label": "Layer" - }, - "leaf_cycle": { - "key": "leaf_cycle", - "type": "combo", - "label": "Leaf Cycle", - "strings": { - "options": { - "evergreen": "Evergreen", - "deciduous": "Deciduous", - "semi_evergreen": "Semi-Evergreen", - "semi_deciduous": "Semi-Deciduous", - "mixed": "Mixed" - } - } - }, - "leaf_type": { - "key": "leaf_type", - "type": "combo", - "label": "Leaf Type", - "strings": { - "options": { - "broadleaved": "Broadleaved", - "needleleaved": "Needleleaved", - "mixed": "Mixed", - "leafless": "Leafless" - } - } - }, - "leisure": { - "key": "leisure", - "type": "typeCombo", - "label": "Type" - }, - "length": { - "key": "length", - "type": "number", - "label": "Length (Meters)" - }, - "levels": { - "key": "building:levels", - "type": "number", - "label": "Levels", - "placeholder": "2, 4, 6..." - }, - "lit": { - "key": "lit", - "type": "check", - "label": "Lit" - }, - "location": { - "key": "location", - "type": "combo", - "label": "Location" - }, - "man_made": { - "key": "man_made", - "type": "typeCombo", - "label": "Type" - }, - "maxspeed": { - "key": "maxspeed", - "type": "maxspeed", - "label": "Speed Limit", - "placeholder": "40, 50, 60..." - }, - "mtb/scale": { - "key": "mtb:scale", - "type": "combo", - "label": "Mountain Biking Difficulty", - "placeholder": "0, 1, 2, 3...", - "strings": { - "options": { - "0": "0: Solid gravel/packed earth, no obstacles, wide curves", - "1": "1: Some loose surface, small obstacles, wide curves", - "2": "2: Much loose surface, large obstacles, easy hairpins", - "3": "3: Slippery surface, large obstacles, tight hairpins", - "4": "4: Loose surface or boulders, dangerous hairpins", - "5": "5: Maximum difficulty, boulder fields, landslides", - "6": "6: Not rideable except by the very best mountain bikers" - } - } - }, - "mtb/scale/imba": { - "key": "mtb:scale:imba", - "type": "combo", - "label": "IMBA Trail Difficulty", - "placeholder": "Easy, Medium, Difficult...", - "strings": { - "options": { - "0": "Easiest (white circle)", - "1": "Easy (green circle)", - "2": "Medium (blue square)", - "3": "Difficult (black diamond)", - "4": "Extremely Difficult (double black diamond)" - } - } - }, - "mtb/scale/uphill": { - "key": "mtb:scale:uphill", - "type": "combo", - "label": "Mountain Biking Uphill Difficulty", - "placeholder": "0, 1, 2, 3...", - "strings": { - "options": { - "0": "0: Avg. incline <10%, gravel/packed earth, no obstacles", - "1": "1: Avg. incline <15%, gravel/packed earth, few small objects", - "2": "2: Avg. incline <20%, stable surface, fistsize rocks/roots", - "3": "3: Avg. incline <25%, variable surface, fistsize rocks/branches", - "4": "4: Avg. incline <30%, poor condition, big rocks/branches", - "5": "5: Very steep, bike generally needs to be pushed or carried" - } - } - }, - "name": { - "key": "name", - "type": "localized", - "label": "Name", - "placeholder": "Common name (if any)" - }, - "natural": { - "key": "natural", - "type": "typeCombo", - "label": "Natural" - }, - "network": { - "key": "network", - "type": "text", - "label": "Network" - }, - "note": { - "key": "note", - "type": "textarea", - "universal": true, - "icon": "note", - "label": "Note" - }, - "office": { - "key": "office", - "type": "typeCombo", - "label": "Type" - }, - "oneway": { - "key": "oneway", - "type": "check", - "label": "One Way", - "strings": { - "options": { - "undefined": "Assumed to be No", - "yes": "Yes", - "no": "No" - } - } - }, - "oneway_yes": { - "key": "oneway", - "type": "check", - "label": "One Way", - "strings": { - "options": { - "undefined": "Assumed to be Yes", - "yes": "Yes", - "no": "No" - } - } - }, - "opening_hours": { - "key": "opening_hours", - "type": "text", - "label": "Hours" - }, - "operator": { - "key": "operator", - "type": "text", - "label": "Operator" - }, - "par": { - "key": "par", - "type": "number", - "label": "Par", - "placeholder": "3, 4, 5..." - }, - "park_ride": { - "key": "park_ride", - "type": "check", - "label": "Park and Ride" - }, - "parking": { - "key": "parking", - "type": "combo", - "label": "Type", - "strings": { - "options": { - "surface": "Surface", - "multi-storey": "Multilevel", - "underground": "Underground", - "sheds": "Sheds", - "carports": "Carports", - "garage_boxes": "Garage Boxes", - "lane": "Roadside Lane" - } - } - }, - "phone": { - "key": "phone", - "type": "tel", - "icon": "telephone", - "universal": true, - "label": "Phone", - "placeholder": "+31 42 123 4567" - }, - "piste/difficulty": { - "key": "piste:difficulty", - "type": "combo", - "label": "Difficulty", - "placeholder": "Easy, Intermediate, Advanced...", - "strings": { - "options": { - "novice": "Novice (instructional)", - "easy": "Easy (green circle)", - "intermediate": "Intermediate (blue square)", - "advanced": "Advanced (black diamond)", - "expert": "Expert (double black diamond)", - "freeride": "Freeride (off-piste)", - "extreme": "Extreme (climbing equipment required)" - } - } - }, - "piste/grooming": { - "key": "piste:grooming", - "type": "combo", - "label": "Grooming", - "strings": { - "options": { - "classic": "Classic", - "mogul": "Mogul", - "backcountry": "Backcountry", - "classic+skating": "Classic and Skating", - "scooter": "Scooter/Snowmobile", - "skating": "Skating" - } - } - }, - "piste/type": { - "key": "piste:type", - "type": "typeCombo", - "label": "Type", - "strings": { - "options": { - "downhill": "Downhill", - "nordic": "Nordic", - "skitour": "Skitour", - "sled": "Sled", - "hike": "Hike", - "sleigh": "Sleigh", - "ice_skate": "Ice Skate", - "snow_park": "Snow Park", - "playground": "Playground" - } - } - }, - "place": { - "key": "place", - "type": "typeCombo", - "label": "Type" - }, - "population": { - "key": "population", - "type": "text", - "label": "Population" - }, - "power": { - "key": "power", - "type": "typeCombo", - "label": "Type" - }, - "power_supply": { - "key": "power_supply", - "type": "check", - "label": "Power Supply" - }, - "railway": { - "key": "railway", - "type": "typeCombo", - "label": "Type" - }, - "recycling/cans": { - "key": "recycling:cans", - "type": "check", - "label": "Accepts Cans" - }, - "recycling/clothes": { - "key": "recycling:clothes", - "type": "check", - "label": "Accepts Clothes" - }, - "recycling/glass": { - "key": "recycling:glass", - "type": "check", - "label": "Accepts Glass" - }, - "recycling/paper": { - "key": "recycling:paper", - "type": "check", - "label": "Accepts Paper" - }, - "ref": { - "key": "ref", - "type": "text", - "label": "Reference" - }, - "relation": { - "key": "type", - "type": "combo", - "label": "Type" - }, - "religion": { - "key": "religion", - "type": "combo", - "label": "Religion" - }, - "restriction": { - "key": "restriction", - "type": "combo", - "label": "Type" - }, - "restrictions": { - "type": "restrictions", - "geometry": "vertex", - "icon": "restrictions", - "reference": { - "rtype": "restriction" - }, - "label": "Turn Restrictions" - }, - "route": { - "key": "route", - "type": "combo", - "label": "Type" - }, - "route_master": { - "key": "route_master", - "type": "combo", - "label": "Type" - }, - "sac_scale": { - "key": "sac_scale", - "type": "combo", - "label": "Hiking Difficulty", - "placeholder": "Mountain Hiking, Alpine Hiking...", - "strings": { - "options": { - "hiking": "T1: Hiking", - "mountain_hiking": "T2: Mountain Hiking", - "demanding_mountain_hiking": "T3: Demanding Mountain Hiking", - "alpine_hiking": "T4: Alpine Hiking", - "demanding_alpine_hiking": "T5: Demanding Alpine Hiking", - "difficult_alpine_hiking": "T6: Difficult Alpine Hiking" - } - } - }, - "sanitary_dump_station": { - "key": "sanitary_dump_station", - "type": "check", - "label": "Toilet Disposal" - }, - "seasonal": { - "key": "seasonal", - "type": "check", - "label": "Seasonal" - }, - "service": { - "key": "service", - "type": "combo", - "label": "Type", - "options": [ - "parking_aisle", - "driveway", - "alley", - "emergency_access", - "drive-through" - ] - }, - "service/bicycle/chain_tool": { - "key": "service:bicycle:chain_tool", - "type": "check", - "label": "Chain Tool", - "strings": { - "options": { - "undefined": "Assumed to be No", - "yes": "Yes", - "no": "No" - } - } - }, - "service/bicycle/pump": { - "key": "service:bicycle:pump", - "type": "check", - "label": "Air Pump", - "strings": { - "options": { - "undefined": "Assumed to be No", - "yes": "Yes", - "no": "No" - } - } - }, - "service_rail": { - "key": "service", - "type": "combo", - "label": "Service Type", - "strings": { - "options": { - "spur": "Spur", - "yard": "Yard", - "siding": "Siding", - "crossover": "Crossover" - } - } - }, - "shelter": { - "key": "shelter", - "type": "check", - "label": "Shelter" - }, - "shelter_type": { - "key": "shelter_type", - "type": "combo", - "label": "Type" - }, - "shop": { - "key": "shop", - "type": "typeCombo", - "label": "Type" - }, - "sloped_curb": { - "key": "sloped_curb", - "type": "combo", - "label": "Sloped Curb" - }, - "smoking": { - "key": "smoking", - "type": "combo", - "label": "Smoking", - "placeholder": "No, Separated, Yes...", - "strings": { - "options": { - "no": "No smoking anywhere", - "separated": "In smoking areas, not physically isolated", - "isolated": "In smoking areas, physically isolated", - "outside": "Allowed outside", - "yes": "Allowed everywhere", - "dedicated": "Dedicated to smokers (e.g. smokers' club)" - } - } - }, - "smoothness": { - "key": "smoothness", - "type": "combo", - "label": "Smoothness", - "placeholder": "Thin Rollers, Wheels, Off-Road...", - "strings": { - "options": { - "excellent": "Thin Rollers: rollerblade, skateboard", - "good": "Thin Wheels: racing bike", - "intermediate": "Wheels: city bike, wheelchair, scooter", - "bad": "Robust Wheels: trekking bike, car, rickshaw", - "very_bad": "High Clearance: light duty off-road vehicle", - "horrible": "Off-Road: heavy duty off-road vehicle", - "very_horrible": "Specialized off-road: tractor, ATV", - "impassable": "Impassable / No wheeled vehicle" - } - } - }, - "social_facility_for": { - "key": "social_facility:for", - "type": "radio", - "label": "People served", - "placeholder": "Homeless, Disabled, Child, etc", - "options": [ - "abused", - "child", - "disabled", - "diseased", - "drug_addicted", - "homeless", - "juvenile", - "mental_health", - "migrant", - "orphan", - "senior", - "underprivileged", - "unemployed", - "victim" - ] - }, - "source": { - "key": "source", - "type": "text", - "icon": "source", - "universal": true, - "label": "Source" - }, - "sport": { - "key": "sport", - "type": "combo", - "label": "Sport" - }, - "sport_ice": { - "key": "sport", - "type": "combo", - "label": "Sport", - "options": [ - "skating", - "hockey", - "multi", - "curling", - "ice_stock" - ] - }, - "sport_racing": { - "key": "sport", - "type": "combo", - "label": "Sport", - "options": [ - "cycling", - "dog_racing", - "horse_racing", - "karting", - "motor", - "motocross", - "running" - ] - }, - "structure": { - "type": "radio", - "keys": [ - "bridge", - "tunnel", - "embankment", - "cutting", - "ford" - ], - "label": "Structure", - "placeholder": "Unknown", - "strings": { - "options": { - "bridge": "Bridge", - "tunnel": "Tunnel", - "embankment": "Embankment", - "cutting": "Cutting", - "ford": "Ford" - } - } - }, - "studio_type": { - "key": "type", - "type": "combo", - "label": "Type", - "options": [ - "audio", - "video" - ] - }, - "substation": { - "key": "substation", - "type": "typeCombo", - "label": "Type" - }, - "supervised": { - "key": "supervised", - "type": "check", - "label": "Supervised" - }, - "surface": { - "key": "surface", - "type": "combo", - "label": "Surface" - }, - "tactile_paving": { - "key": "tactile_paving", - "type": "check", - "label": "Tactile Paving" - }, - "takeaway": { - "key": "takeaway", - "type": "combo", - "label": "Takeaway", - "placeholder": "Yes, No, Takeaway Only...", - "strings": { - "options": { - "yes": "Yes", - "no": "No", - "only": "Takeaway Only" - } - } - }, - "toilets/disposal": { - "key": "toilets:disposal", - "type": "combo", - "label": "Disposal", - "strings": { - "options": { - "flush": "Flush", - "pitlatrine": "Pit/Latrine", - "chemical": "Chemical", - "bucket": "Bucket" - } - } - }, - "tourism": { - "key": "tourism", - "type": "typeCombo", - "label": "Type" - }, - "towertype": { - "key": "tower:type", - "type": "combo", - "label": "Tower type" - }, - "tracktype": { - "key": "tracktype", - "type": "combo", - "label": "Track Type", - "placeholder": "Solid, Mostly Solid, Soft...", - "strings": { - "options": { - "grade1": "Solid: paved or heavily compacted hardcore surface", - "grade2": "Mostly Solid: gravel/rock with some soft material mixed in", - "grade3": "Even mixture of hard and soft materials", - "grade4": "Mostly Soft: soil/sand/grass with some hard material mixed in", - "grade5": "Soft: soil/sand/grass" - } - } - }, - "trail_visibility": { - "key": "trail_visibility", - "type": "combo", - "label": "Trail Visibility", - "placeholder": "Excellent, Good, Bad...", - "strings": { - "options": { - "excellent": "Excellent: unambiguous path or markers everywhere", - "good": "Good: markers visible, sometimes require searching", - "intermediate": "Intermediate: few markers, path mostly visible", - "bad": "Bad: no markers, path sometimes invisible/pathless", - "horrible": "Horrible: often pathless, some orientation skills required", - "no": "No: pathless, excellent orientation skills required" - } - } - }, - "trees": { - "key": "trees", - "type": "combo", - "label": "Trees" - }, - "tunnel": { - "key": "tunnel", - "type": "combo", - "label": "Tunnel" - }, - "vending": { - "key": "vending", - "type": "combo", - "label": "Type of Goods" - }, - "water": { - "key": "water", - "type": "combo", - "label": "Type" - }, - "water_point": { - "key": "water_point", - "type": "check", - "label": "Water Point" - }, - "waterway": { - "key": "waterway", - "type": "typeCombo", - "label": "Type" - }, - "website": { - "key": "website", - "type": "url", - "icon": "website", - "placeholder": "http://example.com/", - "universal": true, - "label": "Website" - }, - "wetland": { - "key": "wetland", - "type": "combo", - "label": "Type" - }, - "wheelchair": { - "key": "wheelchair", - "type": "radio", - "options": [ - "yes", - "limited", - "no" - ], - "icon": "wheelchair", - "universal": true, - "label": "Wheelchair Access" - }, - "width": { - "key": "width", - "type": "number", - "label": "Width (Meters)" - }, - "wikipedia": { - "key": "wikipedia", - "type": "wikipedia", - "icon": "wikipedia", - "universal": true, - "label": "Wikipedia" - } - } -}; \ No newline at end of file diff --git a/vendor/assets/javascripts/html5shiv.js b/vendor/assets/javascripts/html5shiv.js index 77dace490..45ea723dd 100644 --- a/vendor/assets/javascripts/html5shiv.js +++ b/vendor/assets/javascripts/html5shiv.js @@ -1,10 +1,10 @@ /** -* @preserve HTML5 Shiv 3.7.2 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed */ ;(function(window, document) { /*jshint evil:true */ /** version */ - var version = '3.7.2'; + var version = '3.7.3'; /** Preset options */ var options = window.html5 || {}; @@ -121,7 +121,7 @@ * returns a shived element for the given nodeName and document * @memberOf html5 * @param {String} nodeName name of the element - * @param {Document} ownerDocument The context document. + * @param {Document|DocumentFragment} ownerDocument The context document. * @returns {Object} The shived element. */ function createElement(nodeName, ownerDocument, data){ @@ -319,4 +319,8 @@ // shiv the document shivDocument(document); -}(this, document)); + if(typeof module == 'object' && module.exports){ + module.exports = html5; + } + +}(typeof window !== "undefined" ? window : this, document)); diff --git a/vendor/assets/jquery/jquery.cookie.js b/vendor/assets/jquery/jquery.cookie.js index feb62e925..8218817b9 100644 --- a/vendor/assets/jquery/jquery.cookie.js +++ b/vendor/assets/jquery/jquery.cookie.js @@ -7,11 +7,11 @@ */ (function (factory) { if (typeof define === 'function' && define.amd) { - // AMD + // AMD (Register as an anonymous module) define(['jquery'], factory); } else if (typeof exports === 'object') { - // CommonJS - factory(require('jquery')); + // Node/CommonJS + module.exports = factory(require('jquery')); } else { // Browser globals factory(jQuery); @@ -61,7 +61,7 @@ if (typeof options.expires === 'number') { var days = options.expires, t = options.expires = new Date(); - t.setTime(+t + days * 864e+5); + t.setMilliseconds(t.getMilliseconds() + days * 864e+5); } return (document.cookie = [ @@ -75,19 +75,20 @@ // Read - var result = key ? undefined : {}; + var result = key ? undefined : {}, + // To prevent the for loop in the first place assign an empty array + // in case there are no cookies at all. Also prevents odd result when + // calling $.cookie(). + cookies = document.cookie ? document.cookie.split('; ') : [], + i = 0, + l = cookies.length; - // To prevent the for loop in the first place assign an empty array - // in case there are no cookies at all. Also prevents odd result when - // calling $.cookie(). - var cookies = document.cookie ? document.cookie.split('; ') : []; + for (; i < l; i++) { + var parts = cookies[i].split('='), + name = decode(parts.shift()), + cookie = parts.join('='); - for (var i = 0, l = cookies.length; i < l; i++) { - var parts = cookies[i].split('='); - var name = decode(parts.shift()); - var cookie = parts.join('='); - - if (key && key === name) { + if (key === name) { // If second argument (value) is a function it's a converter... result = read(cookie, value); break; @@ -105,10 +106,6 @@ config.defaults = {}; $.removeCookie = function (key, options) { - if ($.cookie(key) === undefined) { - return false; - } - // Must not alter options, thus extending a fresh object... $.cookie(key, '', $.extend({}, options, { expires: -1 })); return !$.cookie(key); diff --git a/vendor/assets/leaflet/images/layers-2x.png b/vendor/assets/leaflet/images/layers-2x.png index a2cf7f9ef..200c333dc 100644 Binary files a/vendor/assets/leaflet/images/layers-2x.png and b/vendor/assets/leaflet/images/layers-2x.png differ diff --git a/vendor/assets/leaflet/images/layers.png b/vendor/assets/leaflet/images/layers.png index bca0a0e42..1a72e5784 100644 Binary files a/vendor/assets/leaflet/images/layers.png and b/vendor/assets/leaflet/images/layers.png differ diff --git a/vendor/assets/leaflet/images/marker-icon-2x.png b/vendor/assets/leaflet/images/marker-icon-2x.png index 0015b6495..e4abba3b5 100644 Binary files a/vendor/assets/leaflet/images/marker-icon-2x.png and b/vendor/assets/leaflet/images/marker-icon-2x.png differ diff --git a/vendor/assets/leaflet/images/marker-icon.png b/vendor/assets/leaflet/images/marker-icon.png index e2e9f757f..950edf246 100644 Binary files a/vendor/assets/leaflet/images/marker-icon.png and b/vendor/assets/leaflet/images/marker-icon.png differ diff --git a/vendor/assets/leaflet/images/marker-shadow.png b/vendor/assets/leaflet/images/marker-shadow.png index d1e773c71..9fd297953 100644 Binary files a/vendor/assets/leaflet/images/marker-shadow.png and b/vendor/assets/leaflet/images/marker-shadow.png differ diff --git a/vendor/assets/leaflet/leaflet.css b/vendor/assets/leaflet/leaflet.css index ac0cd174d..72998d005 100644 --- a/vendor/assets/leaflet/leaflet.css +++ b/vendor/assets/leaflet/leaflet.css @@ -1,478 +1,624 @@ -/* required styles */ - -.leaflet-map-pane, -.leaflet-tile, -.leaflet-marker-icon, -.leaflet-marker-shadow, -.leaflet-tile-pane, -.leaflet-tile-container, -.leaflet-overlay-pane, -.leaflet-shadow-pane, -.leaflet-marker-pane, -.leaflet-popup-pane, -.leaflet-overlay-pane svg, -.leaflet-zoom-box, -.leaflet-image-layer, -.leaflet-layer { - position: absolute; - left: 0; - top: 0; - } -.leaflet-container { - overflow: hidden; - -ms-touch-action: none; - } -.leaflet-tile, -.leaflet-marker-icon, -.leaflet-marker-shadow { - -webkit-user-select: none; - -moz-user-select: none; - user-select: none; - -webkit-user-drag: none; - } -.leaflet-marker-icon, -.leaflet-marker-shadow { - display: block; - } -/* map is broken in FF if you have max-width: 100% on tiles */ -.leaflet-container img { - max-width: none !important; - } -/* stupid Android 2 doesn't understand "max-width: none" properly */ -.leaflet-container img.leaflet-image-layer { - max-width: 15000px !important; - } -.leaflet-tile { - filter: inherit; - visibility: hidden; - } -.leaflet-tile-loaded { - visibility: inherit; - } -.leaflet-zoom-box { - width: 0; - height: 0; - } -/* workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=888319 */ -.leaflet-overlay-pane svg { - -moz-user-select: none; - } - -.leaflet-tile-pane { z-index: 2; } -.leaflet-objects-pane { z-index: 3; } -.leaflet-overlay-pane { z-index: 4; } -.leaflet-shadow-pane { z-index: 5; } -.leaflet-marker-pane { z-index: 6; } -.leaflet-popup-pane { z-index: 7; } - -.leaflet-vml-shape { - width: 1px; - height: 1px; - } -.lvml { - behavior: url(#default#VML); - display: inline-block; - position: absolute; - } - - -/* control positioning */ - -.leaflet-control { - position: relative; - z-index: 7; - pointer-events: auto; - } -.leaflet-top, -.leaflet-bottom { - position: absolute; - z-index: 1000; - pointer-events: none; - } -.leaflet-top { - top: 0; - } -.leaflet-right { - right: 0; - } -.leaflet-bottom { - bottom: 0; - } -.leaflet-left { - left: 0; - } -.leaflet-control { - float: left; - clear: both; - } -.leaflet-right .leaflet-control { - float: right; - } -.leaflet-top .leaflet-control { - margin-top: 10px; - } -.leaflet-bottom .leaflet-control { - margin-bottom: 10px; - } -.leaflet-left .leaflet-control { - margin-left: 10px; - } -.leaflet-right .leaflet-control { - margin-right: 10px; - } - - -/* zoom and fade animations */ - -.leaflet-fade-anim .leaflet-tile, -.leaflet-fade-anim .leaflet-popup { - opacity: 0; - -webkit-transition: opacity 0.2s linear; - -moz-transition: opacity 0.2s linear; - -o-transition: opacity 0.2s linear; - transition: opacity 0.2s linear; - } -.leaflet-fade-anim .leaflet-tile-loaded, -.leaflet-fade-anim .leaflet-map-pane .leaflet-popup { - opacity: 1; - } - -.leaflet-zoom-anim .leaflet-zoom-animated { - -webkit-transition: -webkit-transform 0.25s cubic-bezier(0,0,0.25,1); - -moz-transition: -moz-transform 0.25s cubic-bezier(0,0,0.25,1); - -o-transition: -o-transform 0.25s cubic-bezier(0,0,0.25,1); - transition: transform 0.25s cubic-bezier(0,0,0.25,1); - } -.leaflet-zoom-anim .leaflet-tile, -.leaflet-pan-anim .leaflet-tile, -.leaflet-touching .leaflet-zoom-animated { - -webkit-transition: none; - -moz-transition: none; - -o-transition: none; - transition: none; - } - -.leaflet-zoom-anim .leaflet-zoom-hide { - visibility: hidden; - } - - -/* cursors */ - -.leaflet-clickable { - cursor: pointer; - } -.leaflet-container { - cursor: -webkit-grab; - cursor: -moz-grab; - } -.leaflet-popup-pane, -.leaflet-control { - cursor: auto; - } -.leaflet-dragging .leaflet-container, -.leaflet-dragging .leaflet-clickable { - cursor: move; - cursor: -webkit-grabbing; - cursor: -moz-grabbing; - } - - -/* visual tweaks */ - -.leaflet-container { - background: #ddd; - outline: 0; - } -.leaflet-container a { - color: #0078A8; - } -.leaflet-container a.leaflet-active { - outline: 2px solid orange; - } -.leaflet-zoom-box { - border: 2px dotted #38f; - background: rgba(255,255,255,0.5); - } - - -/* general typography */ -.leaflet-container { - font: 12px/1.5 "Helvetica Neue", Arial, Helvetica, sans-serif; - } - - -/* general toolbar styles */ - -.leaflet-bar { - box-shadow: 0 1px 5px rgba(0,0,0,0.65); - border-radius: 4px; - } -.leaflet-bar a, -.leaflet-bar a:hover { - background-color: #fff; - border-bottom: 1px solid #ccc; - width: 26px; - height: 26px; - line-height: 26px; - display: block; - text-align: center; - text-decoration: none; - color: black; - } -.leaflet-bar a, -.leaflet-control-layers-toggle { - background-position: 50% 50%; - background-repeat: no-repeat; - display: block; - } -.leaflet-bar a:hover { - background-color: #f4f4f4; - } -.leaflet-bar a:first-child { - border-top-left-radius: 4px; - border-top-right-radius: 4px; - } -.leaflet-bar a:last-child { - border-bottom-left-radius: 4px; - border-bottom-right-radius: 4px; - border-bottom: none; - } -.leaflet-bar a.leaflet-disabled { - cursor: default; - background-color: #f4f4f4; - color: #bbb; - } - -.leaflet-touch .leaflet-bar a { - width: 30px; - height: 30px; - line-height: 30px; - } - - -/* zoom control */ - -.leaflet-control-zoom-in, -.leaflet-control-zoom-out { - font: bold 18px 'Lucida Console', Monaco, monospace; - text-indent: 1px; - } -.leaflet-control-zoom-out { - font-size: 20px; - } - -.leaflet-touch .leaflet-control-zoom-in { - font-size: 22px; - } -.leaflet-touch .leaflet-control-zoom-out { - font-size: 24px; - } - - -/* layers control */ - -.leaflet-control-layers { - box-shadow: 0 1px 5px rgba(0,0,0,0.4); - background: #fff; - border-radius: 5px; - } -.leaflet-control-layers-toggle { - background-image: url(images/layers.png); - width: 36px; - height: 36px; - } -.leaflet-retina .leaflet-control-layers-toggle { - background-image: url(images/layers-2x.png); - background-size: 26px 26px; - } -.leaflet-touch .leaflet-control-layers-toggle { - width: 44px; - height: 44px; - } -.leaflet-control-layers .leaflet-control-layers-list, -.leaflet-control-layers-expanded .leaflet-control-layers-toggle { - display: none; - } -.leaflet-control-layers-expanded .leaflet-control-layers-list { - display: block; - position: relative; - } -.leaflet-control-layers-expanded { - padding: 6px 10px 6px 6px; - color: #333; - background: #fff; - } -.leaflet-control-layers-selector { - margin-top: 2px; - position: relative; - top: 1px; - } -.leaflet-control-layers label { - display: block; - } -.leaflet-control-layers-separator { - height: 0; - border-top: 1px solid #ddd; - margin: 5px -10px 5px -6px; - } - - -/* attribution and scale controls */ - -.leaflet-container .leaflet-control-attribution { - background: #fff; - background: rgba(255, 255, 255, 0.7); - margin: 0; - } -.leaflet-control-attribution, -.leaflet-control-scale-line { - padding: 0 5px; - color: #333; - } -.leaflet-control-attribution a { - text-decoration: none; - } -.leaflet-control-attribution a:hover { - text-decoration: underline; - } -.leaflet-container .leaflet-control-attribution, -.leaflet-container .leaflet-control-scale { - font-size: 11px; - } -.leaflet-left .leaflet-control-scale { - margin-left: 5px; - } -.leaflet-bottom .leaflet-control-scale { - margin-bottom: 5px; - } -.leaflet-control-scale-line { - border: 2px solid #777; - border-top: none; - line-height: 1.1; - padding: 2px 5px 1px; - font-size: 11px; - white-space: nowrap; - overflow: hidden; - -moz-box-sizing: content-box; - box-sizing: content-box; - - background: #fff; - background: rgba(255, 255, 255, 0.5); - } -.leaflet-control-scale-line:not(:first-child) { - border-top: 2px solid #777; - border-bottom: none; - margin-top: -2px; - } -.leaflet-control-scale-line:not(:first-child):not(:last-child) { - border-bottom: 2px solid #777; - } - -.leaflet-touch .leaflet-control-attribution, -.leaflet-touch .leaflet-control-layers, -.leaflet-touch .leaflet-bar { - box-shadow: none; - } -.leaflet-touch .leaflet-control-layers, -.leaflet-touch .leaflet-bar { - border: 2px solid rgba(0,0,0,0.2); - background-clip: padding-box; - } - - -/* popup */ - -.leaflet-popup { - position: absolute; - text-align: center; - } -.leaflet-popup-content-wrapper { - padding: 1px; - text-align: left; - border-radius: 12px; - } -.leaflet-popup-content { - margin: 13px 19px; - line-height: 1.4; - } -.leaflet-popup-content p { - margin: 18px 0; - } -.leaflet-popup-tip-container { - margin: 0 auto; - width: 40px; - height: 20px; - position: relative; - overflow: hidden; - } -.leaflet-popup-tip { - width: 17px; - height: 17px; - padding: 1px; - - margin: -10px auto 0; - - -webkit-transform: rotate(45deg); - -moz-transform: rotate(45deg); - -ms-transform: rotate(45deg); - -o-transform: rotate(45deg); - transform: rotate(45deg); - } -.leaflet-popup-content-wrapper, -.leaflet-popup-tip { - background: white; - - box-shadow: 0 3px 14px rgba(0,0,0,0.4); - } -.leaflet-container a.leaflet-popup-close-button { - position: absolute; - top: 0; - right: 0; - padding: 4px 4px 0 0; - text-align: center; - width: 18px; - height: 14px; - font: 16px/14px Tahoma, Verdana, sans-serif; - color: #c3c3c3; - text-decoration: none; - font-weight: bold; - background: transparent; - } -.leaflet-container a.leaflet-popup-close-button:hover { - color: #999; - } -.leaflet-popup-scrolled { - overflow: auto; - border-bottom: 1px solid #ddd; - border-top: 1px solid #ddd; - } - -.leaflet-oldie .leaflet-popup-content-wrapper { - zoom: 1; - } -.leaflet-oldie .leaflet-popup-tip { - width: 24px; - margin: 0 auto; - - -ms-filter: "progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)"; - filter: progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678); - } -.leaflet-oldie .leaflet-popup-tip-container { - margin-top: -1px; - } - -.leaflet-oldie .leaflet-control-zoom, -.leaflet-oldie .leaflet-control-layers, -.leaflet-oldie .leaflet-popup-content-wrapper, -.leaflet-oldie .leaflet-popup-tip { - border: 1px solid #999; - } - - -/* div icon */ - -.leaflet-div-icon { - background: #fff; - border: 1px solid #666; - } +/* required styles */ + +.leaflet-pane, +.leaflet-tile, +.leaflet-marker-icon, +.leaflet-marker-shadow, +.leaflet-tile-container, +.leaflet-pane > svg, +.leaflet-pane > canvas, +.leaflet-zoom-box, +.leaflet-image-layer, +.leaflet-layer { + position: absolute; + left: 0; + top: 0; + } +.leaflet-container { + overflow: hidden; + } +.leaflet-tile, +.leaflet-marker-icon, +.leaflet-marker-shadow { + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + -webkit-user-drag: none; + } +/* Safari renders non-retina tile on retina better with this, but Chrome is worse */ +.leaflet-safari .leaflet-tile { + image-rendering: -webkit-optimize-contrast; + } +/* hack that prevents hw layers "stretching" when loading new tiles */ +.leaflet-safari .leaflet-tile-container { + width: 1600px; + height: 1600px; + -webkit-transform-origin: 0 0; + } +.leaflet-marker-icon, +.leaflet-marker-shadow { + display: block; + } +/* .leaflet-container svg: reset svg max-width decleration shipped in Joomla! (joomla.org) 3.x */ +/* .leaflet-container img: map is broken in FF if you have max-width: 100% on tiles */ +.leaflet-container .leaflet-overlay-pane svg, +.leaflet-container .leaflet-marker-pane img, +.leaflet-container .leaflet-shadow-pane img, +.leaflet-container .leaflet-tile-pane img, +.leaflet-container img.leaflet-image-layer { + max-width: none !important; + } + +.leaflet-container.leaflet-touch-zoom { + -ms-touch-action: pan-x pan-y; + touch-action: pan-x pan-y; + } +.leaflet-container.leaflet-touch-drag { + -ms-touch-action: pinch-zoom; + } +.leaflet-container.leaflet-touch-drag.leaflet-touch-zoom { + -ms-touch-action: none; + touch-action: none; +} +.leaflet-tile { + filter: inherit; + visibility: hidden; + } +.leaflet-tile-loaded { + visibility: inherit; + } +.leaflet-zoom-box { + width: 0; + height: 0; + -moz-box-sizing: border-box; + box-sizing: border-box; + z-index: 800; + } +/* workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=888319 */ +.leaflet-overlay-pane svg { + -moz-user-select: none; + } + +.leaflet-pane { z-index: 400; } + +.leaflet-tile-pane { z-index: 200; } +.leaflet-overlay-pane { z-index: 400; } +.leaflet-shadow-pane { z-index: 500; } +.leaflet-marker-pane { z-index: 600; } +.leaflet-tooltip-pane { z-index: 650; } +.leaflet-popup-pane { z-index: 700; } + +.leaflet-map-pane canvas { z-index: 100; } +.leaflet-map-pane svg { z-index: 200; } + +.leaflet-vml-shape { + width: 1px; + height: 1px; + } +.lvml { + behavior: url(#default#VML); + display: inline-block; + position: absolute; + } + + +/* control positioning */ + +.leaflet-control { + position: relative; + z-index: 800; + pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */ + pointer-events: auto; + } +.leaflet-top, +.leaflet-bottom { + position: absolute; + z-index: 1000; + pointer-events: none; + } +.leaflet-top { + top: 0; + } +.leaflet-right { + right: 0; + } +.leaflet-bottom { + bottom: 0; + } +.leaflet-left { + left: 0; + } +.leaflet-control { + float: left; + clear: both; + } +.leaflet-right .leaflet-control { + float: right; + } +.leaflet-top .leaflet-control { + margin-top: 10px; + } +.leaflet-bottom .leaflet-control { + margin-bottom: 10px; + } +.leaflet-left .leaflet-control { + margin-left: 10px; + } +.leaflet-right .leaflet-control { + margin-right: 10px; + } + + +/* zoom and fade animations */ + +.leaflet-fade-anim .leaflet-tile { + will-change: opacity; + } +.leaflet-fade-anim .leaflet-popup { + opacity: 0; + -webkit-transition: opacity 0.2s linear; + -moz-transition: opacity 0.2s linear; + -o-transition: opacity 0.2s linear; + transition: opacity 0.2s linear; + } +.leaflet-fade-anim .leaflet-map-pane .leaflet-popup { + opacity: 1; + } +.leaflet-zoom-animated { + -webkit-transform-origin: 0 0; + -ms-transform-origin: 0 0; + transform-origin: 0 0; + } +.leaflet-zoom-anim .leaflet-zoom-animated { + will-change: transform; + } +.leaflet-zoom-anim .leaflet-zoom-animated { + -webkit-transition: -webkit-transform 0.25s cubic-bezier(0,0,0.25,1); + -moz-transition: -moz-transform 0.25s cubic-bezier(0,0,0.25,1); + -o-transition: -o-transform 0.25s cubic-bezier(0,0,0.25,1); + transition: transform 0.25s cubic-bezier(0,0,0.25,1); + } +.leaflet-zoom-anim .leaflet-tile, +.leaflet-pan-anim .leaflet-tile { + -webkit-transition: none; + -moz-transition: none; + -o-transition: none; + transition: none; + } + +.leaflet-zoom-anim .leaflet-zoom-hide { + visibility: hidden; + } + + +/* cursors */ + +.leaflet-interactive { + cursor: pointer; + } +.leaflet-grab { + cursor: -webkit-grab; + cursor: -moz-grab; + } +.leaflet-crosshair, +.leaflet-crosshair .leaflet-interactive { + cursor: crosshair; + } +.leaflet-popup-pane, +.leaflet-control { + cursor: auto; + } +.leaflet-dragging .leaflet-grab, +.leaflet-dragging .leaflet-grab .leaflet-interactive, +.leaflet-dragging .leaflet-marker-draggable { + cursor: move; + cursor: -webkit-grabbing; + cursor: -moz-grabbing; + } + +/* marker & overlays interactivity */ +.leaflet-marker-icon, +.leaflet-marker-shadow, +.leaflet-image-layer, +.leaflet-pane > svg path, +.leaflet-tile-container { + pointer-events: none; + } + +.leaflet-marker-icon.leaflet-interactive, +.leaflet-image-layer.leaflet-interactive, +.leaflet-pane > svg path.leaflet-interactive { + pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */ + pointer-events: auto; + } + +/* visual tweaks */ + +.leaflet-container { + background: #ddd; + outline: 0; + } +.leaflet-container a { + color: #0078A8; + } +.leaflet-container a.leaflet-active { + outline: 2px solid orange; + } +.leaflet-zoom-box { + border: 2px dotted #38f; + background: rgba(255,255,255,0.5); + } + + +/* general typography */ +.leaflet-container { + font: 12px/1.5 "Helvetica Neue", Arial, Helvetica, sans-serif; + } + + +/* general toolbar styles */ + +.leaflet-bar { + box-shadow: 0 1px 5px rgba(0,0,0,0.65); + border-radius: 4px; + } +.leaflet-bar a, +.leaflet-bar a:hover { + background-color: #fff; + border-bottom: 1px solid #ccc; + width: 26px; + height: 26px; + line-height: 26px; + display: block; + text-align: center; + text-decoration: none; + color: black; + } +.leaflet-bar a, +.leaflet-control-layers-toggle { + background-position: 50% 50%; + background-repeat: no-repeat; + display: block; + } +.leaflet-bar a:hover { + background-color: #f4f4f4; + } +.leaflet-bar a:first-child { + border-top-left-radius: 4px; + border-top-right-radius: 4px; + } +.leaflet-bar a:last-child { + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + border-bottom: none; + } +.leaflet-bar a.leaflet-disabled { + cursor: default; + background-color: #f4f4f4; + color: #bbb; + } + +.leaflet-touch .leaflet-bar a { + width: 30px; + height: 30px; + line-height: 30px; + } + + +/* zoom control */ + +.leaflet-control-zoom-in, +.leaflet-control-zoom-out { + font: bold 18px 'Lucida Console', Monaco, monospace; + text-indent: 1px; + } +.leaflet-control-zoom-out { + font-size: 20px; + } + +.leaflet-touch .leaflet-control-zoom-in { + font-size: 22px; + } +.leaflet-touch .leaflet-control-zoom-out { + font-size: 24px; + } + + +/* layers control */ + +.leaflet-control-layers { + box-shadow: 0 1px 5px rgba(0,0,0,0.4); + background: #fff; + border-radius: 5px; + } +.leaflet-control-layers-toggle { + background-image: url(images/layers.png); + width: 36px; + height: 36px; + } +.leaflet-retina .leaflet-control-layers-toggle { + background-image: url(images/layers-2x.png); + background-size: 26px 26px; + } +.leaflet-touch .leaflet-control-layers-toggle { + width: 44px; + height: 44px; + } +.leaflet-control-layers .leaflet-control-layers-list, +.leaflet-control-layers-expanded .leaflet-control-layers-toggle { + display: none; + } +.leaflet-control-layers-expanded .leaflet-control-layers-list { + display: block; + position: relative; + } +.leaflet-control-layers-expanded { + padding: 6px 10px 6px 6px; + color: #333; + background: #fff; + } +.leaflet-control-layers-scrollbar { + overflow-y: scroll; + padding-right: 5px; + } +.leaflet-control-layers-selector { + margin-top: 2px; + position: relative; + top: 1px; + } +.leaflet-control-layers label { + display: block; + } +.leaflet-control-layers-separator { + height: 0; + border-top: 1px solid #ddd; + margin: 5px -10px 5px -6px; + } + +/* Default icon URLs */ +.leaflet-default-icon-path { + background-image: url(images/marker-icon.png); + } + + +/* attribution and scale controls */ + +.leaflet-container .leaflet-control-attribution { + background: #fff; + background: rgba(255, 255, 255, 0.7); + margin: 0; + } +.leaflet-control-attribution, +.leaflet-control-scale-line { + padding: 0 5px; + color: #333; + } +.leaflet-control-attribution a { + text-decoration: none; + } +.leaflet-control-attribution a:hover { + text-decoration: underline; + } +.leaflet-container .leaflet-control-attribution, +.leaflet-container .leaflet-control-scale { + font-size: 11px; + } +.leaflet-left .leaflet-control-scale { + margin-left: 5px; + } +.leaflet-bottom .leaflet-control-scale { + margin-bottom: 5px; + } +.leaflet-control-scale-line { + border: 2px solid #777; + border-top: none; + line-height: 1.1; + padding: 2px 5px 1px; + font-size: 11px; + white-space: nowrap; + overflow: hidden; + -moz-box-sizing: border-box; + box-sizing: border-box; + + background: #fff; + background: rgba(255, 255, 255, 0.5); + } +.leaflet-control-scale-line:not(:first-child) { + border-top: 2px solid #777; + border-bottom: none; + margin-top: -2px; + } +.leaflet-control-scale-line:not(:first-child):not(:last-child) { + border-bottom: 2px solid #777; + } + +.leaflet-touch .leaflet-control-attribution, +.leaflet-touch .leaflet-control-layers, +.leaflet-touch .leaflet-bar { + box-shadow: none; + } +.leaflet-touch .leaflet-control-layers, +.leaflet-touch .leaflet-bar { + border: 2px solid rgba(0,0,0,0.2); + background-clip: padding-box; + } + + +/* popup */ + +.leaflet-popup { + position: absolute; + text-align: center; + margin-bottom: 20px; + } +.leaflet-popup-content-wrapper { + padding: 1px; + text-align: left; + border-radius: 12px; + } +.leaflet-popup-content { + margin: 13px 19px; + line-height: 1.4; + } +.leaflet-popup-content p { + margin: 18px 0; + } +.leaflet-popup-tip-container { + width: 40px; + height: 20px; + position: absolute; + left: 50%; + margin-left: -20px; + overflow: hidden; + pointer-events: none; + } +.leaflet-popup-tip { + width: 17px; + height: 17px; + padding: 1px; + + margin: -10px auto 0; + + -webkit-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -ms-transform: rotate(45deg); + -o-transform: rotate(45deg); + transform: rotate(45deg); + } +.leaflet-popup-content-wrapper, +.leaflet-popup-tip { + background: white; + color: #333; + box-shadow: 0 3px 14px rgba(0,0,0,0.4); + } +.leaflet-container a.leaflet-popup-close-button { + position: absolute; + top: 0; + right: 0; + padding: 4px 4px 0 0; + border: none; + text-align: center; + width: 18px; + height: 14px; + font: 16px/14px Tahoma, Verdana, sans-serif; + color: #c3c3c3; + text-decoration: none; + font-weight: bold; + background: transparent; + } +.leaflet-container a.leaflet-popup-close-button:hover { + color: #999; + } +.leaflet-popup-scrolled { + overflow: auto; + border-bottom: 1px solid #ddd; + border-top: 1px solid #ddd; + } + +.leaflet-oldie .leaflet-popup-content-wrapper { + zoom: 1; + } +.leaflet-oldie .leaflet-popup-tip { + width: 24px; + margin: 0 auto; + + -ms-filter: "progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)"; + filter: progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678); + } +.leaflet-oldie .leaflet-popup-tip-container { + margin-top: -1px; + } + +.leaflet-oldie .leaflet-control-zoom, +.leaflet-oldie .leaflet-control-layers, +.leaflet-oldie .leaflet-popup-content-wrapper, +.leaflet-oldie .leaflet-popup-tip { + border: 1px solid #999; + } + + +/* div icon */ + +.leaflet-div-icon { + background: #fff; + border: 1px solid #666; + } + + +/* Tooltip */ +/* Base styles for the element that has a tooltip */ +.leaflet-tooltip { + position: absolute; + padding: 6px; + background-color: #fff; + border: 1px solid #fff; + border-radius: 3px; + color: #222; + white-space: nowrap; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + pointer-events: none; + box-shadow: 0 1px 3px rgba(0,0,0,0.4); + } +.leaflet-tooltip.leaflet-clickable { + cursor: pointer; + pointer-events: auto; + } +.leaflet-tooltip-top:before, +.leaflet-tooltip-bottom:before, +.leaflet-tooltip-left:before, +.leaflet-tooltip-right:before { + position: absolute; + pointer-events: none; + border: 6px solid transparent; + background: transparent; + content: ""; + } + +/* Directions */ + +.leaflet-tooltip-bottom { + margin-top: 6px; +} +.leaflet-tooltip-top { + margin-top: -6px; +} +.leaflet-tooltip-bottom:before, +.leaflet-tooltip-top:before { + left: 50%; + margin-left: -6px; + } +.leaflet-tooltip-top:before { + bottom: 0; + margin-bottom: -12px; + border-top-color: #fff; + } +.leaflet-tooltip-bottom:before { + top: 0; + margin-top: -12px; + margin-left: -6px; + border-bottom-color: #fff; + } +.leaflet-tooltip-left { + margin-left: -6px; +} +.leaflet-tooltip-right { + margin-left: 6px; +} +.leaflet-tooltip-left:before, +.leaflet-tooltip-right:before { + top: 50%; + margin-top: -6px; + } +.leaflet-tooltip-left:before { + right: 0; + margin-right: -12px; + border-left-color: #fff; + } +.leaflet-tooltip-right:before { + left: 0; + margin-left: -12px; + border-right-color: #fff; + } diff --git a/vendor/assets/leaflet/leaflet.js b/vendor/assets/leaflet/leaflet.js index 494709034..e366062ab 100644 --- a/vendor/assets/leaflet/leaflet.js +++ b/vendor/assets/leaflet/leaflet.js @@ -1,13 +1,22 @@ /* - Leaflet, a JavaScript library for mobile-friendly interactive maps. http://leafletjs.com - (c) 2010-2013, Vladimir Agafonkin - (c) 2010-2011, CloudMade + Leaflet 1.0.3, a JS library for interactive maps. http://leafletjs.com + (c) 2010-2016 Vladimir Agafonkin, (c) 2010-2011 CloudMade */ (function (window, document, undefined) { -var oldL = window.L, - L = {}; +var L = { + version: "1.0.3" +}; + +function expose() { + var oldL = window.L; + + L.noConflict = function () { + window.L = oldL; + return this; + }; -L.version = '0.7.3'; + window.L = L; +} // define Leaflet for Node module pattern loaders, including Browserify if (typeof module === 'object' && typeof module.exports === 'object') { @@ -19,114 +28,160 @@ if (typeof module === 'object' && typeof module.exports === 'object') { } // define Leaflet as a global L variable, saving the original L to restore later if needed +if (typeof window !== 'undefined') { + expose(); +} -L.noConflict = function () { - window.L = oldL; - return this; -}; - -window.L = L; /* - * L.Util contains various utility functions used throughout Leaflet code. + * @namespace Util + * + * Various utility functions, used by Leaflet internally. */ L.Util = { - extend: function (dest) { // (Object[, Object, ...]) -> - var sources = Array.prototype.slice.call(arguments, 1), - i, j, len, src; - for (j = 0, len = sources.length; j < len; j++) { - src = sources[j] || {}; + // @function extend(dest: Object, src?: Object): Object + // Merges the properties of the `src` object (or multiple objects) into `dest` object and returns the latter. Has an `L.extend` shortcut. + extend: function (dest) { + var i, j, len, src; + + for (j = 1, len = arguments.length; j < len; j++) { + src = arguments[j]; for (i in src) { - if (src.hasOwnProperty(i)) { - dest[i] = src[i]; - } + dest[i] = src[i]; } } return dest; }, - bind: function (fn, obj) { // (Function, Object) -> Function - var args = arguments.length > 2 ? Array.prototype.slice.call(arguments, 2) : null; - return function () { - return fn.apply(obj, args || arguments); - }; - }, - - stamp: (function () { - var lastId = 0, - key = '_leaflet_id'; - return function (obj) { - obj[key] = obj[key] || ++lastId; - return obj[key]; + // @function create(proto: Object, properties?: Object): Object + // Compatibility polyfill for [Object.create](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/create) + create: Object.create || (function () { + function F() {} + return function (proto) { + F.prototype = proto; + return new F(); }; - }()), + })(), - invokeEach: function (obj, method, context) { - var i, args; + // @function bind(fn: Function, …): Function + // Returns a new function bound to the arguments passed, like [Function.prototype.bind](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Function/bind). + // Has a `L.bind()` shortcut. + bind: function (fn, obj) { + var slice = Array.prototype.slice; - if (typeof obj === 'object') { - args = Array.prototype.slice.call(arguments, 3); - - for (i in obj) { - method.apply(context, [i, obj[i]].concat(args)); - } - return true; + if (fn.bind) { + return fn.bind.apply(fn, slice.call(arguments, 1)); } - return false; - }, - - limitExecByInterval: function (fn, time, context) { - var lock, execOnUnlock; + var args = slice.call(arguments, 2); - return function wrapperFn() { - var args = arguments; + return function () { + return fn.apply(obj, args.length ? args.concat(slice.call(arguments)) : arguments); + }; + }, - if (lock) { - execOnUnlock = true; - return; + // @function stamp(obj: Object): Number + // Returns the unique ID of an object, assiging it one if it doesn't have it. + stamp: function (obj) { + /*eslint-disable */ + obj._leaflet_id = obj._leaflet_id || ++L.Util.lastId; + return obj._leaflet_id; + /*eslint-enable */ + }, + + // @property lastId: Number + // Last unique ID used by [`stamp()`](#util-stamp) + lastId: 0, + + // @function throttle(fn: Function, time: Number, context: Object): Function + // Returns a function which executes function `fn` with the given scope `context` + // (so that the `this` keyword refers to `context` inside `fn`'s code). The function + // `fn` will be called no more than one time per given amount of `time`. The arguments + // received by the bound function will be any arguments passed when binding the + // function, followed by any arguments passed when invoking the bound function. + // Has an `L.bind` shortcut. + throttle: function (fn, time, context) { + var lock, args, wrapperFn, later; + + later = function () { + // reset lock and call if queued + lock = false; + if (args) { + wrapperFn.apply(context, args); + args = false; } + }; - lock = true; - - setTimeout(function () { - lock = false; - - if (execOnUnlock) { - wrapperFn.apply(context, args); - execOnUnlock = false; - } - }, time); + wrapperFn = function () { + if (lock) { + // called too soon, queue to call later + args = arguments; - fn.apply(context, args); + } else { + // call and lock until later + fn.apply(context, arguments); + setTimeout(later, time); + lock = true; + } }; + + return wrapperFn; }, - falseFn: function () { - return false; + // @function wrapNum(num: Number, range: Number[], includeMax?: Boolean): Number + // Returns the number `num` modulo `range` in such a way so it lies within + // `range[0]` and `range[1]`. The returned value will be always smaller than + // `range[1]` unless `includeMax` is set to `true`. + wrapNum: function (x, range, includeMax) { + var max = range[1], + min = range[0], + d = max - min; + return x === max && includeMax ? x : ((x - min) % d + d) % d + min; }, + // @function falseFn(): Function + // Returns a function which always returns `false`. + falseFn: function () { return false; }, + + // @function formatNum(num: Number, digits?: Number): Number + // Returns the number `num` rounded to `digits` decimals, or to 5 decimals by default. formatNum: function (num, digits) { var pow = Math.pow(10, digits || 5); return Math.round(num * pow) / pow; }, + // @function trim(str: String): String + // Compatibility polyfill for [String.prototype.trim](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String/Trim) trim: function (str) { return str.trim ? str.trim() : str.replace(/^\s+|\s+$/g, ''); }, + // @function splitWords(str: String): String[] + // Trims and splits the string on whitespace and returns the array of parts. splitWords: function (str) { return L.Util.trim(str).split(/\s+/); }, + // @function setOptions(obj: Object, options: Object): Object + // Merges the given properties to the `options` of the `obj` object, returning the resulting options. See `Class options`. Has an `L.setOptions` shortcut. setOptions: function (obj, options) { - obj.options = L.extend({}, obj.options, options); + if (!obj.hasOwnProperty('options')) { + obj.options = obj.options ? L.Util.create(obj.options) : {}; + } + for (var i in options) { + obj.options[i] = options[i]; + } return obj.options; }, + // @function getParamString(obj: Object, existingUrl?: String, uppercase?: Boolean): String + // Converts an object into a parameter URL string, e.g. `{a: "foo", b: "bar"}` + // translates to `'?a=foo&b=bar'`. If `existingUrl` is set, the parameters will + // be appended at the end. If `uppercase` is `true`, the parameter names will + // be uppercased (e.g. `'?A=foo&B=bar'`) getParamString: function (obj, existingUrl, uppercase) { var params = []; for (var i in obj) { @@ -134,11 +189,19 @@ L.Util = { } return ((!existingUrl || existingUrl.indexOf('?') === -1) ? '?' : '&') + params.join('&'); }, + + // @function template(str: String, data: Object): String + // Simple templating facility, accepts a template string of the form `'Hello {a}, {b}'` + // and a data object like `{a: 'foo', b: 'bar'}`, returns evaluated string + // `('Hello foo, bar')`. You can also specify functions instead of strings for + // data values — they will be evaluated passing `data` as an argument. template: function (str, data) { - return str.replace(/\{ *([\w_]+) *\}/g, function (str, key) { + return str.replace(L.Util.templateRe, function (str, key) { var value = data[key]; + if (value === undefined) { throw new Error('No value provided for variable ' + str); + } else if (typeof value === 'function') { value = value(data); } @@ -146,30 +209,40 @@ L.Util = { }); }, + templateRe: /\{ *([\w_\-]+) *\}/g, + + // @function isArray(obj): Boolean + // Compatibility polyfill for [Array.isArray](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray) isArray: Array.isArray || function (obj) { return (Object.prototype.toString.call(obj) === '[object Array]'); }, + // @function indexOf(array: Array, el: Object): Number + // Compatibility polyfill for [Array.prototype.indexOf](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf) + indexOf: function (array, el) { + for (var i = 0; i < array.length; i++) { + if (array[i] === el) { return i; } + } + return -1; + }, + + // @property emptyImageUrl: String + // Data URI string containing a base64-encoded empty GIF image. + // Used as a hack to free memory from unused images on WebKit-powered + // mobile devices (by setting image `src` to this string). emptyImageUrl: 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=' }; (function () { - // inspired by http://paulirish.com/2011/requestanimationframe-for-smart-animating/ function getPrefixed(name) { - var i, fn, - prefixes = ['webkit', 'moz', 'o', 'ms']; - - for (i = 0; i < prefixes.length && !fn; i++) { - fn = window[prefixes[i] + name]; - } - - return fn; + return window['webkit' + name] || window['moz' + name] || window['ms' + name]; } var lastTime = 0; + // fallback for IE 7-8 function timeoutDefer(fn) { var time = +new Date(), timeToCall = Math.max(0, 16 - (time - lastTime)); @@ -178,32 +251,33 @@ L.Util = { return window.setTimeout(fn, timeToCall); } - var requestFn = window.requestAnimationFrame || - getPrefixed('RequestAnimationFrame') || timeoutDefer; - - var cancelFn = window.cancelAnimationFrame || - getPrefixed('CancelAnimationFrame') || - getPrefixed('CancelRequestAnimationFrame') || - function (id) { window.clearTimeout(id); }; + var requestFn = window.requestAnimationFrame || getPrefixed('RequestAnimationFrame') || timeoutDefer, + cancelFn = window.cancelAnimationFrame || getPrefixed('CancelAnimationFrame') || + getPrefixed('CancelRequestAnimationFrame') || function (id) { window.clearTimeout(id); }; - L.Util.requestAnimFrame = function (fn, context, immediate, element) { - fn = L.bind(fn, context); - + // @function requestAnimFrame(fn: Function, context?: Object, immediate?: Boolean): Number + // Schedules `fn` to be executed when the browser repaints. `fn` is bound to + // `context` if given. When `immediate` is set, `fn` is called immediately if + // the browser doesn't have native support for + // [`window.requestAnimationFrame`](https://developer.mozilla.org/docs/Web/API/window/requestAnimationFrame), + // otherwise it's delayed. Returns a request ID that can be used to cancel the request. + L.Util.requestAnimFrame = function (fn, context, immediate) { if (immediate && requestFn === timeoutDefer) { - fn(); + fn.call(context); } else { - return requestFn.call(window, fn, element); + return requestFn.call(window, L.bind(fn, context)); } }; + // @function cancelAnimFrame(id: Number): undefined + // Cancels a previous `requestAnimFrame`. See also [window.cancelAnimationFrame](https://developer.mozilla.org/docs/Web/API/window/cancelAnimationFrame). L.Util.cancelAnimFrame = function (id) { if (id) { cancelFn.call(window, id); } }; - -}()); +})(); // shortcuts for most used utility functions L.extend = L.Util.extend; @@ -212,16 +286,23 @@ L.stamp = L.Util.stamp; L.setOptions = L.Util.setOptions; -/* - * L.Class powers the OOP facilities of the library. - * Thanks to John Resig and Dean Edwards for inspiration! - */ + + +// @class Class +// @aka L.Class + +// @section +// @uninheritable + +// Thanks to John Resig and Dean Edwards for inspiration! L.Class = function () {}; L.Class.extend = function (props) { - // extended class with the new prototype + // @function extend(props: Object): Function + // [Extends the current class](#class-inheritance) given the properties to be included. + // Returns a Javascript function that is a class constructor (to be called with `new`). var NewClass = function () { // call the constructor @@ -230,21 +311,17 @@ L.Class.extend = function (props) { } // call all constructor hooks - if (this._initHooks) { - this.callInitHooks(); - } + this.callInitHooks(); }; - // instantiate class without calling constructor - var F = function () {}; - F.prototype = this.prototype; + var parentProto = NewClass.__super__ = this.prototype; - var proto = new F(); + var proto = L.Util.create(parentProto); proto.constructor = NewClass; NewClass.prototype = proto; - //inherit parent's statics + // inherit parent's statics for (var i in this) { if (this.hasOwnProperty(i) && i !== 'prototype') { NewClass[i] = this[i]; @@ -264,8 +341,8 @@ L.Class.extend = function (props) { } // merge options - if (props.options && proto.options) { - props.options = L.extend({}, proto.options, props.options); + if (proto.options) { + props.options = L.Util.extend(L.Util.create(proto.options), props.options); } // mix given properties into the prototype @@ -273,17 +350,13 @@ L.Class.extend = function (props) { proto._initHooks = []; - var parent = this; - // jshint camelcase: false - NewClass.__super__ = parent.prototype; - // add method for calling all hooks proto.callInitHooks = function () { if (this._initHooksCalled) { return; } - if (parent.prototype.callInitHooks) { - parent.prototype.callInitHooks.call(this); + if (parentProto.callInitHooks) { + parentProto.callInitHooks.call(this); } this._initHooksCalled = true; @@ -297,17 +370,22 @@ L.Class.extend = function (props) { }; -// method for adding properties to prototype +// @function include(properties: Object): this +// [Includes a mixin](#class-includes) into the current class. L.Class.include = function (props) { L.extend(this.prototype, props); + return this; }; -// merge new default options to the Class +// @function mergeOptions(options: Object): this +// [Merges `options`](#class-options) into the defaults of the class. L.Class.mergeOptions = function (options) { L.extend(this.prototype.options, options); + return this; }; -// add a constructor hook +// @function addInitHook(fn: Function): this +// Adds a [constructor hook](#class-constructor-hooks) to the class. L.Class.addInitHook = function (fn) { // (Function) || (String, args...) var args = Array.prototype.slice.call(arguments, 1); @@ -317,315 +395,508 @@ L.Class.addInitHook = function (fn) { // (Function) || (String, args...) this.prototype._initHooks = this.prototype._initHooks || []; this.prototype._initHooks.push(init); + return this; }; + /* - * L.Mixin.Events is used to add custom events functionality to Leaflet classes. + * @class Evented + * @aka L.Evented + * @inherits Class + * + * A set of methods shared between event-powered classes (like `Map` and `Marker`). Generally, events allow you to execute some function when something happens with an object (e.g. the user clicks on the map, causing the map to fire `'click'` event). + * + * @example + * + * ```js + * map.on('click', function(e) { + * alert(e.latlng); + * } ); + * ``` + * + * Leaflet deals with event listeners by reference, so if you want to add a listener and then remove it, define it as a function: + * + * ```js + * function onClick(e) { ... } + * + * map.on('click', onClick); + * map.off('click', onClick); + * ``` */ -var eventsKey = '_leaflet_events'; - -L.Mixin = {}; -L.Mixin.Events = { +L.Evented = L.Class.extend({ - addEventListener: function (types, fn, context) { // (String, Function[, Object]) or (Object[, Object]) + /* @method on(type: String, fn: Function, context?: Object): this + * Adds a listener function (`fn`) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. `'click dblclick'`). + * + * @alternative + * @method on(eventMap: Object): this + * Adds a set of type/listener pairs, e.g. `{click: onClick, mousemove: onMouseMove}` + */ + on: function (types, fn, context) { // types can be a map of types/handlers - if (L.Util.invokeEach(types, this.addEventListener, this, fn, context)) { return this; } - - var events = this[eventsKey] = this[eventsKey] || {}, - contextId = context && context !== this && L.stamp(context), - i, len, event, type, indexKey, indexLenKey, typeIndex; - - // types can be a string of space-separated words - types = L.Util.splitWords(types); - - for (i = 0, len = types.length; i < len; i++) { - event = { - action: fn, - context: context || this - }; - type = types[i]; + if (typeof types === 'object') { + for (var type in types) { + // we don't process space-separated events here for performance; + // it's a hot path since Layer uses the on(obj) syntax + this._on(type, types[type], fn); + } - if (contextId) { - // store listeners of a particular context in a separate hash (if it has an id) - // gives a major performance boost when removing thousands of map layers + } else { + // types can be a string of space-separated words + types = L.Util.splitWords(types); - indexKey = type + '_idx'; - indexLenKey = indexKey + '_len'; + for (var i = 0, len = types.length; i < len; i++) { + this._on(types[i], fn, context); + } + } - typeIndex = events[indexKey] = events[indexKey] || {}; + return this; + }, - if (!typeIndex[contextId]) { - typeIndex[contextId] = []; + /* @method off(type: String, fn?: Function, context?: Object): this + * Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to `on`, you must pass the same context to `off` in order to remove the listener. + * + * @alternative + * @method off(eventMap: Object): this + * Removes a set of type/listener pairs. + * + * @alternative + * @method off: this + * Removes all listeners to all events on the object. + */ + off: function (types, fn, context) { - // keep track of the number of keys in the index to quickly check if it's empty - events[indexLenKey] = (events[indexLenKey] || 0) + 1; - } + if (!types) { + // clear all listeners if called without arguments + delete this._events; - typeIndex[contextId].push(event); + } else if (typeof types === 'object') { + for (var type in types) { + this._off(type, types[type], fn); + } + } else { + types = L.Util.splitWords(types); - } else { - events[type] = events[type] || []; - events[type].push(event); + for (var i = 0, len = types.length; i < len; i++) { + this._off(types[i], fn, context); } } return this; }, - hasEventListeners: function (type) { // (String) -> Boolean - var events = this[eventsKey]; - return !!events && ((type in events && events[type].length > 0) || - (type + '_idx' in events && events[type + '_idx_len'] > 0)); - }, - - removeEventListener: function (types, fn, context) { // ([String, Function, Object]) or (Object[, Object]) + // attach listener (without syntactic sugar now) + _on: function (type, fn, context) { + this._events = this._events || {}; - if (!this[eventsKey]) { - return this; + /* get/init listeners for type */ + var typeListeners = this._events[type]; + if (!typeListeners) { + typeListeners = []; + this._events[type] = typeListeners; } - if (!types) { - return this.clearAllEventListeners(); + if (context === this) { + // Less memory footprint. + context = undefined; } + var newListener = {fn: fn, ctx: context}, + listeners = typeListeners; - if (L.Util.invokeEach(types, this.removeEventListener, this, fn, context)) { return this; } - - var events = this[eventsKey], - contextId = context && context !== this && L.stamp(context), - i, len, type, listeners, j, indexKey, indexLenKey, typeIndex, removed; + // check if fn already there + for (var i = 0, len = listeners.length; i < len; i++) { + if (listeners[i].fn === fn && listeners[i].ctx === context) { + return; + } + } - types = L.Util.splitWords(types); + listeners.push(newListener); + }, - for (i = 0, len = types.length; i < len; i++) { - type = types[i]; - indexKey = type + '_idx'; - indexLenKey = indexKey + '_len'; + _off: function (type, fn, context) { + var listeners, + i, + len; - typeIndex = events[indexKey]; + if (!this._events) { return; } - if (!fn) { - // clear all listeners for a type if function isn't specified - delete events[type]; - delete events[indexKey]; - delete events[indexLenKey]; + listeners = this._events[type]; - } else { - listeners = contextId && typeIndex ? typeIndex[contextId] : events[type]; - - if (listeners) { - for (j = listeners.length - 1; j >= 0; j--) { - if ((listeners[j].action === fn) && (!context || (listeners[j].context === context))) { - removed = listeners.splice(j, 1); - // set the old action to a no-op, because it is possible - // that the listener is being iterated over as part of a dispatch - removed[0].action = L.Util.falseFn; - } - } + if (!listeners) { + return; + } - if (context && typeIndex && (listeners.length === 0)) { - delete typeIndex[contextId]; - events[indexLenKey]--; - } - } + if (!fn) { + // Set all removed listeners to noop so they are not called if remove happens in fire + for (i = 0, len = listeners.length; i < len; i++) { + listeners[i].fn = L.Util.falseFn; } + // clear all listeners for a type if function isn't specified + delete this._events[type]; + return; } - return this; - }, - - clearAllEventListeners: function () { - delete this[eventsKey]; - return this; - }, - - fireEvent: function (type, data) { // (String[, Object]) - if (!this.hasEventListeners(type)) { - return this; + if (context === this) { + context = undefined; } - var event = L.Util.extend({}, data, { type: type, target: this }); + if (listeners) { - var events = this[eventsKey], - listeners, i, len, typeIndex, contextId; + // find fn and remove it + for (i = 0, len = listeners.length; i < len; i++) { + var l = listeners[i]; + if (l.ctx !== context) { continue; } + if (l.fn === fn) { - if (events[type]) { - // make sure adding/removing listeners inside other listeners won't cause infinite loop - listeners = events[type].slice(); + // set the removed listener to noop so that's not called if remove happens in fire + l.fn = L.Util.falseFn; - for (i = 0, len = listeners.length; i < len; i++) { - listeners[i].action.call(listeners[i].context, event); + if (this._firingCount) { + /* copy array in case events are being fired */ + this._events[type] = listeners = listeners.slice(); + } + listeners.splice(i, 1); + + return; + } } } + }, + + // @method fire(type: String, data?: Object, propagate?: Boolean): this + // Fires an event of the specified type. You can optionally provide an data + // object — the first argument of the listener function will contain its + // properties. The event can optionally be propagated to event parents. + fire: function (type, data, propagate) { + if (!this.listens(type, propagate)) { return this; } - // fire event for the context-indexed listeners as well - typeIndex = events[type + '_idx']; + var event = L.Util.extend({}, data, {type: type, target: this}); - for (contextId in typeIndex) { - listeners = typeIndex[contextId].slice(); + if (this._events) { + var listeners = this._events[type]; if (listeners) { - for (i = 0, len = listeners.length; i < len; i++) { - listeners[i].action.call(listeners[i].context, event); + this._firingCount = (this._firingCount + 1) || 1; + for (var i = 0, len = listeners.length; i < len; i++) { + var l = listeners[i]; + l.fn.call(l.ctx || this, event); } + + this._firingCount--; } } + if (propagate) { + // propagate the event to parents (set with addEventParent) + this._propagateEvent(event); + } + return this; }, - addOneTimeEventListener: function (types, fn, context) { + // @method listens(type: String): Boolean + // Returns `true` if a particular event type has any listeners attached to it. + listens: function (type, propagate) { + var listeners = this._events && this._events[type]; + if (listeners && listeners.length) { return true; } + + if (propagate) { + // also check parents for listeners if event propagates + for (var id in this._eventParents) { + if (this._eventParents[id].listens(type, propagate)) { return true; } + } + } + return false; + }, + + // @method once(…): this + // Behaves as [`on(…)`](#evented-on), except the listener will only get fired once and then removed. + once: function (types, fn, context) { - if (L.Util.invokeEach(types, this.addOneTimeEventListener, this, fn, context)) { return this; } + if (typeof types === 'object') { + for (var type in types) { + this.once(type, types[type], fn); + } + return this; + } var handler = L.bind(function () { this - .removeEventListener(types, fn, context) - .removeEventListener(types, handler, context); + .off(types, fn, context) + .off(types, handler, context); }, this); + // add a listener that's executed once and removed after that return this - .addEventListener(types, fn, context) - .addEventListener(types, handler, context); + .on(types, fn, context) + .on(types, handler, context); + }, + + // @method addEventParent(obj: Evented): this + // Adds an event parent - an `Evented` that will receive propagated events + addEventParent: function (obj) { + this._eventParents = this._eventParents || {}; + this._eventParents[L.stamp(obj)] = obj; + return this; + }, + + // @method removeEventParent(obj: Evented): this + // Removes an event parent, so it will stop receiving propagated events + removeEventParent: function (obj) { + if (this._eventParents) { + delete this._eventParents[L.stamp(obj)]; + } + return this; + }, + + _propagateEvent: function (e) { + for (var id in this._eventParents) { + this._eventParents[id].fire(e.type, L.extend({layer: e.target}, e), true); + } } -}; +}); + +var proto = L.Evented.prototype; + +// aliases; we should ditch those eventually + +// @method addEventListener(…): this +// Alias to [`on(…)`](#evented-on) +proto.addEventListener = proto.on; + +// @method removeEventListener(…): this +// Alias to [`off(…)`](#evented-off) + +// @method clearAllEventListeners(…): this +// Alias to [`off()`](#evented-off) +proto.removeEventListener = proto.clearAllEventListeners = proto.off; + +// @method addOneTimeEventListener(…): this +// Alias to [`once(…)`](#evented-once) +proto.addOneTimeEventListener = proto.once; + +// @method fireEvent(…): this +// Alias to [`fire(…)`](#evented-fire) +proto.fireEvent = proto.fire; + +// @method hasEventListeners(…): Boolean +// Alias to [`listens(…)`](#evented-listens) +proto.hasEventListeners = proto.listens; + +L.Mixin = {Events: proto}; -L.Mixin.Events.on = L.Mixin.Events.addEventListener; -L.Mixin.Events.off = L.Mixin.Events.removeEventListener; -L.Mixin.Events.once = L.Mixin.Events.addOneTimeEventListener; -L.Mixin.Events.fire = L.Mixin.Events.fireEvent; /* - * L.Browser handles different browser and feature detections for internal Leaflet use. + * @namespace Browser + * @aka L.Browser + * + * A namespace with static properties for browser/feature detection used by Leaflet internally. + * + * @example + * + * ```js + * if (L.Browser.ielt9) { + * alert('Upgrade your browser, dude!'); + * } + * ``` */ (function () { - var ie = 'ActiveXObject' in window, - ielt9 = ie && !document.addEventListener, + var ua = navigator.userAgent.toLowerCase(), + doc = document.documentElement, + + ie = 'ActiveXObject' in window, - // terrible browser detection to work around Safari / iOS / Android browser bugs - ua = navigator.userAgent.toLowerCase(), - webkit = ua.indexOf('webkit') !== -1, - chrome = ua.indexOf('chrome') !== -1, + webkit = ua.indexOf('webkit') !== -1, phantomjs = ua.indexOf('phantom') !== -1, - android = ua.indexOf('android') !== -1, android23 = ua.search('android [23]') !== -1, - gecko = ua.indexOf('gecko') !== -1, + chrome = ua.indexOf('chrome') !== -1, + gecko = ua.indexOf('gecko') !== -1 && !webkit && !window.opera && !ie, - mobile = typeof orientation !== undefined + '', - msPointer = window.navigator && window.navigator.msPointerEnabled && - window.navigator.msMaxTouchPoints && !window.PointerEvent, - pointer = (window.PointerEvent && window.navigator.pointerEnabled && window.navigator.maxTouchPoints) || - msPointer, - retina = ('devicePixelRatio' in window && window.devicePixelRatio > 1) || - ('matchMedia' in window && window.matchMedia('(min-resolution:144dpi)') && - window.matchMedia('(min-resolution:144dpi)').matches), + win = navigator.platform.indexOf('Win') === 0, + + mobile = typeof orientation !== 'undefined' || ua.indexOf('mobile') !== -1, + msPointer = !window.PointerEvent && window.MSPointerEvent, + pointer = window.PointerEvent || msPointer, - doc = document.documentElement, ie3d = ie && ('transition' in doc.style), webkit3d = ('WebKitCSSMatrix' in window) && ('m11' in new window.WebKitCSSMatrix()) && !android23, gecko3d = 'MozPerspective' in doc.style, - opera3d = 'OTransition' in doc.style, - any3d = !window.L_DISABLE_3D && (ie3d || webkit3d || gecko3d || opera3d) && !phantomjs; + opera12 = 'OTransition' in doc.style; - // PhantomJS has 'ontouchstart' in document.documentElement, but doesn't actually support touch. - // https://github.com/Leaflet/Leaflet/pull/1434#issuecomment-13843151 + var touch = !window.L_NO_TOUCH && (pointer || 'ontouchstart' in window || + (window.DocumentTouch && document instanceof window.DocumentTouch)); - var touch = !window.L_NO_TOUCH && !phantomjs && (function () { + L.Browser = { - var startName = 'ontouchstart'; + // @property ie: Boolean + // `true` for all Internet Explorer versions (not Edge). + ie: ie, - // IE10+ (We simulate these into touch* events in L.DomEvent and L.DomEvent.Pointer) or WebKit, etc. - if (pointer || (startName in doc)) { - return true; - } + // @property ielt9: Boolean + // `true` for Internet Explorer versions less than 9. + ielt9: ie && !document.addEventListener, - // Firefox/Gecko - var div = document.createElement('div'), - supported = false; + // @property edge: Boolean + // `true` for the Edge web browser. + edge: 'msLaunchUri' in navigator && !('documentMode' in document), - if (!div.setAttribute) { - return false; - } - div.setAttribute(startName, 'return;'); + // @property webkit: Boolean + // `true` for webkit-based browsers like Chrome and Safari (including mobile versions). + webkit: webkit, - if (typeof div[startName] === 'function') { - supported = true; - } + // @property gecko: Boolean + // `true` for gecko-based browsers like Firefox. + gecko: gecko, - div.removeAttribute(startName); - div = null; + // @property android: Boolean + // `true` for any browser running on an Android platform. + android: ua.indexOf('android') !== -1, - return supported; - }()); + // @property android23: Boolean + // `true` for browsers running on Android 2 or Android 3. + android23: android23, + // @property chrome: Boolean + // `true` for the Chrome browser. + chrome: chrome, - L.Browser = { - ie: ie, - ielt9: ielt9, - webkit: webkit, - gecko: gecko && !webkit && !window.opera && !ie, + // @property safari: Boolean + // `true` for the Safari browser. + safari: !chrome && ua.indexOf('safari') !== -1, - android: android, - android23: android23, - chrome: chrome, + // @property win: Boolean + // `true` when the browser is running in a Windows platform + win: win, + + // @property ie3d: Boolean + // `true` for all Internet Explorer versions supporting CSS transforms. ie3d: ie3d, + + // @property webkit3d: Boolean + // `true` for webkit-based browsers supporting CSS transforms. webkit3d: webkit3d, + + // @property gecko3d: Boolean + // `true` for gecko-based browsers supporting CSS transforms. gecko3d: gecko3d, - opera3d: opera3d, - any3d: any3d, + // @property opera12: Boolean + // `true` for the Opera browser supporting CSS transforms (version 12 or later). + opera12: opera12, + + // @property any3d: Boolean + // `true` for all browsers supporting CSS transforms. + any3d: !window.L_DISABLE_3D && (ie3d || webkit3d || gecko3d) && !opera12 && !phantomjs, + + + // @property mobile: Boolean + // `true` for all browsers running in a mobile device. mobile: mobile, + + // @property mobileWebkit: Boolean + // `true` for all webkit-based browsers in a mobile device. mobileWebkit: mobile && webkit, + + // @property mobileWebkit3d: Boolean + // `true` for all webkit-based browsers in a mobile device supporting CSS transforms. mobileWebkit3d: mobile && webkit3d, + + // @property mobileOpera: Boolean + // `true` for the Opera browser in a mobile device. mobileOpera: mobile && window.opera, - touch: touch, - msPointer: msPointer, - pointer: pointer, + // @property mobileGecko: Boolean + // `true` for gecko-based browsers running in a mobile device. + mobileGecko: mobile && gecko, + + + // @property touch: Boolean + // `true` for all browsers supporting [touch events](https://developer.mozilla.org/docs/Web/API/Touch_events). + // This does not necessarily mean that the browser is running in a computer with + // a touchscreen, it only means that the browser is capable of understanding + // touch events. + touch: !!touch, + + // @property msPointer: Boolean + // `true` for browsers implementing the Microsoft touch events model (notably IE10). + msPointer: !!msPointer, + + // @property pointer: Boolean + // `true` for all browsers supporting [pointer events](https://msdn.microsoft.com/en-us/library/dn433244%28v=vs.85%29.aspx). + pointer: !!pointer, - retina: retina + + // @property retina: Boolean + // `true` for browsers on a high-resolution "retina" screen. + retina: (window.devicePixelRatio || (window.screen.deviceXDPI / window.screen.logicalXDPI)) > 1 }; }()); + /* - * L.Point represents a point with x and y coordinates. + * @class Point + * @aka L.Point + * + * Represents a point with `x` and `y` coordinates in pixels. + * + * @example + * + * ```js + * var point = L.point(200, 300); + * ``` + * + * All Leaflet methods and options that accept `Point` objects also accept them in a simple Array form (unless noted otherwise), so these lines are equivalent: + * + * ```js + * map.panBy([200, 300]); + * map.panBy(L.point(200, 300)); + * ``` */ -L.Point = function (/*Number*/ x, /*Number*/ y, /*Boolean*/ round) { +L.Point = function (x, y, round) { + // @property x: Number; The `x` coordinate of the point this.x = (round ? Math.round(x) : x); + // @property y: Number; The `y` coordinate of the point this.y = (round ? Math.round(y) : y); }; L.Point.prototype = { + // @method clone(): Point + // Returns a copy of the current point. clone: function () { return new L.Point(this.x, this.y); }, - // non-destructive, returns a new point + // @method add(otherPoint: Point): Point + // Returns the result of addition of the current and the given points. add: function (point) { + // non-destructive, returns a new point return this.clone()._add(L.point(point)); }, - // destructive, used directly for performance in situations where it's safe to modify existing point _add: function (point) { + // destructive, used directly for performance in situations where it's safe to modify existing point this.x += point.x; this.y += point.y; return this; }, + // @method subtract(otherPoint: Point): Point + // Returns the result of subtraction of the given point from the current. subtract: function (point) { return this.clone()._subtract(L.point(point)); }, @@ -636,6 +907,8 @@ L.Point.prototype = { return this; }, + // @method divideBy(num: Number): Point + // Returns the result of division of the current point by the given number. divideBy: function (num) { return this.clone()._divideBy(num); }, @@ -646,6 +919,8 @@ L.Point.prototype = { return this; }, + // @method multiplyBy(num: Number): Point + // Returns the result of multiplication of the current point by the given number. multiplyBy: function (num) { return this.clone()._multiplyBy(num); }, @@ -656,6 +931,24 @@ L.Point.prototype = { return this; }, + // @method scaleBy(scale: Point): Point + // Multiply each coordinate of the current point by each coordinate of + // `scale`. In linear algebra terms, multiply the point by the + // [scaling matrix](https://en.wikipedia.org/wiki/Scaling_%28geometry%29#Matrix_representation) + // defined by `scale`. + scaleBy: function (point) { + return new L.Point(this.x * point.x, this.y * point.y); + }, + + // @method unscaleBy(scale: Point): Point + // Inverse of `scaleBy`. Divide each coordinate of the current point by + // each coordinate of `scale`. + unscaleBy: function (point) { + return new L.Point(this.x / point.x, this.y / point.y); + }, + + // @method round(): Point + // Returns a copy of the current point with rounded coordinates. round: function () { return this.clone()._round(); }, @@ -666,6 +959,8 @@ L.Point.prototype = { return this; }, + // @method floor(): Point + // Returns a copy of the current point with floored coordinates (rounded down). floor: function () { return this.clone()._floor(); }, @@ -676,6 +971,20 @@ L.Point.prototype = { return this; }, + // @method ceil(): Point + // Returns a copy of the current point with ceiled coordinates (rounded up). + ceil: function () { + return this.clone()._ceil(); + }, + + _ceil: function () { + this.x = Math.ceil(this.x); + this.y = Math.ceil(this.y); + return this; + }, + + // @method distanceTo(otherPoint: Point): Number + // Returns the cartesian distance between the current and the given points. distanceTo: function (point) { point = L.point(point); @@ -685,6 +994,8 @@ L.Point.prototype = { return Math.sqrt(x * x + y * y); }, + // @method equals(otherPoint: Point): Boolean + // Returns `true` if the given point has the same coordinates. equals: function (point) { point = L.point(point); @@ -692,6 +1003,8 @@ L.Point.prototype = { point.y === this.y; }, + // @method contains(otherPoint: Point): Boolean + // Returns `true` if both coordinates of the given point are less than the corresponding current point coordinates (in absolute values). contains: function (point) { point = L.point(point); @@ -699,6 +1012,8 @@ L.Point.prototype = { Math.abs(point.y) <= Math.abs(this.y); }, + // @method toString(): String + // Returns a string representation of the point for debugging purposes. toString: function () { return 'Point(' + L.Util.formatNum(this.x) + ', ' + @@ -706,6 +1021,16 @@ L.Point.prototype = { } }; +// @factory L.point(x: Number, y: Number, round?: Boolean) +// Creates a Point object with the given `x` and `y` coordinates. If optional `round` is set to true, rounds the `x` and `y` values. + +// @alternative +// @factory L.point(coords: Number[]) +// Expects an array of the form `[x, y]` instead. + +// @alternative +// @factory L.point(coords: Object) +// Expects a plain object of the form `{x: Number, y: Number}` instead. L.point = function (x, y, round) { if (x instanceof L.Point) { return x; @@ -716,15 +1041,36 @@ L.point = function (x, y, round) { if (x === undefined || x === null) { return x; } + if (typeof x === 'object' && 'x' in x && 'y' in x) { + return new L.Point(x.x, x.y); + } return new L.Point(x, y, round); }; + /* - * L.Bounds represents a rectangular area on the screen in pixel coordinates. + * @class Bounds + * @aka L.Bounds + * + * Represents a rectangular area in pixel coordinates. + * + * @example + * + * ```js + * var p1 = L.point(10, 10), + * p2 = L.point(40, 60), + * bounds = L.bounds(p1, p2); + * ``` + * + * All Leaflet methods that accept `Bounds` objects also accept them in a simple Array form (unless noted otherwise), so the bounds example above can be passed like this: + * + * ```js + * otherBounds.intersects([[10, 10], [40, 60]]); + * ``` */ -L.Bounds = function (a, b) { //(Point, Point) or Point[] +L.Bounds = function (a, b) { if (!a) { return; } var points = b ? [a, b] : a; @@ -735,10 +1081,15 @@ L.Bounds = function (a, b) { //(Point, Point) or Point[] }; L.Bounds.prototype = { - // extend the bounds to contain the given point + // @method extend(point: Point): this + // Extends the bounds to contain the given point. extend: function (point) { // (Point) point = L.point(point); + // @property min: Point + // The top left corner of the rectangle. + // @property max: Point + // The bottom right corner of the rectangle. if (!this.min && !this.max) { this.min = point.clone(); this.max = point.clone(); @@ -751,25 +1102,38 @@ L.Bounds.prototype = { return this; }, - getCenter: function (round) { // (Boolean) -> Point + // @method getCenter(round?: Boolean): Point + // Returns the center point of the bounds. + getCenter: function (round) { return new L.Point( (this.min.x + this.max.x) / 2, (this.min.y + this.max.y) / 2, round); }, - getBottomLeft: function () { // -> Point + // @method getBottomLeft(): Point + // Returns the bottom-left point of the bounds. + getBottomLeft: function () { return new L.Point(this.min.x, this.max.y); }, + // @method getTopRight(): Point + // Returns the top-right point of the bounds. getTopRight: function () { // -> Point return new L.Point(this.max.x, this.min.y); }, + // @method getSize(): Point + // Returns the size of the given bounds getSize: function () { return this.max.subtract(this.min); }, - contains: function (obj) { // (Bounds) or (Point) -> Boolean + // @method contains(otherBounds: Bounds): Boolean + // Returns `true` if the rectangle contains the given one. + // @alternative + // @method contains(point: Point): Boolean + // Returns `true` if the rectangle contains the given point. + contains: function (obj) { var min, max; if (typeof obj[0] === 'number' || obj instanceof L.Point) { @@ -791,6 +1155,9 @@ L.Bounds.prototype = { (max.y <= this.max.y); }, + // @method intersects(otherBounds: Bounds): Boolean + // Returns `true` if the rectangle intersects the given bounds. Two bounds + // intersect if they have at least one point in common. intersects: function (bounds) { // (Bounds) -> Boolean bounds = L.bounds(bounds); @@ -804,12 +1171,34 @@ L.Bounds.prototype = { return xIntersects && yIntersects; }, + // @method overlaps(otherBounds: Bounds): Boolean + // Returns `true` if the rectangle overlaps the given bounds. Two bounds + // overlap if their intersection is an area. + overlaps: function (bounds) { // (Bounds) -> Boolean + bounds = L.bounds(bounds); + + var min = this.min, + max = this.max, + min2 = bounds.min, + max2 = bounds.max, + xOverlaps = (max2.x > min.x) && (min2.x < max.x), + yOverlaps = (max2.y > min.y) && (min2.y < max.y); + + return xOverlaps && yOverlaps; + }, + isValid: function () { return !!(this.min && this.max); } }; -L.bounds = function (a, b) { // (Bounds) or (Point, Point) or (Point[]) + +// @factory L.bounds(topLeft: Point, bottomRight: Point) +// Creates a Bounds object from two coordinates (usually top-left and bottom-right corners). +// @alternative +// @factory L.bounds(points: Point[]) +// Creates a Bounds object from the points it contains +L.bounds = function (a, b) { if (!a || a instanceof L.Bounds) { return a; } @@ -817,10 +1206,28 @@ L.bounds = function (a, b) { // (Bounds) or (Point, Point) or (Point[]) }; + /* - * L.Transformation is an utility class to perform simple point transformations through a 2d-matrix. + * @class Transformation + * @aka L.Transformation + * + * Represents an affine transformation: a set of coefficients `a`, `b`, `c`, `d` + * for transforming a point of a form `(x, y)` into `(a*x + b, c*y + d)` and doing + * the reverse. Used by Leaflet in its projections code. + * + * @example + * + * ```js + * var transformation = new L.Transformation(2, 5, -1, 10), + * p = L.point(1, 2), + * p2 = transformation.transform(p), // L.point(7, 8) + * p3 = transformation.untransform(p2); // L.point(1, 2) + * ``` */ + +// factory new L.Transformation(a: Number, b: Number, c: Number, d: Number) +// Creates a `Transformation` object with the given coefficients. L.Transformation = function (a, b, c, d) { this._a = a; this._b = b; @@ -829,6 +1236,9 @@ L.Transformation = function (a, b, c, d) { }; L.Transformation.prototype = { + // @method transform(point: Point, scale?: Number): Point + // Returns a transformed point, optionally multiplied by the given scale. + // Only accepts actual `L.Point` instances, not arrays. transform: function (point, scale) { // (Point, Number) -> Point return this._transform(point.clone(), scale); }, @@ -841,6 +1251,9 @@ L.Transformation.prototype = { return point; }, + // @method untransform(point: Point, scale?: Number): Point + // Returns the reverse transformation of the given point, optionally divided + // by the given scale. Only accepts actual `L.Point` instances, not arrays. untransform: function (point, scale) { scale = scale || 1; return new L.Point( @@ -850,22 +1263,33 @@ L.Transformation.prototype = { }; + /* - * L.DomUtil contains various utility functions for working with DOM. + * @namespace DomUtil + * + * Utility functions to work with the [DOM](https://developer.mozilla.org/docs/Web/API/Document_Object_Model) + * tree, used by Leaflet internally. + * + * Most functions expecting or returning a `HTMLElement` also work for + * SVG elements. The only difference is that classes refer to CSS classes + * in HTML and SVG classes in SVG. */ L.DomUtil = { + + // @function get(id: String|HTMLElement): HTMLElement + // Returns an element given its DOM id, or returns the element itself + // if it was passed directly. get: function (id) { - return (typeof id === 'string' ? document.getElementById(id) : id); + return typeof id === 'string' ? document.getElementById(id) : id; }, + // @function getStyle(el: HTMLElement, styleAttrib: String): String + // Returns the value for a certain style attribute on an element, + // including computed values or values set through CSS. getStyle: function (el, style) { - var value = el.style[style]; - - if (!value && el.currentStyle) { - value = el.currentStyle[style]; - } + var value = el.style[style] || (el.currentStyle && el.currentStyle[style]); if ((!value || value === 'auto') && document.defaultView) { var css = document.defaultView.getComputedStyle(el, null); @@ -875,94 +1299,62 @@ L.DomUtil = { return value === 'auto' ? null : value; }, - getViewportOffset: function (element) { - - var top = 0, - left = 0, - el = element, - docBody = document.body, - docEl = document.documentElement, - pos; - - do { - top += el.offsetTop || 0; - left += el.offsetLeft || 0; - - //add borders - top += parseInt(L.DomUtil.getStyle(el, 'borderTopWidth'), 10) || 0; - left += parseInt(L.DomUtil.getStyle(el, 'borderLeftWidth'), 10) || 0; - - pos = L.DomUtil.getStyle(el, 'position'); - - if (el.offsetParent === docBody && pos === 'absolute') { break; } - - if (pos === 'fixed') { - top += docBody.scrollTop || docEl.scrollTop || 0; - left += docBody.scrollLeft || docEl.scrollLeft || 0; - break; - } - - if (pos === 'relative' && !el.offsetLeft) { - var width = L.DomUtil.getStyle(el, 'width'), - maxWidth = L.DomUtil.getStyle(el, 'max-width'), - r = el.getBoundingClientRect(); - - if (width !== 'none' || maxWidth !== 'none') { - left += r.left + el.clientLeft; - } - - //calculate full y offset since we're breaking out of the loop - top += r.top + (docBody.scrollTop || docEl.scrollTop || 0); - - break; - } - - el = el.offsetParent; - - } while (el); - - el = element; - - do { - if (el === docBody) { break; } + // @function create(tagName: String, className?: String, container?: HTMLElement): HTMLElement + // Creates an HTML element with `tagName`, sets its class to `className`, and optionally appends it to `container` element. + create: function (tagName, className, container) { - top -= el.scrollTop || 0; - left -= el.scrollLeft || 0; + var el = document.createElement(tagName); + el.className = className || ''; - el = el.parentNode; - } while (el); + if (container) { + container.appendChild(el); + } - return new L.Point(left, top); + return el; }, - documentIsLtr: function () { - if (!L.DomUtil._docIsLtrCached) { - L.DomUtil._docIsLtrCached = true; - L.DomUtil._docIsLtr = L.DomUtil.getStyle(document.body, 'direction') === 'ltr'; + // @function remove(el: HTMLElement) + // Removes `el` from its parent element + remove: function (el) { + var parent = el.parentNode; + if (parent) { + parent.removeChild(el); } - return L.DomUtil._docIsLtr; }, - create: function (tagName, className, container) { - - var el = document.createElement(tagName); - el.className = className; - - if (container) { - container.appendChild(el); + // @function empty(el: HTMLElement) + // Removes all of `el`'s children elements from `el` + empty: function (el) { + while (el.firstChild) { + el.removeChild(el.firstChild); } + }, - return el; + // @function toFront(el: HTMLElement) + // Makes `el` the last children of its parent, so it renders in front of the other children. + toFront: function (el) { + el.parentNode.appendChild(el); + }, + + // @function toBack(el: HTMLElement) + // Makes `el` the first children of its parent, so it renders back from the other children. + toBack: function (el) { + var parent = el.parentNode; + parent.insertBefore(el, parent.firstChild); }, + // @function hasClass(el: HTMLElement, name: String): Boolean + // Returns `true` if the element's class attribute contains `name`. hasClass: function (el, name) { if (el.classList !== undefined) { return el.classList.contains(name); } - var className = L.DomUtil._getClass(el); + var className = L.DomUtil.getClass(el); return className.length > 0 && new RegExp('(^|\\s)' + name + '(\\s|$)').test(className); }, + // @function addClass(el: HTMLElement, name: String) + // Adds `name` to the element's class attribute. addClass: function (el, name) { if (el.classList !== undefined) { var classes = L.Util.splitWords(name); @@ -970,20 +1362,24 @@ L.DomUtil = { el.classList.add(classes[i]); } } else if (!L.DomUtil.hasClass(el, name)) { - var className = L.DomUtil._getClass(el); - L.DomUtil._setClass(el, (className ? className + ' ' : '') + name); + var className = L.DomUtil.getClass(el); + L.DomUtil.setClass(el, (className ? className + ' ' : '') + name); } }, + // @function removeClass(el: HTMLElement, name: String) + // Removes `name` from the element's class attribute. removeClass: function (el, name) { if (el.classList !== undefined) { el.classList.remove(name); } else { - L.DomUtil._setClass(el, L.Util.trim((' ' + L.DomUtil._getClass(el) + ' ').replace(' ' + name + ' ', ' '))); + L.DomUtil.setClass(el, L.Util.trim((' ' + L.DomUtil.getClass(el) + ' ').replace(' ' + name + ' ', ' '))); } }, - _setClass: function (el, name) { + // @function setClass(el: HTMLElement, name: String) + // Sets the element's class. + setClass: function (el, name) { if (el.className.baseVal === undefined) { el.className = name; } else { @@ -992,40 +1388,52 @@ L.DomUtil = { } }, - _getClass: function (el) { + // @function getClass(el: HTMLElement): String + // Returns the element's class. + getClass: function (el) { return el.className.baseVal === undefined ? el.className : el.className.baseVal; }, + // @function setOpacity(el: HTMLElement, opacity: Number) + // Set the opacity of an element (including old IE support). + // `opacity` must be a number from `0` to `1`. setOpacity: function (el, value) { if ('opacity' in el.style) { el.style.opacity = value; } else if ('filter' in el.style) { + L.DomUtil._setOpacityIE(el, value); + } + }, - var filter = false, - filterName = 'DXImageTransform.Microsoft.Alpha'; - - // filters collection throws an error if we try to retrieve a filter that doesn't exist - try { - filter = el.filters.item(filterName); - } catch (e) { - // don't set opacity to 1 if we haven't already set an opacity, - // it isn't needed and breaks transparent pngs. - if (value === 1) { return; } - } - - value = Math.round(value * 100); + _setOpacityIE: function (el, value) { + var filter = false, + filterName = 'DXImageTransform.Microsoft.Alpha'; - if (filter) { - filter.Enabled = (value !== 100); - filter.Opacity = value; - } else { - el.style.filter += ' progid:' + filterName + '(opacity=' + value + ')'; - } + // filters collection throws an error if we try to retrieve a filter that doesn't exist + try { + filter = el.filters.item(filterName); + } catch (e) { + // don't set opacity to 1 if we haven't already set an opacity, + // it isn't needed and breaks transparent pngs. + if (value === 1) { return; } + } + + value = Math.round(value * 100); + + if (filter) { + filter.Enabled = (value !== 100); + filter.Opacity = value; + } else { + el.style.filter += ' progid:' + filterName + '(opacity=' + value + ')'; } }, + // @function testProp(props: String[]): String|false + // Goes through the array of style names and returns the first name + // that is a valid style name for an element. If no such name is found, + // it returns false. Useful for vendor-prefixed styles like `transform`. testProp: function (props) { var style = document.documentElement.style; @@ -1038,137 +1446,192 @@ L.DomUtil = { return false; }, - getTranslateString: function (point) { - // on WebKit browsers (Chrome/Safari/iOS Safari/Android) using translate3d instead of translate - // makes animation smoother as it ensures HW accel is used. Firefox 13 doesn't care - // (same speed either way), Opera 12 doesn't support translate3d + // @function setTransform(el: HTMLElement, offset: Point, scale?: Number) + // Resets the 3D CSS transform of `el` so it is translated by `offset` pixels + // and optionally scaled by `scale`. Does not have an effect if the + // browser doesn't support 3D CSS transforms. + setTransform: function (el, offset, scale) { + var pos = offset || new L.Point(0, 0); - var is3d = L.Browser.webkit3d, - open = 'translate' + (is3d ? '3d' : '') + '(', - close = (is3d ? ',0' : '') + ')'; - - return open + point.x + 'px,' + point.y + 'px' + close; - }, - - getScaleString: function (scale, origin) { - - var preTranslateStr = L.DomUtil.getTranslateString(origin.add(origin.multiplyBy(-1 * scale))), - scaleStr = ' scale(' + scale + ') '; - - return preTranslateStr + scaleStr; + el.style[L.DomUtil.TRANSFORM] = + (L.Browser.ie3d ? + 'translate(' + pos.x + 'px,' + pos.y + 'px)' : + 'translate3d(' + pos.x + 'px,' + pos.y + 'px,0)') + + (scale ? ' scale(' + scale + ')' : ''); }, - setPosition: function (el, point, disable3D) { // (HTMLElement, Point[, Boolean]) + // @function setPosition(el: HTMLElement, position: Point) + // Sets the position of `el` to coordinates specified by `position`, + // using CSS translate or top/left positioning depending on the browser + // (used by Leaflet internally to position its layers). + setPosition: function (el, point) { // (HTMLElement, Point[, Boolean]) - // jshint camelcase: false + /*eslint-disable */ el._leaflet_pos = point; + /*eslint-enable */ - if (!disable3D && L.Browser.any3d) { - el.style[L.DomUtil.TRANSFORM] = L.DomUtil.getTranslateString(point); + if (L.Browser.any3d) { + L.DomUtil.setTransform(el, point); } else { el.style.left = point.x + 'px'; el.style.top = point.y + 'px'; } }, + // @function getPosition(el: HTMLElement): Point + // Returns the coordinates of an element previously positioned with setPosition. getPosition: function (el) { // this method is only used for elements previously positioned using setPosition, // so it's safe to cache the position for performance - // jshint camelcase: false - return el._leaflet_pos; + return el._leaflet_pos || new L.Point(0, 0); } }; -// prefix style property names +(function () { + // prefix style property names -L.DomUtil.TRANSFORM = L.DomUtil.testProp( - ['transform', 'WebkitTransform', 'OTransform', 'MozTransform', 'msTransform']); + // @property TRANSFORM: String + // Vendor-prefixed fransform style name (e.g. `'webkitTransform'` for WebKit). + L.DomUtil.TRANSFORM = L.DomUtil.testProp( + ['transform', 'WebkitTransform', 'OTransform', 'MozTransform', 'msTransform']); -// webkitTransition comes first because some browser versions that drop vendor prefix don't do -// the same for the transitionend event, in particular the Android 4.1 stock browser -L.DomUtil.TRANSITION = L.DomUtil.testProp( - ['webkitTransition', 'transition', 'OTransition', 'MozTransition', 'msTransition']); + // webkitTransition comes first because some browser versions that drop vendor prefix don't do + // the same for the transitionend event, in particular the Android 4.1 stock browser -L.DomUtil.TRANSITION_END = - L.DomUtil.TRANSITION === 'webkitTransition' || L.DomUtil.TRANSITION === 'OTransition' ? - L.DomUtil.TRANSITION + 'End' : 'transitionend'; + // @property TRANSITION: String + // Vendor-prefixed transform style name. + var transition = L.DomUtil.TRANSITION = L.DomUtil.testProp( + ['webkitTransition', 'transition', 'OTransition', 'MozTransition', 'msTransition']); -(function () { - if ('onselectstart' in document) { - L.extend(L.DomUtil, { - disableTextSelection: function () { - L.DomEvent.on(window, 'selectstart', L.DomEvent.preventDefault); - }, - - enableTextSelection: function () { - L.DomEvent.off(window, 'selectstart', L.DomEvent.preventDefault); - } - }); - } else { - var userSelectProperty = L.DomUtil.testProp( - ['userSelect', 'WebkitUserSelect', 'OUserSelect', 'MozUserSelect', 'msUserSelect']); - - L.extend(L.DomUtil, { - disableTextSelection: function () { - if (userSelectProperty) { - var style = document.documentElement.style; - this._userSelect = style[userSelectProperty]; - style[userSelectProperty] = 'none'; - } - }, - - enableTextSelection: function () { - if (userSelectProperty) { - document.documentElement.style[userSelectProperty] = this._userSelect; - delete this._userSelect; - } - } - }); - } - - L.extend(L.DomUtil, { - disableImageDrag: function () { - L.DomEvent.on(window, 'dragstart', L.DomEvent.preventDefault); - }, + L.DomUtil.TRANSITION_END = + transition === 'webkitTransition' || transition === 'OTransition' ? transition + 'End' : 'transitionend'; - enableImageDrag: function () { - L.DomEvent.off(window, 'dragstart', L.DomEvent.preventDefault); - } - }); + // @function disableTextSelection() + // Prevents the user from generating `selectstart` DOM events, usually generated + // when the user drags the mouse through a page with text. Used internally + // by Leaflet to override the behaviour of any click-and-drag interaction on + // the map. Affects drag interactions on the whole document. + + // @function enableTextSelection() + // Cancels the effects of a previous [`L.DomUtil.disableTextSelection`](#domutil-disabletextselection). + if ('onselectstart' in document) { + L.DomUtil.disableTextSelection = function () { + L.DomEvent.on(window, 'selectstart', L.DomEvent.preventDefault); + }; + L.DomUtil.enableTextSelection = function () { + L.DomEvent.off(window, 'selectstart', L.DomEvent.preventDefault); + }; + + } else { + var userSelectProperty = L.DomUtil.testProp( + ['userSelect', 'WebkitUserSelect', 'OUserSelect', 'MozUserSelect', 'msUserSelect']); + + L.DomUtil.disableTextSelection = function () { + if (userSelectProperty) { + var style = document.documentElement.style; + this._userSelect = style[userSelectProperty]; + style[userSelectProperty] = 'none'; + } + }; + L.DomUtil.enableTextSelection = function () { + if (userSelectProperty) { + document.documentElement.style[userSelectProperty] = this._userSelect; + delete this._userSelect; + } + }; + } + + // @function disableImageDrag() + // As [`L.DomUtil.disableTextSelection`](#domutil-disabletextselection), but + // for `dragstart` DOM events, usually generated when the user drags an image. + L.DomUtil.disableImageDrag = function () { + L.DomEvent.on(window, 'dragstart', L.DomEvent.preventDefault); + }; + + // @function enableImageDrag() + // Cancels the effects of a previous [`L.DomUtil.disableImageDrag`](#domutil-disabletextselection). + L.DomUtil.enableImageDrag = function () { + L.DomEvent.off(window, 'dragstart', L.DomEvent.preventDefault); + }; + + // @function preventOutline(el: HTMLElement) + // Makes the [outline](https://developer.mozilla.org/docs/Web/CSS/outline) + // of the element `el` invisible. Used internally by Leaflet to prevent + // focusable elements from displaying an outline when the user performs a + // drag interaction on them. + L.DomUtil.preventOutline = function (element) { + while (element.tabIndex === -1) { + element = element.parentNode; + } + if (!element || !element.style) { return; } + L.DomUtil.restoreOutline(); + this._outlineElement = element; + this._outlineStyle = element.style.outline; + element.style.outline = 'none'; + L.DomEvent.on(window, 'keydown', L.DomUtil.restoreOutline, this); + }; + + // @function restoreOutline() + // Cancels the effects of a previous [`L.DomUtil.preventOutline`](). + L.DomUtil.restoreOutline = function () { + if (!this._outlineElement) { return; } + this._outlineElement.style.outline = this._outlineStyle; + delete this._outlineElement; + delete this._outlineStyle; + L.DomEvent.off(window, 'keydown', L.DomUtil.restoreOutline, this); + }; })(); -/* - * L.LatLng represents a geographical point with latitude and longitude coordinates. - */ -L.LatLng = function (lat, lng, alt) { // (Number, Number, Number) - lat = parseFloat(lat); - lng = parseFloat(lng); +/* @class LatLng + * @aka L.LatLng + * + * Represents a geographical point with a certain latitude and longitude. + * + * @example + * + * ``` + * var latlng = L.latLng(50.5, 30.5); + * ``` + * + * All Leaflet methods that accept LatLng objects also accept them in a simple Array form and simple object form (unless noted otherwise), so these lines are equivalent: + * + * ``` + * map.panTo([50, 30]); + * map.panTo({lon: 30, lat: 50}); + * map.panTo({lat: 50, lng: 30}); + * map.panTo(L.latLng(50, 30)); + * ``` + */ +L.LatLng = function (lat, lng, alt) { if (isNaN(lat) || isNaN(lng)) { throw new Error('Invalid LatLng object: (' + lat + ', ' + lng + ')'); } - this.lat = lat; - this.lng = lng; + // @property lat: Number + // Latitude in degrees + this.lat = +lat; + // @property lng: Number + // Longitude in degrees + this.lng = +lng; + + // @property alt: Number + // Altitude in meters (optional) if (alt !== undefined) { - this.alt = parseFloat(alt); + this.alt = +alt; } }; -L.extend(L.LatLng, { - DEG_TO_RAD: Math.PI / 180, - RAD_TO_DEG: 180 / Math.PI, - MAX_MARGIN: 1.0E-9 // max margin of error for the "equals" check -}); - L.LatLng.prototype = { - equals: function (obj) { // (LatLng) -> Boolean + // @method equals(otherLatLng: LatLng, maxMargin?: Number): Boolean + // Returns `true` if the given `LatLng` point is at the same position (within a small margin of error). The margin of error can be overriden by setting `maxMargin` to a small number. + equals: function (obj, maxMargin) { if (!obj) { return false; } obj = L.latLng(obj); @@ -1177,79 +1640,115 @@ L.LatLng.prototype = { Math.abs(this.lat - obj.lat), Math.abs(this.lng - obj.lng)); - return margin <= L.LatLng.MAX_MARGIN; + return margin <= (maxMargin === undefined ? 1.0E-9 : maxMargin); }, - toString: function (precision) { // (Number) -> String + // @method toString(): String + // Returns a string representation of the point (for debugging purposes). + toString: function (precision) { return 'LatLng(' + L.Util.formatNum(this.lat, precision) + ', ' + L.Util.formatNum(this.lng, precision) + ')'; }, - // Haversine distance formula, see http://en.wikipedia.org/wiki/Haversine_formula - // TODO move to projection code, LatLng shouldn't know about Earth - distanceTo: function (other) { // (LatLng) -> Number - other = L.latLng(other); + // @method distanceTo(otherLatLng: LatLng): Number + // Returns the distance (in meters) to the given `LatLng` calculated using the [Haversine formula](http://en.wikipedia.org/wiki/Haversine_formula). + distanceTo: function (other) { + return L.CRS.Earth.distance(this, L.latLng(other)); + }, - var R = 6378137, // earth radius in meters - d2r = L.LatLng.DEG_TO_RAD, - dLat = (other.lat - this.lat) * d2r, - dLon = (other.lng - this.lng) * d2r, - lat1 = this.lat * d2r, - lat2 = other.lat * d2r, - sin1 = Math.sin(dLat / 2), - sin2 = Math.sin(dLon / 2); + // @method wrap(): LatLng + // Returns a new `LatLng` object with the longitude wrapped so it's always between -180 and +180 degrees. + wrap: function () { + return L.CRS.Earth.wrapLatLng(this); + }, - var a = sin1 * sin1 + sin2 * sin2 * Math.cos(lat1) * Math.cos(lat2); + // @method toBounds(sizeInMeters: Number): LatLngBounds + // Returns a new `LatLngBounds` object in which each boundary is `sizeInMeters/2` meters apart from the `LatLng`. + toBounds: function (sizeInMeters) { + var latAccuracy = 180 * sizeInMeters / 40075017, + lngAccuracy = latAccuracy / Math.cos((Math.PI / 180) * this.lat); - return R * 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); + return L.latLngBounds( + [this.lat - latAccuracy, this.lng - lngAccuracy], + [this.lat + latAccuracy, this.lng + lngAccuracy]); }, - wrap: function (a, b) { // (Number, Number) -> LatLng - var lng = this.lng; + clone: function () { + return new L.LatLng(this.lat, this.lng, this.alt); + } +}; + - a = a || -180; - b = b || 180; - lng = (lng + b) % (b - a) + (lng < a || lng === b ? b : a); +// @factory L.latLng(latitude: Number, longitude: Number, altitude?: Number): LatLng +// Creates an object representing a geographical point with the given latitude and longitude (and optionally altitude). - return new L.LatLng(this.lat, lng); - } -}; +// @alternative +// @factory L.latLng(coords: Array): LatLng +// Expects an array of the form `[Number, Number]` or `[Number, Number, Number]` instead. + +// @alternative +// @factory L.latLng(coords: Object): LatLng +// Expects an plain object of the form `{lat: Number, lng: Number}` or `{lat: Number, lng: Number, alt: Number}` instead. -L.latLng = function (a, b) { // (LatLng) or ([Number, Number]) or (Number, Number) +L.latLng = function (a, b, c) { if (a instanceof L.LatLng) { return a; } - if (L.Util.isArray(a)) { - if (typeof a[0] === 'number' || typeof a[0] === 'string') { + if (L.Util.isArray(a) && typeof a[0] !== 'object') { + if (a.length === 3) { return new L.LatLng(a[0], a[1], a[2]); - } else { - return null; } + if (a.length === 2) { + return new L.LatLng(a[0], a[1]); + } + return null; } if (a === undefined || a === null) { return a; } if (typeof a === 'object' && 'lat' in a) { - return new L.LatLng(a.lat, 'lng' in a ? a.lng : a.lon); + return new L.LatLng(a.lat, 'lng' in a ? a.lng : a.lon, a.alt); } if (b === undefined) { return null; } - return new L.LatLng(a, b); + return new L.LatLng(a, b, c); }; /* - * L.LatLngBounds represents a rectangular area on the map in geographical coordinates. + * @class LatLngBounds + * @aka L.LatLngBounds + * + * Represents a rectangular geographical area on a map. + * + * @example + * + * ```js + * var corner1 = L.latLng(40.712, -74.227), + * corner2 = L.latLng(40.774, -74.125), + * bounds = L.latLngBounds(corner1, corner2); + * ``` + * + * All Leaflet methods that accept LatLngBounds objects also accept them in a simple Array form (unless noted otherwise), so the bounds example above can be passed like this: + * + * ```js + * map.fitBounds([ + * [40.712, -74.227], + * [40.774, -74.125] + * ]); + * ``` + * + * Caution: if the area crosses the antimeridian (often confused with the International Date Line), you must specify corners _outside_ the [-180, 180] degrees longitude range. */ -L.LatLngBounds = function (southWest, northEast) { // (LatLng, LatLng) or (LatLng[]) - if (!southWest) { return; } +L.LatLngBounds = function (corner1, corner2) { // (LatLng, LatLng) or (LatLng[]) + if (!corner1) { return; } - var latlngs = northEast ? [southWest, northEast] : southWest; + var latlngs = corner2 ? [corner1, corner2] : corner1; for (var i = 0, len = latlngs.length; i < len; i++) { this.extend(latlngs[i]); @@ -1257,37 +1756,48 @@ L.LatLngBounds = function (southWest, northEast) { // (LatLng, LatLng) or (LatLn }; L.LatLngBounds.prototype = { - // extend the bounds to contain the given point or bounds - extend: function (obj) { // (LatLng) or (LatLngBounds) - if (!obj) { return this; } - var latLng = L.latLng(obj); - if (latLng !== null) { - obj = latLng; - } else { - obj = L.latLngBounds(obj); - } + // @method extend(latlng: LatLng): this + // Extend the bounds to contain the given point + + // @alternative + // @method extend(otherBounds: LatLngBounds): this + // Extend the bounds to contain the given bounds + extend: function (obj) { + var sw = this._southWest, + ne = this._northEast, + sw2, ne2; if (obj instanceof L.LatLng) { - if (!this._southWest && !this._northEast) { - this._southWest = new L.LatLng(obj.lat, obj.lng); - this._northEast = new L.LatLng(obj.lat, obj.lng); - } else { - this._southWest.lat = Math.min(obj.lat, this._southWest.lat); - this._southWest.lng = Math.min(obj.lng, this._southWest.lng); + sw2 = obj; + ne2 = obj; - this._northEast.lat = Math.max(obj.lat, this._northEast.lat); - this._northEast.lng = Math.max(obj.lng, this._northEast.lng); - } } else if (obj instanceof L.LatLngBounds) { - this.extend(obj._southWest); - this.extend(obj._northEast); + sw2 = obj._southWest; + ne2 = obj._northEast; + + if (!sw2 || !ne2) { return this; } + + } else { + return obj ? this.extend(L.latLng(obj) || L.latLngBounds(obj)) : this; } + + if (!sw && !ne) { + this._southWest = new L.LatLng(sw2.lat, sw2.lng); + this._northEast = new L.LatLng(ne2.lat, ne2.lng); + } else { + sw.lat = Math.min(sw2.lat, sw.lat); + sw.lng = Math.min(sw2.lng, sw.lng); + ne.lat = Math.max(ne2.lat, ne.lat); + ne.lng = Math.max(ne2.lng, ne.lng); + } + return this; }, - // extend the bounds by a percentage - pad: function (bufferRatio) { // (Number) -> LatLngBounds + // @method pad(bufferRatio: Number): LatLngBounds + // Returns bigger bounds created by extending the current bounds by a given percentage in each direction. + pad: function (bufferRatio) { var sw = this._southWest, ne = this._northEast, heightBuffer = Math.abs(sw.lat - ne.lat) * bufferRatio, @@ -1298,46 +1808,70 @@ L.LatLngBounds.prototype = { new L.LatLng(ne.lat + heightBuffer, ne.lng + widthBuffer)); }, - getCenter: function () { // -> LatLng + // @method getCenter(): LatLng + // Returns the center point of the bounds. + getCenter: function () { return new L.LatLng( (this._southWest.lat + this._northEast.lat) / 2, (this._southWest.lng + this._northEast.lng) / 2); }, + // @method getSouthWest(): LatLng + // Returns the south-west point of the bounds. getSouthWest: function () { return this._southWest; }, + // @method getNorthEast(): LatLng + // Returns the north-east point of the bounds. getNorthEast: function () { return this._northEast; }, + // @method getNorthWest(): LatLng + // Returns the north-west point of the bounds. getNorthWest: function () { return new L.LatLng(this.getNorth(), this.getWest()); }, + // @method getSouthEast(): LatLng + // Returns the south-east point of the bounds. getSouthEast: function () { return new L.LatLng(this.getSouth(), this.getEast()); }, + // @method getWest(): Number + // Returns the west longitude of the bounds getWest: function () { return this._southWest.lng; }, + // @method getSouth(): Number + // Returns the south latitude of the bounds getSouth: function () { return this._southWest.lat; }, + // @method getEast(): Number + // Returns the east longitude of the bounds getEast: function () { return this._northEast.lng; }, + // @method getNorth(): Number + // Returns the north latitude of the bounds getNorth: function () { return this._northEast.lat; }, + // @method contains(otherBounds: LatLngBounds): Boolean + // Returns `true` if the rectangle contains the given one. + + // @alternative + // @method contains (latlng: LatLng): Boolean + // Returns `true` if the rectangle contains the given point. contains: function (obj) { // (LatLngBounds) or (LatLng) -> Boolean - if (typeof obj[0] === 'number' || obj instanceof L.LatLng) { + if (typeof obj[0] === 'number' || obj instanceof L.LatLng || 'lat' in obj) { obj = L.latLng(obj); } else { obj = L.latLngBounds(obj); @@ -1358,7 +1892,9 @@ L.LatLngBounds.prototype = { (sw2.lng >= sw.lng) && (ne2.lng <= ne.lng); }, - intersects: function (bounds) { // (LatLngBounds) + // @method intersects(otherBounds: LatLngBounds): Boolean + // Returns `true` if the rectangle intersects the given bounds. Two bounds intersect if they have at least one point in common. + intersects: function (bounds) { bounds = L.latLngBounds(bounds); var sw = this._southWest, @@ -1372,11 +1908,31 @@ L.LatLngBounds.prototype = { return latIntersects && lngIntersects; }, + // @method overlaps(otherBounds: Bounds): Boolean + // Returns `true` if the rectangle overlaps the given bounds. Two bounds overlap if their intersection is an area. + overlaps: function (bounds) { + bounds = L.latLngBounds(bounds); + + var sw = this._southWest, + ne = this._northEast, + sw2 = bounds.getSouthWest(), + ne2 = bounds.getNorthEast(), + + latOverlaps = (ne2.lat > sw.lat) && (sw2.lat < ne.lat), + lngOverlaps = (ne2.lng > sw.lng) && (sw2.lng < ne.lng); + + return latOverlaps && lngOverlaps; + }, + + // @method toBBoxString(): String + // Returns a string with bounding box coordinates in a 'southwest_lng,southwest_lat,northeast_lng,northeast_lat' format. Useful for sending requests to web services that return geo data. toBBoxString: function () { return [this.getWest(), this.getSouth(), this.getEast(), this.getNorth()].join(','); }, - equals: function (bounds) { // (LatLngBounds) + // @method equals(otherBounds: LatLngBounds): Boolean + // Returns `true` if the rectangle is equivalent (within a small margin of error) to the given bounds. + equals: function (bounds) { if (!bounds) { return false; } bounds = L.latLngBounds(bounds); @@ -1385,108 +1941,241 @@ L.LatLngBounds.prototype = { this._northEast.equals(bounds.getNorthEast()); }, + // @method isValid(): Boolean + // Returns `true` if the bounds are properly initialized. isValid: function () { return !!(this._southWest && this._northEast); } }; -//TODO International date line? +// TODO International date line? + +// @factory L.latLngBounds(corner1: LatLng, corner2: LatLng) +// Creates a `LatLngBounds` object by defining two diagonally opposite corners of the rectangle. -L.latLngBounds = function (a, b) { // (LatLngBounds) or (LatLng, LatLng) - if (!a || a instanceof L.LatLngBounds) { +// @alternative +// @factory L.latLngBounds(latlngs: LatLng[]) +// Creates a `LatLngBounds` object defined by the geographical points it contains. Very useful for zooming the map to fit a particular set of locations with [`fitBounds`](#map-fitbounds). +L.latLngBounds = function (a, b) { + if (a instanceof L.LatLngBounds) { return a; } return new L.LatLngBounds(a, b); }; + /* - * L.Projection contains various geographical projections used by CRS classes. + * @namespace Projection + * @section + * Leaflet comes with a set of already defined Projections out of the box: + * + * @projection L.Projection.LonLat + * + * Equirectangular, or Plate Carree projection — the most simple projection, + * mostly used by GIS enthusiasts. Directly maps `x` as longitude, and `y` as + * latitude. Also suitable for flat worlds, e.g. game maps. Used by the + * `EPSG:3395` and `Simple` CRS. */ L.Projection = {}; +L.Projection.LonLat = { + project: function (latlng) { + return new L.Point(latlng.lng, latlng.lat); + }, + + unproject: function (point) { + return new L.LatLng(point.y, point.x); + }, + + bounds: L.bounds([-180, -90], [180, 90]) +}; + + /* - * Spherical Mercator is the most popular map projection, used by EPSG:3857 CRS used by default. + * @namespace Projection + * @projection L.Projection.SphericalMercator + * + * Spherical Mercator projection — the most common projection for online maps, + * used by almost all free and commercial tile providers. Assumes that Earth is + * a sphere. Used by the `EPSG:3857` CRS. */ L.Projection.SphericalMercator = { + + R: 6378137, MAX_LATITUDE: 85.0511287798, - project: function (latlng) { // (LatLng) -> Point - var d = L.LatLng.DEG_TO_RAD, + project: function (latlng) { + var d = Math.PI / 180, max = this.MAX_LATITUDE, lat = Math.max(Math.min(max, latlng.lat), -max), - x = latlng.lng * d, - y = lat * d; - - y = Math.log(Math.tan((Math.PI / 4) + (y / 2))); + sin = Math.sin(lat * d); - return new L.Point(x, y); + return new L.Point( + this.R * latlng.lng * d, + this.R * Math.log((1 + sin) / (1 - sin)) / 2); }, - unproject: function (point) { // (Point, Boolean) -> LatLng - var d = L.LatLng.RAD_TO_DEG, - lng = point.x * d, - lat = (2 * Math.atan(Math.exp(point.y)) - (Math.PI / 2)) * d; - - return new L.LatLng(lat, lng); - } -}; - - -/* - * Simple equirectangular (Plate Carree) projection, used by CRS like EPSG:4326 and Simple. - */ + unproject: function (point) { + var d = 180 / Math.PI; -L.Projection.LonLat = { - project: function (latlng) { - return new L.Point(latlng.lng, latlng.lat); + return new L.LatLng( + (2 * Math.atan(Math.exp(point.y / this.R)) - (Math.PI / 2)) * d, + point.x * d / this.R); }, - unproject: function (point) { - return new L.LatLng(point.y, point.x); - } + bounds: (function () { + var d = 6378137 * Math.PI; + return L.bounds([-d, -d], [d, d]); + })() }; + /* - * L.CRS is a base object for all defined CRS (Coordinate Reference Systems) in Leaflet. + * @class CRS + * @aka L.CRS + * Abstract class that defines coordinate reference systems for projecting + * geographical points into pixel (screen) coordinates and back (and to + * coordinates in other units for [WMS](https://en.wikipedia.org/wiki/Web_Map_Service) services). See + * [spatial reference system](http://en.wikipedia.org/wiki/Coordinate_reference_system). + * + * Leaflet defines the most usual CRSs by default. If you want to use a + * CRS not defined by default, take a look at the + * [Proj4Leaflet](https://github.com/kartena/Proj4Leaflet) plugin. */ L.CRS = { - latLngToPoint: function (latlng, zoom) { // (LatLng, Number) -> Point + // @method latLngToPoint(latlng: LatLng, zoom: Number): Point + // Projects geographical coordinates into pixel coordinates for a given zoom. + latLngToPoint: function (latlng, zoom) { var projectedPoint = this.projection.project(latlng), scale = this.scale(zoom); return this.transformation._transform(projectedPoint, scale); }, - pointToLatLng: function (point, zoom) { // (Point, Number[, Boolean]) -> LatLng + // @method pointToLatLng(point: Point, zoom: Number): LatLng + // The inverse of `latLngToPoint`. Projects pixel coordinates on a given + // zoom into geographical coordinates. + pointToLatLng: function (point, zoom) { var scale = this.scale(zoom), untransformedPoint = this.transformation.untransform(point, scale); return this.projection.unproject(untransformedPoint); }, + // @method project(latlng: LatLng): Point + // Projects geographical coordinates into coordinates in units accepted for + // this CRS (e.g. meters for EPSG:3857, for passing it to WMS services). project: function (latlng) { return this.projection.project(latlng); }, + // @method unproject(point: Point): LatLng + // Given a projected coordinate returns the corresponding LatLng. + // The inverse of `project`. + unproject: function (point) { + return this.projection.unproject(point); + }, + + // @method scale(zoom: Number): Number + // Returns the scale used when transforming projected coordinates into + // pixel coordinates for a particular zoom. For example, it returns + // `256 * 2^zoom` for Mercator-based CRS. scale: function (zoom) { return 256 * Math.pow(2, zoom); }, - getSize: function (zoom) { - var s = this.scale(zoom); - return L.point(s, s); + // @method zoom(scale: Number): Number + // Inverse of `scale()`, returns the zoom level corresponding to a scale + // factor of `scale`. + zoom: function (scale) { + return Math.log(scale / 256) / Math.LN2; + }, + + // @method getProjectedBounds(zoom: Number): Bounds + // Returns the projection's bounds scaled and transformed for the provided `zoom`. + getProjectedBounds: function (zoom) { + if (this.infinite) { return null; } + + var b = this.projection.bounds, + s = this.scale(zoom), + min = this.transformation.transform(b.min, s), + max = this.transformation.transform(b.max, s); + + return L.bounds(min, max); + }, + + // @method distance(latlng1: LatLng, latlng2: LatLng): Number + // Returns the distance between two geographical coordinates. + + // @property code: String + // Standard code name of the CRS passed into WMS services (e.g. `'EPSG:3857'`) + // + // @property wrapLng: Number[] + // An array of two numbers defining whether the longitude (horizontal) coordinate + // axis wraps around a given range and how. Defaults to `[-180, 180]` in most + // geographical CRSs. If `undefined`, the longitude axis does not wrap around. + // + // @property wrapLat: Number[] + // Like `wrapLng`, but for the latitude (vertical) axis. + + // wrapLng: [min, max], + // wrapLat: [min, max], + + // @property infinite: Boolean + // If true, the coordinate space will be unbounded (infinite in both axes) + infinite: false, + + // @method wrapLatLng(latlng: LatLng): LatLng + // Returns a `LatLng` where lat and lng has been wrapped according to the + // CRS's `wrapLat` and `wrapLng` properties, if they are outside the CRS's bounds. + // Only accepts actual `L.LatLng` instances, not arrays. + wrapLatLng: function (latlng) { + var lng = this.wrapLng ? L.Util.wrapNum(latlng.lng, this.wrapLng, true) : latlng.lng, + lat = this.wrapLat ? L.Util.wrapNum(latlng.lat, this.wrapLat, true) : latlng.lat, + alt = latlng.alt; + + return L.latLng(lat, lng, alt); + }, + + // @method wrapLatLngBounds(bounds: LatLngBounds): LatLngBounds + // Returns a `LatLngBounds` with the same size as the given one, ensuring + // that its center is within the CRS's bounds. + // Only accepts actual `L.LatLngBounds` instances, not arrays. + wrapLatLngBounds: function (bounds) { + var center = bounds.getCenter(), + newCenter = this.wrapLatLng(center), + latShift = center.lat - newCenter.lat, + lngShift = center.lng - newCenter.lng; + + if (latShift === 0 && lngShift === 0) { + return bounds; + } + + var sw = bounds.getSouthWest(), + ne = bounds.getNorthEast(), + newSw = L.latLng({lat: sw.lat - latShift, lng: sw.lng - lngShift}), + newNe = L.latLng({lat: ne.lat - latShift, lng: ne.lng - lngShift}); + + return new L.LatLngBounds(newSw, newNe); } }; + /* - * A simple CRS that can be used for flat non-Earth maps like panoramas or game maps. + * @namespace CRS + * @crs L.CRS.Simple + * + * A simple CRS that maps longitude and latitude into `x` and `y` directly. + * May be used for maps of flat surfaces (e.g. game maps). Note that the `y` + * axis should still be inverted (going from bottom to top). `distance()` returns + * simple euclidean distance. */ L.CRS.Simple = L.extend({}, L.CRS, { @@ -1495,26 +2184,73 @@ L.CRS.Simple = L.extend({}, L.CRS, { scale: function (zoom) { return Math.pow(2, zoom); + }, + + zoom: function (scale) { + return Math.log(scale) / Math.LN2; + }, + + distance: function (latlng1, latlng2) { + var dx = latlng2.lng - latlng1.lng, + dy = latlng2.lat - latlng1.lat; + + return Math.sqrt(dx * dx + dy * dy); + }, + + infinite: true +}); + + + +/* + * @namespace CRS + * @crs L.CRS.Earth + * + * Serves as the base for CRS that are global such that they cover the earth. + * Can only be used as the base for other CRS and cannot be used directly, + * since it does not have a `code`, `projection` or `transformation`. `distance()` returns + * meters. + */ + +L.CRS.Earth = L.extend({}, L.CRS, { + wrapLng: [-180, 180], + + // Mean Earth Radius, as recommended for use by + // the International Union of Geodesy and Geophysics, + // see http://rosettacode.org/wiki/Haversine_formula + R: 6371000, + + // distance between two geographical points using spherical law of cosines approximation + distance: function (latlng1, latlng2) { + var rad = Math.PI / 180, + lat1 = latlng1.lat * rad, + lat2 = latlng2.lat * rad, + a = Math.sin(lat1) * Math.sin(lat2) + + Math.cos(lat1) * Math.cos(lat2) * Math.cos((latlng2.lng - latlng1.lng) * rad); + + return this.R * Math.acos(Math.min(a, 1)); } }); + /* - * L.CRS.EPSG3857 (Spherical Mercator) is the most common CRS for web mapping - * and is used by Leaflet by default. + * @namespace CRS + * @crs L.CRS.EPSG3857 + * + * The most common CRS for online maps, used by almost all free and commercial + * tile providers. Uses Spherical Mercator projection. Set in by default in + * Map's `crs` option. */ -L.CRS.EPSG3857 = L.extend({}, L.CRS, { +L.CRS.EPSG3857 = L.extend({}, L.CRS.Earth, { code: 'EPSG:3857', - projection: L.Projection.SphericalMercator, - transformation: new L.Transformation(0.5 / Math.PI, 0.5, -0.5 / Math.PI, 0.5), - project: function (latlng) { // (LatLng) -> Point - var projectedPoint = this.projection.project(latlng), - earthRadius = 6378137; - return projectedPoint.multiplyBy(earthRadius); - } + transformation: (function () { + var scale = 0.5 / (Math.PI * L.Projection.SphericalMercator.R); + return new L.Transformation(scale, 0.5, -scale, 0.5); + }()) }); L.CRS.EPSG900913 = L.extend({}, L.CRS.EPSG3857, { @@ -1522,44 +2258,140 @@ L.CRS.EPSG900913 = L.extend({}, L.CRS.EPSG3857, { }); + /* - * L.CRS.EPSG4326 is a CRS popular among advanced GIS specialists. + * @namespace CRS + * @crs L.CRS.EPSG4326 + * + * A common CRS among GIS enthusiasts. Uses simple Equirectangular projection. + * + * Leaflet 1.0.x complies with the [TMS coordinate scheme for EPSG:4326](https://wiki.osgeo.org/wiki/Tile_Map_Service_Specification#global-geodetic), + * which is a breaking change from 0.7.x behaviour. If you are using a `TileLayer` + * with this CRS, ensure that there are two 256x256 pixel tiles covering the + * whole earth at zoom level zero, and that the tile coordinate origin is (-180,+90), + * or (-180,-90) for `TileLayer`s with [the `tms` option](#tilelayer-tms) set. */ -L.CRS.EPSG4326 = L.extend({}, L.CRS, { +L.CRS.EPSG4326 = L.extend({}, L.CRS.Earth, { code: 'EPSG:4326', - projection: L.Projection.LonLat, - transformation: new L.Transformation(1 / 360, 0.5, -1 / 360, 0.5) + transformation: new L.Transformation(1 / 180, 1, -1 / 180, 0.5) }); + /* - * L.Map is the central class of the API - it is used to create a map. + * @class Map + * @aka L.Map + * @inherits Evented + * + * The central class of the API — it is used to create a map on a page and manipulate it. + * + * @example + * + * ```js + * // initialize the map on the "map" div with a given center and zoom + * var map = L.map('map', { + * center: [51.505, -0.09], + * zoom: 13 + * }); + * ``` + * */ -L.Map = L.Class.extend({ - - includes: L.Mixin.Events, +L.Map = L.Evented.extend({ options: { + // @section Map State Options + // @option crs: CRS = L.CRS.EPSG3857 + // The [Coordinate Reference System](#crs) to use. Don't change this if you're not + // sure what it means. crs: L.CRS.EPSG3857, - /* - center: LatLng, - zoom: Number, - layers: Array, - */ - - fadeAnimation: L.DomUtil.TRANSITION && !L.Browser.android23, - trackResize: true, - markerZoomAnimation: L.DomUtil.TRANSITION && L.Browser.any3d + // @option center: LatLng = undefined + // Initial geographic center of the map + center: undefined, + + // @option zoom: Number = undefined + // Initial map zoom level + zoom: undefined, + + // @option minZoom: Number = undefined + // Minimum zoom level of the map. Overrides any `minZoom` option set on map layers. + minZoom: undefined, + + // @option maxZoom: Number = undefined + // Maximum zoom level of the map. Overrides any `maxZoom` option set on map layers. + maxZoom: undefined, + + // @option layers: Layer[] = [] + // Array of layers that will be added to the map initially + layers: [], + + // @option maxBounds: LatLngBounds = null + // When this option is set, the map restricts the view to the given + // geographical bounds, bouncing the user back if the user tries to pan + // outside the view. To set the restriction dynamically, use + // [`setMaxBounds`](#map-setmaxbounds) method. + maxBounds: undefined, + + // @option renderer: Renderer = * + // The default method for drawing vector layers on the map. `L.SVG` + // or `L.Canvas` by default depending on browser support. + renderer: undefined, + + + // @section Animation Options + // @option zoomAnimation: Boolean = true + // Whether the map zoom animation is enabled. By default it's enabled + // in all browsers that support CSS3 Transitions except Android. + zoomAnimation: true, + + // @option zoomAnimationThreshold: Number = 4 + // Won't animate zoom if the zoom difference exceeds this value. + zoomAnimationThreshold: 4, + + // @option fadeAnimation: Boolean = true + // Whether the tile fade animation is enabled. By default it's enabled + // in all browsers that support CSS3 Transitions except Android. + fadeAnimation: true, + + // @option markerZoomAnimation: Boolean = true + // Whether markers animate their zoom with the zoom animation, if disabled + // they will disappear for the length of the animation. By default it's + // enabled in all browsers that support CSS3 Transitions except Android. + markerZoomAnimation: true, + + // @option transform3DLimit: Number = 2^23 + // Defines the maximum size of a CSS translation transform. The default + // value should not be changed unless a web browser positions layers in + // the wrong place after doing a large `panBy`. + transform3DLimit: 8388608, // Precision limit of a 32-bit float + + // @section Interaction Options + // @option zoomSnap: Number = 1 + // Forces the map's zoom level to always be a multiple of this, particularly + // right after a [`fitBounds()`](#map-fitbounds) or a pinch-zoom. + // By default, the zoom level snaps to the nearest integer; lower values + // (e.g. `0.5` or `0.1`) allow for greater granularity. A value of `0` + // means the zoom level will not be snapped after `fitBounds` or a pinch-zoom. + zoomSnap: 1, + + // @option zoomDelta: Number = 1 + // Controls how much the map's zoom level will change after a + // [`zoomIn()`](#map-zoomin), [`zoomOut()`](#map-zoomout), pressing `+` + // or `-` on the keyboard, or using the [zoom controls](#control-zoom). + // Values smaller than `1` (e.g. `0.5`) allow for greater granularity. + zoomDelta: 1, + + // @option trackResize: Boolean = true + // Whether the map automatically handles browser window resize to update itself. + trackResize: true }, initialize: function (id, options) { // (HTMLElement or String, Object) options = L.setOptions(this, options); - this._initContainer(id); this._initLayout(); @@ -1572,47 +2404,104 @@ L.Map = L.Class.extend({ this.setMaxBounds(options.maxBounds); } + if (options.zoom !== undefined) { + this._zoom = this._limitZoom(options.zoom); + } + if (options.center && options.zoom !== undefined) { this.setView(L.latLng(options.center), options.zoom, {reset: true}); } this._handlers = []; - this._layers = {}; this._zoomBoundLayers = {}; - this._tileLayersNum = 0; + this._sizeChanged = true; this.callInitHooks(); - this._addLayers(options.layers); + // don't animate on browsers without hardware-accelerated transitions or old Android/Opera + this._zoomAnimated = L.DomUtil.TRANSITION && L.Browser.any3d && !L.Browser.mobileOpera && + this.options.zoomAnimation; + + // zoom transitions run with the same duration for all layers, so if one of transitionend events + // happens after starting zoom animation (propagating to the map pane), we know that it ended globally + if (this._zoomAnimated) { + this._createAnimProxy(); + L.DomEvent.on(this._proxy, L.DomUtil.TRANSITION_END, this._catchTransitionEnd, this); + } + + this._addLayers(this.options.layers); }, - // public methods that modify map state + // @section Methods for modifying map state + + // @method setView(center: LatLng, zoom: Number, options?: Zoom/pan options): this + // Sets the view of the map (geographical center and zoom) with the given + // animation options. + setView: function (center, zoom, options) { + + zoom = zoom === undefined ? this._zoom : this._limitZoom(zoom); + center = this._limitCenter(L.latLng(center), zoom, this.options.maxBounds); + options = options || {}; + + this._stop(); + + if (this._loaded && !options.reset && options !== true) { + + if (options.animate !== undefined) { + options.zoom = L.extend({animate: options.animate}, options.zoom); + options.pan = L.extend({animate: options.animate, duration: options.duration}, options.pan); + } + + // try animating pan or zoom + var moved = (this._zoom !== zoom) ? + this._tryAnimatedZoom && this._tryAnimatedZoom(center, zoom, options.zoom) : + this._tryAnimatedPan(center, options.pan); + + if (moved) { + // prevent resize handler call, the view will refresh after animation anyway + clearTimeout(this._sizeTimer); + return this; + } + } + + // animation didn't start, just reset the map view + this._resetView(center, zoom); - // replaced by animation-powered implementation in Map.PanAnimation.js - setView: function (center, zoom) { - zoom = zoom === undefined ? this.getZoom() : zoom; - this._resetView(L.latLng(center), this._limitZoom(zoom)); return this; }, + // @method setZoom(zoom: Number, options: Zoom/pan options): this + // Sets the zoom of the map. setZoom: function (zoom, options) { if (!this._loaded) { - this._zoom = this._limitZoom(zoom); + this._zoom = zoom; return this; } return this.setView(this.getCenter(), zoom, {zoom: options}); }, + // @method zoomIn(delta?: Number, options?: Zoom options): this + // Increases the zoom of the map by `delta` ([`zoomDelta`](#map-zoomdelta) by default). zoomIn: function (delta, options) { - return this.setZoom(this._zoom + (delta || 1), options); + delta = delta || (L.Browser.any3d ? this.options.zoomDelta : 1); + return this.setZoom(this._zoom + delta, options); }, + // @method zoomOut(delta?: Number, options?: Zoom options): this + // Decreases the zoom of the map by `delta` ([`zoomDelta`](#map-zoomdelta) by default). zoomOut: function (delta, options) { - return this.setZoom(this._zoom - (delta || 1), options); + delta = delta || (L.Browser.any3d ? this.options.zoomDelta : 1); + return this.setZoom(this._zoom - delta, options); }, + // @method setZoomAround(latlng: LatLng, zoom: Number, options: Zoom options): this + // Zooms the map while keeping a specified geographical point on the map + // stationary (e.g. used internally for scroll zoom and double-click zoom). + // @alternative + // @method setZoomAround(offset: Point, zoom: Number, options: Zoom options): this + // Zooms the map while keeping a specified pixel on the map (relative to the top-left corner) stationary. setZoomAround: function (latlng, zoom, options) { var scale = this.getZoomScale(zoom), viewHalf = this.getSize().divideBy(2), @@ -1624,7 +2513,7 @@ L.Map = L.Class.extend({ return this.setView(newCenter, zoom, {zoom: options}); }, - fitBounds: function (bounds, options) { + _getBoundsCenterZoom: function (bounds, options) { options = options || {}; bounds = bounds.getBounds ? bounds.getBounds() : L.latLngBounds(bounds); @@ -1632,133 +2521,256 @@ L.Map = L.Class.extend({ var paddingTL = L.point(options.paddingTopLeft || options.padding || [0, 0]), paddingBR = L.point(options.paddingBottomRight || options.padding || [0, 0]), - zoom = this.getBoundsZoom(bounds, false, paddingTL.add(paddingBR)), - paddingOffset = paddingBR.subtract(paddingTL).divideBy(2), + zoom = this.getBoundsZoom(bounds, false, paddingTL.add(paddingBR)); + + zoom = (typeof options.maxZoom === 'number') ? Math.min(options.maxZoom, zoom) : zoom; + + var paddingOffset = paddingBR.subtract(paddingTL).divideBy(2), swPoint = this.project(bounds.getSouthWest(), zoom), nePoint = this.project(bounds.getNorthEast(), zoom), center = this.unproject(swPoint.add(nePoint).divideBy(2).add(paddingOffset), zoom); - zoom = options && options.maxZoom ? Math.min(options.maxZoom, zoom) : zoom; + return { + center: center, + zoom: zoom + }; + }, + + // @method fitBounds(bounds: LatLngBounds, options?: fitBounds options): this + // Sets a map view that contains the given geographical bounds with the + // maximum zoom level possible. + fitBounds: function (bounds, options) { + + bounds = L.latLngBounds(bounds); + + if (!bounds.isValid()) { + throw new Error('Bounds are not valid.'); + } - return this.setView(center, zoom, options); + var target = this._getBoundsCenterZoom(bounds, options); + return this.setView(target.center, target.zoom, options); }, + // @method fitWorld(options?: fitBounds options): this + // Sets a map view that mostly contains the whole world with the maximum + // zoom level possible. fitWorld: function (options) { return this.fitBounds([[-90, -180], [90, 180]], options); }, + // @method panTo(latlng: LatLng, options?: Pan options): this + // Pans the map to a given center. panTo: function (center, options) { // (LatLng) return this.setView(center, this._zoom, {pan: options}); }, - panBy: function (offset) { // (Point) - // replaced with animated panBy in Map.PanAnimation.js - this.fire('movestart'); - - this._rawPanBy(L.point(offset)); + // @method panBy(offset: Point): this + // Pans the map by a given number of pixels (animated). + panBy: function (offset, options) { + offset = L.point(offset).round(); + options = options || {}; - this.fire('move'); - return this.fire('moveend'); - }, + if (!offset.x && !offset.y) { + return this.fire('moveend'); + } + // If we pan too far, Chrome gets issues with tiles + // and makes them disappear or appear in the wrong place (slightly offset) #2602 + if (options.animate !== true && !this.getSize().contains(offset)) { + this._resetView(this.unproject(this.project(this.getCenter()).add(offset)), this.getZoom()); + return this; + } - setMaxBounds: function (bounds) { - bounds = L.latLngBounds(bounds); + if (!this._panAnim) { + this._panAnim = new L.PosAnimation(); - this.options.maxBounds = bounds; + this._panAnim.on({ + 'step': this._onPanTransitionStep, + 'end': this._onPanTransitionEnd + }, this); + } - if (!bounds) { - return this.off('moveend', this._panInsideMaxBounds, this); + // don't fire movestart if animating inertia + if (!options.noMoveStart) { + this.fire('movestart'); } - if (this._loaded) { - this._panInsideMaxBounds(); + // animate pan unless animate: false specified + if (options.animate !== false) { + L.DomUtil.addClass(this._mapPane, 'leaflet-pan-anim'); + + var newPos = this._getMapPanePos().subtract(offset).round(); + this._panAnim.run(this._mapPane, newPos, options.duration || 0.25, options.easeLinearity); + } else { + this._rawPanBy(offset); + this.fire('move').fire('moveend'); } - return this.on('moveend', this._panInsideMaxBounds, this); + return this; }, - panInsideBounds: function (bounds, options) { - var center = this.getCenter(), - newCenter = this._limitCenter(center, this._zoom, bounds); + // @method flyTo(latlng: LatLng, zoom?: Number, options?: Zoom/pan options): this + // Sets the view of the map (geographical center and zoom) performing a smooth + // pan-zoom animation. + flyTo: function (targetCenter, targetZoom, options) { - if (center.equals(newCenter)) { return this; } + options = options || {}; + if (options.animate === false || !L.Browser.any3d) { + return this.setView(targetCenter, targetZoom, options); + } - return this.panTo(newCenter, options); - }, + this._stop(); - addLayer: function (layer) { - // TODO method is too big, refactor + var from = this.project(this.getCenter()), + to = this.project(targetCenter), + size = this.getSize(), + startZoom = this._zoom; - var id = L.stamp(layer); + targetCenter = L.latLng(targetCenter); + targetZoom = targetZoom === undefined ? startZoom : targetZoom; - if (this._layers[id]) { return this; } + var w0 = Math.max(size.x, size.y), + w1 = w0 * this.getZoomScale(startZoom, targetZoom), + u1 = (to.distanceTo(from)) || 1, + rho = 1.42, + rho2 = rho * rho; - this._layers[id] = layer; + function r(i) { + var s1 = i ? -1 : 1, + s2 = i ? w1 : w0, + t1 = w1 * w1 - w0 * w0 + s1 * rho2 * rho2 * u1 * u1, + b1 = 2 * s2 * rho2 * u1, + b = t1 / b1, + sq = Math.sqrt(b * b + 1) - b; - // TODO getMaxZoom, getMinZoom in ILayer (instead of options) - if (layer.options && (!isNaN(layer.options.maxZoom) || !isNaN(layer.options.minZoom))) { - this._zoomBoundLayers[id] = layer; - this._updateZoomLevels(); - } + // workaround for floating point precision bug when sq = 0, log = -Infinite, + // thus triggering an infinite loop in flyTo + var log = sq < 0.000000001 ? -18 : Math.log(sq); - // TODO looks ugly, refactor!!! - if (this.options.zoomAnimation && L.TileLayer && (layer instanceof L.TileLayer)) { - this._tileLayersNum++; - this._tileLayersToLoad++; - layer.on('load', this._onTileLayerLoad, this); + return log; } - if (this._loaded) { - this._layerAdd(layer); + function sinh(n) { return (Math.exp(n) - Math.exp(-n)) / 2; } + function cosh(n) { return (Math.exp(n) + Math.exp(-n)) / 2; } + function tanh(n) { return sinh(n) / cosh(n); } + + var r0 = r(0); + + function w(s) { return w0 * (cosh(r0) / cosh(r0 + rho * s)); } + function u(s) { return w0 * (cosh(r0) * tanh(r0 + rho * s) - sinh(r0)) / rho2; } + + function easeOut(t) { return 1 - Math.pow(1 - t, 1.5); } + + var start = Date.now(), + S = (r(1) - r0) / rho, + duration = options.duration ? 1000 * options.duration : 1000 * S * 0.8; + + function frame() { + var t = (Date.now() - start) / duration, + s = easeOut(t) * S; + + if (t <= 1) { + this._flyToFrame = L.Util.requestAnimFrame(frame, this); + + this._move( + this.unproject(from.add(to.subtract(from).multiplyBy(u(s) / u1)), startZoom), + this.getScaleZoom(w0 / w(s), startZoom), + {flyTo: true}); + + } else { + this + ._move(targetCenter, targetZoom) + ._moveEnd(true); + } } + this._moveStart(true); + + frame.call(this); return this; }, - removeLayer: function (layer) { - var id = L.stamp(layer); + // @method flyToBounds(bounds: LatLngBounds, options?: fitBounds options): this + // Sets the view of the map with a smooth animation like [`flyTo`](#map-flyto), + // but takes a bounds parameter like [`fitBounds`](#map-fitbounds). + flyToBounds: function (bounds, options) { + var target = this._getBoundsCenterZoom(bounds, options); + return this.flyTo(target.center, target.zoom, options); + }, - if (!this._layers[id]) { return this; } + // @method setMaxBounds(bounds: Bounds): this + // Restricts the map view to the given bounds (see the [maxBounds](#map-maxbounds) option). + setMaxBounds: function (bounds) { + bounds = L.latLngBounds(bounds); - if (this._loaded) { - layer.onRemove(this); + if (!bounds.isValid()) { + this.options.maxBounds = null; + return this.off('moveend', this._panInsideMaxBounds); + } else if (this.options.maxBounds) { + this.off('moveend', this._panInsideMaxBounds); } - delete this._layers[id]; + this.options.maxBounds = bounds; if (this._loaded) { - this.fire('layerremove', {layer: layer}); + this._panInsideMaxBounds(); } - if (this._zoomBoundLayers[id]) { - delete this._zoomBoundLayers[id]; - this._updateZoomLevels(); - } + return this.on('moveend', this._panInsideMaxBounds); + }, + + // @method setMinZoom(zoom: Number): this + // Sets the lower limit for the available zoom levels (see the [minZoom](#map-minzoom) option). + setMinZoom: function (zoom) { + this.options.minZoom = zoom; - // TODO looks ugly, refactor - if (this.options.zoomAnimation && L.TileLayer && (layer instanceof L.TileLayer)) { - this._tileLayersNum--; - this._tileLayersToLoad--; - layer.off('load', this._onTileLayerLoad, this); + if (this._loaded && this.getZoom() < this.options.minZoom) { + return this.setZoom(zoom); } return this; }, - hasLayer: function (layer) { - if (!layer) { return false; } + // @method setMaxZoom(zoom: Number): this + // Sets the upper limit for the available zoom levels (see the [maxZoom](#map-maxzoom) option). + setMaxZoom: function (zoom) { + this.options.maxZoom = zoom; + + if (this._loaded && (this.getZoom() > this.options.maxZoom)) { + return this.setZoom(zoom); + } - return (L.stamp(layer) in this._layers); + return this; }, - eachLayer: function (method, context) { - for (var i in this._layers) { - method.call(context, this._layers[i]); + // @method panInsideBounds(bounds: LatLngBounds, options?: Pan options): this + // Pans the map to the closest view that would lie inside the given bounds (if it's not already), controlling the animation using the options specific, if any. + panInsideBounds: function (bounds, options) { + this._enforcingBounds = true; + var center = this.getCenter(), + newCenter = this._limitCenter(center, this._zoom, L.latLngBounds(bounds)); + + if (!center.equals(newCenter)) { + this.panTo(newCenter, options); } + + this._enforcingBounds = false; return this; }, + // @method invalidateSize(options: Zoom/Pan options): this + // Checks if the map container size changed and updates the map if so — + // call it after you've changed the map size dynamically, also animating + // pan by default. If `options.pan` is `false`, panning will not occur. + // If `options.debounceMoveend` is `true`, it will delay `moveend` event so + // that it doesn't happen often even if the method is called many + // times in a row. + + // @alternative + // @method invalidateSize(animate: Boolean): this + // Checks if the map container size changed and updates the map if so — + // call it after you've changed the map size dynamically, also animating + // pan by default. invalidateSize: function (options) { if (!this._loaded) { return this; } @@ -1769,7 +2781,7 @@ L.Map = L.Class.extend({ var oldSize = this.getSize(); this._sizeChanged = true; - this._initialCenter = null; + this._lastCenter = null; var newSize = this.getSize(), oldCenter = oldSize.divideBy(2).round(), @@ -1796,13 +2808,134 @@ L.Map = L.Class.extend({ } } + // @section Map state change events + // @event resize: ResizeEvent + // Fired when the map is resized. return this.fire('resize', { oldSize: oldSize, newSize: newSize }); }, + // @section Methods for modifying map state + // @method stop(): this + // Stops the currently running `panTo` or `flyTo` animation, if any. + stop: function () { + this.setZoom(this._limitZoom(this._zoom)); + if (!this.options.zoomSnap) { + this.fire('viewreset'); + } + return this._stop(); + }, + + // @section Geolocation methods + // @method locate(options?: Locate options): this + // Tries to locate the user using the Geolocation API, firing a [`locationfound`](#map-locationfound) + // event with location data on success or a [`locationerror`](#map-locationerror) event on failure, + // and optionally sets the map view to the user's location with respect to + // detection accuracy (or to the world view if geolocation failed). + // Note that, if your page doesn't use HTTPS, this method will fail in + // modern browsers ([Chrome 50 and newer](https://sites.google.com/a/chromium.org/dev/Home/chromium-security/deprecating-powerful-features-on-insecure-origins)) + // See `Locate options` for more details. + locate: function (options) { + + options = this._locateOptions = L.extend({ + timeout: 10000, + watch: false + // setView: false + // maxZoom: + // maximumAge: 0 + // enableHighAccuracy: false + }, options); + + if (!('geolocation' in navigator)) { + this._handleGeolocationError({ + code: 0, + message: 'Geolocation not supported.' + }); + return this; + } + + var onResponse = L.bind(this._handleGeolocationResponse, this), + onError = L.bind(this._handleGeolocationError, this); + + if (options.watch) { + this._locationWatchId = + navigator.geolocation.watchPosition(onResponse, onError, options); + } else { + navigator.geolocation.getCurrentPosition(onResponse, onError, options); + } + return this; + }, + + // @method stopLocate(): this + // Stops watching location previously initiated by `map.locate({watch: true})` + // and aborts resetting the map view if map.locate was called with + // `{setView: true}`. + stopLocate: function () { + if (navigator.geolocation && navigator.geolocation.clearWatch) { + navigator.geolocation.clearWatch(this._locationWatchId); + } + if (this._locateOptions) { + this._locateOptions.setView = false; + } + return this; + }, + + _handleGeolocationError: function (error) { + var c = error.code, + message = error.message || + (c === 1 ? 'permission denied' : + (c === 2 ? 'position unavailable' : 'timeout')); + + if (this._locateOptions.setView && !this._loaded) { + this.fitWorld(); + } + + // @section Location events + // @event locationerror: ErrorEvent + // Fired when geolocation (using the [`locate`](#map-locate) method) failed. + this.fire('locationerror', { + code: c, + message: 'Geolocation error: ' + message + '.' + }); + }, + + _handleGeolocationResponse: function (pos) { + var lat = pos.coords.latitude, + lng = pos.coords.longitude, + latlng = new L.LatLng(lat, lng), + bounds = latlng.toBounds(pos.coords.accuracy), + options = this._locateOptions; + + if (options.setView) { + var zoom = this.getBoundsZoom(bounds); + this.setView(latlng, options.maxZoom ? Math.min(zoom, options.maxZoom) : zoom); + } + + var data = { + latlng: latlng, + bounds: bounds, + timestamp: pos.timestamp + }; + + for (var i in pos.coords) { + if (typeof pos.coords[i] === 'number') { + data[i] = pos.coords[i]; + } + } + + // @event locationfound: LocationEvent + // Fired when geolocation (using the [`locate`](#map-locate) method) + // went successfully. + this.fire('locationfound', data); + }, + // TODO handler.addTo + // TODO Appropiate docs section? + // @section Other Methods + // @method addHandler(name: String, HandlerClass: Function): this + // Adds a new `Handler` to the map, given its name and constructor function. addHandler: function (name, HandlerClass) { if (!HandlerClass) { return this; } @@ -1817,46 +2950,85 @@ L.Map = L.Class.extend({ return this; }, + // @method remove(): this + // Destroys the map and clears all related event listeners. remove: function () { - if (this._loaded) { - this.fire('unload'); - } - this._initEvents('off'); + this._initEvents(true); + + if (this._containerId !== this._container._leaflet_id) { + throw new Error('Map container is being reused by another instance'); + } try { // throws error in IE6-8 - delete this._container._leaflet; + delete this._container._leaflet_id; + delete this._containerId; } catch (e) { - this._container._leaflet = undefined; + /*eslint-disable */ + this._container._leaflet_id = undefined; + /*eslint-enable */ + this._containerId = undefined; } - this._clearPanes(); + L.DomUtil.remove(this._mapPane); + if (this._clearControlPos) { this._clearControlPos(); } this._clearHandlers(); + if (this._loaded) { + // @section Map state change events + // @event unload: Event + // Fired when the map is destroyed with [remove](#map-remove) method. + this.fire('unload'); + } + + for (var i in this._layers) { + this._layers[i].remove(); + } + return this; }, + // @section Other Methods + // @method createPane(name: String, container?: HTMLElement): HTMLElement + // Creates a new [map pane](#map-pane) with the given name if it doesn't exist already, + // then returns it. The pane is created as a children of `container`, or + // as a children of the main map pane if not set. + createPane: function (name, container) { + var className = 'leaflet-pane' + (name ? ' leaflet-' + name.replace('Pane', '') + '-pane' : ''), + pane = L.DomUtil.create('div', className, container || this._mapPane); + + if (name) { + this._panes[name] = pane; + } + return pane; + }, - // public methods for getting map state + // @section Methods for Getting Map State - getCenter: function () { // (Boolean) -> LatLng + // @method getCenter(): LatLng + // Returns the geographical center of the map view + getCenter: function () { this._checkIfLoaded(); - if (this._initialCenter && !this._moved()) { - return this._initialCenter; + if (this._lastCenter && !this._moved()) { + return this._lastCenter; } return this.layerPointToLatLng(this._getCenterLayerPoint()); }, + // @method getZoom(): Number + // Returns the current zoom level of the map view getZoom: function () { return this._zoom; }, + // @method getBounds(): LatLngBounds + // Returns the geographical bounds visible in the current map view getBounds: function () { var bounds = this.getPixelBounds(), sw = this.unproject(bounds.getBottomLeft()), @@ -1865,136 +3037,239 @@ L.Map = L.Class.extend({ return new L.LatLngBounds(sw, ne); }, + // @method getMinZoom(): Number + // Returns the minimum zoom level of the map (if set in the `minZoom` option of the map or of any layers), or `0` by default. getMinZoom: function () { - return this.options.minZoom === undefined ? - (this._layersMinZoom === undefined ? 0 : this._layersMinZoom) : - this.options.minZoom; + return this.options.minZoom === undefined ? this._layersMinZoom || 0 : this.options.minZoom; }, + // @method getMaxZoom(): Number + // Returns the maximum zoom level of the map (if set in the `maxZoom` option of the map or of any layers). getMaxZoom: function () { return this.options.maxZoom === undefined ? (this._layersMaxZoom === undefined ? Infinity : this._layersMaxZoom) : this.options.maxZoom; }, + // @method getBoundsZoom(bounds: LatLngBounds, inside?: Boolean): Number + // Returns the maximum zoom level on which the given bounds fit to the map + // view in its entirety. If `inside` (optional) is set to `true`, the method + // instead returns the minimum zoom level on which the map view fits into + // the given bounds in its entirety. getBoundsZoom: function (bounds, inside, padding) { // (LatLngBounds[, Boolean, Point]) -> Number bounds = L.latLngBounds(bounds); + padding = L.point(padding || [0, 0]); - var zoom = this.getMinZoom() - (inside ? 1 : 0), - maxZoom = this.getMaxZoom(), - size = this.getSize(), - + var zoom = this.getZoom() || 0, + min = this.getMinZoom(), + max = this.getMaxZoom(), nw = bounds.getNorthWest(), se = bounds.getSouthEast(), + size = this.getSize().subtract(padding), + boundsSize = L.bounds(this.project(se, zoom), this.project(nw, zoom)).getSize(), + snap = L.Browser.any3d ? this.options.zoomSnap : 1; - zoomNotFound = true, - boundsSize; - - padding = L.point(padding || [0, 0]); - - do { - zoom++; - boundsSize = this.project(se, zoom).subtract(this.project(nw, zoom)).add(padding); - zoomNotFound = !inside ? size.contains(boundsSize) : boundsSize.x < size.x || boundsSize.y < size.y; + var scale = Math.min(size.x / boundsSize.x, size.y / boundsSize.y); + zoom = this.getScaleZoom(scale, zoom); - } while (zoomNotFound && zoom <= maxZoom); - - if (zoomNotFound && inside) { - return null; + if (snap) { + zoom = Math.round(zoom / (snap / 100)) * (snap / 100); // don't jump if within 1% of a snap level + zoom = inside ? Math.ceil(zoom / snap) * snap : Math.floor(zoom / snap) * snap; } - return inside ? zoom : zoom - 1; + return Math.max(min, Math.min(max, zoom)); }, + // @method getSize(): Point + // Returns the current size of the map container (in pixels). getSize: function () { if (!this._size || this._sizeChanged) { this._size = new L.Point( - this._container.clientWidth, - this._container.clientHeight); + this._container.clientWidth || 0, + this._container.clientHeight || 0); this._sizeChanged = false; } return this._size.clone(); }, - getPixelBounds: function () { - var topLeftPoint = this._getTopLeftPoint(); + // @method getPixelBounds(): Bounds + // Returns the bounds of the current map view in projected pixel + // coordinates (sometimes useful in layer and overlay implementations). + getPixelBounds: function (center, zoom) { + var topLeftPoint = this._getTopLeftPoint(center, zoom); return new L.Bounds(topLeftPoint, topLeftPoint.add(this.getSize())); }, + // TODO: Check semantics - isn't the pixel origin the 0,0 coord relative to + // the map pane? "left point of the map layer" can be confusing, specially + // since there can be negative offsets. + // @method getPixelOrigin(): Point + // Returns the projected pixel coordinates of the top left point of + // the map layer (useful in custom layer and overlay implementations). getPixelOrigin: function () { this._checkIfLoaded(); - return this._initialTopLeftPoint; + return this._pixelOrigin; + }, + + // @method getPixelWorldBounds(zoom?: Number): Bounds + // Returns the world's bounds in pixel coordinates for zoom level `zoom`. + // If `zoom` is omitted, the map's current zoom level is used. + getPixelWorldBounds: function (zoom) { + return this.options.crs.getProjectedBounds(zoom === undefined ? this.getZoom() : zoom); + }, + + // @section Other Methods + + // @method getPane(pane: String|HTMLElement): HTMLElement + // Returns a [map pane](#map-pane), given its name or its HTML element (its identity). + getPane: function (pane) { + return typeof pane === 'string' ? this._panes[pane] : pane; }, + // @method getPanes(): Object + // Returns a plain object containing the names of all [panes](#map-pane) as keys and + // the panes as values. getPanes: function () { return this._panes; }, + // @method getContainer: HTMLElement + // Returns the HTML element that contains the map. getContainer: function () { return this._container; }, - // TODO replace with universal implementation after refactoring projections + // @section Conversion Methods - getZoomScale: function (toZoom) { + // @method getZoomScale(toZoom: Number, fromZoom: Number): Number + // Returns the scale factor to be applied to a map transition from zoom level + // `fromZoom` to `toZoom`. Used internally to help with zoom animations. + getZoomScale: function (toZoom, fromZoom) { + // TODO replace with universal implementation after refactoring projections var crs = this.options.crs; - return crs.scale(toZoom) / crs.scale(this._zoom); + fromZoom = fromZoom === undefined ? this._zoom : fromZoom; + return crs.scale(toZoom) / crs.scale(fromZoom); }, - getScaleZoom: function (scale) { - return this._zoom + (Math.log(scale) / Math.LN2); + // @method getScaleZoom(scale: Number, fromZoom: Number): Number + // Returns the zoom level that the map would end up at, if it is at `fromZoom` + // level and everything is scaled by a factor of `scale`. Inverse of + // [`getZoomScale`](#map-getZoomScale). + getScaleZoom: function (scale, fromZoom) { + var crs = this.options.crs; + fromZoom = fromZoom === undefined ? this._zoom : fromZoom; + var zoom = crs.zoom(scale * crs.scale(fromZoom)); + return isNaN(zoom) ? Infinity : zoom; }, - - // conversion methods - - project: function (latlng, zoom) { // (LatLng[, Number]) -> Point + // @method project(latlng: LatLng, zoom: Number): Point + // Projects a geographical coordinate `LatLng` according to the projection + // of the map's CRS, then scales it according to `zoom` and the CRS's + // `Transformation`. The result is pixel coordinate relative to + // the CRS origin. + project: function (latlng, zoom) { zoom = zoom === undefined ? this._zoom : zoom; return this.options.crs.latLngToPoint(L.latLng(latlng), zoom); }, - unproject: function (point, zoom) { // (Point[, Number]) -> LatLng + // @method unproject(point: Point, zoom: Number): LatLng + // Inverse of [`project`](#map-project). + unproject: function (point, zoom) { zoom = zoom === undefined ? this._zoom : zoom; return this.options.crs.pointToLatLng(L.point(point), zoom); }, - layerPointToLatLng: function (point) { // (Point) + // @method layerPointToLatLng(point: Point): LatLng + // Given a pixel coordinate relative to the [origin pixel](#map-getpixelorigin), + // returns the corresponding geographical coordinate (for the current zoom level). + layerPointToLatLng: function (point) { var projectedPoint = L.point(point).add(this.getPixelOrigin()); return this.unproject(projectedPoint); }, - latLngToLayerPoint: function (latlng) { // (LatLng) + // @method latLngToLayerPoint(latlng: LatLng): Point + // Given a geographical coordinate, returns the corresponding pixel coordinate + // relative to the [origin pixel](#map-getpixelorigin). + latLngToLayerPoint: function (latlng) { var projectedPoint = this.project(L.latLng(latlng))._round(); return projectedPoint._subtract(this.getPixelOrigin()); }, + // @method wrapLatLng(latlng: LatLng): LatLng + // Returns a `LatLng` where `lat` and `lng` has been wrapped according to the + // map's CRS's `wrapLat` and `wrapLng` properties, if they are outside the + // CRS's bounds. + // By default this means longitude is wrapped around the dateline so its + // value is between -180 and +180 degrees. + wrapLatLng: function (latlng) { + return this.options.crs.wrapLatLng(L.latLng(latlng)); + }, + + // @method wrapLatLngBounds(bounds: LatLngBounds): LatLngBounds + // Returns a `LatLngBounds` with the same size as the given one, ensuring that + // its center is within the CRS's bounds. + // By default this means the center longitude is wrapped around the dateline so its + // value is between -180 and +180 degrees, and the majority of the bounds + // overlaps the CRS's bounds. + wrapLatLngBounds: function (latlng) { + return this.options.crs.wrapLatLngBounds(L.latLngBounds(latlng)); + }, + + // @method distance(latlng1: LatLng, latlng2: LatLng): Number + // Returns the distance between two geographical coordinates according to + // the map's CRS. By default this measures distance in meters. + distance: function (latlng1, latlng2) { + return this.options.crs.distance(L.latLng(latlng1), L.latLng(latlng2)); + }, + + // @method containerPointToLayerPoint(point: Point): Point + // Given a pixel coordinate relative to the map container, returns the corresponding + // pixel coordinate relative to the [origin pixel](#map-getpixelorigin). containerPointToLayerPoint: function (point) { // (Point) return L.point(point).subtract(this._getMapPanePos()); }, + // @method layerPointToContainerPoint(point: Point): Point + // Given a pixel coordinate relative to the [origin pixel](#map-getpixelorigin), + // returns the corresponding pixel coordinate relative to the map container. layerPointToContainerPoint: function (point) { // (Point) return L.point(point).add(this._getMapPanePos()); }, + // @method containerPointToLatLng(point: Point): LatLng + // Given a pixel coordinate relative to the map container, returns + // the corresponding geographical coordinate (for the current zoom level). containerPointToLatLng: function (point) { var layerPoint = this.containerPointToLayerPoint(L.point(point)); return this.layerPointToLatLng(layerPoint); }, + // @method latLngToContainerPoint(latlng: LatLng): Point + // Given a geographical coordinate, returns the corresponding pixel coordinate + // relative to the map container. latLngToContainerPoint: function (latlng) { return this.layerPointToContainerPoint(this.latLngToLayerPoint(L.latLng(latlng))); }, - mouseEventToContainerPoint: function (e) { // (MouseEvent) + // @method mouseEventToContainerPoint(ev: MouseEvent): Point + // Given a MouseEvent object, returns the pixel coordinate relative to the + // map container where the event took place. + mouseEventToContainerPoint: function (e) { return L.DomEvent.getMousePosition(e, this._container); }, - mouseEventToLayerPoint: function (e) { // (MouseEvent) + // @method mouseEventToLayerPoint(ev: MouseEvent): Point + // Given a MouseEvent object, returns the pixel coordinate relative to + // the [origin pixel](#map-getpixelorigin) where the event took place. + mouseEventToLayerPoint: function (e) { return this.containerPointToLayerPoint(this.mouseEventToContainerPoint(e)); }, + // @method mouseEventToLatLng(ev: MouseEvent): LatLng + // Given a MouseEvent object, returns geographical coordinate where the + // event took place. mouseEventToLatLng: function (e) { // (MouseEvent) return this.layerPointToLatLng(this.mouseEventToLayerPoint(e)); }, @@ -2007,21 +3282,25 @@ L.Map = L.Class.extend({ if (!container) { throw new Error('Map container not found.'); - } else if (container._leaflet) { + } else if (container._leaflet_id) { throw new Error('Map container is already initialized.'); } - container._leaflet = true; + L.DomEvent.addListener(container, 'scroll', this._onScroll, this); + this._containerId = L.Util.stamp(container); }, _initLayout: function () { var container = this._container; + this._fadeAnimated = this.options.fadeAnimation && L.Browser.any3d; + L.DomUtil.addClass(container, 'leaflet-container' + (L.Browser.touch ? ' leaflet-touch' : '') + (L.Browser.retina ? ' leaflet-retina' : '') + (L.Browser.ielt9 ? ' leaflet-oldie' : '') + - (this.options.fadeAnimation ? ' leaflet-fade-anim' : '')); + (L.Browser.safari ? ' leaflet-safari' : '') + + (this._fadeAnimated ? ' leaflet-fade-anim' : '')); var position = L.DomUtil.getStyle(container, 'position'); @@ -2038,86 +3317,133 @@ L.Map = L.Class.extend({ _initPanes: function () { var panes = this._panes = {}; - - this._mapPane = panes.mapPane = this._createPane('leaflet-map-pane', this._container); - - this._tilePane = panes.tilePane = this._createPane('leaflet-tile-pane', this._mapPane); - panes.objectsPane = this._createPane('leaflet-objects-pane', this._mapPane); - panes.shadowPane = this._createPane('leaflet-shadow-pane'); - panes.overlayPane = this._createPane('leaflet-overlay-pane'); - panes.markerPane = this._createPane('leaflet-marker-pane'); - panes.popupPane = this._createPane('leaflet-popup-pane'); - - var zoomHide = ' leaflet-zoom-hide'; + this._paneRenderers = {}; + + // @section + // + // Panes are DOM elements used to control the ordering of layers on the map. You + // can access panes with [`map.getPane`](#map-getpane) or + // [`map.getPanes`](#map-getpanes) methods. New panes can be created with the + // [`map.createPane`](#map-createpane) method. + // + // Every map has the following default panes that differ only in zIndex. + // + // @pane mapPane: HTMLElement = 'auto' + // Pane that contains all other map panes + + this._mapPane = this.createPane('mapPane', this._container); + L.DomUtil.setPosition(this._mapPane, new L.Point(0, 0)); + + // @pane tilePane: HTMLElement = 200 + // Pane for `GridLayer`s and `TileLayer`s + this.createPane('tilePane'); + // @pane overlayPane: HTMLElement = 400 + // Pane for vector overlays (`Path`s), like `Polyline`s and `Polygon`s + this.createPane('shadowPane'); + // @pane shadowPane: HTMLElement = 500 + // Pane for overlay shadows (e.g. `Marker` shadows) + this.createPane('overlayPane'); + // @pane markerPane: HTMLElement = 600 + // Pane for `Icon`s of `Marker`s + this.createPane('markerPane'); + // @pane tooltipPane: HTMLElement = 650 + // Pane for tooltip. + this.createPane('tooltipPane'); + // @pane popupPane: HTMLElement = 700 + // Pane for `Popup`s. + this.createPane('popupPane'); if (!this.options.markerZoomAnimation) { - L.DomUtil.addClass(panes.markerPane, zoomHide); - L.DomUtil.addClass(panes.shadowPane, zoomHide); - L.DomUtil.addClass(panes.popupPane, zoomHide); - } - }, - - _createPane: function (className, container) { - return L.DomUtil.create('div', className, container || this._panes.objectsPane); - }, - - _clearPanes: function () { - this._container.removeChild(this._mapPane); - }, - - _addLayers: function (layers) { - layers = layers ? (L.Util.isArray(layers) ? layers : [layers]) : []; - - for (var i = 0, len = layers.length; i < len; i++) { - this.addLayer(layers[i]); + L.DomUtil.addClass(panes.markerPane, 'leaflet-zoom-hide'); + L.DomUtil.addClass(panes.shadowPane, 'leaflet-zoom-hide'); } }, // private methods that modify map state - _resetView: function (center, zoom, preserveMapOffset, afterZoomAnim) { + // @section Map state change events + _resetView: function (center, zoom) { + L.DomUtil.setPosition(this._mapPane, new L.Point(0, 0)); - var zoomChanged = (this._zoom !== zoom); + var loading = !this._loaded; + this._loaded = true; + zoom = this._limitZoom(zoom); - if (!afterZoomAnim) { - this.fire('movestart'); + this.fire('viewprereset'); - if (zoomChanged) { - this.fire('zoomstart'); - } + var zoomChanged = this._zoom !== zoom; + this + ._moveStart(zoomChanged) + ._move(center, zoom) + ._moveEnd(zoomChanged); + + // @event viewreset: Event + // Fired when the map needs to redraw its content (this usually happens + // on map zoom or load). Very useful for creating custom overlays. + this.fire('viewreset'); + + // @event load: Event + // Fired when the map is initialized (when its center and zoom are set + // for the first time). + if (loading) { + this.fire('load'); } + }, - this._zoom = zoom; - this._initialCenter = center; - - this._initialTopLeftPoint = this._getNewTopLeftPoint(center); - - if (!preserveMapOffset) { - L.DomUtil.setPosition(this._mapPane, new L.Point(0, 0)); - } else { - this._initialTopLeftPoint._add(this._getMapPanePos()); + _moveStart: function (zoomChanged) { + // @event zoomstart: Event + // Fired when the map zoom is about to change (e.g. before zoom animation). + // @event movestart: Event + // Fired when the view of the map starts changing (e.g. user starts dragging the map). + if (zoomChanged) { + this.fire('zoomstart'); } + return this.fire('movestart'); + }, - this._tileLayersToLoad = this._tileLayersNum; - - var loading = !this._loaded; - this._loaded = true; + _move: function (center, zoom, data) { + if (zoom === undefined) { + zoom = this._zoom; + } + var zoomChanged = this._zoom !== zoom; - this.fire('viewreset', {hard: !preserveMapOffset}); + this._zoom = zoom; + this._lastCenter = center; + this._pixelOrigin = this._getNewPixelOrigin(center); - if (loading) { - this.fire('load'); - this.eachLayer(this._layerAdd, this); + // @event zoom: Event + // Fired repeatedly during any change in zoom level, including zoom + // and fly animations. + if (zoomChanged || (data && data.pinch)) { // Always fire 'zoom' if pinching because #3530 + this.fire('zoom', data); } - this.fire('move'); + // @event move: Event + // Fired repeatedly during any movement of the map, including pan and + // fly animations. + return this.fire('move', data); + }, - if (zoomChanged || afterZoomAnim) { + _moveEnd: function (zoomChanged) { + // @event zoomend: Event + // Fired when the map has changed, after any animations. + if (zoomChanged) { this.fire('zoomend'); } - this.fire('moveend', {hard: !preserveMapOffset}); + // @event moveend: Event + // Fired when the center of the map stops changing (e.g. user stopped + // dragging the map). + return this.fire('moveend'); + }, + + _stop: function () { + L.Util.cancelAnimFrame(this._flyToFrame); + if (this._panAnim) { + this._panAnim.stop(); + } + return this; }, _rawPanBy: function (offset) { @@ -2128,36 +3454,10 @@ L.Map = L.Class.extend({ return this.getMaxZoom() - this.getMinZoom(); }, - _updateZoomLevels: function () { - var i, - minZoom = Infinity, - maxZoom = -Infinity, - oldZoomSpan = this._getZoomSpan(); - - for (i in this._zoomBoundLayers) { - var layer = this._zoomBoundLayers[i]; - if (!isNaN(layer.options.minZoom)) { - minZoom = Math.min(minZoom, layer.options.minZoom); - } - if (!isNaN(layer.options.maxZoom)) { - maxZoom = Math.max(maxZoom, layer.options.maxZoom); - } - } - - if (i === undefined) { // we have no tilelayers - this._layersMaxZoom = this._layersMinZoom = undefined; - } else { - this._layersMaxZoom = maxZoom; - this._layersMinZoom = minZoom; - } - - if (oldZoomSpan !== this._getZoomSpan()) { - this.fire('zoomlevelschange'); - } - }, - _panInsideMaxBounds: function () { - this.panInsideBounds(this.options.maxBounds); + if (!this._enforcingBounds) { + this.panInsideBounds(this.options.maxBounds); + } }, _checkIfLoaded: function () { @@ -2166,74 +3466,158 @@ L.Map = L.Class.extend({ } }, - // map events + // DOM event handling - _initEvents: function (onOff) { + // @section Interaction events + _initEvents: function (remove) { if (!L.DomEvent) { return; } - onOff = onOff || 'on'; - - L.DomEvent[onOff](this._container, 'click', this._onMouseClick, this); - - var events = ['dblclick', 'mousedown', 'mouseup', 'mouseenter', - 'mouseleave', 'mousemove', 'contextmenu'], - i, len; - - for (i = 0, len = events.length; i < len; i++) { - L.DomEvent[onOff](this._container, events[i], this._fireMouseEvent, this); - } + this._targets = {}; + this._targets[L.stamp(this._container)] = this; + + var onOff = remove ? 'off' : 'on'; + + // @event click: MouseEvent + // Fired when the user clicks (or taps) the map. + // @event dblclick: MouseEvent + // Fired when the user double-clicks (or double-taps) the map. + // @event mousedown: MouseEvent + // Fired when the user pushes the mouse button on the map. + // @event mouseup: MouseEvent + // Fired when the user releases the mouse button on the map. + // @event mouseover: MouseEvent + // Fired when the mouse enters the map. + // @event mouseout: MouseEvent + // Fired when the mouse leaves the map. + // @event mousemove: MouseEvent + // Fired while the mouse moves over the map. + // @event contextmenu: MouseEvent + // Fired when the user pushes the right mouse button on the map, prevents + // default browser context menu from showing if there are listeners on + // this event. Also fired on mobile when the user holds a single touch + // for a second (also called long press). + // @event keypress: KeyboardEvent + // Fired when the user presses a key from the keyboard while the map is focused. + L.DomEvent[onOff](this._container, 'click dblclick mousedown mouseup ' + + 'mouseover mouseout mousemove contextmenu keypress', this._handleDOMEvent, this); if (this.options.trackResize) { L.DomEvent[onOff](window, 'resize', this._onResize, this); } + + if (L.Browser.any3d && this.options.transform3DLimit) { + this[onOff]('moveend', this._onMoveEnd); + } }, _onResize: function () { L.Util.cancelAnimFrame(this._resizeRequest); this._resizeRequest = L.Util.requestAnimFrame( - function () { this.invalidateSize({debounceMoveend: true}); }, this, false, this._container); + function () { this.invalidateSize({debounceMoveend: true}); }, this); + }, + + _onScroll: function () { + this._container.scrollTop = 0; + this._container.scrollLeft = 0; + }, + + _onMoveEnd: function () { + var pos = this._getMapPanePos(); + if (Math.max(Math.abs(pos.x), Math.abs(pos.y)) >= this.options.transform3DLimit) { + // https://bugzilla.mozilla.org/show_bug.cgi?id=1203873 but Webkit also have + // a pixel offset on very high values, see: http://jsfiddle.net/dg6r5hhb/ + this._resetView(this.getCenter(), this.getZoom()); + } }, - _onMouseClick: function (e) { - if (!this._loaded || (!e._simulated && - ((this.dragging && this.dragging.moved()) || - (this.boxZoom && this.boxZoom.moved()))) || - L.DomEvent._skipped(e)) { return; } + _findEventTargets: function (e, type) { + var targets = [], + target, + isHover = type === 'mouseout' || type === 'mouseover', + src = e.target || e.srcElement, + dragging = false; - this.fire('preclick'); - this._fireMouseEvent(e); + while (src) { + target = this._targets[L.stamp(src)]; + if (target && (type === 'click' || type === 'preclick') && !e._simulated && this._draggableMoved(target)) { + // Prevent firing click after you just dragged an object. + dragging = true; + break; + } + if (target && target.listens(type, true)) { + if (isHover && !L.DomEvent._isExternalTarget(src, e)) { break; } + targets.push(target); + if (isHover) { break; } + } + if (src === this._container) { break; } + src = src.parentNode; + } + if (!targets.length && !dragging && !isHover && L.DomEvent._isExternalTarget(src, e)) { + targets = [this]; + } + return targets; }, - _fireMouseEvent: function (e) { + _handleDOMEvent: function (e) { if (!this._loaded || L.DomEvent._skipped(e)) { return; } - var type = e.type; + var type = e.type === 'keypress' && e.keyCode === 13 ? 'click' : e.type; + + if (type === 'mousedown') { + // prevents outline when clicking on keyboard-focusable element + L.DomUtil.preventOutline(e.target || e.srcElement); + } + + this._fireDOMEvent(e, type); + }, + + _fireDOMEvent: function (e, type, targets) { + + if (e.type === 'click') { + // Fire a synthetic 'preclick' event which propagates up (mainly for closing popups). + // @event preclick: MouseEvent + // Fired before mouse click on the map (sometimes useful when you + // want something to happen on click before any existing click + // handlers start running). + var synth = L.Util.extend({}, e); + synth.type = 'preclick'; + this._fireDOMEvent(synth, synth.type, targets); + } + + if (e._stopped) { return; } - type = (type === 'mouseenter' ? 'mouseover' : (type === 'mouseleave' ? 'mouseout' : type)); + // Find the layer the event is propagating from and its parents. + targets = (targets || []).concat(this._findEventTargets(e, type)); - if (!this.hasEventListeners(type)) { return; } + if (!targets.length) { return; } - if (type === 'contextmenu') { + var target = targets[0]; + if (type === 'contextmenu' && target.listens(type, true)) { L.DomEvent.preventDefault(e); } - var containerPoint = this.mouseEventToContainerPoint(e), - layerPoint = this.containerPointToLayerPoint(containerPoint), - latlng = this.layerPointToLatLng(layerPoint); - - this.fire(type, { - latlng: latlng, - layerPoint: layerPoint, - containerPoint: containerPoint, + var data = { originalEvent: e - }); - }, + }; - _onTileLayerLoad: function () { - this._tileLayersToLoad--; - if (this._tileLayersNum && !this._tileLayersToLoad) { - this.fire('tilelayersload'); + if (e.type !== 'keypress') { + var isMarker = target instanceof L.Marker; + data.containerPoint = isMarker ? + this.latLngToContainerPoint(target.getLatLng()) : this.mouseEventToContainerPoint(e); + data.layerPoint = this.containerPointToLayerPoint(data.containerPoint); + data.latlng = isMarker ? target.getLatLng() : this.layerPointToLatLng(data.layerPoint); } + + for (var i = 0; i < targets.length; i++) { + targets[i].fire(type, data, true); + if (data.originalEvent._stopped || + (targets[i].options.nonBubblingEvents && L.Util.indexOf(targets[i].options.nonBubblingEvents, type) !== -1)) { return; } + } + }, + + _draggableMoved: function (obj) { + obj = obj.dragging && obj.dragging.enabled() ? obj : this; + return (obj.dragging && obj.dragging.moved()) || (this.boxZoom && this.boxZoom.moved()); }, _clearHandlers: function () { @@ -2242,25 +3626,26 @@ L.Map = L.Class.extend({ } }, + // @section Other Methods + + // @method whenReady(fn: Function, context?: Object): this + // Runs the given function `fn` when the map gets initialized with + // a view (center and zoom) and at least one layer, or immediately + // if it's already initialized, optionally passing a function context. whenReady: function (callback, context) { if (this._loaded) { - callback.call(context || this, this); + callback.call(context || this, {target: this}); } else { this.on('load', callback, context); } return this; }, - _layerAdd: function (layer) { - layer.onAdd(this); - this.fire('layeradd', {layer: layer}); - }, - // private methods for getting map state _getMapPanePos: function () { - return L.DomUtil.getPosition(this._mapPane); + return L.DomUtil.getPosition(this._mapPane) || new L.Point(0, 0); }, _moved: function () { @@ -2268,19 +3653,31 @@ L.Map = L.Class.extend({ return pos && !pos.equals([0, 0]); }, - _getTopLeftPoint: function () { - return this.getPixelOrigin().subtract(this._getMapPanePos()); + _getTopLeftPoint: function (center, zoom) { + var pixelOrigin = center && zoom !== undefined ? + this._getNewPixelOrigin(center, zoom) : + this.getPixelOrigin(); + return pixelOrigin.subtract(this._getMapPanePos()); }, - _getNewTopLeftPoint: function (center, zoom) { + _getNewPixelOrigin: function (center, zoom) { var viewHalf = this.getSize()._divideBy(2); - // TODO round on display, not calculation to increase precision? - return this.project(center, zoom)._subtract(viewHalf)._round(); + return this.project(center, zoom)._subtract(viewHalf)._add(this._getMapPanePos())._round(); + }, + + _latLngToNewLayerPoint: function (latlng, zoom, center) { + var topLeft = this._getNewPixelOrigin(center, zoom); + return this.project(latlng, zoom)._subtract(topLeft); }, - _latLngToNewLayerPoint: function (latlng, newZoom, newCenter) { - var topLeft = this._getNewTopLeftPoint(newCenter, newZoom).add(this._getMapPanePos()); - return this.project(latlng, newZoom)._subtract(topLeft); + _latLngBoundsToNewLayerBounds: function (latLngBounds, zoom, center) { + var topLeft = this._getNewPixelOrigin(center, zoom); + return L.bounds([ + this.project(latLngBounds.getSouthWest(), zoom)._subtract(topLeft), + this.project(latLngBounds.getNorthWest(), zoom)._subtract(topLeft), + this.project(latLngBounds.getSouthEast(), zoom)._subtract(topLeft), + this.project(latLngBounds.getNorthEast(), zoom)._subtract(topLeft) + ]); }, // layer point of the current center @@ -2303,6 +3700,13 @@ L.Map = L.Class.extend({ viewBounds = new L.Bounds(centerPoint.subtract(viewHalf), centerPoint.add(viewHalf)), offset = this._getBoundsOffset(viewBounds, bounds, zoom); + // If offset is less than a pixel, ignore. + // This prevents unstable projections from getting into + // an infinite loop of tiny offsets. + if (offset.round().equals([0, 0])) { + return center; + } + return this.unproject(centerPoint.add(offset), zoom); }, @@ -2318,11 +3722,15 @@ L.Map = L.Class.extend({ // returns offset needed for pxBounds to get inside maxBounds at a specified zoom _getBoundsOffset: function (pxBounds, maxBounds, zoom) { - var nwOffset = this.project(maxBounds.getNorthWest(), zoom).subtract(pxBounds.min), - seOffset = this.project(maxBounds.getSouthEast(), zoom).subtract(pxBounds.max), + var projectedMaxBounds = L.bounds( + this.project(maxBounds.getNorthEast(), zoom), + this.project(maxBounds.getSouthWest(), zoom) + ), + minOffset = projectedMaxBounds.min.subtract(pxBounds.min), + maxOffset = projectedMaxBounds.max.subtract(pxBounds.max), - dx = this._rebound(nwOffset.x, -seOffset.x), - dy = this._rebound(nwOffset.y, -seOffset.y); + dx = this._rebound(minOffset.x, -maxOffset.x), + dy = this._rebound(minOffset.y, -maxOffset.y); return new L.Point(dx, dy); }, @@ -2335,2974 +3743,4763 @@ L.Map = L.Class.extend({ _limitZoom: function (zoom) { var min = this.getMinZoom(), - max = this.getMaxZoom(); - + max = this.getMaxZoom(), + snap = L.Browser.any3d ? this.options.zoomSnap : 1; + if (snap) { + zoom = Math.round(zoom / snap) * snap; + } return Math.max(min, Math.min(max, zoom)); - } -}); - -L.map = function (id, options) { - return new L.Map(id, options); -}; - - -/* - * Mercator projection that takes into account that the Earth is not a perfect sphere. - * Less popular than spherical mercator; used by projections like EPSG:3395. - */ + }, -L.Projection.Mercator = { - MAX_LATITUDE: 85.0840591556, + _onPanTransitionStep: function () { + this.fire('move'); + }, - R_MINOR: 6356752.314245179, - R_MAJOR: 6378137, + _onPanTransitionEnd: function () { + L.DomUtil.removeClass(this._mapPane, 'leaflet-pan-anim'); + this.fire('moveend'); + }, - project: function (latlng) { // (LatLng) -> Point - var d = L.LatLng.DEG_TO_RAD, - max = this.MAX_LATITUDE, - lat = Math.max(Math.min(max, latlng.lat), -max), - r = this.R_MAJOR, - r2 = this.R_MINOR, - x = latlng.lng * d * r, - y = lat * d, - tmp = r2 / r, - eccent = Math.sqrt(1.0 - tmp * tmp), - con = eccent * Math.sin(y); - - con = Math.pow((1 - con) / (1 + con), eccent * 0.5); - - var ts = Math.tan(0.5 * ((Math.PI * 0.5) - y)) / con; - y = -r * Math.log(ts); - - return new L.Point(x, y); - }, - - unproject: function (point) { // (Point, Boolean) -> LatLng - var d = L.LatLng.RAD_TO_DEG, - r = this.R_MAJOR, - r2 = this.R_MINOR, - lng = point.x * d / r, - tmp = r2 / r, - eccent = Math.sqrt(1 - (tmp * tmp)), - ts = Math.exp(- point.y / r), - phi = (Math.PI / 2) - 2 * Math.atan(ts), - numIter = 15, - tol = 1e-7, - i = numIter, - dphi = 0.1, - con; - - while ((Math.abs(dphi) > tol) && (--i > 0)) { - con = eccent * Math.sin(phi); - dphi = (Math.PI / 2) - 2 * Math.atan(ts * - Math.pow((1.0 - con) / (1.0 + con), 0.5 * eccent)) - phi; - phi += dphi; - } + _tryAnimatedPan: function (center, options) { + // difference between the new and current centers in pixels + var offset = this._getCenterOffset(center)._floor(); - return new L.LatLng(phi * d, lng); - } -}; + // don't animate too far unless animate: true specified in options + if ((options && options.animate) !== true && !this.getSize().contains(offset)) { return false; } + this.panBy(offset, options); + return true; + }, -L.CRS.EPSG3395 = L.extend({}, L.CRS, { - code: 'EPSG:3395', + _createAnimProxy: function () { - projection: L.Projection.Mercator, + var proxy = this._proxy = L.DomUtil.create('div', 'leaflet-proxy leaflet-zoom-animated'); + this._panes.mapPane.appendChild(proxy); - transformation: (function () { - var m = L.Projection.Mercator, - r = m.R_MAJOR, - scale = 0.5 / (Math.PI * r); + this.on('zoomanim', function (e) { + var prop = L.DomUtil.TRANSFORM, + transform = proxy.style[prop]; - return new L.Transformation(scale, 0.5, -scale, 0.5); - }()) -}); + L.DomUtil.setTransform(proxy, this.project(e.center, e.zoom), this.getZoomScale(e.zoom, 1)); + // workaround for case when transform is the same and so transitionend event is not fired + if (transform === proxy.style[prop] && this._animatingZoom) { + this._onZoomTransitionEnd(); + } + }, this); -/* - * L.TileLayer is used for standard xyz-numbered tile layers. - */ + this.on('load moveend', function () { + var c = this.getCenter(), + z = this.getZoom(); + L.DomUtil.setTransform(proxy, this.project(c, z), this.getZoomScale(z, 1)); + }, this); + }, -L.TileLayer = L.Class.extend({ - includes: L.Mixin.Events, + _catchTransitionEnd: function (e) { + if (this._animatingZoom && e.propertyName.indexOf('transform') >= 0) { + this._onZoomTransitionEnd(); + } + }, - options: { - minZoom: 0, - maxZoom: 18, - tileSize: 256, - subdomains: 'abc', - errorTileUrl: '', - attribution: '', - zoomOffset: 0, - opacity: 1, - /* - maxNativeZoom: null, - zIndex: null, - tms: false, - continuousWorld: false, - noWrap: false, - zoomReverse: false, - detectRetina: false, - reuseTiles: false, - bounds: false, - */ - unloadInvisibleTiles: L.Browser.mobile, - updateWhenIdle: L.Browser.mobile + _nothingToAnimate: function () { + return !this._container.getElementsByClassName('leaflet-zoom-animated').length; }, - initialize: function (url, options) { - options = L.setOptions(this, options); + _tryAnimatedZoom: function (center, zoom, options) { - // detecting retina displays, adjusting tileSize and zoom levels - if (options.detectRetina && L.Browser.retina && options.maxZoom > 0) { + if (this._animatingZoom) { return true; } - options.tileSize = Math.floor(options.tileSize / 2); - options.zoomOffset++; + options = options || {}; - if (options.minZoom > 0) { - options.minZoom--; - } - this.options.maxZoom--; - } + // don't animate if disabled, not supported or zoom difference is too large + if (!this._zoomAnimated || options.animate === false || this._nothingToAnimate() || + Math.abs(zoom - this._zoom) > this.options.zoomAnimationThreshold) { return false; } - if (options.bounds) { - options.bounds = L.latLngBounds(options.bounds); - } + // offset is the pixel coords of the zoom origin relative to the current center + var scale = this.getZoomScale(zoom), + offset = this._getCenterOffset(center)._divideBy(1 - 1 / scale); - this._url = url; + // don't animate if the zoom origin isn't within one screen from the current center, unless forced + if (options.animate !== true && !this.getSize().contains(offset)) { return false; } - var subdomains = this.options.subdomains; + L.Util.requestAnimFrame(function () { + this + ._moveStart(true) + ._animateZoom(center, zoom, true); + }, this); - if (typeof subdomains === 'string') { - this.options.subdomains = subdomains.split(''); - } + return true; }, - onAdd: function (map) { - this._map = map; - this._animated = map._zoomAnimated; - - // create a container div for tiles - this._initContainer(); + _animateZoom: function (center, zoom, startAnim, noUpdate) { + if (startAnim) { + this._animatingZoom = true; - // set up events - map.on({ - 'viewreset': this._reset, - 'moveend': this._update - }, this); + // remember what center/zoom to set after animation + this._animateToCenter = center; + this._animateToZoom = zoom; - if (this._animated) { - map.on({ - 'zoomanim': this._animateZoom, - 'zoomend': this._endZoomAnim - }, this); + L.DomUtil.addClass(this._mapPane, 'leaflet-zoom-anim'); } - if (!this.options.updateWhenIdle) { - this._limitedUpdate = L.Util.limitExecByInterval(this._update, 150, this); - map.on('move', this._limitedUpdate, this); - } + // @event zoomanim: ZoomAnimEvent + // Fired on every frame of a zoom animation + this.fire('zoomanim', { + center: center, + zoom: zoom, + noUpdate: noUpdate + }); - this._reset(); - this._update(); + // Work around webkit not firing 'transitionend', see https://github.com/Leaflet/Leaflet/issues/3689, 2693 + setTimeout(L.bind(this._onZoomTransitionEnd, this), 250); }, - addTo: function (map) { - map.addLayer(this); - return this; - }, + _onZoomTransitionEnd: function () { + if (!this._animatingZoom) { return; } - onRemove: function (map) { - this._container.parentNode.removeChild(this._container); + L.DomUtil.removeClass(this._mapPane, 'leaflet-zoom-anim'); - map.off({ - 'viewreset': this._reset, - 'moveend': this._update + this._animatingZoom = false; + + this._move(this._animateToCenter, this._animateToZoom); + + // This anim frame should prevent an obscure iOS webkit tile loading race condition. + L.Util.requestAnimFrame(function () { + this._moveEnd(true); }, this); + } +}); - if (this._animated) { - map.off({ - 'zoomanim': this._animateZoom, - 'zoomend': this._endZoomAnim - }, this); - } +// @section - if (!this.options.updateWhenIdle) { - map.off('move', this._limitedUpdate, this); - } +// @factory L.map(id: String, options?: Map options) +// Instantiates a map object given the DOM ID of a `
    ` element +// and optionally an object literal with `Map options`. +// +// @alternative +// @factory L.map(el: HTMLElement, options?: Map options) +// Instantiates a map object given an instance of a `
    ` HTML element +// and optionally an object literal with `Map options`. +L.map = function (id, options) { + return new L.Map(id, options); +}; - this._container = null; - this._map = null; - }, - bringToFront: function () { - var pane = this._map._panes.tilePane; - if (this._container) { - pane.appendChild(this._container); - this._setAutoZIndex(pane, Math.max); - } - return this; - }, +/* + * @class Layer + * @inherits Evented + * @aka L.Layer + * @aka ILayer + * + * A set of methods from the Layer base class that all Leaflet layers use. + * Inherits all methods, options and events from `L.Evented`. + * + * @example + * + * ```js + * var layer = L.Marker(latlng).addTo(map); + * layer.addTo(map); + * layer.remove(); + * ``` + * + * @event add: Event + * Fired after the layer is added to a map + * + * @event remove: Event + * Fired after the layer is removed from a map + */ - bringToBack: function () { - var pane = this._map._panes.tilePane; - if (this._container) { - pane.insertBefore(this._container, pane.firstChild); - this._setAutoZIndex(pane, Math.min); - } +L.Layer = L.Evented.extend({ + // Classes extending `L.Layer` will inherit the following options: + options: { + // @option pane: String = 'overlayPane' + // By default the layer will be added to the map's [overlay pane](#map-overlaypane). Overriding this option will cause the layer to be placed on another pane by default. + pane: 'overlayPane', + nonBubblingEvents: [], // Array of events that should not be bubbled to DOM parents (like the map), + + // @option attribution: String = null + // String to be shown in the attribution control, describes the layer data, e.g. "© Mapbox". + attribution: null + }, + + /* @section + * Classes extending `L.Layer` will inherit the following methods: + * + * @method addTo(map: Map): this + * Adds the layer to the given map + */ + addTo: function (map) { + map.addLayer(this); return this; }, - getAttribution: function () { - return this.options.attribution; - }, - - getContainer: function () { - return this._container; + // @method remove: this + // Removes the layer from the map it is currently active on. + remove: function () { + return this.removeFrom(this._map || this._mapToAdd); }, - setOpacity: function (opacity) { - this.options.opacity = opacity; - - if (this._map) { - this._updateOpacity(); + // @method removeFrom(map: Map): this + // Removes the layer from the given map + removeFrom: function (obj) { + if (obj) { + obj.removeLayer(this); } - return this; }, - setZIndex: function (zIndex) { - this.options.zIndex = zIndex; - this._updateZIndex(); - - return this; + // @method getPane(name? : String): HTMLElement + // Returns the `HTMLElement` representing the named pane on the map. If `name` is omitted, returns the pane for this layer. + getPane: function (name) { + return this._map.getPane(name ? (this.options[name] || name) : this.options.pane); }, - setUrl: function (url, noRedraw) { - this._url = url; - - if (!noRedraw) { - this.redraw(); - } - + addInteractiveTarget: function (targetEl) { + this._map._targets[L.stamp(targetEl)] = this; return this; }, - redraw: function () { - if (this._map) { - this._reset({hard: true}); - this._update(); - } + removeInteractiveTarget: function (targetEl) { + delete this._map._targets[L.stamp(targetEl)]; return this; }, - _updateZIndex: function () { - if (this._container && this.options.zIndex !== undefined) { - this._container.style.zIndex = this.options.zIndex; - } + // @method getAttribution: String + // Used by the `attribution control`, returns the [attribution option](#gridlayer-attribution). + getAttribution: function () { + return this.options.attribution; }, - _setAutoZIndex: function (pane, compare) { - - var layers = pane.children, - edgeZIndex = -compare(Infinity, -Infinity), // -Infinity for max, Infinity for min - zIndex, i, len; + _layerAdd: function (e) { + var map = e.target; - for (i = 0, len = layers.length; i < len; i++) { + // check in case layer gets added and then removed before the map is ready + if (!map.hasLayer(this)) { return; } - if (layers[i] !== this._container) { - zIndex = parseInt(layers[i].style.zIndex, 10); + this._map = map; + this._zoomAnimated = map._zoomAnimated; - if (!isNaN(zIndex)) { - edgeZIndex = compare(edgeZIndex, zIndex); - } - } + if (this.getEvents) { + var events = this.getEvents(); + map.on(events, this); + this.once('remove', function () { + map.off(events, this); + }, this); } - this.options.zIndex = this._container.style.zIndex = - (isFinite(edgeZIndex) ? edgeZIndex : 0) + compare(1, -1); - }, - - _updateOpacity: function () { - var i, - tiles = this._tiles; + this.onAdd(map); - if (L.Browser.ielt9) { - for (i in tiles) { - L.DomUtil.setOpacity(tiles[i], this.options.opacity); - } - } else { - L.DomUtil.setOpacity(this._container, this.options.opacity); + if (this.getAttribution && map.attributionControl) { + map.attributionControl.addAttribution(this.getAttribution()); } - }, - _initContainer: function () { - var tilePane = this._map._panes.tilePane; + this.fire('add'); + map.fire('layeradd', {layer: this}); + } +}); - if (!this._container) { - this._container = L.DomUtil.create('div', 'leaflet-layer'); +/* @section Extension methods + * @uninheritable + * + * Every layer should extend from `L.Layer` and (re-)implement the following methods. + * + * @method onAdd(map: Map): this + * Should contain code that creates DOM elements for the layer, adds them to `map panes` where they should belong and puts listeners on relevant map events. Called on [`map.addLayer(layer)`](#map-addlayer). + * + * @method onRemove(map: Map): this + * Should contain all clean up code that removes the layer's elements from the DOM and removes listeners previously added in [`onAdd`](#layer-onadd). Called on [`map.removeLayer(layer)`](#map-removelayer). + * + * @method getEvents(): Object + * This optional method should return an object like `{ viewreset: this._reset }` for [`addEventListener`](#evented-addeventlistener). The event handlers in this object will be automatically added and removed from the map with your layer. + * + * @method getAttribution(): String + * This optional method should return a string containing HTML to be shown on the `Attribution control` whenever the layer is visible. + * + * @method beforeAdd(map: Map): this + * Optional method. Called on [`map.addLayer(layer)`](#map-addlayer), before the layer is added to the map, before events are initialized, without waiting until the map is in a usable state. Use for early initialization only. + */ - this._updateZIndex(); - if (this._animated) { - var className = 'leaflet-tile-container'; +/* @namespace Map + * @section Layer events + * + * @event layeradd: LayerEvent + * Fired when a new layer is added to the map. + * + * @event layerremove: LayerEvent + * Fired when some layer is removed from the map + * + * @section Methods for Layers and Controls + */ +L.Map.include({ + // @method addLayer(layer: Layer): this + // Adds the given layer to the map + addLayer: function (layer) { + var id = L.stamp(layer); + if (this._layers[id]) { return this; } + this._layers[id] = layer; - this._bgBuffer = L.DomUtil.create('div', className, this._container); - this._tileContainer = L.DomUtil.create('div', className, this._container); + layer._mapToAdd = this; - } else { - this._tileContainer = this._container; - } + if (layer.beforeAdd) { + layer.beforeAdd(this); + } - tilePane.appendChild(this._container); + this.whenReady(layer._layerAdd, layer); - if (this.options.opacity < 1) { - this._updateOpacity(); - } - } + return this; }, - _reset: function (e) { - for (var key in this._tiles) { - this.fire('tileunload', {tile: this._tiles[key]}); - } + // @method removeLayer(layer: Layer): this + // Removes the given layer from the map. + removeLayer: function (layer) { + var id = L.stamp(layer); - this._tiles = {}; - this._tilesToLoad = 0; + if (!this._layers[id]) { return this; } - if (this.options.reuseTiles) { - this._unusedTiles = []; + if (this._loaded) { + layer.onRemove(this); } - this._tileContainer.innerHTML = ''; - - if (this._animated && e && e.hard) { - this._clearBgBuffer(); + if (layer.getAttribution && this.attributionControl) { + this.attributionControl.removeAttribution(layer.getAttribution()); } - this._initContainer(); - }, - - _getTileSize: function () { - var map = this._map, - zoom = map.getZoom() + this.options.zoomOffset, - zoomN = this.options.maxNativeZoom, - tileSize = this.options.tileSize; + delete this._layers[id]; - if (zoomN && zoom > zoomN) { - tileSize = Math.round(map.getZoomScale(zoom) / map.getZoomScale(zoomN) * tileSize); + if (this._loaded) { + this.fire('layerremove', {layer: layer}); + layer.fire('remove'); } - return tileSize; - }, - - _update: function () { + layer._map = layer._mapToAdd = null; - if (!this._map) { return; } + return this; + }, - var map = this._map, - bounds = map.getPixelBounds(), - zoom = map.getZoom(), - tileSize = this._getTileSize(); + // @method hasLayer(layer: Layer): Boolean + // Returns `true` if the given layer is currently added to the map + hasLayer: function (layer) { + return !!layer && (L.stamp(layer) in this._layers); + }, - if (zoom > this.options.maxZoom || zoom < this.options.minZoom) { - return; + /* @method eachLayer(fn: Function, context?: Object): this + * Iterates over the layers of the map, optionally specifying context of the iterator function. + * ``` + * map.eachLayer(function(layer){ + * layer.bindPopup('Hello'); + * }); + * ``` + */ + eachLayer: function (method, context) { + for (var i in this._layers) { + method.call(context, this._layers[i]); } + return this; + }, - var tileBounds = L.bounds( - bounds.min.divideBy(tileSize)._floor(), - bounds.max.divideBy(tileSize)._floor()); - - this._addTilesFromCenterOut(tileBounds); + _addLayers: function (layers) { + layers = layers ? (L.Util.isArray(layers) ? layers : [layers]) : []; - if (this.options.unloadInvisibleTiles || this.options.reuseTiles) { - this._removeOtherTiles(tileBounds); + for (var i = 0, len = layers.length; i < len; i++) { + this.addLayer(layers[i]); } }, - _addTilesFromCenterOut: function (bounds) { - var queue = [], - center = bounds.getCenter(); - - var j, i, point; + _addZoomLimit: function (layer) { + if (isNaN(layer.options.maxZoom) || !isNaN(layer.options.minZoom)) { + this._zoomBoundLayers[L.stamp(layer)] = layer; + this._updateZoomLevels(); + } + }, - for (j = bounds.min.y; j <= bounds.max.y; j++) { - for (i = bounds.min.x; i <= bounds.max.x; i++) { - point = new L.Point(i, j); + _removeZoomLimit: function (layer) { + var id = L.stamp(layer); - if (this._tileShouldBeLoaded(point)) { - queue.push(point); - } - } + if (this._zoomBoundLayers[id]) { + delete this._zoomBoundLayers[id]; + this._updateZoomLevels(); } + }, - var tilesToLoad = queue.length; + _updateZoomLevels: function () { + var minZoom = Infinity, + maxZoom = -Infinity, + oldZoomSpan = this._getZoomSpan(); - if (tilesToLoad === 0) { return; } + for (var i in this._zoomBoundLayers) { + var options = this._zoomBoundLayers[i].options; - // load tiles in order of their distance to center - queue.sort(function (a, b) { - return a.distanceTo(center) - b.distanceTo(center); - }); + minZoom = options.minZoom === undefined ? minZoom : Math.min(minZoom, options.minZoom); + maxZoom = options.maxZoom === undefined ? maxZoom : Math.max(maxZoom, options.maxZoom); + } - var fragment = document.createDocumentFragment(); + this._layersMaxZoom = maxZoom === -Infinity ? undefined : maxZoom; + this._layersMinZoom = minZoom === Infinity ? undefined : minZoom; + + // @section Map state change events + // @event zoomlevelschange: Event + // Fired when the number of zoomlevels on the map is changed due + // to adding or removing a layer. + if (oldZoomSpan !== this._getZoomSpan()) { + this.fire('zoomlevelschange'); + } - // if its the first batch of tiles to load - if (!this._tilesToLoad) { - this.fire('loading'); + if (this.options.maxZoom === undefined && this._layersMaxZoom && this.getZoom() > this._layersMaxZoom) { + this.setZoom(this._layersMaxZoom); } + if (this.options.minZoom === undefined && this._layersMinZoom && this.getZoom() < this._layersMinZoom) { + this.setZoom(this._layersMinZoom); + } + } +}); - this._tilesToLoad += tilesToLoad; - for (i = 0; i < tilesToLoad; i++) { - this._addTile(queue[i], fragment); - } - this._tileContainer.appendChild(fragment); - }, +/* + * @namespace DomEvent + * Utility functions to work with the [DOM events](https://developer.mozilla.org/docs/Web/API/Event), used by Leaflet internally. + */ - _tileShouldBeLoaded: function (tilePoint) { - if ((tilePoint.x + ':' + tilePoint.y) in this._tiles) { - return false; // already loaded - } +// Inspired by John Resig, Dean Edwards and YUI addEvent implementations. - var options = this.options; - if (!options.continuousWorld) { - var limit = this._getWrapTileNum(); - // don't load if exceeds world bounds - if ((options.noWrap && (tilePoint.x < 0 || tilePoint.x >= limit.x)) || - tilePoint.y < 0 || tilePoint.y >= limit.y) { return false; } - } +var eventsKey = '_leaflet_events'; + +L.DomEvent = { + + // @function on(el: HTMLElement, types: String, fn: Function, context?: Object): this + // Adds a listener function (`fn`) to a particular DOM event type of the + // element `el`. You can optionally specify the context of the listener + // (object the `this` keyword will point to). You can also pass several + // space-separated types (e.g. `'click dblclick'`). - if (options.bounds) { - var tileSize = options.tileSize, - nwPoint = tilePoint.multiplyBy(tileSize), - sePoint = nwPoint.add([tileSize, tileSize]), - nw = this._map.unproject(nwPoint), - se = this._map.unproject(sePoint); + // @alternative + // @function on(el: HTMLElement, eventMap: Object, context?: Object): this + // Adds a set of type/listener pairs, e.g. `{click: onClick, mousemove: onMouseMove}` + on: function (obj, types, fn, context) { - // TODO temporary hack, will be removed after refactoring projections - // https://github.com/Leaflet/Leaflet/issues/1618 - if (!options.continuousWorld && !options.noWrap) { - nw = nw.wrap(); - se = se.wrap(); + if (typeof types === 'object') { + for (var type in types) { + this._on(obj, type, types[type], fn); } + } else { + types = L.Util.splitWords(types); - if (!options.bounds.intersects([nw, se])) { return false; } + for (var i = 0, len = types.length; i < len; i++) { + this._on(obj, types[i], fn, context); + } } - return true; + return this; }, - _removeOtherTiles: function (bounds) { - var kArr, x, y, key; + // @function off(el: HTMLElement, types: String, fn: Function, context?: Object): this + // Removes a previously added listener function. If no function is specified, + // it will remove all the listeners of that particular DOM event from the element. + // Note that if you passed a custom context to on, you must pass the same + // context to `off` in order to remove the listener. - for (key in this._tiles) { - kArr = key.split(':'); - x = parseInt(kArr[0], 10); - y = parseInt(kArr[1], 10); + // @alternative + // @function off(el: HTMLElement, eventMap: Object, context?: Object): this + // Removes a set of type/listener pairs, e.g. `{click: onClick, mousemove: onMouseMove}` + off: function (obj, types, fn, context) { - // remove tile if it's out of bounds - if (x < bounds.min.x || x > bounds.max.x || y < bounds.min.y || y > bounds.max.y) { - this._removeTile(key); + if (typeof types === 'object') { + for (var type in types) { + this._off(obj, type, types[type], fn); + } + } else { + types = L.Util.splitWords(types); + + for (var i = 0, len = types.length; i < len; i++) { + this._off(obj, types[i], fn, context); } } + + return this; }, - _removeTile: function (key) { - var tile = this._tiles[key]; + _on: function (obj, type, fn, context) { + var id = type + L.stamp(fn) + (context ? '_' + L.stamp(context) : ''); - this.fire('tileunload', {tile: tile, url: tile.src}); + if (obj[eventsKey] && obj[eventsKey][id]) { return this; } - if (this.options.reuseTiles) { - L.DomUtil.removeClass(tile, 'leaflet-tile-loaded'); - this._unusedTiles.push(tile); + var handler = function (e) { + return fn.call(context || obj, e || window.event); + }; - } else if (tile.parentNode === this._tileContainer) { - this._tileContainer.removeChild(tile); - } + var originalHandler = handler; - // for https://github.com/CloudMade/Leaflet/issues/137 - if (!L.Browser.android) { - tile.onload = null; - tile.src = L.Util.emptyImageUrl; + if (L.Browser.pointer && type.indexOf('touch') === 0) { + this.addPointerListener(obj, type, handler, id); + + } else if (L.Browser.touch && (type === 'dblclick') && this.addDoubleTapListener && + !(L.Browser.pointer && L.Browser.chrome)) { + // Chrome >55 does not need the synthetic dblclicks from addDoubleTapListener + // See #5180 + this.addDoubleTapListener(obj, handler, id); + + } else if ('addEventListener' in obj) { + + if (type === 'mousewheel') { + obj.addEventListener('onwheel' in obj ? 'wheel' : 'mousewheel', handler, false); + + } else if ((type === 'mouseenter') || (type === 'mouseleave')) { + handler = function (e) { + e = e || window.event; + if (L.DomEvent._isExternalTarget(obj, e)) { + originalHandler(e); + } + }; + obj.addEventListener(type === 'mouseenter' ? 'mouseover' : 'mouseout', handler, false); + + } else { + if (type === 'click' && L.Browser.android) { + handler = function (e) { + return L.DomEvent._filterClick(e, originalHandler); + }; + } + obj.addEventListener(type, handler, false); + } + + } else if ('attachEvent' in obj) { + obj.attachEvent('on' + type, handler); } - delete this._tiles[key]; + obj[eventsKey] = obj[eventsKey] || {}; + obj[eventsKey][id] = handler; + + return this; }, - _addTile: function (tilePoint, container) { - var tilePos = this._getTilePos(tilePoint); + _off: function (obj, type, fn, context) { - // get unused tile - or create a new tile - var tile = this._getTile(); + var id = type + L.stamp(fn) + (context ? '_' + L.stamp(context) : ''), + handler = obj[eventsKey] && obj[eventsKey][id]; - /* - Chrome 20 layouts much faster with top/left (verify with timeline, frames) - Android 4 browser has display issues with top/left and requires transform instead - (other browsers don't currently care) - see debug/hacks/jitter.html for an example - */ - L.DomUtil.setPosition(tile, tilePos, L.Browser.chrome); + if (!handler) { return this; } - this._tiles[tilePoint.x + ':' + tilePoint.y] = tile; + if (L.Browser.pointer && type.indexOf('touch') === 0) { + this.removePointerListener(obj, type, id); - this._loadTile(tile, tilePoint); + } else if (L.Browser.touch && (type === 'dblclick') && this.removeDoubleTapListener) { + this.removeDoubleTapListener(obj, id); - if (tile.parentNode !== this._tileContainer) { - container.appendChild(tile); - } - }, + } else if ('removeEventListener' in obj) { - _getZoomForUrl: function () { + if (type === 'mousewheel') { + obj.removeEventListener('onwheel' in obj ? 'wheel' : 'mousewheel', handler, false); - var options = this.options, - zoom = this._map.getZoom(); + } else { + obj.removeEventListener( + type === 'mouseenter' ? 'mouseover' : + type === 'mouseleave' ? 'mouseout' : type, handler, false); + } - if (options.zoomReverse) { - zoom = options.maxZoom - zoom; + } else if ('detachEvent' in obj) { + obj.detachEvent('on' + type, handler); } - zoom += options.zoomOffset; + obj[eventsKey][id] = null; - return options.maxNativeZoom ? Math.min(zoom, options.maxNativeZoom) : zoom; + return this; }, - _getTilePos: function (tilePoint) { - var origin = this._map.getPixelOrigin(), - tileSize = this._getTileSize(); - - return tilePoint.multiplyBy(tileSize).subtract(origin); - }, + // @function stopPropagation(ev: DOMEvent): this + // Stop the given event from propagation to parent elements. Used inside the listener functions: + // ```js + // L.DomEvent.on(div, 'click', function (ev) { + // L.DomEvent.stopPropagation(ev); + // }); + // ``` + stopPropagation: function (e) { - // image-specific code (override to implement e.g. Canvas or SVG tile layer) + if (e.stopPropagation) { + e.stopPropagation(); + } else if (e.originalEvent) { // In case of Leaflet event. + e.originalEvent._stopped = true; + } else { + e.cancelBubble = true; + } + L.DomEvent._skipped(e); - getTileUrl: function (tilePoint) { - return L.Util.template(this._url, L.extend({ - s: this._getSubdomain(tilePoint), - z: tilePoint.z, - x: tilePoint.x, - y: tilePoint.y - }, this.options)); + return this; }, - _getWrapTileNum: function () { - var crs = this._map.options.crs, - size = crs.getSize(this._map.getZoom()); - return size.divideBy(this._getTileSize())._floor(); + // @function disableScrollPropagation(el: HTMLElement): this + // Adds `stopPropagation` to the element's `'mousewheel'` events (plus browser variants). + disableScrollPropagation: function (el) { + return L.DomEvent.on(el, 'mousewheel', L.DomEvent.stopPropagation); }, - _adjustTilePoint: function (tilePoint) { + // @function disableClickPropagation(el: HTMLElement): this + // Adds `stopPropagation` to the element's `'click'`, `'doubleclick'`, + // `'mousedown'` and `'touchstart'` events (plus browser variants). + disableClickPropagation: function (el) { + var stop = L.DomEvent.stopPropagation; - var limit = this._getWrapTileNum(); + L.DomEvent.on(el, L.Draggable.START.join(' '), stop); - // wrap tile coordinates - if (!this.options.continuousWorld && !this.options.noWrap) { - tilePoint.x = ((tilePoint.x % limit.x) + limit.x) % limit.x; - } + return L.DomEvent.on(el, { + click: L.DomEvent._fakeStop, + dblclick: stop + }); + }, - if (this.options.tms) { - tilePoint.y = limit.y - tilePoint.y - 1; - } + // @function preventDefault(ev: DOMEvent): this + // Prevents the default action of the DOM Event `ev` from happening (such as + // following a link in the href of the a element, or doing a POST request + // with page reload when a `` is submitted). + // Use it inside listener functions. + preventDefault: function (e) { - tilePoint.z = this._getZoomForUrl(); + if (e.preventDefault) { + e.preventDefault(); + } else { + e.returnValue = false; + } + return this; }, - _getSubdomain: function (tilePoint) { - var index = Math.abs(tilePoint.x + tilePoint.y) % this.options.subdomains.length; - return this.options.subdomains[index]; + // @function stop(ev): this + // Does `stopPropagation` and `preventDefault` at the same time. + stop: function (e) { + return L.DomEvent + .preventDefault(e) + .stopPropagation(e); }, - _getTile: function () { - if (this.options.reuseTiles && this._unusedTiles.length > 0) { - var tile = this._unusedTiles.pop(); - this._resetTile(tile); - return tile; + // @function getMousePosition(ev: DOMEvent, container?: HTMLElement): Point + // Gets normalized mouse position from a DOM event relative to the + // `container` or to the whole page if not specified. + getMousePosition: function (e, container) { + if (!container) { + return new L.Point(e.clientX, e.clientY); } - return this._createTile(); - }, - // Override if data stored on a tile needs to be cleaned up before reuse - _resetTile: function (/*tile*/) {}, + var rect = container.getBoundingClientRect(); - _createTile: function () { - var tile = L.DomUtil.create('img', 'leaflet-tile'); - tile.style.width = tile.style.height = this._getTileSize() + 'px'; - tile.galleryimg = 'no'; + return new L.Point( + e.clientX - rect.left - container.clientLeft, + e.clientY - rect.top - container.clientTop); + }, - tile.onselectstart = tile.onmousemove = L.Util.falseFn; + // Chrome on Win scrolls double the pixels as in other platforms (see #4538), + // and Firefox scrolls device pixels, not CSS pixels + _wheelPxFactor: (L.Browser.win && L.Browser.chrome) ? 2 : + L.Browser.gecko ? window.devicePixelRatio : + 1, - if (L.Browser.ielt9 && this.options.opacity !== undefined) { - L.DomUtil.setOpacity(tile, this.options.opacity); - } - // without this hack, tiles disappear after zoom on Chrome for Android - // https://github.com/Leaflet/Leaflet/issues/2078 - if (L.Browser.mobileWebkit3d) { - tile.style.WebkitBackfaceVisibility = 'hidden'; - } - return tile; + // @function getWheelDelta(ev: DOMEvent): Number + // Gets normalized wheel delta from a mousewheel DOM event, in vertical + // pixels scrolled (negative if scrolling down). + // Events from pointing devices without precise scrolling are mapped to + // a best guess of 60 pixels. + getWheelDelta: function (e) { + return (L.Browser.edge) ? e.wheelDeltaY / 2 : // Don't trust window-geometry-based delta + (e.deltaY && e.deltaMode === 0) ? -e.deltaY / L.DomEvent._wheelPxFactor : // Pixels + (e.deltaY && e.deltaMode === 1) ? -e.deltaY * 20 : // Lines + (e.deltaY && e.deltaMode === 2) ? -e.deltaY * 60 : // Pages + (e.deltaX || e.deltaZ) ? 0 : // Skip horizontal/depth wheel events + e.wheelDelta ? (e.wheelDeltaY || e.wheelDelta) / 2 : // Legacy IE pixels + (e.detail && Math.abs(e.detail) < 32765) ? -e.detail * 20 : // Legacy Moz lines + e.detail ? e.detail / -32765 * 60 : // Legacy Moz pages + 0; }, - _loadTile: function (tile, tilePoint) { - tile._layer = this; - tile.onload = this._tileOnLoad; - tile.onerror = this._tileOnError; + _skipEvents: {}, - this._adjustTilePoint(tilePoint); - tile.src = this.getTileUrl(tilePoint); + _fakeStop: function (e) { + // fakes stopPropagation by setting a special event flag, checked/reset with L.DomEvent._skipped(e) + L.DomEvent._skipEvents[e.type] = true; + }, - this.fire('tileloadstart', { - tile: tile, - url: tile.src - }); + _skipped: function (e) { + var skipped = this._skipEvents[e.type]; + // reset when checking, as it's only used in map container and propagates outside of the map + this._skipEvents[e.type] = false; + return skipped; }, - _tileLoaded: function () { - this._tilesToLoad--; + // check if element really left/entered the event target (for mouseenter/mouseleave) + _isExternalTarget: function (el, e) { - if (this._animated) { - L.DomUtil.addClass(this._tileContainer, 'leaflet-zoom-animated'); - } + var related = e.relatedTarget; - if (!this._tilesToLoad) { - this.fire('load'); + if (!related) { return true; } - if (this._animated) { - // clear scaled tiles after all new tiles are loaded (for performance) - clearTimeout(this._clearBgBufferTimer); - this._clearBgBufferTimer = setTimeout(L.bind(this._clearBgBuffer, this), 500); + try { + while (related && (related !== el)) { + related = related.parentNode; } + } catch (err) { + return false; } + return (related !== el); }, - _tileOnLoad: function () { - var layer = this._layer; + // this is a horrible workaround for a bug in Android where a single touch triggers two click events + _filterClick: function (e, handler) { + var timeStamp = (e.timeStamp || (e.originalEvent && e.originalEvent.timeStamp)), + elapsed = L.DomEvent._lastClick && (timeStamp - L.DomEvent._lastClick); - //Only if we are loading an actual image - if (this.src !== L.Util.emptyImageUrl) { - L.DomUtil.addClass(this, 'leaflet-tile-loaded'); + // are they closer together than 500ms yet more than 100ms? + // Android typically triggers them ~300ms apart while multiple listeners + // on the same event should be triggered far faster; + // or check if click is simulated on the element, and if it is, reject any non-simulated events - layer.fire('tileload', { - tile: this, - url: this.src - }); + if ((elapsed && elapsed > 100 && elapsed < 500) || (e.target._simulatedClick && !e._simulated)) { + L.DomEvent.stop(e); + return; } + L.DomEvent._lastClick = timeStamp; - layer._tileLoaded(); - }, - - _tileOnError: function () { - var layer = this._layer; - - layer.fire('tileerror', { - tile: this, - url: this.src - }); + handler(e); + } +}; - var newUrl = layer.options.errorTileUrl; - if (newUrl) { - this.src = newUrl; - } +// @function addListener(…): this +// Alias to [`L.DomEvent.on`](#domevent-on) +L.DomEvent.addListener = L.DomEvent.on; - layer._tileLoaded(); - } -}); +// @function removeListener(…): this +// Alias to [`L.DomEvent.off`](#domevent-off) +L.DomEvent.removeListener = L.DomEvent.off; -L.tileLayer = function (url, options) { - return new L.TileLayer(url, options); -}; /* - * L.TileLayer.WMS is used for putting WMS tile layers on the map. + * @class PosAnimation + * @aka L.PosAnimation + * @inherits Evented + * Used internally for panning animations, utilizing CSS3 Transitions for modern browsers and a timer fallback for IE6-9. + * + * @example + * ```js + * var fx = new L.PosAnimation(); + * fx.run(el, [300, 500], 0.5); + * ``` + * + * @constructor L.PosAnimation() + * Creates a `PosAnimation` object. + * */ -L.TileLayer.WMS = L.TileLayer.extend({ +L.PosAnimation = L.Evented.extend({ - defaultWmsParams: { - service: 'WMS', - request: 'GetMap', - version: '1.1.1', - layers: '', - styles: '', - format: 'image/jpeg', - transparent: false + // @method run(el: HTMLElement, newPos: Point, duration?: Number, easeLinearity?: Number) + // Run an animation of a given element to a new position, optionally setting + // duration in seconds (`0.25` by default) and easing linearity factor (3rd + // argument of the [cubic bezier curve](http://cubic-bezier.com/#0,0,.5,1), + // `0.5` by default). + run: function (el, newPos, duration, easeLinearity) { + this.stop(); + + this._el = el; + this._inProgress = true; + this._duration = duration || 0.25; + this._easeOutPower = 1 / Math.max(easeLinearity || 0.5, 0.2); + + this._startPos = L.DomUtil.getPosition(el); + this._offset = newPos.subtract(this._startPos); + this._startTime = +new Date(); + + // @event start: Event + // Fired when the animation starts + this.fire('start'); + + this._animate(); }, - initialize: function (url, options) { // (String, Object) + // @method stop() + // Stops the animation (if currently running). + stop: function () { + if (!this._inProgress) { return; } - this._url = url; + this._step(true); + this._complete(); + }, + + _animate: function () { + // animation loop + this._animId = L.Util.requestAnimFrame(this._animate, this); + this._step(); + }, - var wmsParams = L.extend({}, this.defaultWmsParams), - tileSize = options.tileSize || this.options.tileSize; + _step: function (round) { + var elapsed = (+new Date()) - this._startTime, + duration = this._duration * 1000; - if (options.detectRetina && L.Browser.retina) { - wmsParams.width = wmsParams.height = tileSize * 2; + if (elapsed < duration) { + this._runFrame(this._easeOut(elapsed / duration), round); } else { - wmsParams.width = wmsParams.height = tileSize; + this._runFrame(1); + this._complete(); } + }, - for (var i in options) { - // all keys that are not TileLayer options go to WMS params - if (!this.options.hasOwnProperty(i) && i !== 'crs') { - wmsParams[i] = options[i]; - } + _runFrame: function (progress, round) { + var pos = this._startPos.add(this._offset.multiplyBy(progress)); + if (round) { + pos._round(); } + L.DomUtil.setPosition(this._el, pos); - this.wmsParams = wmsParams; - - L.setOptions(this, options); + // @event step: Event + // Fired continuously during the animation. + this.fire('step'); }, - onAdd: function (map) { + _complete: function () { + L.Util.cancelAnimFrame(this._animId); - this._crs = this.options.crs || map.options.crs; + this._inProgress = false; + // @event end: Event + // Fired when the animation ends. + this.fire('end'); + }, - this._wmsVersion = parseFloat(this.wmsParams.version); + _easeOut: function (t) { + return 1 - Math.pow(1 - t, this._easeOutPower); + } +}); - var projectionKey = this._wmsVersion >= 1.3 ? 'crs' : 'srs'; - this.wmsParams[projectionKey] = this._crs.code; - L.TileLayer.prototype.onAdd.call(this, map); - }, - getTileUrl: function (tilePoint) { // (Point, Number) -> String +/* + * @namespace Projection + * @projection L.Projection.Mercator + * + * Elliptical Mercator projection — more complex than Spherical Mercator. Takes into account that Earth is a geoid, not a perfect sphere. Used by the EPSG:3395 CRS. + */ - var map = this._map, - tileSize = this.options.tileSize, +L.Projection.Mercator = { + R: 6378137, + R_MINOR: 6356752.314245179, - nwPoint = tilePoint.multiplyBy(tileSize), - sePoint = nwPoint.add([tileSize, tileSize]), + bounds: L.bounds([-20037508.34279, -15496570.73972], [20037508.34279, 18764656.23138]), - nw = this._crs.project(map.unproject(nwPoint, tilePoint.z)), - se = this._crs.project(map.unproject(sePoint, tilePoint.z)), - bbox = this._wmsVersion >= 1.3 && this._crs === L.CRS.EPSG4326 ? - [se.y, nw.x, nw.y, se.x].join(',') : - [nw.x, se.y, se.x, nw.y].join(','), + project: function (latlng) { + var d = Math.PI / 180, + r = this.R, + y = latlng.lat * d, + tmp = this.R_MINOR / r, + e = Math.sqrt(1 - tmp * tmp), + con = e * Math.sin(y); - url = L.Util.template(this._url, {s: this._getSubdomain(tilePoint)}); + var ts = Math.tan(Math.PI / 4 - y / 2) / Math.pow((1 - con) / (1 + con), e / 2); + y = -r * Math.log(Math.max(ts, 1E-10)); - return url + L.Util.getParamString(this.wmsParams, url, true) + '&BBOX=' + bbox; + return new L.Point(latlng.lng * d * r, y); }, - setParams: function (params, noRedraw) { - - L.extend(this.wmsParams, params); - - if (!noRedraw) { - this.redraw(); + unproject: function (point) { + var d = 180 / Math.PI, + r = this.R, + tmp = this.R_MINOR / r, + e = Math.sqrt(1 - tmp * tmp), + ts = Math.exp(-point.y / r), + phi = Math.PI / 2 - 2 * Math.atan(ts); + + for (var i = 0, dphi = 0.1, con; i < 15 && Math.abs(dphi) > 1e-7; i++) { + con = e * Math.sin(phi); + con = Math.pow((1 - con) / (1 + con), e / 2); + dphi = Math.PI / 2 - 2 * Math.atan(ts * con) - phi; + phi += dphi; } - return this; + return new L.LatLng(phi * d, point.x * d / r); } -}); - -L.tileLayer.wms = function (url, options) { - return new L.TileLayer.WMS(url, options); }; + /* - * L.TileLayer.Canvas is a class that you can use as a base for creating - * dynamically drawn Canvas-based tile layers. + * @namespace CRS + * @crs L.CRS.EPSG3395 + * + * Rarely used by some commercial tile providers. Uses Elliptical Mercator projection. */ -L.TileLayer.Canvas = L.TileLayer.extend({ - options: { - async: false - }, +L.CRS.EPSG3395 = L.extend({}, L.CRS.Earth, { + code: 'EPSG:3395', + projection: L.Projection.Mercator, - initialize: function (options) { - L.setOptions(this, options); - }, + transformation: (function () { + var scale = 0.5 / (Math.PI * L.Projection.Mercator.R); + return new L.Transformation(scale, 0.5, -scale, 0.5); + }()) +}); - redraw: function () { - if (this._map) { - this._reset({hard: true}); - this._update(); - } - for (var i in this._tiles) { - this._redrawTile(this._tiles[i]); - } - return this; - }, - _redrawTile: function (tile) { - this.drawTile(tile, tile._tilePoint, this._map._zoom); - }, +/* + * @class GridLayer + * @inherits Layer + * @aka L.GridLayer + * + * Generic class for handling a tiled grid of HTML elements. This is the base class for all tile layers and replaces `TileLayer.Canvas`. + * GridLayer can be extended to create a tiled grid of HTML elements like ``, `` or `
    `. GridLayer will handle creating and animating these DOM elements for you. + * + * + * @section Synchronous usage + * @example + * + * To create a custom layer, extend GridLayer and implement the `createTile()` method, which will be passed a `Point` object with the `x`, `y`, and `z` (zoom level) coordinates to draw your tile. + * + * ```js + * var CanvasLayer = L.GridLayer.extend({ + * createTile: function(coords){ + * // create a element for drawing + * var tile = L.DomUtil.create('canvas', 'leaflet-tile'); + * + * // setup tile width and height according to the options + * var size = this.getTileSize(); + * tile.width = size.x; + * tile.height = size.y; + * + * // get a canvas context and draw something on it using coords.x, coords.y and coords.z + * var ctx = tile.getContext('2d'); + * + * // return the tile so it can be rendered on screen + * return tile; + * } + * }); + * ``` + * + * @section Asynchronous usage + * @example + * + * Tile creation can also be asynchronous, this is useful when using a third-party drawing library. Once the tile is finished drawing it can be passed to the `done()` callback. + * + * ```js + * var CanvasLayer = L.GridLayer.extend({ + * createTile: function(coords, done){ + * var error; + * + * // create a element for drawing + * var tile = L.DomUtil.create('canvas', 'leaflet-tile'); + * + * // setup tile width and height according to the options + * var size = this.getTileSize(); + * tile.width = size.x; + * tile.height = size.y; + * + * // draw something asynchronously and pass the tile to the done() callback + * setTimeout(function() { + * done(error, tile); + * }, 1000); + * + * return tile; + * } + * }); + * ``` + * + * @section + */ - _createTile: function () { - var tile = L.DomUtil.create('canvas', 'leaflet-tile'); - tile.width = tile.height = this.options.tileSize; - tile.onselectstart = tile.onmousemove = L.Util.falseFn; - return tile; - }, - _loadTile: function (tile, tilePoint) { - tile._layer = this; - tile._tilePoint = tilePoint; +L.GridLayer = L.Layer.extend({ - this._redrawTile(tile); + // @section + // @aka GridLayer options + options: { + // @option tileSize: Number|Point = 256 + // Width and height of tiles in the grid. Use a number if width and height are equal, or `L.point(width, height)` otherwise. + tileSize: 256, - if (!this.options.async) { - this.tileDrawn(tile); - } - }, + // @option opacity: Number = 1.0 + // Opacity of the tiles. Can be used in the `createTile()` function. + opacity: 1, - drawTile: function (/*tile, tilePoint*/) { - // override with rendering code - }, + // @option updateWhenIdle: Boolean = depends + // If `false`, new tiles are loaded during panning, otherwise only after it (for better performance). `true` by default on mobile browsers, otherwise `false`. + updateWhenIdle: L.Browser.mobile, - tileDrawn: function (tile) { - this._tileOnLoad.call(tile); - } -}); + // @option updateWhenZooming: Boolean = true + // By default, a smooth zoom animation (during a [touch zoom](#map-touchzoom) or a [`flyTo()`](#map-flyto)) will update grid layers every integer zoom level. Setting this option to `false` will update the grid layer only when the smooth animation ends. + updateWhenZooming: true, + // @option updateInterval: Number = 200 + // Tiles will not update more than once every `updateInterval` milliseconds when panning. + updateInterval: 200, -L.tileLayer.canvas = function (options) { - return new L.TileLayer.Canvas(options); -}; + // @option zIndex: Number = 1 + // The explicit zIndex of the tile layer. + zIndex: 1, + // @option bounds: LatLngBounds = undefined + // If set, tiles will only be loaded inside the set `LatLngBounds`. + bounds: null, -/* - * L.ImageOverlay is used to overlay images over the map (to specific geographical bounds). - */ + // @option minZoom: Number = 0 + // The minimum zoom level that tiles will be loaded at. By default the entire map. + minZoom: 0, -L.ImageOverlay = L.Class.extend({ - includes: L.Mixin.Events, + // @option maxZoom: Number = undefined + // The maximum zoom level that tiles will be loaded at. + maxZoom: undefined, - options: { - opacity: 1 - }, + // @option noWrap: Boolean = false + // Whether the layer is wrapped around the antimeridian. If `true`, the + // GridLayer will only be displayed once at low zoom levels. Has no + // effect when the [map CRS](#map-crs) doesn't wrap around. Can be used + // in combination with [`bounds`](#gridlayer-bounds) to prevent requesting + // tiles outside the CRS limits. + noWrap: false, - initialize: function (url, bounds, options) { // (String, LatLngBounds, Object) - this._url = url; - this._bounds = L.latLngBounds(bounds); + // @option pane: String = 'tilePane' + // `Map pane` where the grid layer will be added. + pane: 'tilePane', - L.setOptions(this, options); - }, + // @option className: String = '' + // A custom class name to assign to the tile layer. Empty by default. + className: '', - onAdd: function (map) { - this._map = map; + // @option keepBuffer: Number = 2 + // When panning the map, keep this many rows and columns of tiles before unloading them. + keepBuffer: 2 + }, - if (!this._image) { - this._initImage(); - } + initialize: function (options) { + L.setOptions(this, options); + }, - map._panes.overlayPane.appendChild(this._image); + onAdd: function () { + this._initContainer(); - map.on('viewreset', this._reset, this); + this._levels = {}; + this._tiles = {}; - if (map.options.zoomAnimation && L.Browser.any3d) { - map.on('zoomanim', this._animateZoom, this); - } + this._resetView(); + this._update(); + }, - this._reset(); + beforeAdd: function (map) { + map._addZoomLimit(this); }, onRemove: function (map) { - map.getPanes().overlayPane.removeChild(this._image); - - map.off('viewreset', this._reset, this); + this._removeAllTiles(); + L.DomUtil.remove(this._container); + map._removeZoomLimit(this); + this._container = null; + this._tileZoom = null; + }, - if (map.options.zoomAnimation) { - map.off('zoomanim', this._animateZoom, this); + // @method bringToFront: this + // Brings the tile layer to the top of all tile layers. + bringToFront: function () { + if (this._map) { + L.DomUtil.toFront(this._container); + this._setAutoZIndex(Math.max); } + return this; }, - addTo: function (map) { - map.addLayer(this); + // @method bringToBack: this + // Brings the tile layer to the bottom of all tile layers. + bringToBack: function () { + if (this._map) { + L.DomUtil.toBack(this._container); + this._setAutoZIndex(Math.min); + } return this; }, + // @method getContainer: HTMLElement + // Returns the HTML element that contains the tiles for this layer. + getContainer: function () { + return this._container; + }, + + // @method setOpacity(opacity: Number): this + // Changes the [opacity](#gridlayer-opacity) of the grid layer. setOpacity: function (opacity) { this.options.opacity = opacity; this._updateOpacity(); return this; }, - // TODO remove bringToFront/bringToBack duplication from TileLayer/Path - bringToFront: function () { - if (this._image) { - this._map._panes.overlayPane.appendChild(this._image); - } - return this; - }, + // @method setZIndex(zIndex: Number): this + // Changes the [zIndex](#gridlayer-zindex) of the grid layer. + setZIndex: function (zIndex) { + this.options.zIndex = zIndex; + this._updateZIndex(); - bringToBack: function () { - var pane = this._map._panes.overlayPane; - if (this._image) { - pane.insertBefore(this._image, pane.firstChild); - } return this; }, - setUrl: function (url) { - this._url = url; - this._image.src = this._url; + // @method isLoading: Boolean + // Returns `true` if any tile in the grid layer has not finished loading. + isLoading: function () { + return this._loading; }, - getAttribution: function () { - return this.options.attribution; + // @method redraw: this + // Causes the layer to clear all the tiles and request them again. + redraw: function () { + if (this._map) { + this._removeAllTiles(); + this._update(); + } + return this; }, - _initImage: function () { - this._image = L.DomUtil.create('img', 'leaflet-image-layer'); + getEvents: function () { + var events = { + viewprereset: this._invalidateAll, + viewreset: this._resetView, + zoom: this._resetView, + moveend: this._onMoveEnd + }; - if (this._map.options.zoomAnimation && L.Browser.any3d) { - L.DomUtil.addClass(this._image, 'leaflet-zoom-animated'); - } else { - L.DomUtil.addClass(this._image, 'leaflet-zoom-hide'); + if (!this.options.updateWhenIdle) { + // update tiles on move, but not more often than once per given interval + if (!this._onMove) { + this._onMove = L.Util.throttle(this._onMoveEnd, this.options.updateInterval, this); + } + + events.move = this._onMove; } - this._updateOpacity(); + if (this._zoomAnimated) { + events.zoomanim = this._animateZoom; + } - //TODO createImage util method to remove duplication - L.extend(this._image, { - galleryimg: 'no', - onselectstart: L.Util.falseFn, - onmousemove: L.Util.falseFn, - onload: L.bind(this._onImageLoad, this), - src: this._url - }); + return events; }, - _animateZoom: function (e) { - var map = this._map, - image = this._image, - scale = map.getZoomScale(e.zoom), - nw = this._bounds.getNorthWest(), - se = this._bounds.getSouthEast(), + // @section Extension methods + // Layers extending `GridLayer` shall reimplement the following method. + // @method createTile(coords: Object, done?: Function): HTMLElement + // Called only internally, must be overriden by classes extending `GridLayer`. + // Returns the `HTMLElement` corresponding to the given `coords`. If the `done` callback + // is specified, it must be called when the tile has finished loading and drawing. + createTile: function () { + return document.createElement('div'); + }, - topLeft = map._latLngToNewLayerPoint(nw, e.zoom, e.center), - size = map._latLngToNewLayerPoint(se, e.zoom, e.center)._subtract(topLeft), - origin = topLeft._add(size._multiplyBy((1 / 2) * (1 - 1 / scale))); + // @section + // @method getTileSize: Point + // Normalizes the [tileSize option](#gridlayer-tilesize) into a point. Used by the `createTile()` method. + getTileSize: function () { + var s = this.options.tileSize; + return s instanceof L.Point ? s : new L.Point(s, s); + }, - image.style[L.DomUtil.TRANSFORM] = - L.DomUtil.getTranslateString(origin) + ' scale(' + scale + ') '; + _updateZIndex: function () { + if (this._container && this.options.zIndex !== undefined && this.options.zIndex !== null) { + this._container.style.zIndex = this.options.zIndex; + } }, - _reset: function () { - var image = this._image, - topLeft = this._map.latLngToLayerPoint(this._bounds.getNorthWest()), - size = this._map.latLngToLayerPoint(this._bounds.getSouthEast())._subtract(topLeft); + _setAutoZIndex: function (compare) { + // go through all other layers of the same pane, set zIndex to max + 1 (front) or min - 1 (back) - L.DomUtil.setPosition(image, topLeft); + var layers = this.getPane().children, + edgeZIndex = -compare(-Infinity, Infinity); // -Infinity for max, Infinity for min - image.style.width = size.x + 'px'; - image.style.height = size.y + 'px'; - }, + for (var i = 0, len = layers.length, zIndex; i < len; i++) { + + zIndex = layers[i].style.zIndex; + + if (layers[i] !== this._container && zIndex) { + edgeZIndex = compare(edgeZIndex, +zIndex); + } + } - _onImageLoad: function () { - this.fire('load'); + if (isFinite(edgeZIndex)) { + this.options.zIndex = edgeZIndex + compare(-1, 1); + this._updateZIndex(); + } }, _updateOpacity: function () { - L.DomUtil.setOpacity(this._image, this.options.opacity); - } -}); + if (!this._map) { return; } -L.imageOverlay = function (url, bounds, options) { - return new L.ImageOverlay(url, bounds, options); -}; + // IE doesn't inherit filter opacity properly, so we're forced to set it on tiles + if (L.Browser.ielt9) { return; } + L.DomUtil.setOpacity(this._container, this.options.opacity); -/* - * L.Icon is an image-based icon class that you can use with L.Marker for custom markers. - */ + var now = +new Date(), + nextFrame = false, + willPrune = false; -L.Icon = L.Class.extend({ - options: { - /* - iconUrl: (String) (required) - iconRetinaUrl: (String) (optional, used for retina devices if detected) - iconSize: (Point) (can be set through CSS) - iconAnchor: (Point) (centered by default, can be set in CSS with negative margins) - popupAnchor: (Point) (if not specified, popup opens in the anchor point) - shadowUrl: (String) (no shadow by default) - shadowRetinaUrl: (String) (optional, used for retina devices if detected) - shadowSize: (Point) - shadowAnchor: (Point) - */ - className: '' - }, + for (var key in this._tiles) { + var tile = this._tiles[key]; + if (!tile.current || !tile.loaded) { continue; } - initialize: function (options) { - L.setOptions(this, options); - }, + var fade = Math.min(1, (now - tile.loaded) / 200); - createIcon: function (oldIcon) { - return this._createIcon('icon', oldIcon); + L.DomUtil.setOpacity(tile.el, fade); + if (fade < 1) { + nextFrame = true; + } else { + if (tile.active) { willPrune = true; } + tile.active = true; + } + } + + if (willPrune && !this._noPrune) { this._pruneTiles(); } + + if (nextFrame) { + L.Util.cancelAnimFrame(this._fadeFrame); + this._fadeFrame = L.Util.requestAnimFrame(this._updateOpacity, this); + } }, - createShadow: function (oldIcon) { - return this._createIcon('shadow', oldIcon); + _initContainer: function () { + if (this._container) { return; } + + this._container = L.DomUtil.create('div', 'leaflet-layer ' + (this.options.className || '')); + this._updateZIndex(); + + if (this.options.opacity < 1) { + this._updateOpacity(); + } + + this.getPane().appendChild(this._container); }, - _createIcon: function (name, oldIcon) { - var src = this._getIconUrl(name); + _updateLevels: function () { - if (!src) { - if (name === 'icon') { - throw new Error('iconUrl not set in Icon options (see the docs).'); + var zoom = this._tileZoom, + maxZoom = this.options.maxZoom; + + if (zoom === undefined) { return undefined; } + + for (var z in this._levels) { + if (this._levels[z].el.children.length || z === zoom) { + this._levels[z].el.style.zIndex = maxZoom - Math.abs(zoom - z); + } else { + L.DomUtil.remove(this._levels[z].el); + this._removeTilesAtZoom(z); + delete this._levels[z]; } - return null; } - var img; - if (!oldIcon || oldIcon.tagName !== 'IMG') { - img = this._createImg(src); - } else { - img = this._createImg(src, oldIcon); + var level = this._levels[zoom], + map = this._map; + + if (!level) { + level = this._levels[zoom] = {}; + + level.el = L.DomUtil.create('div', 'leaflet-tile-container leaflet-zoom-animated', this._container); + level.el.style.zIndex = maxZoom; + + level.origin = map.project(map.unproject(map.getPixelOrigin()), zoom).round(); + level.zoom = zoom; + + this._setZoomTransform(level, map.getCenter(), map.getZoom()); + + // force the browser to consider the newly added element for transition + L.Util.falseFn(level.el.offsetWidth); } - this._setIconStyles(img, name); - return img; - }, + this._level = level; - _setIconStyles: function (img, name) { - var options = this.options, - size = L.point(options[name + 'Size']), - anchor; + return level; + }, - if (name === 'shadow') { - anchor = L.point(options.shadowAnchor || options.iconAnchor); - } else { - anchor = L.point(options.iconAnchor); + _pruneTiles: function () { + if (!this._map) { + return; } - if (!anchor && size) { - anchor = size.divideBy(2, true); + var key, tile; + + var zoom = this._map.getZoom(); + if (zoom > this.options.maxZoom || + zoom < this.options.minZoom) { + this._removeAllTiles(); + return; } - img.className = 'leaflet-marker-' + name + ' ' + options.className; + for (key in this._tiles) { + tile = this._tiles[key]; + tile.retain = tile.current; + } - if (anchor) { - img.style.marginLeft = (-anchor.x) + 'px'; - img.style.marginTop = (-anchor.y) + 'px'; + for (key in this._tiles) { + tile = this._tiles[key]; + if (tile.current && !tile.active) { + var coords = tile.coords; + if (!this._retainParent(coords.x, coords.y, coords.z, coords.z - 5)) { + this._retainChildren(coords.x, coords.y, coords.z, coords.z + 2); + } + } } - if (size) { - img.style.width = size.x + 'px'; - img.style.height = size.y + 'px'; + for (key in this._tiles) { + if (!this._tiles[key].retain) { + this._removeTile(key); + } } }, - _createImg: function (src, el) { - el = el || document.createElement('img'); - el.src = src; - return el; + _removeTilesAtZoom: function (zoom) { + for (var key in this._tiles) { + if (this._tiles[key].coords.z !== zoom) { + continue; + } + this._removeTile(key); + } }, - _getIconUrl: function (name) { - if (L.Browser.retina && this.options[name + 'RetinaUrl']) { - return this.options[name + 'RetinaUrl']; + _removeAllTiles: function () { + for (var key in this._tiles) { + this._removeTile(key); } - return this.options[name + 'Url']; - } -}); - -L.icon = function (options) { - return new L.Icon(options); -}; - + }, -/* - * L.Icon.Default is the blue marker icon used by default in Leaflet. - */ + _invalidateAll: function () { + for (var z in this._levels) { + L.DomUtil.remove(this._levels[z].el); + delete this._levels[z]; + } + this._removeAllTiles(); -L.Icon.Default = L.Icon.extend({ + this._tileZoom = null; + }, - options: { - iconSize: [25, 41], - iconAnchor: [12, 41], - popupAnchor: [1, -34], + _retainParent: function (x, y, z, minZoom) { + var x2 = Math.floor(x / 2), + y2 = Math.floor(y / 2), + z2 = z - 1, + coords2 = new L.Point(+x2, +y2); + coords2.z = +z2; - shadowSize: [41, 41] - }, + var key = this._tileCoordsToKey(coords2), + tile = this._tiles[key]; - _getIconUrl: function (name) { - var key = name + 'Url'; + if (tile && tile.active) { + tile.retain = true; + return true; - if (this.options[key]) { - return this.options[key]; + } else if (tile && tile.loaded) { + tile.retain = true; } - if (L.Browser.retina && name === 'icon') { - name += '-2x'; + if (z2 > minZoom) { + return this._retainParent(x2, y2, z2, minZoom); } - var path = L.Icon.Default.imagePath; + return false; + }, - if (!path) { - throw new Error('Couldn\'t autodetect L.Icon.Default.imagePath, set it manually.'); - } + _retainChildren: function (x, y, z, maxZoom) { - return path + '/marker-' + name + '.png'; - } -}); + for (var i = 2 * x; i < 2 * x + 2; i++) { + for (var j = 2 * y; j < 2 * y + 2; j++) { -L.Icon.Default.imagePath = (function () { - var scripts = document.getElementsByTagName('script'), - leafletRe = /[\/^]leaflet[\-\._]?([\w\-\._]*)\.js\??/; + var coords = new L.Point(i, j); + coords.z = z + 1; - var i, len, src, matches, path; + var key = this._tileCoordsToKey(coords), + tile = this._tiles[key]; + + if (tile && tile.active) { + tile.retain = true; + continue; - for (i = 0, len = scripts.length; i < len; i++) { - src = scripts[i].src; - matches = src.match(leafletRe); + } else if (tile && tile.loaded) { + tile.retain = true; + } - if (matches) { - path = src.split(leafletRe)[0]; - return (path ? path + '/' : '') + 'images'; + if (z + 1 < maxZoom) { + this._retainChildren(i, j, z + 1, maxZoom); + } + } } - } -}()); + }, + _resetView: function (e) { + var animating = e && (e.pinch || e.flyTo); + this._setView(this._map.getCenter(), this._map.getZoom(), animating, animating); + }, -/* - * L.Marker is used to display clickable/draggable icons on the map. - */ - -L.Marker = L.Class.extend({ - - includes: L.Mixin.Events, - - options: { - icon: new L.Icon.Default(), - title: '', - alt: '', - clickable: true, - draggable: false, - keyboard: true, - zIndexOffset: 0, - opacity: 1, - riseOnHover: false, - riseOffset: 250 - }, - - initialize: function (latlng, options) { - L.setOptions(this, options); - this._latlng = L.latLng(latlng); + _animateZoom: function (e) { + this._setView(e.center, e.zoom, true, e.noUpdate); }, - onAdd: function (map) { - this._map = map; - - map.on('viewreset', this.update, this); - - this._initIcon(); - this.update(); - this.fire('add'); - - if (map.options.zoomAnimation && map.options.markerZoomAnimation) { - map.on('zoomanim', this._animateZoom, this); + _setView: function (center, zoom, noPrune, noUpdate) { + var tileZoom = Math.round(zoom); + if ((this.options.maxZoom !== undefined && tileZoom > this.options.maxZoom) || + (this.options.minZoom !== undefined && tileZoom < this.options.minZoom)) { + tileZoom = undefined; } - }, - addTo: function (map) { - map.addLayer(this); - return this; - }, + var tileZoomChanged = this.options.updateWhenZooming && (tileZoom !== this._tileZoom); - onRemove: function (map) { - if (this.dragging) { - this.dragging.disable(); - } + if (!noUpdate || tileZoomChanged) { - this._removeIcon(); - this._removeShadow(); + this._tileZoom = tileZoom; - this.fire('remove'); + if (this._abortLoading) { + this._abortLoading(); + } - map.off({ - 'viewreset': this.update, - 'zoomanim': this._animateZoom - }, this); + this._updateLevels(); + this._resetGrid(); - this._map = null; - }, + if (tileZoom !== undefined) { + this._update(center); + } - getLatLng: function () { - return this._latlng; - }, + if (!noPrune) { + this._pruneTiles(); + } - setLatLng: function (latlng) { - this._latlng = L.latLng(latlng); + // Flag to prevent _updateOpacity from pruning tiles during + // a zoom anim or a pinch gesture + this._noPrune = !!noPrune; + } - this.update(); + this._setZoomTransforms(center, zoom); + }, - return this.fire('move', { latlng: this._latlng }); + _setZoomTransforms: function (center, zoom) { + for (var i in this._levels) { + this._setZoomTransform(this._levels[i], center, zoom); + } }, - setZIndexOffset: function (offset) { - this.options.zIndexOffset = offset; - this.update(); + _setZoomTransform: function (level, center, zoom) { + var scale = this._map.getZoomScale(zoom, level.zoom), + translate = level.origin.multiplyBy(scale) + .subtract(this._map._getNewPixelOrigin(center, zoom)).round(); - return this; + if (L.Browser.any3d) { + L.DomUtil.setTransform(level.el, translate, scale); + } else { + L.DomUtil.setPosition(level.el, translate); + } }, - setIcon: function (icon) { - - this.options.icon = icon; + _resetGrid: function () { + var map = this._map, + crs = map.options.crs, + tileSize = this._tileSize = this.getTileSize(), + tileZoom = this._tileZoom; - if (this._map) { - this._initIcon(); - this.update(); + var bounds = this._map.getPixelWorldBounds(this._tileZoom); + if (bounds) { + this._globalTileRange = this._pxBoundsToTileRange(bounds); } - if (this._popup) { - this.bindPopup(this._popup); - } + this._wrapX = crs.wrapLng && !this.options.noWrap && [ + Math.floor(map.project([0, crs.wrapLng[0]], tileZoom).x / tileSize.x), + Math.ceil(map.project([0, crs.wrapLng[1]], tileZoom).x / tileSize.y) + ]; + this._wrapY = crs.wrapLat && !this.options.noWrap && [ + Math.floor(map.project([crs.wrapLat[0], 0], tileZoom).y / tileSize.x), + Math.ceil(map.project([crs.wrapLat[1], 0], tileZoom).y / tileSize.y) + ]; + }, - return this; + _onMoveEnd: function () { + if (!this._map || this._map._animatingZoom) { return; } + + this._update(); }, - update: function () { - if (this._icon) { - var pos = this._map.latLngToLayerPoint(this._latlng).round(); - this._setPos(pos); - } + _getTiledPixelBounds: function (center) { + var map = this._map, + mapZoom = map._animatingZoom ? Math.max(map._animateToZoom, map.getZoom()) : map.getZoom(), + scale = map.getZoomScale(mapZoom, this._tileZoom), + pixelCenter = map.project(center, this._tileZoom).floor(), + halfSize = map.getSize().divideBy(scale * 2); - return this; + return new L.Bounds(pixelCenter.subtract(halfSize), pixelCenter.add(halfSize)); }, - _initIcon: function () { - var options = this.options, - map = this._map, - animation = (map.options.zoomAnimation && map.options.markerZoomAnimation), - classToAdd = animation ? 'leaflet-zoom-animated' : 'leaflet-zoom-hide'; + // Private method to load tiles in the grid's active zoom level according to map bounds + _update: function (center) { + var map = this._map; + if (!map) { return; } + var zoom = map.getZoom(); - var icon = options.icon.createIcon(this._icon), - addIcon = false; + if (center === undefined) { center = map.getCenter(); } + if (this._tileZoom === undefined) { return; } // if out of minzoom/maxzoom - // if we're not reusing the icon, remove the old one and init new one - if (icon !== this._icon) { - if (this._icon) { - this._removeIcon(); - } - addIcon = true; + var pixelBounds = this._getTiledPixelBounds(center), + tileRange = this._pxBoundsToTileRange(pixelBounds), + tileCenter = tileRange.getCenter(), + queue = [], + margin = this.options.keepBuffer, + noPruneRange = new L.Bounds(tileRange.getBottomLeft().subtract([margin, -margin]), + tileRange.getTopRight().add([margin, -margin])); - if (options.title) { - icon.title = options.title; - } - - if (options.alt) { - icon.alt = options.alt; + for (var key in this._tiles) { + var c = this._tiles[key].coords; + if (c.z !== this._tileZoom || !noPruneRange.contains(L.point(c.x, c.y))) { + this._tiles[key].current = false; } } - L.DomUtil.addClass(icon, classToAdd); - - if (options.keyboard) { - icon.tabIndex = '0'; - } + // _update just loads more tiles. If the tile zoom level differs too much + // from the map's, let _setView reset levels and prune old tiles. + if (Math.abs(zoom - this._tileZoom) > 1) { this._setView(center, zoom); return; } - this._icon = icon; + // create a queue of coordinates to load tiles from + for (var j = tileRange.min.y; j <= tileRange.max.y; j++) { + for (var i = tileRange.min.x; i <= tileRange.max.x; i++) { + var coords = new L.Point(i, j); + coords.z = this._tileZoom; - this._initInteraction(); + if (!this._isValidTile(coords)) { continue; } - if (options.riseOnHover) { - L.DomEvent - .on(icon, 'mouseover', this._bringToFront, this) - .on(icon, 'mouseout', this._resetZIndex, this); + var tile = this._tiles[this._tileCoordsToKey(coords)]; + if (tile) { + tile.current = true; + } else { + queue.push(coords); + } + } } - var newShadow = options.icon.createShadow(this._shadow), - addShadow = false; + // sort tile queue to load tiles in order of their distance to center + queue.sort(function (a, b) { + return a.distanceTo(tileCenter) - b.distanceTo(tileCenter); + }); - if (newShadow !== this._shadow) { - this._removeShadow(); - addShadow = true; - } + if (queue.length !== 0) { + // if it's the first batch of tiles to load + if (!this._loading) { + this._loading = true; + // @event loading: Event + // Fired when the grid layer starts loading tiles. + this.fire('loading'); + } - if (newShadow) { - L.DomUtil.addClass(newShadow, classToAdd); - } - this._shadow = newShadow; + // create DOM fragment to append tiles in one batch + var fragment = document.createDocumentFragment(); + for (i = 0; i < queue.length; i++) { + this._addTile(queue[i], fragment); + } - if (options.opacity < 1) { - this._updateOpacity(); + this._level.el.appendChild(fragment); } + }, + _isValidTile: function (coords) { + var crs = this._map.options.crs; - var panes = this._map._panes; - - if (addIcon) { - panes.markerPane.appendChild(this._icon); + if (!crs.infinite) { + // don't load tile if it's out of bounds and not wrapped + var bounds = this._globalTileRange; + if ((!crs.wrapLng && (coords.x < bounds.min.x || coords.x > bounds.max.x)) || + (!crs.wrapLat && (coords.y < bounds.min.y || coords.y > bounds.max.y))) { return false; } } - if (newShadow && addShadow) { - panes.shadowPane.appendChild(this._shadow); - } + if (!this.options.bounds) { return true; } + + // don't load tile if it doesn't intersect the bounds in options + var tileBounds = this._tileCoordsToBounds(coords); + return L.latLngBounds(this.options.bounds).overlaps(tileBounds); }, - _removeIcon: function () { - if (this.options.riseOnHover) { - L.DomEvent - .off(this._icon, 'mouseover', this._bringToFront) - .off(this._icon, 'mouseout', this._resetZIndex); - } + _keyToBounds: function (key) { + return this._tileCoordsToBounds(this._keyToTileCoords(key)); + }, - this._map._panes.markerPane.removeChild(this._icon); + // converts tile coordinates to its geographical bounds + _tileCoordsToBounds: function (coords) { - this._icon = null; - }, + var map = this._map, + tileSize = this.getTileSize(), - _removeShadow: function () { - if (this._shadow) { - this._map._panes.shadowPane.removeChild(this._shadow); - } - this._shadow = null; - }, + nwPoint = coords.scaleBy(tileSize), + sePoint = nwPoint.add(tileSize), - _setPos: function (pos) { - L.DomUtil.setPosition(this._icon, pos); + nw = map.unproject(nwPoint, coords.z), + se = map.unproject(sePoint, coords.z), + bounds = new L.LatLngBounds(nw, se); - if (this._shadow) { - L.DomUtil.setPosition(this._shadow, pos); + if (!this.options.noWrap) { + map.wrapLatLngBounds(bounds); } - this._zIndex = pos.y + this.options.zIndexOffset; + return bounds; + }, - this._resetZIndex(); + // converts tile coordinates to key for the tile cache + _tileCoordsToKey: function (coords) { + return coords.x + ':' + coords.y + ':' + coords.z; }, - _updateZIndex: function (offset) { - this._icon.style.zIndex = this._zIndex + offset; + // converts tile cache key to coordinates + _keyToTileCoords: function (key) { + var k = key.split(':'), + coords = new L.Point(+k[0], +k[1]); + coords.z = +k[2]; + return coords; }, - _animateZoom: function (opt) { - var pos = this._map._latLngToNewLayerPoint(this._latlng, opt.zoom, opt.center).round(); + _removeTile: function (key) { + var tile = this._tiles[key]; + if (!tile) { return; } - this._setPos(pos); - }, + L.DomUtil.remove(tile.el); - _initInteraction: function () { + delete this._tiles[key]; - if (!this.options.clickable) { return; } + // @event tileunload: TileEvent + // Fired when a tile is removed (e.g. when a tile goes off the screen). + this.fire('tileunload', { + tile: tile.el, + coords: this._keyToTileCoords(key) + }); + }, - // TODO refactor into something shared with Map/Path/etc. to DRY it up + _initTile: function (tile) { + L.DomUtil.addClass(tile, 'leaflet-tile'); - var icon = this._icon, - events = ['dblclick', 'mousedown', 'mouseover', 'mouseout', 'contextmenu']; + var tileSize = this.getTileSize(); + tile.style.width = tileSize.x + 'px'; + tile.style.height = tileSize.y + 'px'; - L.DomUtil.addClass(icon, 'leaflet-clickable'); - L.DomEvent.on(icon, 'click', this._onMouseClick, this); - L.DomEvent.on(icon, 'keypress', this._onKeyPress, this); + tile.onselectstart = L.Util.falseFn; + tile.onmousemove = L.Util.falseFn; - for (var i = 0; i < events.length; i++) { - L.DomEvent.on(icon, events[i], this._fireMouseEvent, this); + // update opacity on tiles in IE7-8 because of filter inheritance problems + if (L.Browser.ielt9 && this.options.opacity < 1) { + L.DomUtil.setOpacity(tile, this.options.opacity); } - if (L.Handler.MarkerDrag) { - this.dragging = new L.Handler.MarkerDrag(this); - - if (this.options.draggable) { - this.dragging.enable(); - } + // without this hack, tiles disappear after zoom on Chrome for Android + // https://github.com/Leaflet/Leaflet/issues/2078 + if (L.Browser.android && !L.Browser.android23) { + tile.style.WebkitBackfaceVisibility = 'hidden'; } }, - _onMouseClick: function (e) { - var wasDragged = this.dragging && this.dragging.moved(); + _addTile: function (coords, container) { + var tilePos = this._getTilePos(coords), + key = this._tileCoordsToKey(coords); + + var tile = this.createTile(this._wrapCoords(coords), L.bind(this._tileReady, this, coords)); - if (this.hasEventListeners(e.type) || wasDragged) { - L.DomEvent.stopPropagation(e); + this._initTile(tile); + + // if createTile is defined with a second argument ("done" callback), + // we know that tile is async and will be ready later; otherwise + if (this.createTile.length < 2) { + // mark tile as ready, but delay one frame for opacity animation to happen + L.Util.requestAnimFrame(L.bind(this._tileReady, this, coords, null, tile)); } - if (wasDragged) { return; } + L.DomUtil.setPosition(tile, tilePos); - if ((!this.dragging || !this.dragging._enabled) && this._map.dragging && this._map.dragging.moved()) { return; } + // save tile in cache + this._tiles[key] = { + el: tile, + coords: coords, + current: true + }; - this.fire(e.type, { - originalEvent: e, - latlng: this._latlng + container.appendChild(tile); + // @event tileloadstart: TileEvent + // Fired when a tile is requested and starts loading. + this.fire('tileloadstart', { + tile: tile, + coords: coords }); }, - _onKeyPress: function (e) { - if (e.keyCode === 13) { - this.fire('click', { - originalEvent: e, - latlng: this._latlng + _tileReady: function (coords, err, tile) { + if (!this._map) { return; } + + if (err) { + // @event tileerror: TileErrorEvent + // Fired when there is an error loading a tile. + this.fire('tileerror', { + error: err, + tile: tile, + coords: coords }); } - }, - _fireMouseEvent: function (e) { + var key = this._tileCoordsToKey(coords); - this.fire(e.type, { - originalEvent: e, - latlng: this._latlng - }); + tile = this._tiles[key]; + if (!tile) { return; } - // TODO proper custom event propagation - // this line will always be called if marker is in a FeatureGroup - if (e.type === 'contextmenu' && this.hasEventListeners(e.type)) { - L.DomEvent.preventDefault(e); - } - if (e.type !== 'mousedown') { - L.DomEvent.stopPropagation(e); + tile.loaded = +new Date(); + if (this._map._fadeAnimated) { + L.DomUtil.setOpacity(tile.el, 0); + L.Util.cancelAnimFrame(this._fadeFrame); + this._fadeFrame = L.Util.requestAnimFrame(this._updateOpacity, this); } else { - L.DomEvent.preventDefault(e); + tile.active = true; + this._pruneTiles(); } - }, - setOpacity: function (opacity) { - this.options.opacity = opacity; - if (this._map) { - this._updateOpacity(); + if (!err) { + L.DomUtil.addClass(tile.el, 'leaflet-tile-loaded'); + + // @event tileload: TileEvent + // Fired when a tile loads. + this.fire('tileload', { + tile: tile.el, + coords: coords + }); } - return this; - }, + if (this._noTilesToLoad()) { + this._loading = false; + // @event load: Event + // Fired when the grid layer loaded all visible tiles. + this.fire('load'); - _updateOpacity: function () { - L.DomUtil.setOpacity(this._icon, this.options.opacity); - if (this._shadow) { - L.DomUtil.setOpacity(this._shadow, this.options.opacity); + if (L.Browser.ielt9 || !this._map._fadeAnimated) { + L.Util.requestAnimFrame(this._pruneTiles, this); + } else { + // Wait a bit more than 0.2 secs (the duration of the tile fade-in) + // to trigger a pruning. + setTimeout(L.bind(this._pruneTiles, this), 250); + } } }, - _bringToFront: function () { - this._updateZIndex(this.options.riseOffset); + _getTilePos: function (coords) { + return coords.scaleBy(this.getTileSize()).subtract(this._level.origin); }, - _resetZIndex: function () { - this._updateZIndex(0); + _wrapCoords: function (coords) { + var newCoords = new L.Point( + this._wrapX ? L.Util.wrapNum(coords.x, this._wrapX) : coords.x, + this._wrapY ? L.Util.wrapNum(coords.y, this._wrapY) : coords.y); + newCoords.z = coords.z; + return newCoords; + }, + + _pxBoundsToTileRange: function (bounds) { + var tileSize = this.getTileSize(); + return new L.Bounds( + bounds.min.unscaleBy(tileSize).floor(), + bounds.max.unscaleBy(tileSize).ceil().subtract([1, 1])); + }, + + _noTilesToLoad: function () { + for (var key in this._tiles) { + if (!this._tiles[key].loaded) { return false; } + } + return true; } }); -L.marker = function (latlng, options) { - return new L.Marker(latlng, options); +// @factory L.gridLayer(options?: GridLayer options) +// Creates a new instance of GridLayer with the supplied options. +L.gridLayer = function (options) { + return new L.GridLayer(options); }; + /* - * L.DivIcon is a lightweight HTML-based icon class (as opposed to the image-based L.Icon) - * to use with L.Marker. + * @class TileLayer + * @inherits GridLayer + * @aka L.TileLayer + * Used to load and display tile layers on the map. Extends `GridLayer`. + * + * @example + * + * ```js + * L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png?{foo}', {foo: 'bar'}).addTo(map); + * ``` + * + * @section URL template + * @example + * + * A string of the following form: + * + * ``` + * 'http://{s}.somedomain.com/blabla/{z}/{x}/{y}{r}.png' + * ``` + * + * `{s}` means one of the available subdomains (used sequentially to help with browser parallel requests per domain limitation; subdomain values are specified in options; `a`, `b` or `c` by default, can be omitted), `{z}` — zoom level, `{x}` and `{y}` — tile coordinates. `{r}` can be used to add @2x to the URL to load retina tiles. + * + * You can use custom keys in the template, which will be [evaluated](#util-template) from TileLayer options, like this: + * + * ``` + * L.tileLayer('http://{s}.somedomain.com/{foo}/{z}/{x}/{y}.png', {foo: 'bar'}); + * ``` */ -L.DivIcon = L.Icon.extend({ + +L.TileLayer = L.GridLayer.extend({ + + // @section + // @aka TileLayer options options: { - iconSize: [12, 12], // also can be set through CSS - /* - iconAnchor: (Point) - popupAnchor: (Point) - html: (String) - bgPos: (Point) - */ - className: 'leaflet-div-icon', - html: false - }, + // @option minZoom: Number = 0 + // Minimum zoom number. + minZoom: 0, - createIcon: function (oldIcon) { - var div = (oldIcon && oldIcon.tagName === 'DIV') ? oldIcon : document.createElement('div'), - options = this.options; + // @option maxZoom: Number = 18 + // Maximum zoom number. + maxZoom: 18, - if (options.html !== false) { - div.innerHTML = options.html; - } else { - div.innerHTML = ''; - } + // @option maxNativeZoom: Number = null + // Maximum zoom number the tile source has available. If it is specified, + // the tiles on all zoom levels higher than `maxNativeZoom` will be loaded + // from `maxNativeZoom` level and auto-scaled. + maxNativeZoom: null, - if (options.bgPos) { - div.style.backgroundPosition = - (-options.bgPos.x) + 'px ' + (-options.bgPos.y) + 'px'; - } + // @option minNativeZoom: Number = null + // Minimum zoom number the tile source has available. If it is specified, + // the tiles on all zoom levels lower than `minNativeZoom` will be loaded + // from `minNativeZoom` level and auto-scaled. + minNativeZoom: null, - this._setIconStyles(div, 'icon'); - return div; - }, + // @option subdomains: String|String[] = 'abc' + // Subdomains of the tile service. Can be passed in the form of one string (where each letter is a subdomain name) or an array of strings. + subdomains: 'abc', - createShadow: function () { - return null; - } -}); + // @option errorTileUrl: String = '' + // URL to the tile image to show in place of the tile that failed to load. + errorTileUrl: '', -L.divIcon = function (options) { - return new L.DivIcon(options); -}; + // @option zoomOffset: Number = 0 + // The zoom number used in tile URLs will be offset with this value. + zoomOffset: 0, + // @option tms: Boolean = false + // If `true`, inverses Y axis numbering for tiles (turn this on for [TMS](https://en.wikipedia.org/wiki/Tile_Map_Service) services). + tms: false, -/* - * L.Popup is used for displaying popups on the map. - */ + // @option zoomReverse: Boolean = false + // If set to true, the zoom number used in tile URLs will be reversed (`maxZoom - zoom` instead of `zoom`) + zoomReverse: false, -L.Map.mergeOptions({ - closePopupOnClick: true -}); + // @option detectRetina: Boolean = false + // If `true` and user is on a retina display, it will request four tiles of half the specified size and a bigger zoom level in place of one to utilize the high resolution. + detectRetina: false, -L.Popup = L.Class.extend({ - includes: L.Mixin.Events, + // @option crossOrigin: Boolean = false + // If true, all tiles will have their crossOrigin attribute set to ''. This is needed if you want to access tile pixel data. + crossOrigin: false + }, - options: { - minWidth: 50, - maxWidth: 300, - // maxHeight: null, - autoPan: true, - closeButton: true, - offset: [0, 7], - autoPanPadding: [5, 5], - // autoPanPaddingTopLeft: null, - // autoPanPaddingBottomRight: null, - keepInView: false, - className: '', - zoomAnimation: true - }, + initialize: function (url, options) { - initialize: function (options, source) { - L.setOptions(this, options); + this._url = url; - this._source = source; - this._animated = L.Browser.any3d && this.options.zoomAnimation; - this._isOpen = false; - }, + options = L.setOptions(this, options); - onAdd: function (map) { - this._map = map; + // detecting retina displays, adjusting tileSize and zoom levels + if (options.detectRetina && L.Browser.retina && options.maxZoom > 0) { - if (!this._container) { - this._initLayout(); - } + options.tileSize = Math.floor(options.tileSize / 2); - var animFade = map.options.fadeAnimation; + if (!options.zoomReverse) { + options.zoomOffset++; + options.maxZoom--; + } else { + options.zoomOffset--; + options.minZoom++; + } - if (animFade) { - L.DomUtil.setOpacity(this._container, 0); + options.minZoom = Math.max(0, options.minZoom); } - map._panes.popupPane.appendChild(this._container); - - map.on(this._getEvents(), this); - - this.update(); - if (animFade) { - L.DomUtil.setOpacity(this._container, 1); + if (typeof options.subdomains === 'string') { + options.subdomains = options.subdomains.split(''); } - this.fire('open'); - - map.fire('popupopen', {popup: this}); - - if (this._source) { - this._source.fire('popupopen', {popup: this}); + // for https://github.com/Leaflet/Leaflet/issues/137 + if (!L.Browser.android) { + this.on('tileunload', this._onTileRemove); } }, - addTo: function (map) { - map.addLayer(this); - return this; - }, + // @method setUrl(url: String, noRedraw?: Boolean): this + // Updates the layer's URL template and redraws it (unless `noRedraw` is set to `true`). + setUrl: function (url, noRedraw) { + this._url = url; - openOn: function (map) { - map.openPopup(this); + if (!noRedraw) { + this.redraw(); + } return this; }, - onRemove: function (map) { - map._panes.popupPane.removeChild(this._container); - - L.Util.falseFn(this._container.offsetWidth); // force reflow + // @method createTile(coords: Object, done?: Function): HTMLElement + // Called only internally, overrides GridLayer's [`createTile()`](#gridlayer-createtile) + // to return an `` HTML element with the appropiate image URL given `coords`. The `done` + // callback is called when the tile has been loaded. + createTile: function (coords, done) { + var tile = document.createElement('img'); - map.off(this._getEvents(), this); + L.DomEvent.on(tile, 'load', L.bind(this._tileOnLoad, this, done, tile)); + L.DomEvent.on(tile, 'error', L.bind(this._tileOnError, this, done, tile)); - if (map.options.fadeAnimation) { - L.DomUtil.setOpacity(this._container, 0); + if (this.options.crossOrigin) { + tile.crossOrigin = ''; } - this._map = null; - - this.fire('close'); + /* + Alt tag is set to empty string to keep screen readers from reading URL and for compliance reasons + http://www.w3.org/TR/WCAG20-TECHS/H67 + */ + tile.alt = ''; - map.fire('popupclose', {popup: this}); + /* + Set role="presentation" to force screen readers to ignore this + https://www.w3.org/TR/wai-aria/roles#textalternativecomputation + */ + tile.setAttribute('role', 'presentation'); - if (this._source) { - this._source.fire('popupclose', {popup: this}); - } - }, + tile.src = this.getTileUrl(coords); - getLatLng: function () { - return this._latlng; + return tile; }, - setLatLng: function (latlng) { - this._latlng = L.latLng(latlng); - if (this._map) { - this._updatePosition(); - this._adjustPan(); + // @section Extension methods + // @uninheritable + // Layers extending `TileLayer` might reimplement the following method. + // @method getTileUrl(coords: Object): String + // Called only internally, returns the URL for a tile given its coordinates. + // Classes extending `TileLayer` can override this function to provide custom tile URL naming schemes. + getTileUrl: function (coords) { + var data = { + r: L.Browser.retina ? '@2x' : '', + s: this._getSubdomain(coords), + x: coords.x, + y: coords.y, + z: this._getZoomForUrl() + }; + if (this._map && !this._map.options.crs.infinite) { + var invertedY = this._globalTileRange.max.y - coords.y; + if (this.options.tms) { + data['y'] = invertedY; + } + data['-y'] = invertedY; } - return this; + + return L.Util.template(this._url, L.extend(data, this.options)); }, - getContent: function () { - return this._content; + _tileOnLoad: function (done, tile) { + // For https://github.com/Leaflet/Leaflet/issues/3332 + if (L.Browser.ielt9) { + setTimeout(L.bind(done, this, null, tile), 0); + } else { + done(null, tile); + } }, - setContent: function (content) { - this._content = content; - this.update(); - return this; + _tileOnError: function (done, tile, e) { + var errorUrl = this.options.errorTileUrl; + if (errorUrl && tile.src !== errorUrl) { + tile.src = errorUrl; + } + done(e, tile); }, - update: function () { - if (!this._map) { return; } + getTileSize: function () { + var map = this._map, + tileSize = L.GridLayer.prototype.getTileSize.call(this), + zoom = this._tileZoom + this.options.zoomOffset, + minNativeZoom = this.options.minNativeZoom, + maxNativeZoom = this.options.maxNativeZoom; - this._container.style.visibility = 'hidden'; + // decrease tile size when scaling below minNativeZoom + if (minNativeZoom !== null && zoom < minNativeZoom) { + return tileSize.divideBy(map.getZoomScale(minNativeZoom, zoom)).round(); + } - this._updateContent(); - this._updateLayout(); - this._updatePosition(); + // increase tile size when scaling above maxNativeZoom + if (maxNativeZoom !== null && zoom > maxNativeZoom) { + return tileSize.divideBy(map.getZoomScale(maxNativeZoom, zoom)).round(); + } - this._container.style.visibility = ''; + return tileSize; + }, - this._adjustPan(); + _onTileRemove: function (e) { + e.tile.onload = null; }, - _getEvents: function () { - var events = { - viewreset: this._updatePosition - }; + _getZoomForUrl: function () { + var zoom = this._tileZoom, + maxZoom = this.options.maxZoom, + zoomReverse = this.options.zoomReverse, + zoomOffset = this.options.zoomOffset, + minNativeZoom = this.options.minNativeZoom, + maxNativeZoom = this.options.maxNativeZoom; - if (this._animated) { - events.zoomanim = this._zoomAnimation; + if (zoomReverse) { + zoom = maxZoom - zoom; } - if ('closeOnClick' in this.options ? this.options.closeOnClick : this._map.options.closePopupOnClick) { - events.preclick = this._close; + + zoom += zoomOffset; + + if (minNativeZoom !== null && zoom < minNativeZoom) { + return minNativeZoom; } - if (this.options.keepInView) { - events.moveend = this._adjustPan; + + if (maxNativeZoom !== null && zoom > maxNativeZoom) { + return maxNativeZoom; } - return events; + return zoom; }, - _close: function () { - if (this._map) { - this._map.closePopup(this); - } + _getSubdomain: function (tilePoint) { + var index = Math.abs(tilePoint.x + tilePoint.y) % this.options.subdomains.length; + return this.options.subdomains[index]; }, - _initLayout: function () { - var prefix = 'leaflet-popup', - containerClass = prefix + ' ' + this.options.className + ' leaflet-zoom-' + - (this._animated ? 'animated' : 'hide'), - container = this._container = L.DomUtil.create('div', containerClass), - closeButton; + // stops loading all tiles in the background layer + _abortLoading: function () { + var i, tile; + for (i in this._tiles) { + if (this._tiles[i].coords.z !== this._tileZoom) { + tile = this._tiles[i].el; - if (this.options.closeButton) { - closeButton = this._closeButton = - L.DomUtil.create('a', prefix + '-close-button', container); - closeButton.href = '#close'; - closeButton.innerHTML = '×'; - L.DomEvent.disableClickPropagation(closeButton); + tile.onload = L.Util.falseFn; + tile.onerror = L.Util.falseFn; - L.DomEvent.on(closeButton, 'click', this._onCloseButtonClick, this); + if (!tile.complete) { + tile.src = L.Util.emptyImageUrl; + L.DomUtil.remove(tile); + } + } } + } +}); - var wrapper = this._wrapper = - L.DomUtil.create('div', prefix + '-content-wrapper', container); - L.DomEvent.disableClickPropagation(wrapper); - this._contentNode = L.DomUtil.create('div', prefix + '-content', wrapper); +// @factory L.tilelayer(urlTemplate: String, options?: TileLayer options) +// Instantiates a tile layer object given a `URL template` and optionally an options object. - L.DomEvent.disableScrollPropagation(this._contentNode); - L.DomEvent.on(wrapper, 'contextmenu', L.DomEvent.stopPropagation); +L.tileLayer = function (url, options) { + return new L.TileLayer(url, options); +}; - this._tipContainer = L.DomUtil.create('div', prefix + '-tip-container', container); - this._tip = L.DomUtil.create('div', prefix + '-tip', this._tipContainer); - }, - _updateContent: function () { - if (!this._content) { return; } - if (typeof this._content === 'string') { - this._contentNode.innerHTML = this._content; - } else { - while (this._contentNode.hasChildNodes()) { - this._contentNode.removeChild(this._contentNode.firstChild); - } - this._contentNode.appendChild(this._content); - } - this.fire('contentupdate'); - }, +/* + * @class TileLayer.WMS + * @inherits TileLayer + * @aka L.TileLayer.WMS + * Used to display [WMS](https://en.wikipedia.org/wiki/Web_Map_Service) services as tile layers on the map. Extends `TileLayer`. + * + * @example + * + * ```js + * var nexrad = L.tileLayer.wms("http://mesonet.agron.iastate.edu/cgi-bin/wms/nexrad/n0r.cgi", { + * layers: 'nexrad-n0r-900913', + * format: 'image/png', + * transparent: true, + * attribution: "Weather data © 2012 IEM Nexrad" + * }); + * ``` + */ - _updateLayout: function () { - var container = this._contentNode, - style = container.style; +L.TileLayer.WMS = L.TileLayer.extend({ - style.width = ''; - style.whiteSpace = 'nowrap'; + // @section + // @aka TileLayer.WMS options + // If any custom options not documented here are used, they will be sent to the + // WMS server as extra parameters in each request URL. This can be useful for + // [non-standard vendor WMS parameters](http://docs.geoserver.org/stable/en/user/services/wms/vendor.html). + defaultWmsParams: { + service: 'WMS', + request: 'GetMap', - var width = container.offsetWidth; - width = Math.min(width, this.options.maxWidth); - width = Math.max(width, this.options.minWidth); + // @option layers: String = '' + // **(required)** Comma-separated list of WMS layers to show. + layers: '', - style.width = (width + 1) + 'px'; - style.whiteSpace = ''; + // @option styles: String = '' + // Comma-separated list of WMS styles. + styles: '', - style.height = ''; + // @option format: String = 'image/jpeg' + // WMS image format (use `'image/png'` for layers with transparency). + format: 'image/jpeg', - var height = container.offsetHeight, - maxHeight = this.options.maxHeight, - scrolledClass = 'leaflet-popup-scrolled'; + // @option transparent: Boolean = false + // If `true`, the WMS service will return images with transparency. + transparent: false, - if (maxHeight && height > maxHeight) { - style.height = maxHeight + 'px'; - L.DomUtil.addClass(container, scrolledClass); - } else { - L.DomUtil.removeClass(container, scrolledClass); - } + // @option version: String = '1.1.1' + // Version of the WMS service to use + version: '1.1.1' + }, - this._containerWidth = this._container.offsetWidth; + options: { + // @option crs: CRS = null + // Coordinate Reference System to use for the WMS requests, defaults to + // map CRS. Don't change this if you're not sure what it means. + crs: null, + + // @option uppercase: Boolean = false + // If `true`, WMS request parameter keys will be uppercase. + uppercase: false }, - _updatePosition: function () { - if (!this._map) { return; } + initialize: function (url, options) { - var pos = this._map.latLngToLayerPoint(this._latlng), - animated = this._animated, - offset = L.point(this.options.offset); + this._url = url; + + var wmsParams = L.extend({}, this.defaultWmsParams); - if (animated) { - L.DomUtil.setPosition(this._container, pos); + // all keys that are not TileLayer options go to WMS params + for (var i in options) { + if (!(i in this.options)) { + wmsParams[i] = options[i]; + } } - this._containerBottom = -offset.y - (animated ? 0 : pos.y); - this._containerLeft = -Math.round(this._containerWidth / 2) + offset.x + (animated ? 0 : pos.x); + options = L.setOptions(this, options); + + wmsParams.width = wmsParams.height = options.tileSize * (options.detectRetina && L.Browser.retina ? 2 : 1); - // bottom position the popup in case the height of the popup changes (images loading etc) - this._container.style.bottom = this._containerBottom + 'px'; - this._container.style.left = this._containerLeft + 'px'; + this.wmsParams = wmsParams; }, - _zoomAnimation: function (opt) { - var pos = this._map._latLngToNewLayerPoint(this._latlng, opt.zoom, opt.center); + onAdd: function (map) { + + this._crs = this.options.crs || map.options.crs; + this._wmsVersion = parseFloat(this.wmsParams.version); + + var projectionKey = this._wmsVersion >= 1.3 ? 'crs' : 'srs'; + this.wmsParams[projectionKey] = this._crs.code; - L.DomUtil.setPosition(this._container, pos); + L.TileLayer.prototype.onAdd.call(this, map); }, - _adjustPan: function () { - if (!this.options.autoPan) { return; } + getTileUrl: function (coords) { - var map = this._map, - containerHeight = this._container.offsetHeight, - containerWidth = this._containerWidth, + var tileBounds = this._tileCoordsToBounds(coords), + nw = this._crs.project(tileBounds.getNorthWest()), + se = this._crs.project(tileBounds.getSouthEast()), - layerPos = new L.Point(this._containerLeft, -containerHeight - this._containerBottom); + bbox = (this._wmsVersion >= 1.3 && this._crs === L.CRS.EPSG4326 ? + [se.y, nw.x, nw.y, se.x] : + [nw.x, se.y, se.x, nw.y]).join(','), - if (this._animated) { - layerPos._add(L.DomUtil.getPosition(this._container)); - } + url = L.TileLayer.prototype.getTileUrl.call(this, coords); - var containerPos = map.layerPointToContainerPoint(layerPos), - padding = L.point(this.options.autoPanPadding), - paddingTL = L.point(this.options.autoPanPaddingTopLeft || padding), - paddingBR = L.point(this.options.autoPanPaddingBottomRight || padding), - size = map.getSize(), - dx = 0, - dy = 0; + return url + + L.Util.getParamString(this.wmsParams, url, this.options.uppercase) + + (this.options.uppercase ? '&BBOX=' : '&bbox=') + bbox; + }, - if (containerPos.x + containerWidth + paddingBR.x > size.x) { // right - dx = containerPos.x + containerWidth - size.x + paddingBR.x; - } - if (containerPos.x - dx - paddingTL.x < 0) { // left - dx = containerPos.x - paddingTL.x; - } - if (containerPos.y + containerHeight + paddingBR.y > size.y) { // bottom - dy = containerPos.y + containerHeight - size.y + paddingBR.y; - } - if (containerPos.y - dy - paddingTL.y < 0) { // top - dy = containerPos.y - paddingTL.y; - } + // @method setParams(params: Object, noRedraw?: Boolean): this + // Merges an object with the new parameters and re-requests tiles on the current screen (unless `noRedraw` was set to true). + setParams: function (params, noRedraw) { - if (dx || dy) { - map - .fire('autopanstart') - .panBy([dx, dy]); + L.extend(this.wmsParams, params); + + if (!noRedraw) { + this.redraw(); } - }, - _onCloseButtonClick: function (e) { - this._close(); - L.DomEvent.stop(e); + return this; } }); -L.popup = function (options, source) { - return new L.Popup(options, source); + +// @factory L.tileLayer.wms(baseUrl: String, options: TileLayer.WMS options) +// Instantiates a WMS tile layer object given a base URL of the WMS service and a WMS parameters/options object. +L.tileLayer.wms = function (url, options) { + return new L.TileLayer.WMS(url, options); }; -L.Map.include({ - openPopup: function (popup, latlng, options) { // (Popup) or (String || HTMLElement, LatLng[, Object]) - this.closePopup(); - if (!(popup instanceof L.Popup)) { - var content = popup; +/* + * @class ImageOverlay + * @aka L.ImageOverlay + * @inherits Interactive layer + * + * Used to load and display a single image over specific bounds of the map. Extends `Layer`. + * + * @example + * + * ```js + * var imageUrl = 'http://www.lib.utexas.edu/maps/historical/newark_nj_1922.jpg', + * imageBounds = [[40.712216, -74.22655], [40.773941, -74.12544]]; + * L.imageOverlay(imageUrl, imageBounds).addTo(map); + * ``` + */ - popup = new L.Popup(options) - .setLatLng(latlng) - .setContent(content); - } - popup._isOpen = true; +L.ImageOverlay = L.Layer.extend({ - this._popup = popup; - return this.addLayer(popup); + // @section + // @aka ImageOverlay options + options: { + // @option opacity: Number = 1.0 + // The opacity of the image overlay. + opacity: 1, + + // @option alt: String = '' + // Text for the `alt` attribute of the image (useful for accessibility). + alt: '', + + // @option interactive: Boolean = false + // If `true`, the image overlay will emit [mouse events](#interactive-layer) when clicked or hovered. + interactive: false, + + // @option crossOrigin: Boolean = false + // If true, the image will have its crossOrigin attribute set to ''. This is needed if you want to access image pixel data. + crossOrigin: false }, - closePopup: function (popup) { - if (!popup || popup === this._popup) { - popup = this._popup; - this._popup = null; - } - if (popup) { - this.removeLayer(popup); - popup._isOpen = false; - } - return this; - } -}); - - -/* - * Popup extension to L.Marker, adding popup-related methods. - */ - -L.Marker.include({ - openPopup: function () { - if (this._popup && this._map && !this._map.hasLayer(this._popup)) { - this._popup.setLatLng(this._latlng); - this._map.openPopup(this._popup); - } + initialize: function (url, bounds, options) { // (String, LatLngBounds, Object) + this._url = url; + this._bounds = L.latLngBounds(bounds); - return this; + L.setOptions(this, options); }, - closePopup: function () { - if (this._popup) { - this._popup._close(); - } - return this; - }, + onAdd: function () { + if (!this._image) { + this._initImage(); - togglePopup: function () { - if (this._popup) { - if (this._popup._isOpen) { - this.closePopup(); - } else { - this.openPopup(); + if (this.options.opacity < 1) { + this._updateOpacity(); } } - return this; - }, - - bindPopup: function (content, options) { - var anchor = L.point(this.options.icon.options.popupAnchor || [0, 0]); - - anchor = anchor.add(L.Popup.prototype.options.offset); - if (options && options.offset) { - anchor = anchor.add(options.offset); + if (this.options.interactive) { + L.DomUtil.addClass(this._image, 'leaflet-interactive'); + this.addInteractiveTarget(this._image); } - options = L.extend({offset: anchor}, options); + this.getPane().appendChild(this._image); + this._reset(); + }, - if (!this._popupHandlersAdded) { - this - .on('click', this.togglePopup, this) - .on('remove', this.closePopup, this) - .on('move', this._movePopup, this); - this._popupHandlersAdded = true; + onRemove: function () { + L.DomUtil.remove(this._image); + if (this.options.interactive) { + this.removeInteractiveTarget(this._image); } + }, - if (content instanceof L.Popup) { - L.setOptions(content, options); - this._popup = content; - } else { - this._popup = new L.Popup(options, this) - .setContent(content); - } + // @method setOpacity(opacity: Number): this + // Sets the opacity of the overlay. + setOpacity: function (opacity) { + this.options.opacity = opacity; + if (this._image) { + this._updateOpacity(); + } return this; }, - setPopupContent: function (content) { - if (this._popup) { - this._popup.setContent(content); + setStyle: function (styleOpts) { + if (styleOpts.opacity) { + this.setOpacity(styleOpts.opacity); } return this; }, - unbindPopup: function () { - if (this._popup) { - this._popup = null; - this - .off('click', this.togglePopup, this) - .off('remove', this.closePopup, this) - .off('move', this._movePopup, this); - this._popupHandlersAdded = false; + // @method bringToFront(): this + // Brings the layer to the top of all overlays. + bringToFront: function () { + if (this._map) { + L.DomUtil.toFront(this._image); } return this; }, - getPopup: function () { - return this._popup; + // @method bringToBack(): this + // Brings the layer to the bottom of all overlays. + bringToBack: function () { + if (this._map) { + L.DomUtil.toBack(this._image); + } + return this; }, - _movePopup: function (e) { - this._popup.setLatLng(e.latlng); - } -}); - - -/* - * L.LayerGroup is a class to combine several layers into one so that - * you can manipulate the group (e.g. add/remove it) as one layer. - */ - -L.LayerGroup = L.Class.extend({ - initialize: function (layers) { - this._layers = {}; - - var i, len; + // @method setUrl(url: String): this + // Changes the URL of the image. + setUrl: function (url) { + this._url = url; - if (layers) { - for (i = 0, len = layers.length; i < len; i++) { - this.addLayer(layers[i]); - } + if (this._image) { + this._image.src = url; } + return this; }, - addLayer: function (layer) { - var id = this.getLayerId(layer); - - this._layers[id] = layer; + // @method setBounds(bounds: LatLngBounds): this + // Update the bounds that this ImageOverlay covers + setBounds: function (bounds) { + this._bounds = bounds; if (this._map) { - this._map.addLayer(layer); + this._reset(); } - return this; }, - removeLayer: function (layer) { - var id = layer in this._layers ? layer : this.getLayerId(layer); + getEvents: function () { + var events = { + zoom: this._reset, + viewreset: this._reset + }; - if (this._map && this._layers[id]) { - this._map.removeLayer(this._layers[id]); + if (this._zoomAnimated) { + events.zoomanim = this._animateZoom; } - delete this._layers[id]; - - return this; + return events; }, - hasLayer: function (layer) { - if (!layer) { return false; } - - return (layer in this._layers || this.getLayerId(layer) in this._layers); + // @method getBounds(): LatLngBounds + // Get the bounds that this ImageOverlay covers + getBounds: function () { + return this._bounds; }, - clearLayers: function () { - this.eachLayer(this.removeLayer, this); - return this; + // @method getElement(): HTMLElement + // Get the img element that represents the ImageOverlay on the map + getElement: function () { + return this._image; }, - invoke: function (methodName) { - var args = Array.prototype.slice.call(arguments, 1), - i, layer; - - for (i in this._layers) { - layer = this._layers[i]; - - if (layer[methodName]) { - layer[methodName].apply(layer, args); - } - } + _initImage: function () { + var img = this._image = L.DomUtil.create('img', + 'leaflet-image-layer ' + (this._zoomAnimated ? 'leaflet-zoom-animated' : '')); - return this; - }, + img.onselectstart = L.Util.falseFn; + img.onmousemove = L.Util.falseFn; - onAdd: function (map) { - this._map = map; - this.eachLayer(map.addLayer, map); - }, + img.onload = L.bind(this.fire, this, 'load'); - onRemove: function (map) { - this.eachLayer(map.removeLayer, map); - this._map = null; - }, + if (this.options.crossOrigin) { + img.crossOrigin = ''; + } - addTo: function (map) { - map.addLayer(this); - return this; + img.src = this._url; + img.alt = this.options.alt; }, - eachLayer: function (method, context) { - for (var i in this._layers) { - method.call(context, this._layers[i]); - } - return this; - }, + _animateZoom: function (e) { + var scale = this._map.getZoomScale(e.zoom), + offset = this._map._latLngBoundsToNewLayerBounds(this._bounds, e.zoom, e.center).min; - getLayer: function (id) { - return this._layers[id]; + L.DomUtil.setTransform(this._image, offset, scale); }, - getLayers: function () { - var layers = []; + _reset: function () { + var image = this._image, + bounds = new L.Bounds( + this._map.latLngToLayerPoint(this._bounds.getNorthWest()), + this._map.latLngToLayerPoint(this._bounds.getSouthEast())), + size = bounds.getSize(); - for (var i in this._layers) { - layers.push(this._layers[i]); - } - return layers; - }, + L.DomUtil.setPosition(image, bounds.min); - setZIndex: function (zIndex) { - return this.invoke('setZIndex', zIndex); + image.style.width = size.x + 'px'; + image.style.height = size.y + 'px'; }, - getLayerId: function (layer) { - return L.stamp(layer); + _updateOpacity: function () { + L.DomUtil.setOpacity(this._image, this.options.opacity); } }); -L.layerGroup = function (layers) { - return new L.LayerGroup(layers); +// @factory L.imageOverlay(imageUrl: String, bounds: LatLngBounds, options?: ImageOverlay options) +// Instantiates an image overlay object given the URL of the image and the +// geographical bounds it is tied to. +L.imageOverlay = function (url, bounds, options) { + return new L.ImageOverlay(url, bounds, options); }; + /* - * L.FeatureGroup extends L.LayerGroup by introducing mouse events and additional methods - * shared between a group of interactive layers (like vectors or markers). + * @class Icon + * @aka L.Icon + * @inherits Layer + * + * Represents an icon to provide when creating a marker. + * + * @example + * + * ```js + * var myIcon = L.icon({ + * iconUrl: 'my-icon.png', + * iconRetinaUrl: 'my-icon@2x.png', + * iconSize: [38, 95], + * iconAnchor: [22, 94], + * popupAnchor: [-3, -76], + * shadowUrl: 'my-icon-shadow.png', + * shadowRetinaUrl: 'my-icon-shadow@2x.png', + * shadowSize: [68, 95], + * shadowAnchor: [22, 94] + * }); + * + * L.marker([50.505, 30.57], {icon: myIcon}).addTo(map); + * ``` + * + * `L.Icon.Default` extends `L.Icon` and is the blue icon Leaflet uses for markers by default. + * */ -L.FeatureGroup = L.LayerGroup.extend({ - includes: L.Mixin.Events, +L.Icon = L.Class.extend({ - statics: { - EVENTS: 'click dblclick mouseover mouseout mousemove contextmenu popupopen popupclose' + /* @section + * @aka Icon options + * + * @option iconUrl: String = null + * **(required)** The URL to the icon image (absolute or relative to your script path). + * + * @option iconRetinaUrl: String = null + * The URL to a retina sized version of the icon image (absolute or relative to your + * script path). Used for Retina screen devices. + * + * @option iconSize: Point = null + * Size of the icon image in pixels. + * + * @option iconAnchor: Point = null + * The coordinates of the "tip" of the icon (relative to its top left corner). The icon + * will be aligned so that this point is at the marker's geographical location. Centered + * by default if size is specified, also can be set in CSS with negative margins. + * + * @option popupAnchor: Point = null + * The coordinates of the point from which popups will "open", relative to the icon anchor. + * + * @option shadowUrl: String = null + * The URL to the icon shadow image. If not specified, no shadow image will be created. + * + * @option shadowRetinaUrl: String = null + * + * @option shadowSize: Point = null + * Size of the shadow image in pixels. + * + * @option shadowAnchor: Point = null + * The coordinates of the "tip" of the shadow (relative to its top left corner) (the same + * as iconAnchor if not specified). + * + * @option className: String = '' + * A custom class name to assign to both icon and shadow images. Empty by default. + */ + + initialize: function (options) { + L.setOptions(this, options); }, - addLayer: function (layer) { - if (this.hasLayer(layer)) { - return this; - } + // @method createIcon(oldIcon?: HTMLElement): HTMLElement + // Called internally when the icon has to be shown, returns a `` HTML element + // styled according to the options. + createIcon: function (oldIcon) { + return this._createIcon('icon', oldIcon); + }, - if ('on' in layer) { - layer.on(L.FeatureGroup.EVENTS, this._propagateEvent, this); - } + // @method createShadow(oldIcon?: HTMLElement): HTMLElement + // As `createIcon`, but for the shadow beneath it. + createShadow: function (oldIcon) { + return this._createIcon('shadow', oldIcon); + }, - L.LayerGroup.prototype.addLayer.call(this, layer); + _createIcon: function (name, oldIcon) { + var src = this._getIconUrl(name); - if (this._popupContent && layer.bindPopup) { - layer.bindPopup(this._popupContent, this._popupOptions); + if (!src) { + if (name === 'icon') { + throw new Error('iconUrl not set in Icon options (see the docs).'); + } + return null; } - return this.fire('layeradd', {layer: layer}); - }, - - removeLayer: function (layer) { - if (!this.hasLayer(layer)) { - return this; - } - if (layer in this._layers) { - layer = this._layers[layer]; - } + var img = this._createImg(src, oldIcon && oldIcon.tagName === 'IMG' ? oldIcon : null); + this._setIconStyles(img, name); - layer.off(L.FeatureGroup.EVENTS, this._propagateEvent, this); + return img; + }, - L.LayerGroup.prototype.removeLayer.call(this, layer); + _setIconStyles: function (img, name) { + var options = this.options; + var sizeOption = options[name + 'Size']; - if (this._popupContent) { - this.invoke('unbindPopup'); + if (typeof sizeOption === 'number') { + sizeOption = [sizeOption, sizeOption]; } - return this.fire('layerremove', {layer: layer}); - }, + var size = L.point(sizeOption), + anchor = L.point(name === 'shadow' && options.shadowAnchor || options.iconAnchor || + size && size.divideBy(2, true)); - bindPopup: function (content, options) { - this._popupContent = content; - this._popupOptions = options; - return this.invoke('bindPopup', content, options); - }, + img.className = 'leaflet-marker-' + name + ' ' + (options.className || ''); - openPopup: function (latlng) { - // open popup on the first layer - for (var id in this._layers) { - this._layers[id].openPopup(latlng); - break; + if (anchor) { + img.style.marginLeft = (-anchor.x) + 'px'; + img.style.marginTop = (-anchor.y) + 'px'; } - return this; - }, - - setStyle: function (style) { - return this.invoke('setStyle', style); - }, - - bringToFront: function () { - return this.invoke('bringToFront'); - }, - bringToBack: function () { - return this.invoke('bringToBack'); + if (size) { + img.style.width = size.x + 'px'; + img.style.height = size.y + 'px'; + } }, - getBounds: function () { - var bounds = new L.LatLngBounds(); - - this.eachLayer(function (layer) { - bounds.extend(layer instanceof L.Marker ? layer.getLatLng() : layer.getBounds()); - }); - - return bounds; + _createImg: function (src, el) { + el = el || document.createElement('img'); + el.src = src; + return el; }, - _propagateEvent: function (e) { - e = L.extend({ - layer: e.target, - target: this - }, e); - this.fire(e.type, e); + _getIconUrl: function (name) { + return L.Browser.retina && this.options[name + 'RetinaUrl'] || this.options[name + 'Url']; } }); -L.featureGroup = function (layers) { - return new L.FeatureGroup(layers); + +// @factory L.icon(options: Icon options) +// Creates an icon instance with the given options. +L.icon = function (options) { + return new L.Icon(options); }; + /* - * L.Path is a base class for rendering vector paths on a map. Inherited by Polyline, Circle, etc. + * @miniclass Icon.Default (Icon) + * @aka L.Icon.Default + * @section + * + * A trivial subclass of `Icon`, represents the icon to use in `Marker`s when + * no icon is specified. Points to the blue marker image distributed with Leaflet + * releases. + * + * In order to customize the default icon, just change the properties of `L.Icon.Default.prototype.options` + * (which is a set of `Icon options`). + * + * If you want to _completely_ replace the default icon, override the + * `L.Marker.prototype.options.icon` with your own icon instead. */ -L.Path = L.Class.extend({ - includes: [L.Mixin.Events], +L.Icon.Default = L.Icon.extend({ - statics: { - // how much to extend the clip area around the map view - // (relative to its size, e.g. 0.5 is half the screen in each direction) - // set it so that SVG element doesn't exceed 1280px (vectors flicker on dragend if it is) - CLIP_PADDING: (function () { - var max = L.Browser.mobile ? 1280 : 2000, - target = (max / Math.max(window.outerWidth, window.outerHeight) - 1) / 2; - return Math.max(0, Math.min(0.5, target)); - })() + options: { + iconUrl: 'marker-icon.png', + iconRetinaUrl: 'marker-icon-2x.png', + shadowUrl: 'marker-shadow.png', + iconSize: [25, 41], + iconAnchor: [12, 41], + popupAnchor: [1, -34], + tooltipAnchor: [16, -28], + shadowSize: [41, 41] }, - options: { - stroke: true, - color: '#0033ff', - dashArray: null, - lineCap: null, - lineJoin: null, - weight: 5, - opacity: 0.5, - - fill: false, - fillColor: null, //same as color by default - fillOpacity: 0.2, + _getIconUrl: function (name) { + if (!L.Icon.Default.imagePath) { // Deprecated, backwards-compatibility only + L.Icon.Default.imagePath = this._detectIconPath(); + } - clickable: true + // @option imagePath: String + // `L.Icon.Default` will try to auto-detect the absolute location of the + // blue icon images. If you are placing these images in a non-standard + // way, set this option to point to the right absolute path. + return (this.options.imagePath || L.Icon.Default.imagePath) + L.Icon.prototype._getIconUrl.call(this, name); }, - initialize: function (options) { - L.setOptions(this, options); - }, + _detectIconPath: function () { + var el = L.DomUtil.create('div', 'leaflet-default-icon-path', document.body); + var path = L.DomUtil.getStyle(el, 'background-image') || + L.DomUtil.getStyle(el, 'backgroundImage'); // IE8 - onAdd: function (map) { - this._map = map; + document.body.removeChild(el); - if (!this._container) { - this._initElements(); - this._initEvents(); - } + return path.indexOf('url') === 0 ? + path.replace(/^url\([\"\']?/, '').replace(/marker-icon\.png[\"\']?\)$/, '') : ''; + } +}); - this.projectLatlngs(); - this._updatePath(); - if (this._container) { - this._map._pathRoot.appendChild(this._container); - } - this.fire('add'); +/* + * @class Marker + * @inherits Interactive layer + * @aka L.Marker + * L.Marker is used to display clickable/draggable icons on the map. Extends `Layer`. + * + * @example + * + * ```js + * L.marker([50.5, 30.5]).addTo(map); + * ``` + */ - map.on({ - 'viewreset': this.projectLatlngs, - 'moveend': this._updatePath - }, this); - }, +L.Marker = L.Layer.extend({ - addTo: function (map) { - map.addLayer(this); - return this; - }, + // @section + // @aka Marker options + options: { + // @option icon: Icon = * + // Icon class to use for rendering the marker. See [Icon documentation](#L.Icon) for details on how to customize the marker icon. If not specified, a new `L.Icon.Default` is used. + icon: new L.Icon.Default(), - onRemove: function (map) { - map._pathRoot.removeChild(this._container); + // Option inherited from "Interactive layer" abstract class + interactive: true, - // Need to fire remove event before we set _map to null as the event hooks might need the object - this.fire('remove'); - this._map = null; + // @option draggable: Boolean = false + // Whether the marker is draggable with mouse/touch or not. + draggable: false, - if (L.Browser.vml) { - this._container = null; - this._stroke = null; - this._fill = null; - } + // @option keyboard: Boolean = true + // Whether the marker can be tabbed to with a keyboard and clicked by pressing enter. + keyboard: true, - map.off({ - 'viewreset': this.projectLatlngs, - 'moveend': this._updatePath - }, this); - }, + // @option title: String = '' + // Text for the browser tooltip that appear on marker hover (no tooltip by default). + title: '', - projectLatlngs: function () { - // do all projection stuff here - }, + // @option alt: String = '' + // Text for the `alt` attribute of the icon image (useful for accessibility). + alt: '', - setStyle: function (style) { - L.setOptions(this, style); + // @option zIndexOffset: Number = 0 + // By default, marker images zIndex is set automatically based on its latitude. Use this option if you want to put the marker on top of all others (or below), specifying a high value like `1000` (or high negative value, respectively). + zIndexOffset: 0, - if (this._container) { - this._updateStyle(); - } + // @option opacity: Number = 1.0 + // The opacity of the marker. + opacity: 1, - return this; - }, + // @option riseOnHover: Boolean = false + // If `true`, the marker will get on top of others when you hover the mouse over it. + riseOnHover: false, - redraw: function () { - if (this._map) { - this.projectLatlngs(); - this._updatePath(); - } - return this; - } -}); + // @option riseOffset: Number = 250 + // The z-index offset used for the `riseOnHover` feature. + riseOffset: 250, -L.Map.include({ - _updatePathViewport: function () { - var p = L.Path.CLIP_PADDING, - size = this.getSize(), - panePos = L.DomUtil.getPosition(this._mapPane), - min = panePos.multiplyBy(-1)._subtract(size.multiplyBy(p)._round()), - max = min.add(size.multiplyBy(1 + p * 2)._round()); + // @option pane: String = 'markerPane' + // `Map pane` where the markers icon will be added. + pane: 'markerPane', - this._pathViewport = new L.Bounds(min, max); - } -}); + // FIXME: shadowPane is no longer a valid option + nonBubblingEvents: ['click', 'dblclick', 'mouseover', 'mouseout', 'contextmenu'] + }, + /* @section + * + * In addition to [shared layer methods](#Layer) like `addTo()` and `remove()` and [popup methods](#Popup) like bindPopup() you can also use the following methods: + */ -/* - * Extends L.Path with SVG-specific rendering code. - */ + initialize: function (latlng, options) { + L.setOptions(this, options); + this._latlng = L.latLng(latlng); + }, -L.Path.SVG_NS = 'http://www.w3.org/2000/svg'; + onAdd: function (map) { + this._zoomAnimated = this._zoomAnimated && map.options.markerZoomAnimation; -L.Browser.svg = !!(document.createElementNS && document.createElementNS(L.Path.SVG_NS, 'svg').createSVGRect); + if (this._zoomAnimated) { + map.on('zoomanim', this._animateZoom, this); + } -L.Path = L.Path.extend({ - statics: { - SVG: L.Browser.svg + this._initIcon(); + this.update(); }, - bringToFront: function () { - var root = this._map._pathRoot, - path = this._container; + onRemove: function (map) { + if (this.dragging && this.dragging.enabled()) { + this.options.draggable = true; + this.dragging.removeHooks(); + } - if (path && root.lastChild !== path) { - root.appendChild(path); + if (this._zoomAnimated) { + map.off('zoomanim', this._animateZoom, this); } - return this; - }, - bringToBack: function () { - var root = this._map._pathRoot, - path = this._container, - first = root.firstChild; + this._removeIcon(); + this._removeShadow(); + }, - if (path && first !== path) { - root.insertBefore(path, first); - } - return this; + getEvents: function () { + return { + zoom: this.update, + viewreset: this.update + }; }, - getPathString: function () { - // form path string here + // @method getLatLng: LatLng + // Returns the current geographical position of the marker. + getLatLng: function () { + return this._latlng; }, - _createElement: function (name) { - return document.createElementNS(L.Path.SVG_NS, name); + // @method setLatLng(latlng: LatLng): this + // Changes the marker position to the given point. + setLatLng: function (latlng) { + var oldLatLng = this._latlng; + this._latlng = L.latLng(latlng); + this.update(); + + // @event move: Event + // Fired when the marker is moved via [`setLatLng`](#marker-setlatlng) or by [dragging](#marker-dragging). Old and new coordinates are included in event arguments as `oldLatLng`, `latlng`. + return this.fire('move', {oldLatLng: oldLatLng, latlng: this._latlng}); }, - _initElements: function () { - this._map._initPathRoot(); - this._initPath(); - this._initStyle(); + // @method setZIndexOffset(offset: Number): this + // Changes the [zIndex offset](#marker-zindexoffset) of the marker. + setZIndexOffset: function (offset) { + this.options.zIndexOffset = offset; + return this.update(); }, - _initPath: function () { - this._container = this._createElement('g'); + // @method setIcon(icon: Icon): this + // Changes the marker icon. + setIcon: function (icon) { + + this.options.icon = icon; - this._path = this._createElement('path'); + if (this._map) { + this._initIcon(); + this.update(); + } - if (this.options.className) { - L.DomUtil.addClass(this._path, this.options.className); + if (this._popup) { + this.bindPopup(this._popup, this._popup.options); } - this._container.appendChild(this._path); + return this; }, - _initStyle: function () { - if (this.options.stroke) { - this._path.setAttribute('stroke-linejoin', 'round'); - this._path.setAttribute('stroke-linecap', 'round'); - } - if (this.options.fill) { - this._path.setAttribute('fill-rule', 'evenodd'); - } - if (this.options.pointerEvents) { - this._path.setAttribute('pointer-events', this.options.pointerEvents); - } - if (!this.options.clickable && !this.options.pointerEvents) { - this._path.setAttribute('pointer-events', 'none'); - } - this._updateStyle(); + getElement: function () { + return this._icon; }, - _updateStyle: function () { - if (this.options.stroke) { - this._path.setAttribute('stroke', this.options.color); - this._path.setAttribute('stroke-opacity', this.options.opacity); - this._path.setAttribute('stroke-width', this.options.weight); - if (this.options.dashArray) { - this._path.setAttribute('stroke-dasharray', this.options.dashArray); - } else { - this._path.removeAttribute('stroke-dasharray'); - } - if (this.options.lineCap) { - this._path.setAttribute('stroke-linecap', this.options.lineCap); - } - if (this.options.lineJoin) { - this._path.setAttribute('stroke-linejoin', this.options.lineJoin); - } - } else { - this._path.setAttribute('stroke', 'none'); - } - if (this.options.fill) { - this._path.setAttribute('fill', this.options.fillColor || this.options.color); - this._path.setAttribute('fill-opacity', this.options.fillOpacity); - } else { - this._path.setAttribute('fill', 'none'); - } - }, + update: function () { - _updatePath: function () { - var str = this.getPathString(); - if (!str) { - // fix webkit empty string parsing bug - str = 'M0 0'; + if (this._icon) { + var pos = this._map.latLngToLayerPoint(this._latlng).round(); + this._setPos(pos); } - this._path.setAttribute('d', str); + + return this; }, - // TODO remove duplication with L.Map - _initEvents: function () { - if (this.options.clickable) { - if (L.Browser.svg || !L.Browser.vml) { - L.DomUtil.addClass(this._path, 'leaflet-clickable'); - } + _initIcon: function () { + var options = this.options, + classToAdd = 'leaflet-zoom-' + (this._zoomAnimated ? 'animated' : 'hide'); + + var icon = options.icon.createIcon(this._icon), + addIcon = false; - L.DomEvent.on(this._container, 'click', this._onMouseClick, this); + // if we're not reusing the icon, remove the old one and init new one + if (icon !== this._icon) { + if (this._icon) { + this._removeIcon(); + } + addIcon = true; - var events = ['dblclick', 'mousedown', 'mouseover', - 'mouseout', 'mousemove', 'contextmenu']; - for (var i = 0; i < events.length; i++) { - L.DomEvent.on(this._container, events[i], this._fireMouseEvent, this); + if (options.title) { + icon.title = options.title; + } + if (options.alt) { + icon.alt = options.alt; } } - }, - _onMouseClick: function (e) { - if (this._map.dragging && this._map.dragging.moved()) { return; } + L.DomUtil.addClass(icon, classToAdd); - this._fireMouseEvent(e); - }, + if (options.keyboard) { + icon.tabIndex = '0'; + } - _fireMouseEvent: function (e) { - if (!this.hasEventListeners(e.type)) { return; } + this._icon = icon; - var map = this._map, - containerPoint = map.mouseEventToContainerPoint(e), - layerPoint = map.containerPointToLayerPoint(containerPoint), - latlng = map.layerPointToLatLng(layerPoint); + if (options.riseOnHover) { + this.on({ + mouseover: this._bringToFront, + mouseout: this._resetZIndex + }); + } - this.fire(e.type, { - latlng: latlng, - layerPoint: layerPoint, - containerPoint: containerPoint, - originalEvent: e - }); + var newShadow = options.icon.createShadow(this._shadow), + addShadow = false; - if (e.type === 'contextmenu') { - L.DomEvent.preventDefault(e); + if (newShadow !== this._shadow) { + this._removeShadow(); + addShadow = true; } - if (e.type !== 'mousemove') { - L.DomEvent.stopPropagation(e); + + if (newShadow) { + L.DomUtil.addClass(newShadow, classToAdd); + newShadow.alt = ''; } - } -}); + this._shadow = newShadow; -L.Map.include({ - _initPathRoot: function () { - if (!this._pathRoot) { - this._pathRoot = L.Path.prototype._createElement('svg'); - this._panes.overlayPane.appendChild(this._pathRoot); - if (this.options.zoomAnimation && L.Browser.any3d) { - L.DomUtil.addClass(this._pathRoot, 'leaflet-zoom-animated'); + if (options.opacity < 1) { + this._updateOpacity(); + } - this.on({ - 'zoomanim': this._animatePathZoom, - 'zoomend': this._endPathZoom - }); - } else { - L.DomUtil.addClass(this._pathRoot, 'leaflet-zoom-hide'); - } - this.on('moveend', this._updateSvgViewport); - this._updateSvgViewport(); + if (addIcon) { + this.getPane().appendChild(this._icon); + } + this._initInteraction(); + if (newShadow && addShadow) { + this.getPane('shadowPane').appendChild(this._shadow); } }, - _animatePathZoom: function (e) { - var scale = this.getZoomScale(e.zoom), - offset = this._getCenterOffset(e.center)._multiplyBy(-scale)._add(this._pathViewport.min); + _removeIcon: function () { + if (this.options.riseOnHover) { + this.off({ + mouseover: this._bringToFront, + mouseout: this._resetZIndex + }); + } - this._pathRoot.style[L.DomUtil.TRANSFORM] = - L.DomUtil.getTranslateString(offset) + ' scale(' + scale + ') '; + L.DomUtil.remove(this._icon); + this.removeInteractiveTarget(this._icon); - this._pathZooming = true; + this._icon = null; }, - _endPathZoom: function () { - this._pathZooming = false; + _removeShadow: function () { + if (this._shadow) { + L.DomUtil.remove(this._shadow); + } + this._shadow = null; }, - _updateSvgViewport: function () { + _setPos: function (pos) { + L.DomUtil.setPosition(this._icon, pos); - if (this._pathZooming) { - // Do not update SVGs while a zoom animation is going on otherwise the animation will break. - // When the zoom animation ends we will be updated again anyway - // This fixes the case where you do a momentum move and zoom while the move is still ongoing. - return; + if (this._shadow) { + L.DomUtil.setPosition(this._shadow, pos); } - this._updatePathViewport(); + this._zIndex = pos.y + this.options.zIndexOffset; - var vp = this._pathViewport, - min = vp.min, - max = vp.max, - width = max.x - min.x, - height = max.y - min.y, - root = this._pathRoot, - pane = this._panes.overlayPane; + this._resetZIndex(); + }, - // Hack to make flicker on drag end on mobile webkit less irritating - if (L.Browser.mobileWebkit) { - pane.removeChild(root); - } + _updateZIndex: function (offset) { + this._icon.style.zIndex = this._zIndex + offset; + }, - L.DomUtil.setPosition(root, min); - root.setAttribute('width', width); - root.setAttribute('height', height); - root.setAttribute('viewBox', [min.x, min.y, width, height].join(' ')); + _animateZoom: function (opt) { + var pos = this._map._latLngToNewLayerPoint(this._latlng, opt.zoom, opt.center).round(); - if (L.Browser.mobileWebkit) { - pane.appendChild(root); - } - } -}); + this._setPos(pos); + }, + _initInteraction: function () { -/* - * Popup extension to L.Path (polylines, polygons, circles), adding popup-related methods. - */ + if (!this.options.interactive) { return; } -L.Path.include({ + L.DomUtil.addClass(this._icon, 'leaflet-interactive'); - bindPopup: function (content, options) { + this.addInteractiveTarget(this._icon); - if (content instanceof L.Popup) { - this._popup = content; - } else { - if (!this._popup || options) { - this._popup = new L.Popup(options, this); + if (L.Handler.MarkerDrag) { + var draggable = this.options.draggable; + if (this.dragging) { + draggable = this.dragging.enabled(); + this.dragging.disable(); } - this._popup.setContent(content); - } - if (!this._popupHandlersAdded) { - this - .on('click', this._openPopup, this) - .on('remove', this.closePopup, this); + this.dragging = new L.Handler.MarkerDrag(this); - this._popupHandlersAdded = true; + if (draggable) { + this.dragging.enable(); + } } - - return this; }, - unbindPopup: function () { - if (this._popup) { - this._popup = null; - this - .off('click', this._openPopup) - .off('remove', this.closePopup); - - this._popupHandlersAdded = false; + // @method setOpacity(opacity: Number): this + // Changes the opacity of the marker. + setOpacity: function (opacity) { + this.options.opacity = opacity; + if (this._map) { + this._updateOpacity(); } + return this; }, - openPopup: function (latlng) { + _updateOpacity: function () { + var opacity = this.options.opacity; - if (this._popup) { - // open the popup from one of the path's points if not specified - latlng = latlng || this._latlng || - this._latlngs[Math.floor(this._latlngs.length / 2)]; + L.DomUtil.setOpacity(this._icon, opacity); - this._openPopup({latlng: latlng}); + if (this._shadow) { + L.DomUtil.setOpacity(this._shadow, opacity); } + }, - return this; + _bringToFront: function () { + this._updateZIndex(this.options.riseOffset); }, - closePopup: function () { - if (this._popup) { - this._popup._close(); - } - return this; + _resetZIndex: function () { + this._updateZIndex(0); }, - _openPopup: function (e) { - this._popup.setLatLng(e.latlng); - this._map.openPopup(this._popup); + _getPopupAnchor: function () { + return this.options.icon.options.popupAnchor || [0, 0]; + }, + + _getTooltipAnchor: function () { + return this.options.icon.options.tooltipAnchor || [0, 0]; } }); -/* - * Vector rendering for IE6-8 through VML. - * Thanks to Dmitry Baranovsky and his Raphael library for inspiration! - */ +// factory L.marker(latlng: LatLng, options? : Marker options) -L.Browser.vml = !L.Browser.svg && (function () { - try { - var div = document.createElement('div'); - div.innerHTML = ''; - - var shape = div.firstChild; - shape.style.behavior = 'url(#default#VML)'; - - return shape && (typeof shape.adj === 'object'); - - } catch (e) { - return false; - } -}()); - -L.Path = L.Browser.svg || !L.Browser.vml ? L.Path : L.Path.extend({ - statics: { - VML: true, - CLIP_PADDING: 0.02 - }, +// @factory L.marker(latlng: LatLng, options? : Marker options) +// Instantiates a Marker object given a geographical point and optionally an options object. +L.marker = function (latlng, options) { + return new L.Marker(latlng, options); +}; - _createElement: (function () { - try { - document.namespaces.add('lvml', 'urn:schemas-microsoft-com:vml'); - return function (name) { - return document.createElement(''); - }; - } catch (e) { - return function (name) { - return document.createElement( - '<' + name + ' xmlns="urn:schemas-microsoft.com:vml" class="lvml">'); - }; - } - }()), - _initPath: function () { - var container = this._container = this._createElement('shape'); - L.DomUtil.addClass(container, 'leaflet-vml-shape' + - (this.options.className ? ' ' + this.options.className : '')); +/* + * @class DivIcon + * @aka L.DivIcon + * @inherits Icon + * + * Represents a lightweight icon for markers that uses a simple `
    ` + * element instead of an image. Inherits from `Icon` but ignores the `iconUrl` and shadow options. + * + * @example + * ```js + * var myIcon = L.divIcon({className: 'my-div-icon'}); + * // you can set .my-div-icon styles in CSS + * + * L.marker([50.505, 30.57], {icon: myIcon}).addTo(map); + * ``` + * + * By default, it has a 'leaflet-div-icon' CSS class and is styled as a little white square with a shadow. + */ - if (this.options.clickable) { - L.DomUtil.addClass(container, 'leaflet-clickable'); - } +L.DivIcon = L.Icon.extend({ + options: { + // @section + // @aka DivIcon options + iconSize: [12, 12], // also can be set through CSS - container.coordsize = '1 1'; + // iconAnchor: (Point), + // popupAnchor: (Point), - this._path = this._createElement('path'); - container.appendChild(this._path); + // @option html: String = '' + // Custom HTML code to put inside the div element, empty by default. + html: false, - this._map._pathRoot.appendChild(container); - }, + // @option bgPos: Point = [0, 0] + // Optional relative position of the background, in pixels + bgPos: null, - _initStyle: function () { - this._updateStyle(); + className: 'leaflet-div-icon' }, - _updateStyle: function () { - var stroke = this._stroke, - fill = this._fill, - options = this.options, - container = this._container; - - container.stroked = options.stroke; - container.filled = options.fill; - - if (options.stroke) { - if (!stroke) { - stroke = this._stroke = this._createElement('stroke'); - stroke.endcap = 'round'; - container.appendChild(stroke); - } - stroke.weight = options.weight + 'px'; - stroke.color = options.color; - stroke.opacity = options.opacity; + createIcon: function (oldIcon) { + var div = (oldIcon && oldIcon.tagName === 'DIV') ? oldIcon : document.createElement('div'), + options = this.options; - if (options.dashArray) { - stroke.dashStyle = L.Util.isArray(options.dashArray) ? - options.dashArray.join(' ') : - options.dashArray.replace(/( *, *)/g, ' '); - } else { - stroke.dashStyle = ''; - } - if (options.lineCap) { - stroke.endcap = options.lineCap.replace('butt', 'flat'); - } - if (options.lineJoin) { - stroke.joinstyle = options.lineJoin; - } + div.innerHTML = options.html !== false ? options.html : ''; - } else if (stroke) { - container.removeChild(stroke); - this._stroke = null; + if (options.bgPos) { + var bgPos = L.point(options.bgPos); + div.style.backgroundPosition = (-bgPos.x) + 'px ' + (-bgPos.y) + 'px'; } + this._setIconStyles(div, 'icon'); - if (options.fill) { - if (!fill) { - fill = this._fill = this._createElement('fill'); - container.appendChild(fill); - } - fill.color = options.fillColor || options.color; - fill.opacity = options.fillOpacity; - - } else if (fill) { - container.removeChild(fill); - this._fill = null; - } + return div; }, - _updatePath: function () { - var style = this._container.style; - - style.display = 'none'; - this._path.v = this.getPathString() + ' '; // the space fixes IE empty path string bug - style.display = ''; + createShadow: function () { + return null; } }); -L.Map.include(L.Browser.svg || !L.Browser.vml ? {} : { - _initPathRoot: function () { - if (this._pathRoot) { return; } - - var root = this._pathRoot = document.createElement('div'); - root.className = 'leaflet-vml-container'; - this._panes.overlayPane.appendChild(root); +// @factory L.divIcon(options: DivIcon options) +// Creates a `DivIcon` instance with the given options. +L.divIcon = function (options) { + return new L.DivIcon(options); +}; - this.on('moveend', this._updatePathViewport); - this._updatePathViewport(); - } -}); /* - * Vector rendering for all browsers that support canvas. + * @class DivOverlay + * @inherits Layer + * @aka L.DivOverlay + * Base model for L.Popup and L.Tooltip. Inherit from it for custom popup like plugins. */ -L.Browser.canvas = (function () { - return !!document.createElement('canvas').getContext; -}()); +// @namespace DivOverlay +L.DivOverlay = L.Layer.extend({ -L.Path = (L.Path.SVG && !window.L_PREFER_CANVAS) || !L.Browser.canvas ? L.Path : L.Path.extend({ - statics: { - //CLIP_PADDING: 0.02, // not sure if there's a need to set it to a small value - CANVAS: true, - SVG: false - }, + // @section + // @aka DivOverlay options + options: { + // @option offset: Point = Point(0, 7) + // The offset of the popup position. Useful to control the anchor + // of the popup when opening it on some overlays. + offset: [0, 7], - redraw: function () { - if (this._map) { - this.projectLatlngs(); - this._requestUpdate(); - } - return this; + // @option className: String = '' + // A custom CSS class name to assign to the popup. + className: '', + + // @option pane: String = 'popupPane' + // `Map pane` where the popup will be added. + pane: 'popupPane' }, - setStyle: function (style) { - L.setOptions(this, style); + initialize: function (options, source) { + L.setOptions(this, options); - if (this._map) { - this._updateStyle(); - this._requestUpdate(); - } - return this; + this._source = source; }, - onRemove: function (map) { - map - .off('viewreset', this.projectLatlngs, this) - .off('moveend', this._updatePath, this); + onAdd: function (map) { + this._zoomAnimated = map._zoomAnimated; - if (this.options.clickable) { - this._map.off('click', this._onClick, this); - this._map.off('mousemove', this._onMouseMove, this); + if (!this._container) { + this._initLayout(); } - this._requestUpdate(); - - this.fire('remove'); - this._map = null; - }, + if (map._fadeAnimated) { + L.DomUtil.setOpacity(this._container, 0); + } - _requestUpdate: function () { - if (this._map && !L.Path._updateRequest) { - L.Path._updateRequest = L.Util.requestAnimFrame(this._fireMapMoveEnd, this._map); + clearTimeout(this._removeTimeout); + this.getPane().appendChild(this._container); + this.update(); + + if (map._fadeAnimated) { + L.DomUtil.setOpacity(this._container, 1); } - }, - _fireMapMoveEnd: function () { - L.Path._updateRequest = null; - this.fire('moveend'); + this.bringToFront(); }, - _initElements: function () { - this._map._initPathRoot(); - this._ctx = this._map._canvasCtx; + onRemove: function (map) { + if (map._fadeAnimated) { + L.DomUtil.setOpacity(this._container, 0); + this._removeTimeout = setTimeout(L.bind(L.DomUtil.remove, L.DomUtil, this._container), 200); + } else { + L.DomUtil.remove(this._container); + } }, - _updateStyle: function () { - var options = this.options; + // @namespace Popup + // @method getLatLng: LatLng + // Returns the geographical point of popup. + getLatLng: function () { + return this._latlng; + }, - if (options.stroke) { - this._ctx.lineWidth = options.weight; - this._ctx.strokeStyle = options.color; - } - if (options.fill) { - this._ctx.fillStyle = options.fillColor || options.color; + // @method setLatLng(latlng: LatLng): this + // Sets the geographical point where the popup will open. + setLatLng: function (latlng) { + this._latlng = L.latLng(latlng); + if (this._map) { + this._updatePosition(); + this._adjustPan(); } + return this; }, - _drawPath: function () { - var i, j, len, len2, point, drawMethod; - - this._ctx.beginPath(); - - for (i = 0, len = this._parts.length; i < len; i++) { - for (j = 0, len2 = this._parts[i].length; j < len2; j++) { - point = this._parts[i][j]; - drawMethod = (j === 0 ? 'move' : 'line') + 'To'; + // @method getContent: String|HTMLElement + // Returns the content of the popup. + getContent: function () { + return this._content; + }, - this._ctx[drawMethod](point.x, point.y); - } - // TODO refactor ugly hack - if (this instanceof L.Polygon) { - this._ctx.closePath(); - } - } + // @method setContent(htmlContent: String|HTMLElement|Function): this + // Sets the HTML content of the popup. If a function is passed the source layer will be passed to the function. The function should return a `String` or `HTMLElement` to be used in the popup. + setContent: function (content) { + this._content = content; + this.update(); + return this; }, - _checkIfEmpty: function () { - return !this._parts.length; + // @method getElement: String|HTMLElement + // Alias for [getContent()](#popup-getcontent) + getElement: function () { + return this._container; }, - _updatePath: function () { - if (this._checkIfEmpty()) { return; } + // @method update: null + // Updates the popup content, layout and position. Useful for updating the popup after something inside changed, e.g. image loaded. + update: function () { + if (!this._map) { return; } - var ctx = this._ctx, - options = this.options; + this._container.style.visibility = 'hidden'; - this._drawPath(); - ctx.save(); - this._updateStyle(); + this._updateContent(); + this._updateLayout(); + this._updatePosition(); - if (options.fill) { - ctx.globalAlpha = options.fillOpacity; - ctx.fill(); - } + this._container.style.visibility = ''; - if (options.stroke) { - ctx.globalAlpha = options.opacity; - ctx.stroke(); - } + this._adjustPan(); + }, + + getEvents: function () { + var events = { + zoom: this._updatePosition, + viewreset: this._updatePosition + }; - ctx.restore(); + if (this._zoomAnimated) { + events.zoomanim = this._animateZoom; + } + return events; + }, - // TODO optimization: 1 fill/stroke for all features with equal style instead of 1 for each feature + // @method isOpen: Boolean + // Returns `true` when the popup is visible on the map. + isOpen: function () { + return !!this._map && this._map.hasLayer(this); }, - _initEvents: function () { - if (this.options.clickable) { - // TODO dblclick - this._map.on('mousemove', this._onMouseMove, this); - this._map.on('click', this._onClick, this); + // @method bringToFront: this + // Brings this popup in front of other popups (in the same map pane). + bringToFront: function () { + if (this._map) { + L.DomUtil.toFront(this._container); } + return this; }, - _onClick: function (e) { - if (this._containsPoint(e.layerPoint)) { - this.fire('click', e); + // @method bringToBack: this + // Brings this popup to the back of other popups (in the same map pane). + bringToBack: function () { + if (this._map) { + L.DomUtil.toBack(this._container); } + return this; }, - _onMouseMove: function (e) { - if (!this._map || this._map._animatingZoom) { return; } + _updateContent: function () { + if (!this._content) { return; } - // TODO don't do on each move - if (this._containsPoint(e.layerPoint)) { - this._ctx.canvas.style.cursor = 'pointer'; - this._mouseInside = true; - this.fire('mouseover', e); + var node = this._contentNode; + var content = (typeof this._content === 'function') ? this._content(this._source || this) : this._content; - } else if (this._mouseInside) { - this._ctx.canvas.style.cursor = ''; - this._mouseInside = false; - this.fire('mouseout', e); + if (typeof content === 'string') { + node.innerHTML = content; + } else { + while (node.hasChildNodes()) { + node.removeChild(node.firstChild); + } + node.appendChild(content); } - } -}); - -L.Map.include((L.Path.SVG && !window.L_PREFER_CANVAS) || !L.Browser.canvas ? {} : { - _initPathRoot: function () { - var root = this._pathRoot, - ctx; - - if (!root) { - root = this._pathRoot = document.createElement('canvas'); - root.style.position = 'absolute'; - ctx = this._canvasCtx = root.getContext('2d'); + this.fire('contentupdate'); + }, - ctx.lineCap = 'round'; - ctx.lineJoin = 'round'; + _updatePosition: function () { + if (!this._map) { return; } - this._panes.overlayPane.appendChild(root); + var pos = this._map.latLngToLayerPoint(this._latlng), + offset = L.point(this.options.offset), + anchor = this._getAnchor(); - if (this.options.zoomAnimation) { - this._pathRoot.className = 'leaflet-zoom-animated'; - this.on('zoomanim', this._animatePathZoom); - this.on('zoomend', this._endPathZoom); - } - this.on('moveend', this._updateCanvasViewport); - this._updateCanvasViewport(); + if (this._zoomAnimated) { + L.DomUtil.setPosition(this._container, pos.add(anchor)); + } else { + offset = offset.add(pos).add(anchor); } - }, - _updateCanvasViewport: function () { - // don't redraw while zooming. See _updateSvgViewport for more details - if (this._pathZooming) { return; } - this._updatePathViewport(); + var bottom = this._containerBottom = -offset.y, + left = this._containerLeft = -Math.round(this._containerWidth / 2) + offset.x; - var vp = this._pathViewport, - min = vp.min, - size = vp.max.subtract(min), - root = this._pathRoot; + // bottom position the popup in case the height of the popup changes (images loading etc) + this._container.style.bottom = bottom + 'px'; + this._container.style.left = left + 'px'; + }, - //TODO check if this works properly on mobile webkit - L.DomUtil.setPosition(root, min); - root.width = size.x; - root.height = size.y; - root.getContext('2d').translate(-min.x, -min.y); + _getAnchor: function () { + return [0, 0]; } + }); + /* - * L.LineUtil contains different utility functions for line segments - * and polylines (clipping, simplification, distances, etc.) + * @class Popup + * @inherits DivOverlay + * @aka L.Popup + * Used to open popups in certain places of the map. Use [Map.openPopup](#map-openpopup) to + * open popups while making sure that only one popup is open at one time + * (recommended for usability), or use [Map.addLayer](#map-addlayer) to open as many as you want. + * + * @example + * + * If you want to just bind a popup to marker click and then open it, it's really easy: + * + * ```js + * marker.bindPopup(popupContent).openPopup(); + * ``` + * Path overlays like polylines also have a `bindPopup` method. + * Here's a more complicated way to open a popup on a map: + * + * ```js + * var popup = L.popup() + * .setLatLng(latlng) + * .setContent('

    Hello world!
    This is a nice popup.

    ') + * .openOn(map); + * ``` */ -/*jshint bitwise:false */ // allow bitwise operations for this file -L.LineUtil = { +// @namespace Popup +L.Popup = L.DivOverlay.extend({ - // Simplify polyline with vertex reduction and Douglas-Peucker simplification. - // Improves rendering performance dramatically by lessening the number of points to draw. + // @section + // @aka Popup options + options: { + // @option maxWidth: Number = 300 + // Max width of the popup, in pixels. + maxWidth: 300, - simplify: function (/*Point[]*/ points, /*Number*/ tolerance) { - if (!tolerance || !points.length) { - return points.slice(); - } + // @option minWidth: Number = 50 + // Min width of the popup, in pixels. + minWidth: 50, - var sqTolerance = tolerance * tolerance; + // @option maxHeight: Number = null + // If set, creates a scrollable container of the given height + // inside a popup if its content exceeds it. + maxHeight: null, - // stage 1: vertex reduction - points = this._reducePoints(points, sqTolerance); + // @option autoPan: Boolean = true + // Set it to `false` if you don't want the map to do panning animation + // to fit the opened popup. + autoPan: true, - // stage 2: Douglas-Peucker simplification - points = this._simplifyDP(points, sqTolerance); + // @option autoPanPaddingTopLeft: Point = null + // The margin between the popup and the top left corner of the map + // view after autopanning was performed. + autoPanPaddingTopLeft: null, - return points; - }, + // @option autoPanPaddingBottomRight: Point = null + // The margin between the popup and the bottom right corner of the map + // view after autopanning was performed. + autoPanPaddingBottomRight: null, - // distance from a point to a segment between two points - pointToSegmentDistance: function (/*Point*/ p, /*Point*/ p1, /*Point*/ p2) { - return Math.sqrt(this._sqClosestPointOnSegment(p, p1, p2, true)); - }, + // @option autoPanPadding: Point = Point(5, 5) + // Equivalent of setting both top left and bottom right autopan padding to the same value. + autoPanPadding: [5, 5], - closestPointOnSegment: function (/*Point*/ p, /*Point*/ p1, /*Point*/ p2) { - return this._sqClosestPointOnSegment(p, p1, p2); - }, + // @option keepInView: Boolean = false + // Set it to `true` if you want to prevent users from panning the popup + // off of the screen while it is open. + keepInView: false, - // Douglas-Peucker simplification, see http://en.wikipedia.org/wiki/Douglas-Peucker_algorithm - _simplifyDP: function (points, sqTolerance) { + // @option closeButton: Boolean = true + // Controls the presence of a close button in the popup. + closeButton: true, - var len = points.length, - ArrayConstructor = typeof Uint8Array !== undefined + '' ? Uint8Array : Array, - markers = new ArrayConstructor(len); + // @option autoClose: Boolean = true + // Set it to `false` if you want to override the default behavior of + // the popup closing when user clicks the map (set globally by + // the Map's [closePopupOnClick](#map-closepopuponclick) option). + autoClose: true, - markers[0] = markers[len - 1] = 1; + // @option className: String = '' + // A custom CSS class name to assign to the popup. + className: '' + }, - this._simplifyDPStep(points, markers, sqTolerance, 0, len - 1); + // @namespace Popup + // @method openOn(map: Map): this + // Adds the popup to the map and closes the previous one. The same as `map.openPopup(popup)`. + openOn: function (map) { + map.openPopup(this); + return this; + }, - var i, - newPoints = []; + onAdd: function (map) { + L.DivOverlay.prototype.onAdd.call(this, map); - for (i = 0; i < len; i++) { - if (markers[i]) { - newPoints.push(points[i]); + // @namespace Map + // @section Popup events + // @event popupopen: PopupEvent + // Fired when a popup is opened in the map + map.fire('popupopen', {popup: this}); + + if (this._source) { + // @namespace Layer + // @section Popup events + // @event popupopen: PopupEvent + // Fired when a popup bound to this layer is opened + this._source.fire('popupopen', {popup: this}, true); + // For non-path layers, we toggle the popup when clicking + // again the layer, so prevent the map to reopen it. + if (!(this._source instanceof L.Path)) { + this._source.on('preclick', L.DomEvent.stopPropagation); } } - - return newPoints; }, - _simplifyDPStep: function (points, markers, sqTolerance, first, last) { + onRemove: function (map) { + L.DivOverlay.prototype.onRemove.call(this, map); - var maxSqDist = 0, - index, i, sqDist; + // @namespace Map + // @section Popup events + // @event popupclose: PopupEvent + // Fired when a popup in the map is closed + map.fire('popupclose', {popup: this}); + + if (this._source) { + // @namespace Layer + // @section Popup events + // @event popupclose: PopupEvent + // Fired when a popup bound to this layer is closed + this._source.fire('popupclose', {popup: this}, true); + if (!(this._source instanceof L.Path)) { + this._source.off('preclick', L.DomEvent.stopPropagation); + } + } + }, + + getEvents: function () { + var events = L.DivOverlay.prototype.getEvents.call(this); + + if ('closeOnClick' in this.options ? this.options.closeOnClick : this._map.options.closePopupOnClick) { + events.preclick = this._close; + } + + if (this.options.keepInView) { + events.moveend = this._adjustPan; + } + + return events; + }, + + _close: function () { + if (this._map) { + this._map.closePopup(this); + } + }, + + _initLayout: function () { + var prefix = 'leaflet-popup', + container = this._container = L.DomUtil.create('div', + prefix + ' ' + (this.options.className || '') + + ' leaflet-zoom-animated'); + + if (this.options.closeButton) { + var closeButton = this._closeButton = L.DomUtil.create('a', prefix + '-close-button', container); + closeButton.href = '#close'; + closeButton.innerHTML = '×'; + + L.DomEvent.on(closeButton, 'click', this._onCloseButtonClick, this); + } + + var wrapper = this._wrapper = L.DomUtil.create('div', prefix + '-content-wrapper', container); + this._contentNode = L.DomUtil.create('div', prefix + '-content', wrapper); + + L.DomEvent + .disableClickPropagation(wrapper) + .disableScrollPropagation(this._contentNode) + .on(wrapper, 'contextmenu', L.DomEvent.stopPropagation); + + this._tipContainer = L.DomUtil.create('div', prefix + '-tip-container', container); + this._tip = L.DomUtil.create('div', prefix + '-tip', this._tipContainer); + }, + + _updateLayout: function () { + var container = this._contentNode, + style = container.style; + + style.width = ''; + style.whiteSpace = 'nowrap'; + + var width = container.offsetWidth; + width = Math.min(width, this.options.maxWidth); + width = Math.max(width, this.options.minWidth); + + style.width = (width + 1) + 'px'; + style.whiteSpace = ''; + + style.height = ''; + + var height = container.offsetHeight, + maxHeight = this.options.maxHeight, + scrolledClass = 'leaflet-popup-scrolled'; + + if (maxHeight && height > maxHeight) { + style.height = maxHeight + 'px'; + L.DomUtil.addClass(container, scrolledClass); + } else { + L.DomUtil.removeClass(container, scrolledClass); + } + + this._containerWidth = this._container.offsetWidth; + }, + + _animateZoom: function (e) { + var pos = this._map._latLngToNewLayerPoint(this._latlng, e.zoom, e.center), + anchor = this._getAnchor(); + L.DomUtil.setPosition(this._container, pos.add(anchor)); + }, + + _adjustPan: function () { + if (!this.options.autoPan || (this._map._panAnim && this._map._panAnim._inProgress)) { return; } + + var map = this._map, + marginBottom = parseInt(L.DomUtil.getStyle(this._container, 'marginBottom'), 10) || 0, + containerHeight = this._container.offsetHeight + marginBottom, + containerWidth = this._containerWidth, + layerPos = new L.Point(this._containerLeft, -containerHeight - this._containerBottom); + + layerPos._add(L.DomUtil.getPosition(this._container)); + + var containerPos = map.layerPointToContainerPoint(layerPos), + padding = L.point(this.options.autoPanPadding), + paddingTL = L.point(this.options.autoPanPaddingTopLeft || padding), + paddingBR = L.point(this.options.autoPanPaddingBottomRight || padding), + size = map.getSize(), + dx = 0, + dy = 0; + + if (containerPos.x + containerWidth + paddingBR.x > size.x) { // right + dx = containerPos.x + containerWidth - size.x + paddingBR.x; + } + if (containerPos.x - dx - paddingTL.x < 0) { // left + dx = containerPos.x - paddingTL.x; + } + if (containerPos.y + containerHeight + paddingBR.y > size.y) { // bottom + dy = containerPos.y + containerHeight - size.y + paddingBR.y; + } + if (containerPos.y - dy - paddingTL.y < 0) { // top + dy = containerPos.y - paddingTL.y; + } + + // @namespace Map + // @section Popup events + // @event autopanstart: Event + // Fired when the map starts autopanning when opening a popup. + if (dx || dy) { + map + .fire('autopanstart') + .panBy([dx, dy]); + } + }, + + _onCloseButtonClick: function (e) { + this._close(); + L.DomEvent.stop(e); + }, + + _getAnchor: function () { + // Where should we anchor the popup on the source layer? + return L.point(this._source && this._source._getPopupAnchor ? this._source._getPopupAnchor() : [0, 0]); + } + +}); + +// @namespace Popup +// @factory L.popup(options?: Popup options, source?: Layer) +// Instantiates a `Popup` object given an optional `options` object that describes its appearance and location and an optional `source` object that is used to tag the popup with a reference to the Layer to which it refers. +L.popup = function (options, source) { + return new L.Popup(options, source); +}; + + +/* @namespace Map + * @section Interaction Options + * @option closePopupOnClick: Boolean = true + * Set it to `false` if you don't want popups to close when user clicks the map. + */ +L.Map.mergeOptions({ + closePopupOnClick: true +}); + + +// @namespace Map +// @section Methods for Layers and Controls +L.Map.include({ + // @method openPopup(popup: Popup): this + // Opens the specified popup while closing the previously opened (to make sure only one is opened at one time for usability). + // @alternative + // @method openPopup(content: String|HTMLElement, latlng: LatLng, options?: Popup options): this + // Creates a popup with the specified content and options and opens it in the given point on a map. + openPopup: function (popup, latlng, options) { + if (!(popup instanceof L.Popup)) { + popup = new L.Popup(options).setContent(popup); + } + + if (latlng) { + popup.setLatLng(latlng); + } + + if (this.hasLayer(popup)) { + return this; + } + + if (this._popup && this._popup.options.autoClose) { + this.closePopup(); + } + + this._popup = popup; + return this.addLayer(popup); + }, + + // @method closePopup(popup?: Popup): this + // Closes the popup previously opened with [openPopup](#map-openpopup) (or the given one). + closePopup: function (popup) { + if (!popup || popup === this._popup) { + popup = this._popup; + this._popup = null; + } + if (popup) { + this.removeLayer(popup); + } + return this; + } +}); + +/* + * @namespace Layer + * @section Popup methods example + * + * All layers share a set of methods convenient for binding popups to it. + * + * ```js + * var layer = L.Polygon(latlngs).bindPopup('Hi There!').addTo(map); + * layer.openPopup(); + * layer.closePopup(); + * ``` + * + * Popups will also be automatically opened when the layer is clicked on and closed when the layer is removed from the map or another popup is opened. + */ + +// @section Popup methods +L.Layer.include({ + + // @method bindPopup(content: String|HTMLElement|Function|Popup, options?: Popup options): this + // Binds a popup to the layer with the passed `content` and sets up the + // neccessary event listeners. If a `Function` is passed it will receive + // the layer as the first argument and should return a `String` or `HTMLElement`. + bindPopup: function (content, options) { + + if (content instanceof L.Popup) { + L.setOptions(content, options); + this._popup = content; + content._source = this; + } else { + if (!this._popup || options) { + this._popup = new L.Popup(options, this); + } + this._popup.setContent(content); + } + + if (!this._popupHandlersAdded) { + this.on({ + click: this._openPopup, + remove: this.closePopup, + move: this._movePopup + }); + this._popupHandlersAdded = true; + } + + return this; + }, + + // @method unbindPopup(): this + // Removes the popup previously bound with `bindPopup`. + unbindPopup: function () { + if (this._popup) { + this.off({ + click: this._openPopup, + remove: this.closePopup, + move: this._movePopup + }); + this._popupHandlersAdded = false; + this._popup = null; + } + return this; + }, + + // @method openPopup(latlng?: LatLng): this + // Opens the bound popup at the specificed `latlng` or at the default popup anchor if no `latlng` is passed. + openPopup: function (layer, latlng) { + if (!(layer instanceof L.Layer)) { + latlng = layer; + layer = this; + } + + if (layer instanceof L.FeatureGroup) { + for (var id in this._layers) { + layer = this._layers[id]; + break; + } + } + + if (!latlng) { + latlng = layer.getCenter ? layer.getCenter() : layer.getLatLng(); + } + + if (this._popup && this._map) { + // set popup source to this layer + this._popup._source = layer; + + // update the popup (content, layout, ect...) + this._popup.update(); + + // open the popup on the map + this._map.openPopup(this._popup, latlng); + } + + return this; + }, + + // @method closePopup(): this + // Closes the popup bound to this layer if it is open. + closePopup: function () { + if (this._popup) { + this._popup._close(); + } + return this; + }, + + // @method togglePopup(): this + // Opens or closes the popup bound to this layer depending on its current state. + togglePopup: function (target) { + if (this._popup) { + if (this._popup._map) { + this.closePopup(); + } else { + this.openPopup(target); + } + } + return this; + }, + + // @method isPopupOpen(): boolean + // Returns `true` if the popup bound to this layer is currently open. + isPopupOpen: function () { + return (this._popup ? this._popup.isOpen() : false); + }, + + // @method setPopupContent(content: String|HTMLElement|Popup): this + // Sets the content of the popup bound to this layer. + setPopupContent: function (content) { + if (this._popup) { + this._popup.setContent(content); + } + return this; + }, + + // @method getPopup(): Popup + // Returns the popup bound to this layer. + getPopup: function () { + return this._popup; + }, + + _openPopup: function (e) { + var layer = e.layer || e.target; + + if (!this._popup) { + return; + } + + if (!this._map) { + return; + } + + // prevent map click + L.DomEvent.stop(e); + + // if this inherits from Path its a vector and we can just + // open the popup at the new location + if (layer instanceof L.Path) { + this.openPopup(e.layer || e.target, e.latlng); + return; + } + + // otherwise treat it like a marker and figure out + // if we should toggle it open/closed + if (this._map.hasLayer(this._popup) && this._popup._source === layer) { + this.closePopup(); + } else { + this.openPopup(layer, e.latlng); + } + }, + + _movePopup: function (e) { + this._popup.setLatLng(e.latlng); + } +}); + + + +/* + * @class Tooltip + * @inherits DivOverlay + * @aka L.Tooltip + * Used to display small texts on top of map layers. + * + * @example + * + * ```js + * marker.bindTooltip("my tooltip text").openTooltip(); + * ``` + * Note about tooltip offset. Leaflet takes two options in consideration + * for computing tooltip offseting: + * - the `offset` Tooltip option: it defaults to [0, 0], and it's specific to one tooltip. + * Add a positive x offset to move the tooltip to the right, and a positive y offset to + * move it to the bottom. Negatives will move to the left and top. + * - the `tooltipAnchor` Icon option: this will only be considered for Marker. You + * should adapt this value if you use a custom icon. + */ + + +// @namespace Tooltip +L.Tooltip = L.DivOverlay.extend({ + + // @section + // @aka Tooltip options + options: { + // @option pane: String = 'tooltipPane' + // `Map pane` where the tooltip will be added. + pane: 'tooltipPane', + + // @option offset: Point = Point(0, 0) + // Optional offset of the tooltip position. + offset: [0, 0], + + // @option direction: String = 'auto' + // Direction where to open the tooltip. Possible values are: `right`, `left`, + // `top`, `bottom`, `center`, `auto`. + // `auto` will dynamicaly switch between `right` and `left` according to the tooltip + // position on the map. + direction: 'auto', + + // @option permanent: Boolean = false + // Whether to open the tooltip permanently or only on mouseover. + permanent: false, + + // @option sticky: Boolean = false + // If true, the tooltip will follow the mouse instead of being fixed at the feature center. + sticky: false, + + // @option interactive: Boolean = false + // If true, the tooltip will listen to the feature events. + interactive: false, + + // @option opacity: Number = 0.9 + // Tooltip container opacity. + opacity: 0.9 + }, + + onAdd: function (map) { + L.DivOverlay.prototype.onAdd.call(this, map); + this.setOpacity(this.options.opacity); + + // @namespace Map + // @section Tooltip events + // @event tooltipopen: TooltipEvent + // Fired when a tooltip is opened in the map. + map.fire('tooltipopen', {tooltip: this}); + + if (this._source) { + // @namespace Layer + // @section Tooltip events + // @event tooltipopen: TooltipEvent + // Fired when a tooltip bound to this layer is opened. + this._source.fire('tooltipopen', {tooltip: this}, true); + } + }, + + onRemove: function (map) { + L.DivOverlay.prototype.onRemove.call(this, map); + + // @namespace Map + // @section Tooltip events + // @event tooltipclose: TooltipEvent + // Fired when a tooltip in the map is closed. + map.fire('tooltipclose', {tooltip: this}); + + if (this._source) { + // @namespace Layer + // @section Tooltip events + // @event tooltipclose: TooltipEvent + // Fired when a tooltip bound to this layer is closed. + this._source.fire('tooltipclose', {tooltip: this}, true); + } + }, + + getEvents: function () { + var events = L.DivOverlay.prototype.getEvents.call(this); + + if (L.Browser.touch && !this.options.permanent) { + events.preclick = this._close; + } + + return events; + }, + + _close: function () { + if (this._map) { + this._map.closeTooltip(this); + } + }, + + _initLayout: function () { + var prefix = 'leaflet-tooltip', + className = prefix + ' ' + (this.options.className || '') + ' leaflet-zoom-' + (this._zoomAnimated ? 'animated' : 'hide'); + + this._contentNode = this._container = L.DomUtil.create('div', className); + }, + + _updateLayout: function () {}, + + _adjustPan: function () {}, + + _setPosition: function (pos) { + var map = this._map, + container = this._container, + centerPoint = map.latLngToContainerPoint(map.getCenter()), + tooltipPoint = map.layerPointToContainerPoint(pos), + direction = this.options.direction, + tooltipWidth = container.offsetWidth, + tooltipHeight = container.offsetHeight, + offset = L.point(this.options.offset), + anchor = this._getAnchor(); + + if (direction === 'top') { + pos = pos.add(L.point(-tooltipWidth / 2 + offset.x, -tooltipHeight + offset.y + anchor.y, true)); + } else if (direction === 'bottom') { + pos = pos.subtract(L.point(tooltipWidth / 2 - offset.x, -offset.y, true)); + } else if (direction === 'center') { + pos = pos.subtract(L.point(tooltipWidth / 2 + offset.x, tooltipHeight / 2 - anchor.y + offset.y, true)); + } else if (direction === 'right' || direction === 'auto' && tooltipPoint.x < centerPoint.x) { + direction = 'right'; + pos = pos.add(L.point(offset.x + anchor.x, anchor.y - tooltipHeight / 2 + offset.y, true)); + } else { + direction = 'left'; + pos = pos.subtract(L.point(tooltipWidth + anchor.x - offset.x, tooltipHeight / 2 - anchor.y - offset.y, true)); + } + + L.DomUtil.removeClass(container, 'leaflet-tooltip-right'); + L.DomUtil.removeClass(container, 'leaflet-tooltip-left'); + L.DomUtil.removeClass(container, 'leaflet-tooltip-top'); + L.DomUtil.removeClass(container, 'leaflet-tooltip-bottom'); + L.DomUtil.addClass(container, 'leaflet-tooltip-' + direction); + L.DomUtil.setPosition(container, pos); + }, + + _updatePosition: function () { + var pos = this._map.latLngToLayerPoint(this._latlng); + this._setPosition(pos); + }, + + setOpacity: function (opacity) { + this.options.opacity = opacity; + + if (this._container) { + L.DomUtil.setOpacity(this._container, opacity); + } + }, + + _animateZoom: function (e) { + var pos = this._map._latLngToNewLayerPoint(this._latlng, e.zoom, e.center); + this._setPosition(pos); + }, + + _getAnchor: function () { + // Where should we anchor the tooltip on the source layer? + return L.point(this._source && this._source._getTooltipAnchor && !this.options.sticky ? this._source._getTooltipAnchor() : [0, 0]); + } + +}); + +// @namespace Tooltip +// @factory L.tooltip(options?: Tooltip options, source?: Layer) +// Instantiates a Tooltip object given an optional `options` object that describes its appearance and location and an optional `source` object that is used to tag the tooltip with a reference to the Layer to which it refers. +L.tooltip = function (options, source) { + return new L.Tooltip(options, source); +}; + +// @namespace Map +// @section Methods for Layers and Controls +L.Map.include({ + + // @method openTooltip(tooltip: Tooltip): this + // Opens the specified tooltip. + // @alternative + // @method openTooltip(content: String|HTMLElement, latlng: LatLng, options?: Tooltip options): this + // Creates a tooltip with the specified content and options and open it. + openTooltip: function (tooltip, latlng, options) { + if (!(tooltip instanceof L.Tooltip)) { + tooltip = new L.Tooltip(options).setContent(tooltip); + } + + if (latlng) { + tooltip.setLatLng(latlng); + } + + if (this.hasLayer(tooltip)) { + return this; + } + + return this.addLayer(tooltip); + }, + + // @method closeTooltip(tooltip?: Tooltip): this + // Closes the tooltip given as parameter. + closeTooltip: function (tooltip) { + if (tooltip) { + this.removeLayer(tooltip); + } + return this; + } + +}); + +/* + * @namespace Layer + * @section Tooltip methods example + * + * All layers share a set of methods convenient for binding tooltips to it. + * + * ```js + * var layer = L.Polygon(latlngs).bindTooltip('Hi There!').addTo(map); + * layer.openTooltip(); + * layer.closeTooltip(); + * ``` + */ + +// @section Tooltip methods +L.Layer.include({ + + // @method bindTooltip(content: String|HTMLElement|Function|Tooltip, options?: Tooltip options): this + // Binds a tooltip to the layer with the passed `content` and sets up the + // neccessary event listeners. If a `Function` is passed it will receive + // the layer as the first argument and should return a `String` or `HTMLElement`. + bindTooltip: function (content, options) { + + if (content instanceof L.Tooltip) { + L.setOptions(content, options); + this._tooltip = content; + content._source = this; + } else { + if (!this._tooltip || options) { + this._tooltip = L.tooltip(options, this); + } + this._tooltip.setContent(content); + + } + + this._initTooltipInteractions(); + + if (this._tooltip.options.permanent && this._map && this._map.hasLayer(this)) { + this.openTooltip(); + } + + return this; + }, + + // @method unbindTooltip(): this + // Removes the tooltip previously bound with `bindTooltip`. + unbindTooltip: function () { + if (this._tooltip) { + this._initTooltipInteractions(true); + this.closeTooltip(); + this._tooltip = null; + } + return this; + }, + + _initTooltipInteractions: function (remove) { + if (!remove && this._tooltipHandlersAdded) { return; } + var onOff = remove ? 'off' : 'on', + events = { + remove: this.closeTooltip, + move: this._moveTooltip + }; + if (!this._tooltip.options.permanent) { + events.mouseover = this._openTooltip; + events.mouseout = this.closeTooltip; + if (this._tooltip.options.sticky) { + events.mousemove = this._moveTooltip; + } + if (L.Browser.touch) { + events.click = this._openTooltip; + } + } else { + events.add = this._openTooltip; + } + this[onOff](events); + this._tooltipHandlersAdded = !remove; + }, + + // @method openTooltip(latlng?: LatLng): this + // Opens the bound tooltip at the specificed `latlng` or at the default tooltip anchor if no `latlng` is passed. + openTooltip: function (layer, latlng) { + if (!(layer instanceof L.Layer)) { + latlng = layer; + layer = this; + } + + if (layer instanceof L.FeatureGroup) { + for (var id in this._layers) { + layer = this._layers[id]; + break; + } + } + + if (!latlng) { + latlng = layer.getCenter ? layer.getCenter() : layer.getLatLng(); + } + + if (this._tooltip && this._map) { + + // set tooltip source to this layer + this._tooltip._source = layer; + + // update the tooltip (content, layout, ect...) + this._tooltip.update(); + + // open the tooltip on the map + this._map.openTooltip(this._tooltip, latlng); + + // Tooltip container may not be defined if not permanent and never + // opened. + if (this._tooltip.options.interactive && this._tooltip._container) { + L.DomUtil.addClass(this._tooltip._container, 'leaflet-clickable'); + this.addInteractiveTarget(this._tooltip._container); + } + } + + return this; + }, + + // @method closeTooltip(): this + // Closes the tooltip bound to this layer if it is open. + closeTooltip: function () { + if (this._tooltip) { + this._tooltip._close(); + if (this._tooltip.options.interactive && this._tooltip._container) { + L.DomUtil.removeClass(this._tooltip._container, 'leaflet-clickable'); + this.removeInteractiveTarget(this._tooltip._container); + } + } + return this; + }, + + // @method toggleTooltip(): this + // Opens or closes the tooltip bound to this layer depending on its current state. + toggleTooltip: function (target) { + if (this._tooltip) { + if (this._tooltip._map) { + this.closeTooltip(); + } else { + this.openTooltip(target); + } + } + return this; + }, + + // @method isTooltipOpen(): boolean + // Returns `true` if the tooltip bound to this layer is currently open. + isTooltipOpen: function () { + return this._tooltip.isOpen(); + }, + + // @method setTooltipContent(content: String|HTMLElement|Tooltip): this + // Sets the content of the tooltip bound to this layer. + setTooltipContent: function (content) { + if (this._tooltip) { + this._tooltip.setContent(content); + } + return this; + }, + + // @method getTooltip(): Tooltip + // Returns the tooltip bound to this layer. + getTooltip: function () { + return this._tooltip; + }, + + _openTooltip: function (e) { + var layer = e.layer || e.target; + + if (!this._tooltip || !this._map) { + return; + } + this.openTooltip(layer, this._tooltip.options.sticky ? e.latlng : undefined); + }, + + _moveTooltip: function (e) { + var latlng = e.latlng, containerPoint, layerPoint; + if (this._tooltip.options.sticky && e.originalEvent) { + containerPoint = this._map.mouseEventToContainerPoint(e.originalEvent); + layerPoint = this._map.containerPointToLayerPoint(containerPoint); + latlng = this._map.layerPointToLatLng(layerPoint); + } + this._tooltip.setLatLng(latlng); + } +}); + + + +/* + * @class LayerGroup + * @aka L.LayerGroup + * @inherits Layer + * + * Used to group several layers and handle them as one. If you add it to the map, + * any layers added or removed from the group will be added/removed on the map as + * well. Extends `Layer`. + * + * @example + * + * ```js + * L.layerGroup([marker1, marker2]) + * .addLayer(polyline) + * .addTo(map); + * ``` + */ + +L.LayerGroup = L.Layer.extend({ + + initialize: function (layers) { + this._layers = {}; + + var i, len; + + if (layers) { + for (i = 0, len = layers.length; i < len; i++) { + this.addLayer(layers[i]); + } + } + }, + + // @method addLayer(layer: Layer): this + // Adds the given layer to the group. + addLayer: function (layer) { + var id = this.getLayerId(layer); + + this._layers[id] = layer; + + if (this._map) { + this._map.addLayer(layer); + } + + return this; + }, + + // @method removeLayer(layer: Layer): this + // Removes the given layer from the group. + // @alternative + // @method removeLayer(id: Number): this + // Removes the layer with the given internal ID from the group. + removeLayer: function (layer) { + var id = layer in this._layers ? layer : this.getLayerId(layer); + + if (this._map && this._layers[id]) { + this._map.removeLayer(this._layers[id]); + } + + delete this._layers[id]; + + return this; + }, + + // @method hasLayer(layer: Layer): Boolean + // Returns `true` if the given layer is currently added to the group. + hasLayer: function (layer) { + return !!layer && (layer in this._layers || this.getLayerId(layer) in this._layers); + }, + + // @method clearLayers(): this + // Removes all the layers from the group. + clearLayers: function () { + for (var i in this._layers) { + this.removeLayer(this._layers[i]); + } + return this; + }, + + // @method invoke(methodName: String, …): this + // Calls `methodName` on every layer contained in this group, passing any + // additional parameters. Has no effect if the layers contained do not + // implement `methodName`. + invoke: function (methodName) { + var args = Array.prototype.slice.call(arguments, 1), + i, layer; + + for (i in this._layers) { + layer = this._layers[i]; + + if (layer[methodName]) { + layer[methodName].apply(layer, args); + } + } + + return this; + }, + + onAdd: function (map) { + for (var i in this._layers) { + map.addLayer(this._layers[i]); + } + }, + + onRemove: function (map) { + for (var i in this._layers) { + map.removeLayer(this._layers[i]); + } + }, + + // @method eachLayer(fn: Function, context?: Object): this + // Iterates over the layers of the group, optionally specifying context of the iterator function. + // ```js + // group.eachLayer(function (layer) { + // layer.bindPopup('Hello'); + // }); + // ``` + eachLayer: function (method, context) { + for (var i in this._layers) { + method.call(context, this._layers[i]); + } + return this; + }, + + // @method getLayer(id: Number): Layer + // Returns the layer with the given internal ID. + getLayer: function (id) { + return this._layers[id]; + }, + + // @method getLayers(): Layer[] + // Returns an array of all the layers added to the group. + getLayers: function () { + var layers = []; + + for (var i in this._layers) { + layers.push(this._layers[i]); + } + return layers; + }, + + // @method setZIndex(zIndex: Number): this + // Calls `setZIndex` on every layer contained in this group, passing the z-index. + setZIndex: function (zIndex) { + return this.invoke('setZIndex', zIndex); + }, + + // @method getLayerId(layer: Layer): Number + // Returns the internal ID for a layer + getLayerId: function (layer) { + return L.stamp(layer); + } +}); + + +// @factory L.layerGroup(layers: Layer[]) +// Create a layer group, optionally given an initial set of layers. +L.layerGroup = function (layers) { + return new L.LayerGroup(layers); +}; + + + +/* + * @class FeatureGroup + * @aka L.FeatureGroup + * @inherits LayerGroup + * + * Extended `LayerGroup` that makes it easier to do the same thing to all its member layers: + * * [`bindPopup`](#layer-bindpopup) binds a popup to all of the layers at once (likewise with [`bindTooltip`](#layer-bindtooltip)) + * * Events are propagated to the `FeatureGroup`, so if the group has an event + * handler, it will handle events from any of the layers. This includes mouse events + * and custom events. + * * Has `layeradd` and `layerremove` events + * + * @example + * + * ```js + * L.featureGroup([marker1, marker2, polyline]) + * .bindPopup('Hello world!') + * .on('click', function() { alert('Clicked on a member of the group!'); }) + * .addTo(map); + * ``` + */ + +L.FeatureGroup = L.LayerGroup.extend({ + + addLayer: function (layer) { + if (this.hasLayer(layer)) { + return this; + } + + layer.addEventParent(this); + + L.LayerGroup.prototype.addLayer.call(this, layer); + + // @event layeradd: LayerEvent + // Fired when a layer is added to this `FeatureGroup` + return this.fire('layeradd', {layer: layer}); + }, + + removeLayer: function (layer) { + if (!this.hasLayer(layer)) { + return this; + } + if (layer in this._layers) { + layer = this._layers[layer]; + } + + layer.removeEventParent(this); + + L.LayerGroup.prototype.removeLayer.call(this, layer); + + // @event layerremove: LayerEvent + // Fired when a layer is removed from this `FeatureGroup` + return this.fire('layerremove', {layer: layer}); + }, + + // @method setStyle(style: Path options): this + // Sets the given path options to each layer of the group that has a `setStyle` method. + setStyle: function (style) { + return this.invoke('setStyle', style); + }, + + // @method bringToFront(): this + // Brings the layer group to the top of all other layers + bringToFront: function () { + return this.invoke('bringToFront'); + }, + + // @method bringToBack(): this + // Brings the layer group to the top of all other layers + bringToBack: function () { + return this.invoke('bringToBack'); + }, + + // @method getBounds(): LatLngBounds + // Returns the LatLngBounds of the Feature Group (created from bounds and coordinates of its children). + getBounds: function () { + var bounds = new L.LatLngBounds(); + + for (var id in this._layers) { + var layer = this._layers[id]; + bounds.extend(layer.getBounds ? layer.getBounds() : layer.getLatLng()); + } + return bounds; + } +}); + +// @factory L.featureGroup(layers: Layer[]) +// Create a feature group, optionally given an initial set of layers. +L.featureGroup = function (layers) { + return new L.FeatureGroup(layers); +}; + + + +/* + * @class Renderer + * @inherits Layer + * @aka L.Renderer + * + * Base class for vector renderer implementations (`SVG`, `Canvas`). Handles the + * DOM container of the renderer, its bounds, and its zoom animation. + * + * A `Renderer` works as an implicit layer group for all `Path`s - the renderer + * itself can be added or removed to the map. All paths use a renderer, which can + * be implicit (the map will decide the type of renderer and use it automatically) + * or explicit (using the [`renderer`](#path-renderer) option of the path). + * + * Do not use this class directly, use `SVG` and `Canvas` instead. + * + * @event update: Event + * Fired when the renderer updates its bounds, center and zoom, for example when + * its map has moved + */ + +L.Renderer = L.Layer.extend({ + + // @section + // @aka Renderer options + options: { + // @option padding: Number = 0.1 + // How much to extend the clip area around the map view (relative to its size) + // e.g. 0.1 would be 10% of map view in each direction + padding: 0.1 + }, + + initialize: function (options) { + L.setOptions(this, options); + L.stamp(this); + this._layers = this._layers || {}; + }, + + onAdd: function () { + if (!this._container) { + this._initContainer(); // defined by renderer implementations + + if (this._zoomAnimated) { + L.DomUtil.addClass(this._container, 'leaflet-zoom-animated'); + } + } + + this.getPane().appendChild(this._container); + this._update(); + this.on('update', this._updatePaths, this); + }, + + onRemove: function () { + L.DomUtil.remove(this._container); + this.off('update', this._updatePaths, this); + }, + + getEvents: function () { + var events = { + viewreset: this._reset, + zoom: this._onZoom, + moveend: this._update, + zoomend: this._onZoomEnd + }; + if (this._zoomAnimated) { + events.zoomanim = this._onAnimZoom; + } + return events; + }, + + _onAnimZoom: function (ev) { + this._updateTransform(ev.center, ev.zoom); + }, + + _onZoom: function () { + this._updateTransform(this._map.getCenter(), this._map.getZoom()); + }, + + _updateTransform: function (center, zoom) { + var scale = this._map.getZoomScale(zoom, this._zoom), + position = L.DomUtil.getPosition(this._container), + viewHalf = this._map.getSize().multiplyBy(0.5 + this.options.padding), + currentCenterPoint = this._map.project(this._center, zoom), + destCenterPoint = this._map.project(center, zoom), + centerOffset = destCenterPoint.subtract(currentCenterPoint), + + topLeftOffset = viewHalf.multiplyBy(-scale).add(position).add(viewHalf).subtract(centerOffset); + + if (L.Browser.any3d) { + L.DomUtil.setTransform(this._container, topLeftOffset, scale); + } else { + L.DomUtil.setPosition(this._container, topLeftOffset); + } + }, + + _reset: function () { + this._update(); + this._updateTransform(this._center, this._zoom); + + for (var id in this._layers) { + this._layers[id]._reset(); + } + }, + + _onZoomEnd: function () { + for (var id in this._layers) { + this._layers[id]._project(); + } + }, + + _updatePaths: function () { + for (var id in this._layers) { + this._layers[id]._update(); + } + }, + + _update: function () { + // Update pixel bounds of renderer container (for positioning/sizing/clipping later) + // Subclasses are responsible of firing the 'update' event. + var p = this.options.padding, + size = this._map.getSize(), + min = this._map.containerPointToLayerPoint(size.multiplyBy(-p)).round(); + + this._bounds = new L.Bounds(min, min.add(size.multiplyBy(1 + p * 2)).round()); + + this._center = this._map.getCenter(); + this._zoom = this._map.getZoom(); + } +}); + + +L.Map.include({ + // @namespace Map; @method getRenderer(layer: Path): Renderer + // Returns the instance of `Renderer` that should be used to render the given + // `Path`. It will ensure that the `renderer` options of the map and paths + // are respected, and that the renderers do exist on the map. + getRenderer: function (layer) { + // @namespace Path; @option renderer: Renderer + // Use this specific instance of `Renderer` for this path. Takes + // precedence over the map's [default renderer](#map-renderer). + var renderer = layer.options.renderer || this._getPaneRenderer(layer.options.pane) || this.options.renderer || this._renderer; + + if (!renderer) { + // @namespace Map; @option preferCanvas: Boolean = false + // Whether `Path`s should be rendered on a `Canvas` renderer. + // By default, all `Path`s are rendered in a `SVG` renderer. + renderer = this._renderer = (this.options.preferCanvas && L.canvas()) || L.svg(); + } + + if (!this.hasLayer(renderer)) { + this.addLayer(renderer); + } + return renderer; + }, + + _getPaneRenderer: function (name) { + if (name === 'overlayPane' || name === undefined) { + return false; + } + + var renderer = this._paneRenderers[name]; + if (renderer === undefined) { + renderer = (L.SVG && L.svg({pane: name})) || (L.Canvas && L.canvas({pane: name})); + this._paneRenderers[name] = renderer; + } + return renderer; + } +}); + + + +/* + * @class Path + * @aka L.Path + * @inherits Interactive layer + * + * An abstract class that contains options and constants shared between vector + * overlays (Polygon, Polyline, Circle). Do not use it directly. Extends `Layer`. + */ + +L.Path = L.Layer.extend({ + + // @section + // @aka Path options + options: { + // @option stroke: Boolean = true + // Whether to draw stroke along the path. Set it to `false` to disable borders on polygons or circles. + stroke: true, + + // @option color: String = '#3388ff' + // Stroke color + color: '#3388ff', + + // @option weight: Number = 3 + // Stroke width in pixels + weight: 3, + + // @option opacity: Number = 1.0 + // Stroke opacity + opacity: 1, + + // @option lineCap: String= 'round' + // A string that defines [shape to be used at the end](https://developer.mozilla.org/docs/Web/SVG/Attribute/stroke-linecap) of the stroke. + lineCap: 'round', + + // @option lineJoin: String = 'round' + // A string that defines [shape to be used at the corners](https://developer.mozilla.org/docs/Web/SVG/Attribute/stroke-linejoin) of the stroke. + lineJoin: 'round', + + // @option dashArray: String = null + // A string that defines the stroke [dash pattern](https://developer.mozilla.org/docs/Web/SVG/Attribute/stroke-dasharray). Doesn't work on `Canvas`-powered layers in [some old browsers](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/setLineDash#Browser_compatibility). + dashArray: null, + + // @option dashOffset: String = null + // A string that defines the [distance into the dash pattern to start the dash](https://developer.mozilla.org/docs/Web/SVG/Attribute/stroke-dashoffset). Doesn't work on `Canvas`-powered layers in [some old browsers](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/setLineDash#Browser_compatibility). + dashOffset: null, + + // @option fill: Boolean = depends + // Whether to fill the path with color. Set it to `false` to disable filling on polygons or circles. + fill: false, + + // @option fillColor: String = * + // Fill color. Defaults to the value of the [`color`](#path-color) option + fillColor: null, + + // @option fillOpacity: Number = 0.2 + // Fill opacity. + fillOpacity: 0.2, + + // @option fillRule: String = 'evenodd' + // A string that defines [how the inside of a shape](https://developer.mozilla.org/docs/Web/SVG/Attribute/fill-rule) is determined. + fillRule: 'evenodd', + + // className: '', + + // Option inherited from "Interactive layer" abstract class + interactive: true + }, + + beforeAdd: function (map) { + // Renderer is set here because we need to call renderer.getEvents + // before this.getEvents. + this._renderer = map.getRenderer(this); + }, + + onAdd: function () { + this._renderer._initPath(this); + this._reset(); + this._renderer._addPath(this); + }, + + onRemove: function () { + this._renderer._removePath(this); + }, + + // @method redraw(): this + // Redraws the layer. Sometimes useful after you changed the coordinates that the path uses. + redraw: function () { + if (this._map) { + this._renderer._updatePath(this); + } + return this; + }, + + // @method setStyle(style: Path options): this + // Changes the appearance of a Path based on the options in the `Path options` object. + setStyle: function (style) { + L.setOptions(this, style); + if (this._renderer) { + this._renderer._updateStyle(this); + } + return this; + }, + + // @method bringToFront(): this + // Brings the layer to the top of all path layers. + bringToFront: function () { + if (this._renderer) { + this._renderer._bringToFront(this); + } + return this; + }, + + // @method bringToBack(): this + // Brings the layer to the bottom of all path layers. + bringToBack: function () { + if (this._renderer) { + this._renderer._bringToBack(this); + } + return this; + }, + + getElement: function () { + return this._path; + }, + + _reset: function () { + // defined in children classes + this._project(); + this._update(); + }, + + _clickTolerance: function () { + // used when doing hit detection for Canvas layers + return (this.options.stroke ? this.options.weight / 2 : 0) + (L.Browser.touch ? 10 : 0); + } +}); + + + +/* + * @namespace LineUtil + * + * Various utility functions for polyine points processing, used by Leaflet internally to make polylines lightning-fast. + */ + +L.LineUtil = { + + // Simplify polyline with vertex reduction and Douglas-Peucker simplification. + // Improves rendering performance dramatically by lessening the number of points to draw. + + // @function simplify(points: Point[], tolerance: Number): Point[] + // Dramatically reduces the number of points in a polyline while retaining + // its shape and returns a new array of simplified points, using the + // [Douglas-Peucker algorithm](http://en.wikipedia.org/wiki/Douglas-Peucker_algorithm). + // Used for a huge performance boost when processing/displaying Leaflet polylines for + // each zoom level and also reducing visual noise. tolerance affects the amount of + // simplification (lesser value means higher quality but slower and with more points). + // Also released as a separated micro-library [Simplify.js](http://mourner.github.com/simplify-js/). + simplify: function (points, tolerance) { + if (!tolerance || !points.length) { + return points.slice(); + } + + var sqTolerance = tolerance * tolerance; + + // stage 1: vertex reduction + points = this._reducePoints(points, sqTolerance); + + // stage 2: Douglas-Peucker simplification + points = this._simplifyDP(points, sqTolerance); + + return points; + }, + + // @function pointToSegmentDistance(p: Point, p1: Point, p2: Point): Number + // Returns the distance between point `p` and segment `p1` to `p2`. + pointToSegmentDistance: function (p, p1, p2) { + return Math.sqrt(this._sqClosestPointOnSegment(p, p1, p2, true)); + }, + + // @function closestPointOnSegment(p: Point, p1: Point, p2: Point): Number + // Returns the closest point from a point `p` on a segment `p1` to `p2`. + closestPointOnSegment: function (p, p1, p2) { + return this._sqClosestPointOnSegment(p, p1, p2); + }, + + // Douglas-Peucker simplification, see http://en.wikipedia.org/wiki/Douglas-Peucker_algorithm + _simplifyDP: function (points, sqTolerance) { + + var len = points.length, + ArrayConstructor = typeof Uint8Array !== undefined + '' ? Uint8Array : Array, + markers = new ArrayConstructor(len); + + markers[0] = markers[len - 1] = 1; + + this._simplifyDPStep(points, markers, sqTolerance, 0, len - 1); + + var i, + newPoints = []; + + for (i = 0; i < len; i++) { + if (markers[i]) { + newPoints.push(points[i]); + } + } + + return newPoints; + }, + + _simplifyDPStep: function (points, markers, sqTolerance, first, last) { + + var maxSqDist = 0, + index, i, sqDist; for (i = first + 1; i <= last - 1; i++) { sqDist = this._sqClosestPointOnSegment(points[i], points[first], points[last], true); @@ -5337,10 +8534,13 @@ L.LineUtil = { return reducedPoints; }, - // Cohen-Sutherland line clipping algorithm. - // Used to avoid rendering parts of a polyline that are not currently visible. - clipSegment: function (a, b, bounds, useLastCode) { + // @function clipSegment(a: Point, b: Point, bounds: Bounds, useLastCode?: Boolean, round?: Boolean): Point[]|Boolean + // Clips the segment a to b by rectangular bounds with the + // [Cohen-Sutherland algorithm](https://en.wikipedia.org/wiki/Cohen%E2%80%93Sutherland_algorithm) + // (modifying the segment points directly!). Used by Leaflet to only show polyline + // points that are on the screen or near, increasing performance. + clipSegment: function (a, b, bounds, useLastCode, round) { var codeA = useLastCode ? this._lastCode : this._getBitCode(a, bounds), codeB = this._getBitCode(b, bounds), @@ -5353,44 +8553,56 @@ L.LineUtil = { // if a,b is inside the clip window (trivial accept) if (!(codeA | codeB)) { return [a, b]; + } + // if a,b is outside the clip window (trivial reject) - } else if (codeA & codeB) { + if (codeA & codeB) { return false; + } + // other cases - } else { - codeOut = codeA || codeB; - p = this._getEdgeIntersection(a, b, codeOut, bounds); - newCode = this._getBitCode(p, bounds); + codeOut = codeA || codeB; + p = this._getEdgeIntersection(a, b, codeOut, bounds, round); + newCode = this._getBitCode(p, bounds); - if (codeOut === codeA) { - a = p; - codeA = newCode; - } else { - b = p; - codeB = newCode; - } + if (codeOut === codeA) { + a = p; + codeA = newCode; + } else { + b = p; + codeB = newCode; } } }, - _getEdgeIntersection: function (a, b, code, bounds) { + _getEdgeIntersection: function (a, b, code, bounds, round) { var dx = b.x - a.x, dy = b.y - a.y, min = bounds.min, - max = bounds.max; + max = bounds.max, + x, y; if (code & 8) { // top - return new L.Point(a.x + dx * (max.y - a.y) / dy, max.y); + x = a.x + dx * (max.y - a.y) / dy; + y = max.y; + } else if (code & 4) { // bottom - return new L.Point(a.x + dx * (min.y - a.y) / dy, min.y); + x = a.x + dx * (min.y - a.y) / dy; + y = min.y; + } else if (code & 2) { // right - return new L.Point(max.x, a.y + dy * (max.x - a.x) / dx); + x = max.x; + y = a.y + dy * (max.x - a.x) / dx; + } else if (code & 1) { // left - return new L.Point(min.x, a.y + dy * (min.x - a.x) / dx); + x = min.x; + y = a.y + dy * (min.x - a.x) / dx; } + + return new L.Point(x, y, round); }, - _getBitCode: function (/*Point*/ p, bounds) { + _getBitCode: function (p, bounds) { var code = 0; if (p.x < bounds.min.x) { // left @@ -5398,6 +8610,7 @@ L.LineUtil = { } else if (p.x > bounds.max.x) { // right code |= 2; } + if (p.y < bounds.min.y) { // bottom code |= 4; } else if (p.y > bounds.max.y) { // top @@ -5443,72 +8656,102 @@ L.LineUtil = { }; + /* - * L.Polyline is used to display polylines on a map. + * @class Polyline + * @aka L.Polyline + * @inherits Path + * + * A class for drawing polyline overlays on a map. Extends `Path`. + * + * @example + * + * ```js + * // create a red polyline from an array of LatLng points + * var latlngs = [ + * [45.51, -122.68], + * [37.77, -122.43], + * [34.04, -118.2] + * ]; + * + * var polyline = L.polyline(latlngs, {color: 'red'}).addTo(map); + * + * // zoom the map to the polyline + * map.fitBounds(polyline.getBounds()); + * ``` + * + * You can also pass a multi-dimensional array to represent a `MultiPolyline` shape: + * + * ```js + * // create a red polyline from an array of arrays of LatLng points + * var latlngs = [ + * [[45.51, -122.68], + * [37.77, -122.43], + * [34.04, -118.2]], + * [[40.78, -73.91], + * [41.83, -87.62], + * [32.76, -96.72]] + * ]; + * ``` */ L.Polyline = L.Path.extend({ - initialize: function (latlngs, options) { - L.Path.prototype.initialize.call(this, options); - - this._latlngs = this._convertLatLngs(latlngs); - }, + // @section + // @aka Polyline options options: { - // how much to simplify the polyline on each zoom level - // more = better performance and smoother look, less = more accurate + // @option smoothFactor: Number = 1.0 + // How much to simplify the polyline on each zoom level. More means + // better performance and smoother look, and less means more accurate representation. smoothFactor: 1.0, - noClip: false - }, - - projectLatlngs: function () { - this._originalPoints = []; - for (var i = 0, len = this._latlngs.length; i < len; i++) { - this._originalPoints[i] = this._map.latLngToLayerPoint(this._latlngs[i]); - } + // @option noClip: Boolean = false + // Disable polyline clipping. + noClip: false }, - getPathString: function () { - for (var i = 0, len = this._parts.length, str = ''; i < len; i++) { - str += this._getPathPartStr(this._parts[i]); - } - return str; + initialize: function (latlngs, options) { + L.setOptions(this, options); + this._setLatLngs(latlngs); }, + // @method getLatLngs(): LatLng[] + // Returns an array of the points in the path, or nested arrays of points in case of multi-polyline. getLatLngs: function () { return this._latlngs; }, + // @method setLatLngs(latlngs: LatLng[]): this + // Replaces all the points in the polyline with the given array of geographical points. setLatLngs: function (latlngs) { - this._latlngs = this._convertLatLngs(latlngs); - return this.redraw(); - }, - - addLatLng: function (latlng) { - this._latlngs.push(L.latLng(latlng)); + this._setLatLngs(latlngs); return this.redraw(); }, - spliceLatLngs: function () { // (Number index, Number howMany) - var removed = [].splice.apply(this._latlngs, arguments); - this._convertLatLngs(this._latlngs, true); - this.redraw(); - return removed; + // @method isEmpty(): Boolean + // Returns `true` if the Polyline has no LatLngs. + isEmpty: function () { + return !this._latlngs.length; }, closestLayerPoint: function (p) { - var minDistance = Infinity, parts = this._parts, p1, p2, minPoint = null; + var minDistance = Infinity, + minPoint = null, + closest = L.LineUtil._sqClosestPointOnSegment, + p1, p2; + + for (var j = 0, jLen = this._parts.length; j < jLen; j++) { + var points = this._parts[j]; - for (var j = 0, jLen = parts.length; j < jLen; j++) { - var points = parts[j]; for (var i = 1, len = points.length; i < len; i++) { p1 = points[i - 1]; p2 = points[i]; - var sqDist = L.LineUtil._sqClosestPointOnSegment(p, p1, p2, true); + + var sqDist = closest(p, p1, p2, true); + if (sqDist < minDistance) { minDistance = sqDist; - minPoint = L.LineUtil._sqClosestPointOnSegment(p, p1, p2); + minPoint = closest(p, p1, p2); } } } @@ -5518,110 +8761,216 @@ L.Polyline = L.Path.extend({ return minPoint; }, + // @method getCenter(): LatLng + // Returns the center ([centroid](http://en.wikipedia.org/wiki/Centroid)) of the polyline. + getCenter: function () { + // throws error when not yet added to map as this center calculation requires projected coordinates + if (!this._map) { + throw new Error('Must add layer to map before using getCenter()'); + } + + var i, halfDist, segDist, dist, p1, p2, ratio, + points = this._rings[0], + len = points.length; + + if (!len) { return null; } + + // polyline centroid algorithm; only uses the first ring if there are multiple + + for (i = 0, halfDist = 0; i < len - 1; i++) { + halfDist += points[i].distanceTo(points[i + 1]) / 2; + } + + // The line is so small in the current view that all points are on the same pixel. + if (halfDist === 0) { + return this._map.layerPointToLatLng(points[0]); + } + + for (i = 0, dist = 0; i < len - 1; i++) { + p1 = points[i]; + p2 = points[i + 1]; + segDist = p1.distanceTo(p2); + dist += segDist; + + if (dist > halfDist) { + ratio = (dist - halfDist) / segDist; + return this._map.layerPointToLatLng([ + p2.x - ratio * (p2.x - p1.x), + p2.y - ratio * (p2.y - p1.y) + ]); + } + } + }, + + // @method getBounds(): LatLngBounds + // Returns the `LatLngBounds` of the path. getBounds: function () { - return new L.LatLngBounds(this.getLatLngs()); + return this._bounds; + }, + + // @method addLatLng(latlng: LatLng, latlngs? LatLng[]): this + // Adds a given point to the polyline. By default, adds to the first ring of + // the polyline in case of a multi-polyline, but can be overridden by passing + // a specific ring as a LatLng array (that you can earlier access with [`getLatLngs`](#polyline-getlatlngs)). + addLatLng: function (latlng, latlngs) { + latlngs = latlngs || this._defaultShape(); + latlng = L.latLng(latlng); + latlngs.push(latlng); + this._bounds.extend(latlng); + return this.redraw(); }, - _convertLatLngs: function (latlngs, overwrite) { - var i, len, target = overwrite ? latlngs : []; + _setLatLngs: function (latlngs) { + this._bounds = new L.LatLngBounds(); + this._latlngs = this._convertLatLngs(latlngs); + }, - for (i = 0, len = latlngs.length; i < len; i++) { - if (L.Util.isArray(latlngs[i]) && typeof latlngs[i][0] !== 'number') { - return; + _defaultShape: function () { + return L.Polyline._flat(this._latlngs) ? this._latlngs : this._latlngs[0]; + }, + + // recursively convert latlngs input into actual LatLng instances; calculate bounds along the way + _convertLatLngs: function (latlngs) { + var result = [], + flat = L.Polyline._flat(latlngs); + + for (var i = 0, len = latlngs.length; i < len; i++) { + if (flat) { + result[i] = L.latLng(latlngs[i]); + this._bounds.extend(result[i]); + } else { + result[i] = this._convertLatLngs(latlngs[i]); } - target[i] = L.latLng(latlngs[i]); } - return target; + + return result; }, - _initEvents: function () { - L.Path.prototype._initEvents.call(this); + _project: function () { + var pxBounds = new L.Bounds(); + this._rings = []; + this._projectLatlngs(this._latlngs, this._rings, pxBounds); + + var w = this._clickTolerance(), + p = new L.Point(w, w); + + if (this._bounds.isValid() && pxBounds.isValid()) { + pxBounds.min._subtract(p); + pxBounds.max._add(p); + this._pxBounds = pxBounds; + } }, - _getPathPartStr: function (points) { - var round = L.Path.VML; + // recursively turns latlngs into a set of rings with projected coordinates + _projectLatlngs: function (latlngs, result, projectedBounds) { + var flat = latlngs[0] instanceof L.LatLng, + len = latlngs.length, + i, ring; - for (var j = 0, len2 = points.length, str = '', p; j < len2; j++) { - p = points[j]; - if (round) { - p._round(); + if (flat) { + ring = []; + for (i = 0; i < len; i++) { + ring[i] = this._map.latLngToLayerPoint(latlngs[i]); + projectedBounds.extend(ring[i]); + } + result.push(ring); + } else { + for (i = 0; i < len; i++) { + this._projectLatlngs(latlngs[i], result, projectedBounds); } - str += (j ? 'L' : 'M') + p.x + ' ' + p.y; } - return str; }, + // clip polyline by renderer bounds so that we have less to render for performance _clipPoints: function () { - var points = this._originalPoints, - len = points.length, - i, k, segment; + var bounds = this._renderer._bounds; - if (this.options.noClip) { - this._parts = [points]; + this._parts = []; + if (!this._pxBounds || !this._pxBounds.intersects(bounds)) { return; } - this._parts = []; + if (this.options.noClip) { + this._parts = this._rings; + return; + } var parts = this._parts, - vp = this._map._pathViewport, - lu = L.LineUtil; + i, j, k, len, len2, segment, points; - for (i = 0, k = 0; i < len - 1; i++) { - segment = lu.clipSegment(points[i], points[i + 1], vp, i); - if (!segment) { - continue; - } + for (i = 0, k = 0, len = this._rings.length; i < len; i++) { + points = this._rings[i]; + + for (j = 0, len2 = points.length; j < len2 - 1; j++) { + segment = L.LineUtil.clipSegment(points[j], points[j + 1], bounds, j, true); + + if (!segment) { continue; } - parts[k] = parts[k] || []; - parts[k].push(segment[0]); + parts[k] = parts[k] || []; + parts[k].push(segment[0]); - // if segment goes out of screen, or it's the last one, it's the end of the line part - if ((segment[1] !== points[i + 1]) || (i === len - 2)) { - parts[k].push(segment[1]); - k++; + // if segment goes out of screen, or it's the last one, it's the end of the line part + if ((segment[1] !== points[j + 1]) || (j === len2 - 2)) { + parts[k].push(segment[1]); + k++; + } } } }, - // simplify each clipped part of the polyline + // simplify each clipped part of the polyline for performance _simplifyPoints: function () { var parts = this._parts, - lu = L.LineUtil; + tolerance = this.options.smoothFactor; for (var i = 0, len = parts.length; i < len; i++) { - parts[i] = lu.simplify(parts[i], this.options.smoothFactor); + parts[i] = L.LineUtil.simplify(parts[i], tolerance); } }, - _updatePath: function () { + _update: function () { if (!this._map) { return; } this._clipPoints(); this._simplifyPoints(); + this._updatePath(); + }, - L.Path.prototype._updatePath.call(this); + _updatePath: function () { + this._renderer._updatePoly(this); } }); +// @factory L.polyline(latlngs: LatLng[], options?: Polyline options) +// Instantiates a polyline object given an array of geographical points and +// optionally an options object. You can create a `Polyline` object with +// multiple separate lines (`MultiPolyline`) by passing an array of arrays +// of geographic points. L.polyline = function (latlngs, options) { return new L.Polyline(latlngs, options); }; +L.Polyline._flat = function (latlngs) { + // true if it's a flat array of latlngs; false if nested + return !L.Util.isArray(latlngs[0]) || (typeof latlngs[0][0] !== 'object' && typeof latlngs[0][0] !== 'undefined'); +}; + + /* - * L.PolyUtil contains utility functions for polygons (clipping, etc.). + * @namespace PolyUtil + * Various utility functions for polygon geometries. */ -/*jshint bitwise:false */ // allow bitwise operations here - L.PolyUtil = {}; -/* - * Sutherland-Hodgeman polygon clipping algorithm. - * Used to avoid rendering parts of a polygon that are not currently visible. +/* @function clipPolygon(points: Point[], bounds: Bounds, round?: Boolean): Point[] + * Clips the polygon geometry defined by the given `points` by the given bounds (using the [Sutherland-Hodgeman algorithm](https://en.wikipedia.org/wiki/Sutherland%E2%80%93Hodgman_algorithm)). + * Used by Leaflet to only show polygon points that are on the screen or near, increasing + * performance. Note that polygon points needs different algorithm for clipping + * than polyline, so there's a seperate method for it. */ -L.PolyUtil.clipPolygon = function (points, bounds) { +L.PolyUtil.clipPolygon = function (points, bounds, round) { var clippedPoints, edges = [1, 4, 2, 8], i, j, k, @@ -5646,7 +8995,7 @@ L.PolyUtil.clipPolygon = function (points, bounds) { if (!(a._code & edge)) { // if b is outside the clip window (a->b goes out of screen) if (b._code & edge) { - p = lu._getEdgeIntersection(b, a, edge, bounds); + p = lu._getEdgeIntersection(b, a, edge, bounds, round); p._code = lu._getBitCode(p, bounds); clippedPoints.push(p); } @@ -5654,7 +9003,7 @@ L.PolyUtil.clipPolygon = function (points, bounds) { // else if b is inside the clip window (a->b enters the screen) } else if (!(b._code & edge)) { - p = lu._getEdgeIntersection(b, a, edge, bounds); + p = lu._getEdgeIntersection(b, a, edge, bounds, round); p._code = lu._getBitCode(p, bounds); clippedPoints.push(p); } @@ -5666,170 +9015,197 @@ L.PolyUtil.clipPolygon = function (points, bounds) { }; + /* - * L.Polygon is used to display polygons on a map. + * @class Polygon + * @aka L.Polygon + * @inherits Polyline + * + * A class for drawing polygon overlays on a map. Extends `Polyline`. + * + * Note that points you pass when creating a polygon shouldn't have an additional last point equal to the first one — it's better to filter out such points. + * + * + * @example + * + * ```js + * // create a red polygon from an array of LatLng points + * var latlngs = [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]]; + * + * var polygon = L.polygon(latlngs, {color: 'red'}).addTo(map); + * + * // zoom the map to the polygon + * map.fitBounds(polygon.getBounds()); + * ``` + * + * You can also pass an array of arrays of latlngs, with the first array representing the outer shape and the other arrays representing holes in the outer shape: + * + * ```js + * var latlngs = [ + * [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]], // outer ring + * [[37.29, -108.58],[40.71, -108.58],[40.71, -102.50],[37.29, -102.50]] // hole + * ]; + * ``` + * + * Additionally, you can pass a multi-dimensional array to represent a MultiPolygon shape. + * + * ```js + * var latlngs = [ + * [ // first polygon + * [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]], // outer ring + * [[37.29, -108.58],[40.71, -108.58],[40.71, -102.50],[37.29, -102.50]] // hole + * ], + * [ // second polygon + * [[41, -111.03],[45, -111.04],[45, -104.05],[41, -104.05]] + * ] + * ]; + * ``` */ L.Polygon = L.Polyline.extend({ + options: { fill: true }, - initialize: function (latlngs, options) { - L.Polyline.prototype.initialize.call(this, latlngs, options); - this._initWithHoles(latlngs); + isEmpty: function () { + return !this._latlngs.length || !this._latlngs[0].length; }, - _initWithHoles: function (latlngs) { - var i, len, hole; - if (latlngs && L.Util.isArray(latlngs[0]) && (typeof latlngs[0][0] !== 'number')) { - this._latlngs = this._convertLatLngs(latlngs[0]); - this._holes = latlngs.slice(1); - - for (i = 0, len = this._holes.length; i < len; i++) { - hole = this._holes[i] = this._convertLatLngs(this._holes[i]); - if (hole[0].equals(hole[hole.length - 1])) { - hole.pop(); - } - } + getCenter: function () { + // throws error when not yet added to map as this center calculation requires projected coordinates + if (!this._map) { + throw new Error('Must add layer to map before using getCenter()'); } - // filter out last point if its equal to the first one - latlngs = this._latlngs; + var i, j, p1, p2, f, area, x, y, center, + points = this._rings[0], + len = points.length; - if (latlngs.length >= 2 && latlngs[0].equals(latlngs[latlngs.length - 1])) { - latlngs.pop(); - } - }, + if (!len) { return null; } - projectLatlngs: function () { - L.Polyline.prototype.projectLatlngs.call(this); + // polygon centroid algorithm; only uses the first ring if there are multiple - // project polygon holes points - // TODO move this logic to Polyline to get rid of duplication - this._holePoints = []; + area = x = y = 0; - if (!this._holes) { return; } + for (i = 0, j = len - 1; i < len; j = i++) { + p1 = points[i]; + p2 = points[j]; - var i, j, len, len2; + f = p1.y * p2.x - p2.y * p1.x; + x += (p1.x + p2.x) * f; + y += (p1.y + p2.y) * f; + area += f * 3; + } + + if (area === 0) { + // Polygon is so small that all points are on same pixel. + center = points[0]; + } else { + center = [x / area, y / area]; + } + return this._map.layerPointToLatLng(center); + }, - for (i = 0, len = this._holes.length; i < len; i++) { - this._holePoints[i] = []; + _convertLatLngs: function (latlngs) { + var result = L.Polyline.prototype._convertLatLngs.call(this, latlngs), + len = result.length; - for (j = 0, len2 = this._holes[i].length; j < len2; j++) { - this._holePoints[i][j] = this._map.latLngToLayerPoint(this._holes[i][j]); - } + // remove last point if it equals first one + if (len >= 2 && result[0] instanceof L.LatLng && result[0].equals(result[len - 1])) { + result.pop(); } + return result; }, - setLatLngs: function (latlngs) { - if (latlngs && L.Util.isArray(latlngs[0]) && (typeof latlngs[0][0] !== 'number')) { - this._initWithHoles(latlngs); - return this.redraw(); - } else { - return L.Polyline.prototype.setLatLngs.call(this, latlngs); + _setLatLngs: function (latlngs) { + L.Polyline.prototype._setLatLngs.call(this, latlngs); + if (L.Polyline._flat(this._latlngs)) { + this._latlngs = [this._latlngs]; } }, + _defaultShape: function () { + return L.Polyline._flat(this._latlngs[0]) ? this._latlngs[0] : this._latlngs[0][0]; + }, + _clipPoints: function () { - var points = this._originalPoints, - newParts = []; + // polygons need a different clipping algorithm so we redefine that + + var bounds = this._renderer._bounds, + w = this.options.weight, + p = new L.Point(w, w); + + // increase clip padding by stroke width to avoid stroke on clip edges + bounds = new L.Bounds(bounds.min.subtract(p), bounds.max.add(p)); - this._parts = [points].concat(this._holePoints); + this._parts = []; + if (!this._pxBounds || !this._pxBounds.intersects(bounds)) { + return; + } - if (this.options.noClip) { return; } + if (this.options.noClip) { + this._parts = this._rings; + return; + } - for (var i = 0, len = this._parts.length; i < len; i++) { - var clipped = L.PolyUtil.clipPolygon(this._parts[i], this._map._pathViewport); + for (var i = 0, len = this._rings.length, clipped; i < len; i++) { + clipped = L.PolyUtil.clipPolygon(this._rings[i], bounds, true); if (clipped.length) { - newParts.push(clipped); + this._parts.push(clipped); } } - - this._parts = newParts; }, - _getPathPartStr: function (points) { - var str = L.Polyline.prototype._getPathPartStr.call(this, points); - return str + (L.Browser.svg ? 'z' : 'x'); + _updatePath: function () { + this._renderer._updatePoly(this, true); } }); + +// @factory L.polygon(latlngs: LatLng[], options?: Polyline options) L.polygon = function (latlngs, options) { return new L.Polygon(latlngs, options); }; + /* - * Contains L.MultiPolyline and L.MultiPolygon layers. + * L.Rectangle extends Polygon and creates a rectangle when passed a LatLngBounds object. */ -(function () { - function createMulti(Klass) { - - return L.FeatureGroup.extend({ - - initialize: function (latlngs, options) { - this._layers = {}; - this._options = options; - this.setLatLngs(latlngs); - }, - - setLatLngs: function (latlngs) { - var i = 0, - len = latlngs.length; - - this.eachLayer(function (layer) { - if (i < len) { - layer.setLatLngs(latlngs[i++]); - } else { - this.removeLayer(layer); - } - }, this); - - while (i < len) { - this.addLayer(new Klass(latlngs[i++], this._options)); - } - - return this; - }, - - getLatLngs: function () { - var latlngs = []; - - this.eachLayer(function (layer) { - latlngs.push(layer.getLatLngs()); - }); - - return latlngs; - } - }); - } - - L.MultiPolyline = createMulti(L.Polyline); - L.MultiPolygon = createMulti(L.Polygon); - - L.multiPolyline = function (latlngs, options) { - return new L.MultiPolyline(latlngs, options); - }; - - L.multiPolygon = function (latlngs, options) { - return new L.MultiPolygon(latlngs, options); - }; -}()); - - /* - * L.Rectangle extends Polygon and creates a rectangle when passed a LatLngBounds object. + * @class Rectangle + * @aka L.Retangle + * @inherits Polygon + * + * A class for drawing rectangle overlays on a map. Extends `Polygon`. + * + * @example + * + * ```js + * // define rectangle geographical bounds + * var bounds = [[54.559322, -5.767822], [56.1210604, -3.021240]]; + * + * // create an orange rectangle + * L.rectangle(bounds, {color: "#ff7800", weight: 1}).addTo(map); + * + * // zoom the map to the rectangle bounds + * map.fitBounds(bounds); + * ``` + * */ + L.Rectangle = L.Polygon.extend({ initialize: function (latLngBounds, options) { L.Polygon.prototype.initialize.call(this, this._boundsToLatLngs(latLngBounds), options); }, + // @method setBounds(latLngBounds: LatLngBounds): this + // Redraws the rectangle with the passed bounds. setBounds: function (latLngBounds) { - this.setLatLngs(this._boundsToLatLngs(latLngBounds)); + return this.setLatLngs(this._boundsToLatLngs(latLngBounds)); }, _boundsToLatLngs: function (latLngBounds) { @@ -5843,3338 +9219,4033 @@ L.Rectangle = L.Polygon.extend({ } }); + +// @factory L.rectangle(latLngBounds: LatLngBounds, options?: Polyline options) L.rectangle = function (latLngBounds, options) { return new L.Rectangle(latLngBounds, options); }; + /* - * L.Circle is a circle overlay (with a certain radius in meters). + * @class CircleMarker + * @aka L.CircleMarker + * @inherits Path + * + * A circle of a fixed size with radius specified in pixels. Extends `Path`. */ -L.Circle = L.Path.extend({ - initialize: function (latlng, radius, options) { - L.Path.prototype.initialize.call(this, options); - - this._latlng = L.latLng(latlng); - this._mRadius = radius; - }, +L.CircleMarker = L.Path.extend({ + // @section + // @aka CircleMarker options options: { - fill: true - }, - - setLatLng: function (latlng) { - this._latlng = L.latLng(latlng); - return this.redraw(); - }, - - setRadius: function (radius) { - this._mRadius = radius; - return this.redraw(); - }, - - projectLatlngs: function () { - var lngRadius = this._getLngRadius(), - latlng = this._latlng, - pointLeft = this._map.latLngToLayerPoint([latlng.lat, latlng.lng - lngRadius]); - - this._point = this._map.latLngToLayerPoint(latlng); - this._radius = Math.max(this._point.x - pointLeft.x, 1); - }, - - getBounds: function () { - var lngRadius = this._getLngRadius(), - latRadius = (this._mRadius / 40075017) * 360, - latlng = this._latlng; - - return new L.LatLngBounds( - [latlng.lat - latRadius, latlng.lng - lngRadius], - [latlng.lat + latRadius, latlng.lng + lngRadius]); - }, - - getLatLng: function () { - return this._latlng; - }, - - getPathString: function () { - var p = this._point, - r = this._radius; - - if (this._checkIfEmpty()) { - return ''; - } - - if (L.Browser.svg) { - return 'M' + p.x + ',' + (p.y - r) + - 'A' + r + ',' + r + ',0,1,1,' + - (p.x - 0.1) + ',' + (p.y - r) + ' z'; - } else { - p._round(); - r = Math.round(r); - return 'AL ' + p.x + ',' + p.y + ' ' + r + ',' + r + ' 0,' + (65535 * 360); - } - }, - - getRadius: function () { - return this._mRadius; - }, + fill: true, - // TODO Earth hardcoded, move into projection code! - - _getLatRadius: function () { - return (this._mRadius / 40075017) * 360; + // @option radius: Number = 10 + // Radius of the circle marker, in pixels + radius: 10 }, - _getLngRadius: function () { - return this._getLatRadius() / Math.cos(L.LatLng.DEG_TO_RAD * this._latlng.lat); + initialize: function (latlng, options) { + L.setOptions(this, options); + this._latlng = L.latLng(latlng); + this._radius = this.options.radius; }, - _checkIfEmpty: function () { - if (!this._map) { - return false; - } - var vp = this._map._pathViewport, - r = this._radius, - p = this._point; - - return p.x - r > vp.max.x || p.y - r > vp.max.y || - p.x + r < vp.min.x || p.y + r < vp.min.y; - } -}); - -L.circle = function (latlng, radius, options) { - return new L.Circle(latlng, radius, options); -}; + // @method setLatLng(latLng: LatLng): this + // Sets the position of a circle marker to a new location. + setLatLng: function (latlng) { + this._latlng = L.latLng(latlng); + this.redraw(); + return this.fire('move', {latlng: this._latlng}); + }, + // @method getLatLng(): LatLng + // Returns the current geographical position of the circle marker + getLatLng: function () { + return this._latlng; + }, -/* - * L.CircleMarker is a circle overlay with a permanent pixel radius. - */ + // @method setRadius(radius: Number): this + // Sets the radius of a circle marker. Units are in pixels. + setRadius: function (radius) { + this.options.radius = this._radius = radius; + return this.redraw(); + }, -L.CircleMarker = L.Circle.extend({ - options: { - radius: 10, - weight: 2 + // @method getRadius(): Number + // Returns the current radius of the circle + getRadius: function () { + return this._radius; }, - initialize: function (latlng, options) { - L.Circle.prototype.initialize.call(this, latlng, null, options); - this._radius = this.options.radius; + setStyle : function (options) { + var radius = options && options.radius || this._radius; + L.Path.prototype.setStyle.call(this, options); + this.setRadius(radius); + return this; }, - projectLatlngs: function () { + _project: function () { this._point = this._map.latLngToLayerPoint(this._latlng); + this._updateBounds(); }, - _updateStyle : function () { - L.Circle.prototype._updateStyle.call(this); - this.setRadius(this.options.radius); + _updateBounds: function () { + var r = this._radius, + r2 = this._radiusY || r, + w = this._clickTolerance(), + p = [r + w, r2 + w]; + this._pxBounds = new L.Bounds(this._point.subtract(p), this._point.add(p)); }, - setLatLng: function (latlng) { - L.Circle.prototype.setLatLng.call(this, latlng); - if (this._popup && this._popup._isOpen) { - this._popup.setLatLng(latlng); + _update: function () { + if (this._map) { + this._updatePath(); } - return this; }, - setRadius: function (radius) { - this.options.radius = this._radius = radius; - return this.redraw(); + _updatePath: function () { + this._renderer._updateCircle(this); }, - getRadius: function () { - return this._radius; + _empty: function () { + return this._radius && !this._renderer._bounds.intersects(this._pxBounds); } }); + +// @factory L.circleMarker(latlng: LatLng, options?: CircleMarker options) +// Instantiates a circle marker object given a geographical point, and an optional options object. L.circleMarker = function (latlng, options) { return new L.CircleMarker(latlng, options); }; + /* - * Extends L.Polyline to be able to manually detect clicks on Canvas-rendered polylines. + * @class Circle + * @aka L.Circle + * @inherits CircleMarker + * + * A class for drawing circle overlays on a map. Extends `CircleMarker`. + * + * It's an approximation and starts to diverge from a real circle closer to poles (due to projection distortion). + * + * @example + * + * ```js + * L.circle([50.5, 30.5], {radius: 200}).addTo(map); + * ``` */ -L.Polyline.include(!L.Path.CANVAS ? {} : { - _containsPoint: function (p, closed) { - var i, j, k, len, len2, dist, part, - w = this.options.weight / 2; +L.Circle = L.CircleMarker.extend({ - if (L.Browser.touch) { - w += 10; // polyline click tolerance on touch devices + initialize: function (latlng, options, legacyOptions) { + if (typeof options === 'number') { + // Backwards compatibility with 0.7.x factory (latlng, radius, options?) + options = L.extend({}, legacyOptions, {radius: options}); } + L.setOptions(this, options); + this._latlng = L.latLng(latlng); - for (i = 0, len = this._parts.length; i < len; i++) { - part = this._parts[i]; - for (j = 0, len2 = part.length, k = len2 - 1; j < len2; k = j++) { - if (!closed && (j === 0)) { - continue; - } + if (isNaN(this.options.radius)) { throw new Error('Circle radius cannot be NaN'); } - dist = L.LineUtil.pointToSegmentDistance(p, part[k], part[j]); + // @section + // @aka Circle options + // @option radius: Number; Radius of the circle, in meters. + this._mRadius = this.options.radius; + }, - if (dist <= w) { - return true; - } - } - } - return false; - } -}); + // @method setRadius(radius: Number): this + // Sets the radius of a circle. Units are in meters. + setRadius: function (radius) { + this._mRadius = radius; + return this.redraw(); + }, + // @method getRadius(): Number + // Returns the current radius of a circle. Units are in meters. + getRadius: function () { + return this._mRadius; + }, -/* - * Extends L.Polygon to be able to manually detect clicks on Canvas-rendered polygons. - */ + // @method getBounds(): LatLngBounds + // Returns the `LatLngBounds` of the path. + getBounds: function () { + var half = [this._radius, this._radiusY || this._radius]; -L.Polygon.include(!L.Path.CANVAS ? {} : { - _containsPoint: function (p) { - var inside = false, - part, p1, p2, - i, j, k, - len, len2; + return new L.LatLngBounds( + this._map.layerPointToLatLng(this._point.subtract(half)), + this._map.layerPointToLatLng(this._point.add(half))); + }, - // TODO optimization: check if within bounds first + setStyle: L.Path.prototype.setStyle, - if (L.Polyline.prototype._containsPoint.call(this, p, true)) { - // click on polygon border - return true; - } + _project: function () { - // ray casting algorithm for detecting if point is in polygon + var lng = this._latlng.lng, + lat = this._latlng.lat, + map = this._map, + crs = map.options.crs; + + if (crs.distance === L.CRS.Earth.distance) { + var d = Math.PI / 180, + latR = (this._mRadius / L.CRS.Earth.R) / d, + top = map.project([lat + latR, lng]), + bottom = map.project([lat - latR, lng]), + p = top.add(bottom).divideBy(2), + lat2 = map.unproject(p).lat, + lngR = Math.acos((Math.cos(latR * d) - Math.sin(lat * d) * Math.sin(lat2 * d)) / + (Math.cos(lat * d) * Math.cos(lat2 * d))) / d; + + if (isNaN(lngR) || lngR === 0) { + lngR = latR / Math.cos(Math.PI / 180 * lat); // Fallback for edge case, #2425 + } - for (i = 0, len = this._parts.length; i < len; i++) { - part = this._parts[i]; + this._point = p.subtract(map.getPixelOrigin()); + this._radius = isNaN(lngR) ? 0 : Math.max(Math.round(p.x - map.project([lat2, lng - lngR]).x), 1); + this._radiusY = Math.max(Math.round(p.y - top.y), 1); - for (j = 0, len2 = part.length, k = len2 - 1; j < len2; k = j++) { - p1 = part[j]; - p2 = part[k]; + } else { + var latlng2 = crs.unproject(crs.project(this._latlng).subtract([this._mRadius, 0])); - if (((p1.y > p.y) !== (p2.y > p.y)) && - (p.x < (p2.x - p1.x) * (p.y - p1.y) / (p2.y - p1.y) + p1.x)) { - inside = !inside; - } - } + this._point = map.latLngToLayerPoint(this._latlng); + this._radius = this._point.x - map.latLngToLayerPoint(latlng2).x; } - return inside; + this._updateBounds(); } }); +// @factory L.circle(latlng: LatLng, options?: Circle options) +// Instantiates a circle object given a geographical point, and an options object +// which contains the circle radius. +// @alternative +// @factory L.circle(latlng: LatLng, radius: Number, options?: Circle options) +// Obsolete way of instantiating a circle, for compatibility with 0.7.x code. +// Do not use in new applications or plugins. +L.circle = function (latlng, options, legacyOptions) { + return new L.Circle(latlng, options, legacyOptions); +}; -/* - * Extends L.Circle with Canvas-specific code. - */ - -L.Circle.include(!L.Path.CANVAS ? {} : { - _drawPath: function () { - var p = this._point; - this._ctx.beginPath(); - this._ctx.arc(p.x, p.y, this._radius, 0, Math.PI * 2, false); - }, - - _containsPoint: function (p) { - var center = this._point, - w2 = this.options.stroke ? this.options.weight / 2 : 0; - - return (p.distanceTo(center) <= this._radius + w2); - } -}); /* - * CircleMarker canvas specific drawing parts. + * @class SVG + * @inherits Renderer + * @aka L.SVG + * + * Allows vector layers to be displayed with [SVG](https://developer.mozilla.org/docs/Web/SVG). + * Inherits `Renderer`. + * + * Due to [technical limitations](http://caniuse.com/#search=svg), SVG is not + * available in all web browsers, notably Android 2.x and 3.x. + * + * Although SVG is not available on IE7 and IE8, these browsers support + * [VML](https://en.wikipedia.org/wiki/Vector_Markup_Language) + * (a now deprecated technology), and the SVG renderer will fall back to VML in + * this case. + * + * @example + * + * Use SVG by default for all paths in the map: + * + * ```js + * var map = L.map('map', { + * renderer: L.svg() + * }); + * ``` + * + * Use a SVG renderer with extra padding for specific vector geometries: + * + * ```js + * var map = L.map('map'); + * var myRenderer = L.svg({ padding: 0.5 }); + * var line = L.polyline( coordinates, { renderer: myRenderer } ); + * var circle = L.circle( center, { renderer: myRenderer } ); + * ``` */ -L.CircleMarker.include(!L.Path.CANVAS ? {} : { - _updateStyle: function () { - L.Path.prototype._updateStyle.call(this); - } -}); - +L.SVG = L.Renderer.extend({ -/* - * L.GeoJSON turns any GeoJSON data into a Leaflet layer. - */ + getEvents: function () { + var events = L.Renderer.prototype.getEvents.call(this); + events.zoomstart = this._onZoomStart; + return events; + }, -L.GeoJSON = L.FeatureGroup.extend({ + _initContainer: function () { + this._container = L.SVG.create('svg'); - initialize: function (geojson, options) { - L.setOptions(this, options); + // makes it possible to click through svg root; we'll reset it back in individual paths + this._container.setAttribute('pointer-events', 'none'); - this._layers = {}; + this._rootGroup = L.SVG.create('g'); + this._container.appendChild(this._rootGroup); + }, - if (geojson) { - this.addData(geojson); - } + _onZoomStart: function () { + // Drag-then-pinch interactions might mess up the center and zoom. + // In this case, the easiest way to prevent this is re-do the renderer + // bounds and padding when the zooming starts. + this._update(); }, - addData: function (geojson) { - var features = L.Util.isArray(geojson) ? geojson : geojson.features, - i, len, feature; + _update: function () { + if (this._map._animatingZoom && this._bounds) { return; } - if (features) { - for (i = 0, len = features.length; i < len; i++) { - // Only add this if geometry or geometries are set and not null - feature = features[i]; - if (feature.geometries || feature.geometry || feature.features || feature.coordinates) { - this.addData(features[i]); - } - } - return this; - } + L.Renderer.prototype._update.call(this); - var options = this.options; + var b = this._bounds, + size = b.getSize(), + container = this._container; - if (options.filter && !options.filter(geojson)) { return; } + // set size of svg-container if changed + if (!this._svgSize || !this._svgSize.equals(size)) { + this._svgSize = size; + container.setAttribute('width', size.x); + container.setAttribute('height', size.y); + } - var layer = L.GeoJSON.geometryToLayer(geojson, options.pointToLayer, options.coordsToLatLng, options); - layer.feature = L.GeoJSON.asFeature(geojson); + // movement: update container viewBox so that we don't have to change coordinates of individual layers + L.DomUtil.setPosition(container, b.min); + container.setAttribute('viewBox', [b.min.x, b.min.y, size.x, size.y].join(' ')); - layer.defaultOptions = layer.options; - this.resetStyle(layer); + this.fire('update'); + }, - if (options.onEachFeature) { - options.onEachFeature(geojson, layer); - } + // methods below are called by vector layers implementations - return this.addLayer(layer); - }, + _initPath: function (layer) { + var path = layer._path = L.SVG.create('path'); - resetStyle: function (layer) { - var style = this.options.style; - if (style) { - // reset any custom styles - L.Util.extend(layer.options, layer.defaultOptions); + // @namespace Path + // @option className: String = null + // Custom class name set on an element. Only for SVG renderer. + if (layer.options.className) { + L.DomUtil.addClass(path, layer.options.className); + } - this._setLayerStyle(layer, style); + if (layer.options.interactive) { + L.DomUtil.addClass(path, 'leaflet-interactive'); } - }, - setStyle: function (style) { - this.eachLayer(function (layer) { - this._setLayerStyle(layer, style); - }, this); + this._updateStyle(layer); + this._layers[L.stamp(layer)] = layer; }, - _setLayerStyle: function (layer, style) { - if (typeof style === 'function') { - style = style(layer.feature); - } - if (layer.setStyle) { - layer.setStyle(style); - } - } -}); + _addPath: function (layer) { + this._rootGroup.appendChild(layer._path); + layer.addInteractiveTarget(layer._path); + }, -L.extend(L.GeoJSON, { - geometryToLayer: function (geojson, pointToLayer, coordsToLatLng, vectorOptions) { - var geometry = geojson.type === 'Feature' ? geojson.geometry : geojson, - coords = geometry.coordinates, - layers = [], - latlng, latlngs, i, len; + _removePath: function (layer) { + L.DomUtil.remove(layer._path); + layer.removeInteractiveTarget(layer._path); + delete this._layers[L.stamp(layer)]; + }, - coordsToLatLng = coordsToLatLng || this.coordsToLatLng; + _updatePath: function (layer) { + layer._project(); + layer._update(); + }, - switch (geometry.type) { - case 'Point': - latlng = coordsToLatLng(coords); - return pointToLayer ? pointToLayer(geojson, latlng) : new L.Marker(latlng); + _updateStyle: function (layer) { + var path = layer._path, + options = layer.options; - case 'MultiPoint': - for (i = 0, len = coords.length; i < len; i++) { - latlng = coordsToLatLng(coords[i]); - layers.push(pointToLayer ? pointToLayer(geojson, latlng) : new L.Marker(latlng)); - } - return new L.FeatureGroup(layers); + if (!path) { return; } - case 'LineString': - latlngs = this.coordsToLatLngs(coords, 0, coordsToLatLng); - return new L.Polyline(latlngs, vectorOptions); + if (options.stroke) { + path.setAttribute('stroke', options.color); + path.setAttribute('stroke-opacity', options.opacity); + path.setAttribute('stroke-width', options.weight); + path.setAttribute('stroke-linecap', options.lineCap); + path.setAttribute('stroke-linejoin', options.lineJoin); - case 'Polygon': - if (coords.length === 2 && !coords[1].length) { - throw new Error('Invalid GeoJSON object.'); + if (options.dashArray) { + path.setAttribute('stroke-dasharray', options.dashArray); + } else { + path.removeAttribute('stroke-dasharray'); } - latlngs = this.coordsToLatLngs(coords, 1, coordsToLatLng); - return new L.Polygon(latlngs, vectorOptions); - - case 'MultiLineString': - latlngs = this.coordsToLatLngs(coords, 1, coordsToLatLng); - return new L.MultiPolyline(latlngs, vectorOptions); - - case 'MultiPolygon': - latlngs = this.coordsToLatLngs(coords, 2, coordsToLatLng); - return new L.MultiPolygon(latlngs, vectorOptions); - - case 'GeometryCollection': - for (i = 0, len = geometry.geometries.length; i < len; i++) { - layers.push(this.geometryToLayer({ - geometry: geometry.geometries[i], - type: 'Feature', - properties: geojson.properties - }, pointToLayer, coordsToLatLng, vectorOptions)); + if (options.dashOffset) { + path.setAttribute('stroke-dashoffset', options.dashOffset); + } else { + path.removeAttribute('stroke-dashoffset'); } - return new L.FeatureGroup(layers); + } else { + path.setAttribute('stroke', 'none'); + } - default: - throw new Error('Invalid GeoJSON object.'); + if (options.fill) { + path.setAttribute('fill', options.fillColor || options.color); + path.setAttribute('fill-opacity', options.fillOpacity); + path.setAttribute('fill-rule', options.fillRule || 'evenodd'); + } else { + path.setAttribute('fill', 'none'); } }, - coordsToLatLng: function (coords) { // (Array[, Boolean]) -> LatLng - return new L.LatLng(coords[1], coords[0], coords[2]); + _updatePoly: function (layer, closed) { + this._setPath(layer, L.SVG.pointsToPath(layer._parts, closed)); }, - coordsToLatLngs: function (coords, levelsDeep, coordsToLatLng) { // (Array[, Number, Function]) -> Array - var latlng, i, len, - latlngs = []; + _updateCircle: function (layer) { + var p = layer._point, + r = layer._radius, + r2 = layer._radiusY || r, + arc = 'a' + r + ',' + r2 + ' 0 1,0 '; - for (i = 0, len = coords.length; i < len; i++) { - latlng = levelsDeep ? - this.coordsToLatLngs(coords[i], levelsDeep - 1, coordsToLatLng) : - (coordsToLatLng || this.coordsToLatLng)(coords[i]); - - latlngs.push(latlng); - } + // drawing a circle with two half-arcs + var d = layer._empty() ? 'M0 0' : + 'M' + (p.x - r) + ',' + p.y + + arc + (r * 2) + ',0 ' + + arc + (-r * 2) + ',0 '; - return latlngs; + this._setPath(layer, d); }, - latLngToCoords: function (latlng) { - var coords = [latlng.lng, latlng.lat]; + _setPath: function (layer, path) { + layer._path.setAttribute('d', path); + }, - if (latlng.alt !== undefined) { - coords.push(latlng.alt); - } - return coords; + // SVG does not have the concept of zIndex so we resort to changing the DOM order of elements + _bringToFront: function (layer) { + L.DomUtil.toFront(layer._path); }, - latLngsToCoords: function (latLngs) { - var coords = []; + _bringToBack: function (layer) { + L.DomUtil.toBack(layer._path); + } +}); - for (var i = 0, len = latLngs.length; i < len; i++) { - coords.push(L.GeoJSON.latLngToCoords(latLngs[i])); - } - return coords; +// @namespace SVG; @section +// There are several static functions which can be called without instantiating L.SVG: +L.extend(L.SVG, { + // @function create(name: String): SVGElement + // Returns a instance of [SVGElement](https://developer.mozilla.org/docs/Web/API/SVGElement), + // corresponding to the class name passed. For example, using 'line' will return + // an instance of [SVGLineElement](https://developer.mozilla.org/docs/Web/API/SVGLineElement). + create: function (name) { + return document.createElementNS('http://www.w3.org/2000/svg', name); }, - getFeature: function (layer, newGeometry) { - return layer.feature ? L.extend({}, layer.feature, {geometry: newGeometry}) : L.GeoJSON.asFeature(newGeometry); - }, + // @function pointsToPath(rings: Point[], closed: Boolean): String + // Generates a SVG path string for multiple rings, with each ring turning + // into "M..L..L.." instructions + pointsToPath: function (rings, closed) { + var str = '', + i, j, len, len2, points, p; + + for (i = 0, len = rings.length; i < len; i++) { + points = rings[i]; + + for (j = 0, len2 = points.length; j < len2; j++) { + p = points[j]; + str += (j ? 'L' : 'M') + p.x + ' ' + p.y; + } - asFeature: function (geoJSON) { - if (geoJSON.type === 'Feature') { - return geoJSON; + // closes the ring for polygons; "x" is VML syntax + str += closed ? (L.Browser.svg ? 'z' : 'x') : ''; } - return { - type: 'Feature', - properties: {}, - geometry: geoJSON - }; + // SVG complains about empty path strings + return str || 'M0 0'; } }); -var PointToGeoJSON = { - toGeoJSON: function () { - return L.GeoJSON.getFeature(this, { - type: 'Point', - coordinates: L.GeoJSON.latLngToCoords(this.getLatLng()) - }); - } +// @namespace Browser; @property svg: Boolean +// `true` when the browser supports [SVG](https://developer.mozilla.org/docs/Web/SVG). +L.Browser.svg = !!(document.createElementNS && L.SVG.create('svg').createSVGRect); + + +// @namespace SVG +// @factory L.svg(options?: Renderer options) +// Creates a SVG renderer with the given options. +L.svg = function (options) { + return L.Browser.svg || L.Browser.vml ? new L.SVG(options) : null; }; -L.Marker.include(PointToGeoJSON); -L.Circle.include(PointToGeoJSON); -L.CircleMarker.include(PointToGeoJSON); -L.Polyline.include({ - toGeoJSON: function () { - return L.GeoJSON.getFeature(this, { - type: 'LineString', - coordinates: L.GeoJSON.latLngsToCoords(this.getLatLngs()) - }); - } -}); -L.Polygon.include({ - toGeoJSON: function () { - var coords = [L.GeoJSON.latLngsToCoords(this.getLatLngs())], - i, len, hole; +/* + * Thanks to Dmitry Baranovsky and his Raphael library for inspiration! + */ - coords[0].push(coords[0][0]); +/* + * @class SVG + * + * Although SVG is not available on IE7 and IE8, these browsers support [VML](https://en.wikipedia.org/wiki/Vector_Markup_Language), and the SVG renderer will fall back to VML in this case. + * + * VML was deprecated in 2012, which means VML functionality exists only for backwards compatibility + * with old versions of Internet Explorer. + */ - if (this._holes) { - for (i = 0, len = this._holes.length; i < len; i++) { - hole = L.GeoJSON.latLngsToCoords(this._holes[i]); - hole.push(hole[0]); - coords.push(hole); - } - } +// @namespace Browser; @property vml: Boolean +// `true` if the browser supports [VML](https://en.wikipedia.org/wiki/Vector_Markup_Language). +L.Browser.vml = !L.Browser.svg && (function () { + try { + var div = document.createElement('div'); + div.innerHTML = ''; - return L.GeoJSON.getFeature(this, { - type: 'Polygon', - coordinates: coords - }); + var shape = div.firstChild; + shape.style.behavior = 'url(#default#VML)'; + + return shape && (typeof shape.adj === 'object'); + + } catch (e) { + return false; } -}); +}()); -(function () { - function multiToGeoJSON(type) { - return function () { - var coords = []; +// redefine some SVG methods to handle VML syntax which is similar but with some differences +L.SVG.include(!L.Browser.vml ? {} : { - this.eachLayer(function (layer) { - coords.push(layer.toGeoJSON().geometry.coordinates); - }); + _initContainer: function () { + this._container = L.DomUtil.create('div', 'leaflet-vml-container'); + }, - return L.GeoJSON.getFeature(this, { - type: type, - coordinates: coords - }); - }; - } + _update: function () { + if (this._map._animatingZoom) { return; } + L.Renderer.prototype._update.call(this); + this.fire('update'); + }, + + _initPath: function (layer) { + var container = layer._container = L.SVG.create('shape'); + + L.DomUtil.addClass(container, 'leaflet-vml-shape ' + (this.options.className || '')); + + container.coordsize = '1 1'; + + layer._path = L.SVG.create('path'); + container.appendChild(layer._path); + + this._updateStyle(layer); + this._layers[L.stamp(layer)] = layer; + }, + + _addPath: function (layer) { + var container = layer._container; + this._container.appendChild(container); + + if (layer.options.interactive) { + layer.addInteractiveTarget(container); + } + }, - L.MultiPolyline.include({toGeoJSON: multiToGeoJSON('MultiLineString')}); - L.MultiPolygon.include({toGeoJSON: multiToGeoJSON('MultiPolygon')}); + _removePath: function (layer) { + var container = layer._container; + L.DomUtil.remove(container); + layer.removeInteractiveTarget(container); + delete this._layers[L.stamp(layer)]; + }, - L.LayerGroup.include({ - toGeoJSON: function () { + _updateStyle: function (layer) { + var stroke = layer._stroke, + fill = layer._fill, + options = layer.options, + container = layer._container; - var geometry = this.feature && this.feature.geometry, - jsons = [], - json; + container.stroked = !!options.stroke; + container.filled = !!options.fill; - if (geometry && geometry.type === 'MultiPoint') { - return multiToGeoJSON('MultiPoint').call(this); + if (options.stroke) { + if (!stroke) { + stroke = layer._stroke = L.SVG.create('stroke'); } + container.appendChild(stroke); + stroke.weight = options.weight + 'px'; + stroke.color = options.color; + stroke.opacity = options.opacity; - var isGeometryCollection = geometry && geometry.type === 'GeometryCollection'; - - this.eachLayer(function (layer) { - if (layer.toGeoJSON) { - json = layer.toGeoJSON(); - jsons.push(isGeometryCollection ? json.geometry : L.GeoJSON.asFeature(json)); - } - }); - - if (isGeometryCollection) { - return L.GeoJSON.getFeature(this, { - geometries: jsons, - type: 'GeometryCollection' - }); + if (options.dashArray) { + stroke.dashStyle = L.Util.isArray(options.dashArray) ? + options.dashArray.join(' ') : + options.dashArray.replace(/( *, *)/g, ' '); + } else { + stroke.dashStyle = ''; } + stroke.endcap = options.lineCap.replace('butt', 'flat'); + stroke.joinstyle = options.lineJoin; - return { - type: 'FeatureCollection', - features: jsons - }; + } else if (stroke) { + container.removeChild(stroke); + layer._stroke = null; } - }); -}()); -L.geoJson = function (geojson, options) { - return new L.GeoJSON(geojson, options); -}; + if (options.fill) { + if (!fill) { + fill = layer._fill = L.SVG.create('fill'); + } + container.appendChild(fill); + fill.color = options.fillColor || options.color; + fill.opacity = options.fillOpacity; + } else if (fill) { + container.removeChild(fill); + layer._fill = null; + } + }, -/* - * L.DomEvent contains functions for working with DOM events. - */ + _updateCircle: function (layer) { + var p = layer._point.round(), + r = Math.round(layer._radius), + r2 = Math.round(layer._radiusY || r); -L.DomEvent = { - /* inspired by John Resig, Dean Edwards and YUI addEvent implementations */ - addListener: function (obj, type, fn, context) { // (HTMLElement, String, Function[, Object]) + this._setPath(layer, layer._empty() ? 'M0 0' : + 'AL ' + p.x + ',' + p.y + ' ' + r + ',' + r2 + ' 0,' + (65535 * 360)); + }, - var id = L.stamp(fn), - key = '_leaflet_' + type + id, - handler, originalHandler, newType; + _setPath: function (layer, path) { + layer._path.v = path; + }, - if (obj[key]) { return this; } + _bringToFront: function (layer) { + L.DomUtil.toFront(layer._container); + }, - handler = function (e) { - return fn.call(context || obj, e || L.DomEvent._getEvent()); - }; + _bringToBack: function (layer) { + L.DomUtil.toBack(layer._container); + } +}); - if (L.Browser.pointer && type.indexOf('touch') === 0) { - return this.addPointerListener(obj, type, handler, id); - } - if (L.Browser.touch && (type === 'dblclick') && this.addDoubleTapListener) { - this.addDoubleTapListener(obj, handler, id); +if (L.Browser.vml) { + L.SVG.create = (function () { + try { + document.namespaces.add('lvml', 'urn:schemas-microsoft-com:vml'); + return function (name) { + return document.createElement(''); + }; + } catch (e) { + return function (name) { + return document.createElement('<' + name + ' xmlns="urn:schemas-microsoft.com:vml" class="lvml">'); + }; } + })(); +} - if ('addEventListener' in obj) { - if (type === 'mousewheel') { - obj.addEventListener('DOMMouseScroll', handler, false); - obj.addEventListener(type, handler, false); - } else if ((type === 'mouseenter') || (type === 'mouseleave')) { +/* + * @class Canvas + * @inherits Renderer + * @aka L.Canvas + * + * Allows vector layers to be displayed with [``](https://developer.mozilla.org/docs/Web/API/Canvas_API). + * Inherits `Renderer`. + * + * Due to [technical limitations](http://caniuse.com/#search=canvas), Canvas is not + * available in all web browsers, notably IE8, and overlapping geometries might + * not display properly in some edge cases. + * + * @example + * + * Use Canvas by default for all paths in the map: + * + * ```js + * var map = L.map('map', { + * renderer: L.canvas() + * }); + * ``` + * + * Use a Canvas renderer with extra padding for specific vector geometries: + * + * ```js + * var map = L.map('map'); + * var myRenderer = L.canvas({ padding: 0.5 }); + * var line = L.polyline( coordinates, { renderer: myRenderer } ); + * var circle = L.circle( center, { renderer: myRenderer } ); + * ``` + */ - originalHandler = handler; - newType = (type === 'mouseenter' ? 'mouseover' : 'mouseout'); +L.Canvas = L.Renderer.extend({ + getEvents: function () { + var events = L.Renderer.prototype.getEvents.call(this); + events.viewprereset = this._onViewPreReset; + return events; + }, - handler = function (e) { - if (!L.DomEvent._checkMouse(obj, e)) { return; } - return originalHandler(e); - }; + _onViewPreReset: function () { + // Set a flag so that a viewprereset+moveend+viewreset only updates&redraws once + this._postponeUpdatePaths = true; + }, - obj.addEventListener(newType, handler, false); + onAdd: function () { + L.Renderer.prototype.onAdd.call(this); - } else if (type === 'click' && L.Browser.android) { - originalHandler = handler; - handler = function (e) { - return L.DomEvent._filterClick(e, originalHandler); - }; + // Redraw vectors since canvas is cleared upon removal, + // in case of removing the renderer itself from the map. + this._draw(); + }, - obj.addEventListener(type, handler, false); - } else { - obj.addEventListener(type, handler, false); - } + _initContainer: function () { + var container = this._container = document.createElement('canvas'); - } else if ('attachEvent' in obj) { - obj.attachEvent('on' + type, handler); - } + L.DomEvent + .on(container, 'mousemove', L.Util.throttle(this._onMouseMove, 32, this), this) + .on(container, 'click dblclick mousedown mouseup contextmenu', this._onClick, this) + .on(container, 'mouseout', this._handleMouseOut, this); - obj[key] = handler; + this._ctx = container.getContext('2d'); + }, - return this; + _updatePaths: function () { + if (this._postponeUpdatePaths) { return; } + + var layer; + this._redrawBounds = null; + for (var id in this._layers) { + layer = this._layers[id]; + layer._update(); + } + this._redraw(); }, - removeListener: function (obj, type, fn) { // (HTMLElement, String, Function) + _update: function () { + if (this._map._animatingZoom && this._bounds) { return; } - var id = L.stamp(fn), - key = '_leaflet_' + type + id, - handler = obj[key]; + this._drawnLayers = {}; - if (!handler) { return this; } + L.Renderer.prototype._update.call(this); - if (L.Browser.pointer && type.indexOf('touch') === 0) { - this.removePointerListener(obj, type, id); - } else if (L.Browser.touch && (type === 'dblclick') && this.removeDoubleTapListener) { - this.removeDoubleTapListener(obj, id); + var b = this._bounds, + container = this._container, + size = b.getSize(), + m = L.Browser.retina ? 2 : 1; - } else if ('removeEventListener' in obj) { + L.DomUtil.setPosition(container, b.min); - if (type === 'mousewheel') { - obj.removeEventListener('DOMMouseScroll', handler, false); - obj.removeEventListener(type, handler, false); + // set canvas size (also clearing it); use double size on retina + container.width = m * size.x; + container.height = m * size.y; + container.style.width = size.x + 'px'; + container.style.height = size.y + 'px'; - } else if ((type === 'mouseenter') || (type === 'mouseleave')) { - obj.removeEventListener((type === 'mouseenter' ? 'mouseover' : 'mouseout'), handler, false); - } else { - obj.removeEventListener(type, handler, false); - } - } else if ('detachEvent' in obj) { - obj.detachEvent('on' + type, handler); + if (L.Browser.retina) { + this._ctx.scale(2, 2); } - obj[key] = null; + // translate so we use the same path coordinates after canvas element moves + this._ctx.translate(-b.min.x, -b.min.y); - return this; + // Tell paths to redraw themselves + this.fire('update'); }, - stopPropagation: function (e) { + _reset: function () { + L.Renderer.prototype._reset.call(this); - if (e.stopPropagation) { - e.stopPropagation(); - } else { - e.cancelBubble = true; + if (this._postponeUpdatePaths) { + this._postponeUpdatePaths = false; + this._updatePaths(); } - L.DomEvent._skipped(e); - - return this; }, - disableScrollPropagation: function (el) { - var stop = L.DomEvent.stopPropagation; + _initPath: function (layer) { + this._updateDashArray(layer); + this._layers[L.stamp(layer)] = layer; - return L.DomEvent - .on(el, 'mousewheel', stop) - .on(el, 'MozMousePixelScroll', stop); + var order = layer._order = { + layer: layer, + prev: this._drawLast, + next: null + }; + if (this._drawLast) { this._drawLast.next = order; } + this._drawLast = order; + this._drawFirst = this._drawFirst || this._drawLast; }, - disableClickPropagation: function (el) { - var stop = L.DomEvent.stopPropagation; - - for (var i = L.Draggable.START.length - 1; i >= 0; i--) { - L.DomEvent.on(el, L.Draggable.START[i], stop); - } - - return L.DomEvent - .on(el, 'click', L.DomEvent._fakeStop) - .on(el, 'dblclick', stop); + _addPath: function (layer) { + this._requestRedraw(layer); }, - preventDefault: function (e) { + _removePath: function (layer) { + var order = layer._order; + var next = order.next; + var prev = order.prev; - if (e.preventDefault) { - e.preventDefault(); + if (next) { + next.prev = prev; } else { - e.returnValue = false; + this._drawLast = prev; } - return this; - }, - - stop: function (e) { - return L.DomEvent - .preventDefault(e) - .stopPropagation(e); - }, - - getMousePosition: function (e, container) { - if (!container) { - return new L.Point(e.clientX, e.clientY); + if (prev) { + prev.next = next; + } else { + this._drawFirst = next; } - var rect = container.getBoundingClientRect(); + delete layer._order; - return new L.Point( - e.clientX - rect.left - container.clientLeft, - e.clientY - rect.top - container.clientTop); + delete this._layers[L.stamp(layer)]; + + this._requestRedraw(layer); }, - getWheelDelta: function (e) { + _updatePath: function (layer) { + // Redraw the union of the layer's old pixel + // bounds and the new pixel bounds. + this._extendRedrawBounds(layer); + layer._project(); + layer._update(); + // The redraw will extend the redraw bounds + // with the new pixel bounds. + this._requestRedraw(layer); + }, - var delta = 0; + _updateStyle: function (layer) { + this._updateDashArray(layer); + this._requestRedraw(layer); + }, - if (e.wheelDelta) { - delta = e.wheelDelta / 120; - } - if (e.detail) { - delta = -e.detail / 3; + _updateDashArray: function (layer) { + if (layer.options.dashArray) { + var parts = layer.options.dashArray.split(','), + dashArray = [], + i; + for (i = 0; i < parts.length; i++) { + dashArray.push(Number(parts[i])); + } + layer.options._dashArray = dashArray; } - return delta; }, - _skipEvents: {}, + _requestRedraw: function (layer) { + if (!this._map) { return; } - _fakeStop: function (e) { - // fakes stopPropagation by setting a special event flag, checked/reset with L.DomEvent._skipped(e) - L.DomEvent._skipEvents[e.type] = true; + this._extendRedrawBounds(layer); + this._redrawRequest = this._redrawRequest || L.Util.requestAnimFrame(this._redraw, this); }, - _skipped: function (e) { - var skipped = this._skipEvents[e.type]; - // reset when checking, as it's only used in map container and propagates outside of the map - this._skipEvents[e.type] = false; - return skipped; + _extendRedrawBounds: function (layer) { + var padding = (layer.options.weight || 0) + 1; + this._redrawBounds = this._redrawBounds || new L.Bounds(); + this._redrawBounds.extend(layer._pxBounds.min.subtract([padding, padding])); + this._redrawBounds.extend(layer._pxBounds.max.add([padding, padding])); }, - // check if element really left/entered the event target (for mouseenter/mouseleave) - _checkMouse: function (el, e) { + _redraw: function () { + this._redrawRequest = null; - var related = e.relatedTarget; + if (this._redrawBounds) { + this._redrawBounds.min._floor(); + this._redrawBounds.max._ceil(); + } - if (!related) { return true; } + this._clear(); // clear layers in redraw bounds + this._draw(); // draw layers - try { - while (related && (related !== el)) { - related = related.parentNode; - } - } catch (err) { - return false; - } - return (related !== el); + this._redrawBounds = null; }, - _getEvent: function () { // evil magic for IE - /*jshint noarg:false */ - var e = window.event; - if (!e) { - var caller = arguments.callee.caller; - while (caller) { - e = caller['arguments'][0]; - if (e && window.Event === e.constructor) { - break; - } - caller = caller.caller; - } + _clear: function () { + var bounds = this._redrawBounds; + if (bounds) { + var size = bounds.getSize(); + this._ctx.clearRect(bounds.min.x, bounds.min.y, size.x, size.y); + } else { + this._ctx.clearRect(0, 0, this._container.width, this._container.height); } - return e; }, - // this is a horrible workaround for a bug in Android where a single touch triggers two click events - _filterClick: function (e, handler) { - var timeStamp = (e.timeStamp || e.originalEvent.timeStamp), - elapsed = L.DomEvent._lastClick && (timeStamp - L.DomEvent._lastClick); + _draw: function () { + var layer, bounds = this._redrawBounds; + this._ctx.save(); + if (bounds) { + var size = bounds.getSize(); + this._ctx.beginPath(); + this._ctx.rect(bounds.min.x, bounds.min.y, size.x, size.y); + this._ctx.clip(); + } - // are they closer together than 500ms yet more than 100ms? - // Android typically triggers them ~300ms apart while multiple listeners - // on the same event should be triggered far faster; - // or check if click is simulated on the element, and if it is, reject any non-simulated events + this._drawing = true; - if ((elapsed && elapsed > 100 && elapsed < 500) || (e.target._simulatedClick && !e._simulated)) { - L.DomEvent.stop(e); - return; + for (var order = this._drawFirst; order; order = order.next) { + layer = order.layer; + if (!bounds || (layer._pxBounds && layer._pxBounds.intersects(bounds))) { + layer._updatePath(); + } } - L.DomEvent._lastClick = timeStamp; - - return handler(e); - } -}; -L.DomEvent.on = L.DomEvent.addListener; -L.DomEvent.off = L.DomEvent.removeListener; + this._drawing = false; + this._ctx.restore(); // Restore state before clipping. + }, -/* - * L.Draggable allows you to add dragging capabilities to any element. Supports mobile devices too. - */ + _updatePoly: function (layer, closed) { + if (!this._drawing) { return; } -L.Draggable = L.Class.extend({ - includes: L.Mixin.Events, + var i, j, len2, p, + parts = layer._parts, + len = parts.length, + ctx = this._ctx; - statics: { - START: L.Browser.touch ? ['touchstart', 'mousedown'] : ['mousedown'], - END: { - mousedown: 'mouseup', - touchstart: 'touchend', - pointerdown: 'touchend', - MSPointerDown: 'touchend' - }, - MOVE: { - mousedown: 'mousemove', - touchstart: 'touchmove', - pointerdown: 'touchmove', - MSPointerDown: 'touchmove' - } - }, + if (!len) { return; } - initialize: function (element, dragStartTarget) { - this._element = element; - this._dragStartTarget = dragStartTarget || element; - }, + this._drawnLayers[layer._leaflet_id] = layer; - enable: function () { - if (this._enabled) { return; } + ctx.beginPath(); - for (var i = L.Draggable.START.length - 1; i >= 0; i--) { - L.DomEvent.on(this._dragStartTarget, L.Draggable.START[i], this._onDown, this); + if (ctx.setLineDash) { + ctx.setLineDash(layer.options && layer.options._dashArray || []); } - this._enabled = true; - }, - - disable: function () { - if (!this._enabled) { return; } - - for (var i = L.Draggable.START.length - 1; i >= 0; i--) { - L.DomEvent.off(this._dragStartTarget, L.Draggable.START[i], this._onDown, this); + for (i = 0; i < len; i++) { + for (j = 0, len2 = parts[i].length; j < len2; j++) { + p = parts[i][j]; + ctx[j ? 'lineTo' : 'moveTo'](p.x, p.y); + } + if (closed) { + ctx.closePath(); + } } - this._enabled = false; - this._moved = false; - }, + this._fillStroke(ctx, layer); - _onDown: function (e) { - this._moved = false; + // TODO optimization: 1 fill/stroke for all features with equal style instead of 1 for each feature + }, - if (e.shiftKey || ((e.which !== 1) && (e.button !== 1) && !e.touches)) { return; } + _updateCircle: function (layer) { - L.DomEvent.stopPropagation(e); + if (!this._drawing || layer._empty()) { return; } - if (L.Draggable._disabled) { return; } + var p = layer._point, + ctx = this._ctx, + r = layer._radius, + s = (layer._radiusY || r) / r; - L.DomUtil.disableImageDrag(); - L.DomUtil.disableTextSelection(); + this._drawnLayers[layer._leaflet_id] = layer; - if (this._moving) { return; } + if (s !== 1) { + ctx.save(); + ctx.scale(1, s); + } - var first = e.touches ? e.touches[0] : e; + ctx.beginPath(); + ctx.arc(p.x, p.y / s, r, 0, Math.PI * 2, false); - this._startPoint = new L.Point(first.clientX, first.clientY); - this._startPos = this._newPos = L.DomUtil.getPosition(this._element); + if (s !== 1) { + ctx.restore(); + } - L.DomEvent - .on(document, L.Draggable.MOVE[e.type], this._onMove, this) - .on(document, L.Draggable.END[e.type], this._onUp, this); + this._fillStroke(ctx, layer); }, - _onMove: function (e) { - if (e.touches && e.touches.length > 1) { - this._moved = true; - return; - } - - var first = (e.touches && e.touches.length === 1 ? e.touches[0] : e), - newPoint = new L.Point(first.clientX, first.clientY), - offset = newPoint.subtract(this._startPoint); + _fillStroke: function (ctx, layer) { + var options = layer.options; - if (!offset.x && !offset.y) { return; } - if (L.Browser.touch && Math.abs(offset.x) + Math.abs(offset.y) < 3) { return; } + if (options.fill) { + ctx.globalAlpha = options.fillOpacity; + ctx.fillStyle = options.fillColor || options.color; + ctx.fill(options.fillRule || 'evenodd'); + } - L.DomEvent.preventDefault(e); + if (options.stroke && options.weight !== 0) { + ctx.globalAlpha = options.opacity; + ctx.lineWidth = options.weight; + ctx.strokeStyle = options.color; + ctx.lineCap = options.lineCap; + ctx.lineJoin = options.lineJoin; + ctx.stroke(); + } + }, - if (!this._moved) { - this.fire('dragstart'); + // Canvas obviously doesn't have mouse events for individual drawn objects, + // so we emulate that by calculating what's under the mouse on mousemove/click manually - this._moved = true; - this._startPos = L.DomUtil.getPosition(this._element).subtract(offset); + _onClick: function (e) { + var point = this._map.mouseEventToLayerPoint(e), layer, clickedLayer; - L.DomUtil.addClass(document.body, 'leaflet-dragging'); - this._lastTarget = e.target || e.srcElement; - L.DomUtil.addClass(this._lastTarget, 'leaflet-drag-target'); + for (var order = this._drawFirst; order; order = order.next) { + layer = order.layer; + if (layer.options.interactive && layer._containsPoint(point) && !this._map._draggableMoved(layer)) { + clickedLayer = layer; + } } + if (clickedLayer) { + L.DomEvent._fakeStop(e); + this._fireEvent([clickedLayer], e); + } + }, - this._newPos = this._startPos.add(offset); - this._moving = true; + _onMouseMove: function (e) { + if (!this._map || this._map.dragging.moving() || this._map._animatingZoom) { return; } - L.Util.cancelAnimFrame(this._animRequest); - this._animRequest = L.Util.requestAnimFrame(this._updatePosition, this, true, this._dragStartTarget); + var point = this._map.mouseEventToLayerPoint(e); + this._handleMouseHover(e, point); }, - _updatePosition: function () { - this.fire('predrag'); - L.DomUtil.setPosition(this._element, this._newPos); - this.fire('drag'); + + _handleMouseOut: function (e) { + var layer = this._hoveredLayer; + if (layer) { + // if we're leaving the layer, fire mouseout + L.DomUtil.removeClass(this._container, 'leaflet-interactive'); + this._fireEvent([layer], e, 'mouseout'); + this._hoveredLayer = null; + } }, - _onUp: function () { - L.DomUtil.removeClass(document.body, 'leaflet-dragging'); + _handleMouseHover: function (e, point) { + var layer, candidateHoveredLayer; - if (this._lastTarget) { - L.DomUtil.removeClass(this._lastTarget, 'leaflet-drag-target'); - this._lastTarget = null; + for (var order = this._drawFirst; order; order = order.next) { + layer = order.layer; + if (layer.options.interactive && layer._containsPoint(point)) { + candidateHoveredLayer = layer; + } } - for (var i in L.Draggable.MOVE) { - L.DomEvent - .off(document, L.Draggable.MOVE[i], this._onMove) - .off(document, L.Draggable.END[i], this._onUp); + if (candidateHoveredLayer !== this._hoveredLayer) { + this._handleMouseOut(e); + + if (candidateHoveredLayer) { + L.DomUtil.addClass(this._container, 'leaflet-interactive'); // change cursor + this._fireEvent([candidateHoveredLayer], e, 'mouseover'); + this._hoveredLayer = candidateHoveredLayer; + } } - L.DomUtil.enableImageDrag(); - L.DomUtil.enableTextSelection(); + if (this._hoveredLayer) { + this._fireEvent([this._hoveredLayer], e); + } + }, - if (this._moved && this._moving) { - // ensure drag is not fired after dragend - L.Util.cancelAnimFrame(this._animRequest); + _fireEvent: function (layers, e, type) { + this._map._fireDOMEvent(e, type || e.type, layers); + }, - this.fire('dragend', { - distance: this._newPos.distanceTo(this._startPos) - }); - } + _bringToFront: function (layer) { + var order = layer._order; + var next = order.next; + var prev = order.prev; - this._moving = false; - } -}); + if (next) { + next.prev = prev; + } else { + // Already last + return; + } + if (prev) { + prev.next = next; + } else if (next) { + // Update first entry unless this is the + // signle entry + this._drawFirst = next; + } + order.prev = this._drawLast; + this._drawLast.next = order; -/* - L.Handler is a base class for handler classes that are used internally to inject - interaction features like dragging to classes like Map and Marker. -*/ + order.next = null; + this._drawLast = order; -L.Handler = L.Class.extend({ - initialize: function (map) { - this._map = map; + this._requestRedraw(layer); }, - enable: function () { - if (this._enabled) { return; } + _bringToBack: function (layer) { + var order = layer._order; + var next = order.next; + var prev = order.prev; - this._enabled = true; - this.addHooks(); - }, + if (prev) { + prev.next = next; + } else { + // Already first + return; + } + if (next) { + next.prev = prev; + } else if (prev) { + // Update last entry unless this is the + // signle entry + this._drawLast = prev; + } - disable: function () { - if (!this._enabled) { return; } + order.prev = null; - this._enabled = false; - this.removeHooks(); - }, + order.next = this._drawFirst; + this._drawFirst.prev = order; + this._drawFirst = order; - enabled: function () { - return !!this._enabled; + this._requestRedraw(layer); } }); +// @namespace Browser; @property canvas: Boolean +// `true` when the browser supports [``](https://developer.mozilla.org/docs/Web/API/Canvas_API). +L.Browser.canvas = (function () { + return !!document.createElement('canvas').getContext; +}()); + +// @namespace Canvas +// @factory L.canvas(options?: Renderer options) +// Creates a Canvas renderer with the given options. +L.canvas = function (options) { + return L.Browser.canvas ? new L.Canvas(options) : null; +}; -/* - * L.Handler.MapDrag is used to make the map draggable (with panning inertia), enabled by default. - */ +L.Polyline.prototype._containsPoint = function (p, closed) { + var i, j, k, len, len2, part, + w = this._clickTolerance(); -L.Map.mergeOptions({ - dragging: true, + if (!this._pxBounds.contains(p)) { return false; } - inertia: !L.Browser.android23, - inertiaDeceleration: 3400, // px/s^2 - inertiaMaxSpeed: Infinity, // px/s - inertiaThreshold: L.Browser.touch ? 32 : 18, // ms - easeLinearity: 0.25, + // hit detection for polylines + for (i = 0, len = this._parts.length; i < len; i++) { + part = this._parts[i]; - // TODO refactor, move to CRS - worldCopyJump: false -}); + for (j = 0, len2 = part.length, k = len2 - 1; j < len2; k = j++) { + if (!closed && (j === 0)) { continue; } -L.Map.Drag = L.Handler.extend({ - addHooks: function () { - if (!this._draggable) { - var map = this._map; + if (L.LineUtil.pointToSegmentDistance(p, part[k], part[j]) <= w) { + return true; + } + } + } + return false; +}; - this._draggable = new L.Draggable(map._mapPane, map._container); +L.Polygon.prototype._containsPoint = function (p) { + var inside = false, + part, p1, p2, i, j, k, len, len2; - this._draggable.on({ - 'dragstart': this._onDragStart, - 'drag': this._onDrag, - 'dragend': this._onDragEnd - }, this); + if (!this._pxBounds.contains(p)) { return false; } - if (map.options.worldCopyJump) { - this._draggable.on('predrag', this._onPreDrag, this); - map.on('viewreset', this._onViewReset, this); + // ray casting algorithm for detecting if point is in polygon + for (i = 0, len = this._parts.length; i < len; i++) { + part = this._parts[i]; - map.whenReady(this._onViewReset, this); + for (j = 0, len2 = part.length, k = len2 - 1; j < len2; k = j++) { + p1 = part[j]; + p2 = part[k]; + + if (((p1.y > p.y) !== (p2.y > p.y)) && (p.x < (p2.x - p1.x) * (p.y - p1.y) / (p2.y - p1.y) + p1.x)) { + inside = !inside; } } - this._draggable.enable(); - }, + } - removeHooks: function () { - this._draggable.disable(); - }, + // also check if it's on polygon stroke + return inside || L.Polyline.prototype._containsPoint.call(this, p, true); +}; - moved: function () { - return this._draggable && this._draggable._moved; - }, +L.CircleMarker.prototype._containsPoint = function (p) { + return p.distanceTo(this._point) <= this._radius + this._clickTolerance(); +}; - _onDragStart: function () { - var map = this._map; - if (map._panAnim) { - map._panAnim.stop(); - } - map - .fire('movestart') - .fire('dragstart'); +/* + * @class GeoJSON + * @aka L.GeoJSON + * @inherits FeatureGroup + * + * Represents a GeoJSON object or an array of GeoJSON objects. Allows you to parse + * GeoJSON data and display it on the map. Extends `FeatureGroup`. + * + * @example + * + * ```js + * L.geoJSON(data, { + * style: function (feature) { + * return {color: feature.properties.color}; + * } + * }).bindPopup(function (layer) { + * return layer.feature.properties.description; + * }).addTo(map); + * ``` + */ - if (map.options.inertia) { - this._positions = []; - this._times = []; +L.GeoJSON = L.FeatureGroup.extend({ + + /* @section + * @aka GeoJSON options + * + * @option pointToLayer: Function = * + * A `Function` defining how GeoJSON points spawn Leaflet layers. It is internally + * called when data is added, passing the GeoJSON point feature and its `LatLng`. + * The default is to spawn a default `Marker`: + * ```js + * function(geoJsonPoint, latlng) { + * return L.marker(latlng); + * } + * ``` + * + * @option style: Function = * + * A `Function` defining the `Path options` for styling GeoJSON lines and polygons, + * called internally when data is added. + * The default value is to not override any defaults: + * ```js + * function (geoJsonFeature) { + * return {} + * } + * ``` + * + * @option onEachFeature: Function = * + * A `Function` that will be called once for each created `Feature`, after it has + * been created and styled. Useful for attaching events and popups to features. + * The default is to do nothing with the newly created layers: + * ```js + * function (feature, layer) {} + * ``` + * + * @option filter: Function = * + * A `Function` that will be used to decide whether to include a feature or not. + * The default is to include all features: + * ```js + * function (geoJsonFeature) { + * return true; + * } + * ``` + * Note: dynamically changing the `filter` option will have effect only on newly + * added data. It will _not_ re-evaluate already included features. + * + * @option coordsToLatLng: Function = * + * A `Function` that will be used for converting GeoJSON coordinates to `LatLng`s. + * The default is the `coordsToLatLng` static method. + */ + + initialize: function (geojson, options) { + L.setOptions(this, options); + + this._layers = {}; + + if (geojson) { + this.addData(geojson); } }, - _onDrag: function () { - if (this._map.options.inertia) { - var time = this._lastTime = +new Date(), - pos = this._lastPos = this._draggable._newPos; - - this._positions.push(pos); - this._times.push(time); + // @method addData( data ): this + // Adds a GeoJSON object to the layer. + addData: function (geojson) { + var features = L.Util.isArray(geojson) ? geojson : geojson.features, + i, len, feature; - if (time - this._times[0] > 200) { - this._positions.shift(); - this._times.shift(); + if (features) { + for (i = 0, len = features.length; i < len; i++) { + // only add this if geometry or geometries are set and not null + feature = features[i]; + if (feature.geometries || feature.geometry || feature.features || feature.coordinates) { + this.addData(feature); + } } + return this; } - this._map - .fire('move') - .fire('drag'); - }, + var options = this.options; - _onViewReset: function () { - // TODO fix hardcoded Earth values - var pxCenter = this._map.getSize()._divideBy(2), - pxWorldCenter = this._map.latLngToLayerPoint([0, 0]); + if (options.filter && !options.filter(geojson)) { return this; } - this._initialWorldOffset = pxWorldCenter.subtract(pxCenter).x; - this._worldWidth = this._map.project([0, 180]).x; - }, + var layer = L.GeoJSON.geometryToLayer(geojson, options); + if (!layer) { + return this; + } + layer.feature = L.GeoJSON.asFeature(geojson); - _onPreDrag: function () { - // TODO refactor to be able to adjust map pane position after zoom - var worldWidth = this._worldWidth, - halfWidth = Math.round(worldWidth / 2), - dx = this._initialWorldOffset, - x = this._draggable._newPos.x, - newX1 = (x - halfWidth + dx) % worldWidth + halfWidth - dx, - newX2 = (x + halfWidth + dx) % worldWidth - halfWidth - dx, - newX = Math.abs(newX1 + dx) < Math.abs(newX2 + dx) ? newX1 : newX2; + layer.defaultOptions = layer.options; + this.resetStyle(layer); - this._draggable._newPos.x = newX; + if (options.onEachFeature) { + options.onEachFeature(geojson, layer); + } + + return this.addLayer(layer); }, - _onDragEnd: function (e) { - var map = this._map, - options = map.options, - delay = +new Date() - this._lastTime, + // @method resetStyle( layer ): this + // Resets the given vector layer's style to the original GeoJSON style, useful for resetting style after hover events. + resetStyle: function (layer) { + // reset any custom styles + layer.options = L.Util.extend({}, layer.defaultOptions); + this._setLayerStyle(layer, this.options.style); + return this; + }, - noInertia = !options.inertia || delay > options.inertiaThreshold || !this._positions[0]; + // @method setStyle( style ): this + // Changes styles of GeoJSON vector layers with the given style function. + setStyle: function (style) { + return this.eachLayer(function (layer) { + this._setLayerStyle(layer, style); + }, this); + }, - map.fire('dragend', e); + _setLayerStyle: function (layer, style) { + if (typeof style === 'function') { + style = style(layer.feature); + } + if (layer.setStyle) { + layer.setStyle(style); + } + } +}); - if (noInertia) { - map.fire('moveend'); +// @section +// There are several static functions which can be called without instantiating L.GeoJSON: +L.extend(L.GeoJSON, { + // @function geometryToLayer(featureData: Object, options?: GeoJSON options): Layer + // Creates a `Layer` from a given GeoJSON feature. Can use a custom + // [`pointToLayer`](#geojson-pointtolayer) and/or [`coordsToLatLng`](#geojson-coordstolatlng) + // functions if provided as options. + geometryToLayer: function (geojson, options) { - } else { + var geometry = geojson.type === 'Feature' ? geojson.geometry : geojson, + coords = geometry ? geometry.coordinates : null, + layers = [], + pointToLayer = options && options.pointToLayer, + coordsToLatLng = options && options.coordsToLatLng || this.coordsToLatLng, + latlng, latlngs, i, len; - var direction = this._lastPos.subtract(this._positions[0]), - duration = (this._lastTime + delay - this._times[0]) / 1000, - ease = options.easeLinearity, + if (!coords && !geometry) { + return null; + } - speedVector = direction.multiplyBy(ease / duration), - speed = speedVector.distanceTo([0, 0]), + switch (geometry.type) { + case 'Point': + latlng = coordsToLatLng(coords); + return pointToLayer ? pointToLayer(geojson, latlng) : new L.Marker(latlng); - limitedSpeed = Math.min(options.inertiaMaxSpeed, speed), - limitedSpeedVector = speedVector.multiplyBy(limitedSpeed / speed), + case 'MultiPoint': + for (i = 0, len = coords.length; i < len; i++) { + latlng = coordsToLatLng(coords[i]); + layers.push(pointToLayer ? pointToLayer(geojson, latlng) : new L.Marker(latlng)); + } + return new L.FeatureGroup(layers); - decelerationDuration = limitedSpeed / (options.inertiaDeceleration * ease), - offset = limitedSpeedVector.multiplyBy(-decelerationDuration / 2).round(); + case 'LineString': + case 'MultiLineString': + latlngs = this.coordsToLatLngs(coords, geometry.type === 'LineString' ? 0 : 1, coordsToLatLng); + return new L.Polyline(latlngs, options); - if (!offset.x || !offset.y) { - map.fire('moveend'); + case 'Polygon': + case 'MultiPolygon': + latlngs = this.coordsToLatLngs(coords, geometry.type === 'Polygon' ? 1 : 2, coordsToLatLng); + return new L.Polygon(latlngs, options); - } else { - offset = map._limitOffset(offset, map.options.maxBounds); + case 'GeometryCollection': + for (i = 0, len = geometry.geometries.length; i < len; i++) { + var layer = this.geometryToLayer({ + geometry: geometry.geometries[i], + type: 'Feature', + properties: geojson.properties + }, options); - L.Util.requestAnimFrame(function () { - map.panBy(offset, { - duration: decelerationDuration, - easeLinearity: ease, - noMoveStart: true - }); - }); + if (layer) { + layers.push(layer); + } } + return new L.FeatureGroup(layers); + + default: + throw new Error('Invalid GeoJSON object.'); } - } -}); + }, -L.Map.addInitHook('addHandler', 'dragging', L.Map.Drag); + // @function coordsToLatLng(coords: Array): LatLng + // Creates a `LatLng` object from an array of 2 numbers (longitude, latitude) + // or 3 numbers (longitude, latitude, altitude) used in GeoJSON for points. + coordsToLatLng: function (coords) { + return new L.LatLng(coords[1], coords[0], coords[2]); + }, + // @function coordsToLatLngs(coords: Array, levelsDeep?: Number, coordsToLatLng?: Function): Array + // Creates a multidimensional array of `LatLng`s from a GeoJSON coordinates array. + // `levelsDeep` specifies the nesting level (0 is for an array of points, 1 for an array of arrays of points, etc., 0 by default). + // Can use a custom [`coordsToLatLng`](#geojson-coordstolatlng) function. + coordsToLatLngs: function (coords, levelsDeep, coordsToLatLng) { + var latlngs = []; -/* - * L.Handler.DoubleClickZoom is used to handle double-click zoom on the map, enabled by default. - */ + for (var i = 0, len = coords.length, latlng; i < len; i++) { + latlng = levelsDeep ? + this.coordsToLatLngs(coords[i], levelsDeep - 1, coordsToLatLng) : + (coordsToLatLng || this.coordsToLatLng)(coords[i]); + + latlngs.push(latlng); + } + + return latlngs; + }, + + // @function latLngToCoords(latlng: LatLng): Array + // Reverse of [`coordsToLatLng`](#geojson-coordstolatlng) + latLngToCoords: function (latlng) { + return latlng.alt !== undefined ? + [latlng.lng, latlng.lat, latlng.alt] : + [latlng.lng, latlng.lat]; + }, + + // @function latLngsToCoords(latlngs: Array, levelsDeep?: Number, closed?: Boolean): Array + // Reverse of [`coordsToLatLngs`](#geojson-coordstolatlngs) + // `closed` determines whether the first point should be appended to the end of the array to close the feature, only used when `levelsDeep` is 0. False by default. + latLngsToCoords: function (latlngs, levelsDeep, closed) { + var coords = []; + + for (var i = 0, len = latlngs.length; i < len; i++) { + coords.push(levelsDeep ? + L.GeoJSON.latLngsToCoords(latlngs[i], levelsDeep - 1, closed) : + L.GeoJSON.latLngToCoords(latlngs[i])); + } -L.Map.mergeOptions({ - doubleClickZoom: true -}); + if (!levelsDeep && closed) { + coords.push(coords[0]); + } -L.Map.DoubleClickZoom = L.Handler.extend({ - addHooks: function () { - this._map.on('dblclick', this._onDoubleClick, this); + return coords; }, - removeHooks: function () { - this._map.off('dblclick', this._onDoubleClick, this); + getFeature: function (layer, newGeometry) { + return layer.feature ? + L.extend({}, layer.feature, {geometry: newGeometry}) : + L.GeoJSON.asFeature(newGeometry); }, - _onDoubleClick: function (e) { - var map = this._map, - zoom = map.getZoom() + (e.originalEvent.shiftKey ? -1 : 1); - - if (map.options.doubleClickZoom === 'center') { - map.setZoom(zoom); - } else { - map.setZoomAround(e.containerPoint, zoom); + // @function asFeature(geojson: Object): Object + // Normalize GeoJSON geometries/features into GeoJSON features. + asFeature: function (geojson) { + if (geojson.type === 'Feature' || geojson.type === 'FeatureCollection') { + return geojson; } + + return { + type: 'Feature', + properties: {}, + geometry: geojson + }; } }); -L.Map.addInitHook('addHandler', 'doubleClickZoom', L.Map.DoubleClickZoom); +var PointToGeoJSON = { + toGeoJSON: function () { + return L.GeoJSON.getFeature(this, { + type: 'Point', + coordinates: L.GeoJSON.latLngToCoords(this.getLatLng()) + }); + } +}; +// @namespace Marker +// @method toGeoJSON(): Object +// Returns a [`GeoJSON`](http://en.wikipedia.org/wiki/GeoJSON) representation of the marker (as a GeoJSON `Point` Feature). +L.Marker.include(PointToGeoJSON); -/* - * L.Handler.ScrollWheelZoom is used by L.Map to enable mouse scroll wheel zoom on the map. - */ +// @namespace CircleMarker +// @method toGeoJSON(): Object +// Returns a [`GeoJSON`](http://en.wikipedia.org/wiki/GeoJSON) representation of the circle marker (as a GeoJSON `Point` Feature). +L.Circle.include(PointToGeoJSON); +L.CircleMarker.include(PointToGeoJSON); -L.Map.mergeOptions({ - scrollWheelZoom: true -}); -L.Map.ScrollWheelZoom = L.Handler.extend({ - addHooks: function () { - L.DomEvent.on(this._map._container, 'mousewheel', this._onWheelScroll, this); - L.DomEvent.on(this._map._container, 'MozMousePixelScroll', L.DomEvent.preventDefault); - this._delta = 0; - }, +// @namespace Polyline +// @method toGeoJSON(): Object +// Returns a [`GeoJSON`](http://en.wikipedia.org/wiki/GeoJSON) representation of the polyline (as a GeoJSON `LineString` or `MultiLineString` Feature). +L.Polyline.prototype.toGeoJSON = function () { + var multi = !L.Polyline._flat(this._latlngs); - removeHooks: function () { - L.DomEvent.off(this._map._container, 'mousewheel', this._onWheelScroll); - L.DomEvent.off(this._map._container, 'MozMousePixelScroll', L.DomEvent.preventDefault); - }, + var coords = L.GeoJSON.latLngsToCoords(this._latlngs, multi ? 1 : 0); - _onWheelScroll: function (e) { - var delta = L.DomEvent.getWheelDelta(e); + return L.GeoJSON.getFeature(this, { + type: (multi ? 'Multi' : '') + 'LineString', + coordinates: coords + }); +}; - this._delta += delta; - this._lastMousePos = this._map.mouseEventToContainerPoint(e); +// @namespace Polygon +// @method toGeoJSON(): Object +// Returns a [`GeoJSON`](http://en.wikipedia.org/wiki/GeoJSON) representation of the polygon (as a GeoJSON `Polygon` or `MultiPolygon` Feature). +L.Polygon.prototype.toGeoJSON = function () { + var holes = !L.Polyline._flat(this._latlngs), + multi = holes && !L.Polyline._flat(this._latlngs[0]); - if (!this._startTime) { - this._startTime = +new Date(); - } + var coords = L.GeoJSON.latLngsToCoords(this._latlngs, multi ? 2 : holes ? 1 : 0, true); - var left = Math.max(40 - (+new Date() - this._startTime), 0); + if (!holes) { + coords = [coords]; + } - clearTimeout(this._timer); - this._timer = setTimeout(L.bind(this._performZoom, this), left); + return L.GeoJSON.getFeature(this, { + type: (multi ? 'Multi' : '') + 'Polygon', + coordinates: coords + }); +}; - L.DomEvent.preventDefault(e); - L.DomEvent.stopPropagation(e); + +// @namespace LayerGroup +L.LayerGroup.include({ + toMultiPoint: function () { + var coords = []; + + this.eachLayer(function (layer) { + coords.push(layer.toGeoJSON().geometry.coordinates); + }); + + return L.GeoJSON.getFeature(this, { + type: 'MultiPoint', + coordinates: coords + }); }, - _performZoom: function () { - var map = this._map, - delta = this._delta, - zoom = map.getZoom(); + // @method toGeoJSON(): Object + // Returns a [`GeoJSON`](http://en.wikipedia.org/wiki/GeoJSON) representation of the layer group (as a GeoJSON `GeometryCollection`). + toGeoJSON: function () { - delta = delta > 0 ? Math.ceil(delta) : Math.floor(delta); - delta = Math.max(Math.min(delta, 4), -4); - delta = map._limitZoom(zoom + delta) - zoom; + var type = this.feature && this.feature.geometry && this.feature.geometry.type; - this._delta = 0; - this._startTime = null; + if (type === 'MultiPoint') { + return this.toMultiPoint(); + } - if (!delta) { return; } + var isGeometryCollection = type === 'GeometryCollection', + jsons = []; - if (map.options.scrollWheelZoom === 'center') { - map.setZoom(zoom + delta); - } else { - map.setZoomAround(this._lastMousePos, zoom + delta); + this.eachLayer(function (layer) { + if (layer.toGeoJSON) { + var json = layer.toGeoJSON(); + jsons.push(isGeometryCollection ? json.geometry : L.GeoJSON.asFeature(json)); + } + }); + + if (isGeometryCollection) { + return L.GeoJSON.getFeature(this, { + geometries: jsons, + type: 'GeometryCollection' + }); } + + return { + type: 'FeatureCollection', + features: jsons + }; } }); -L.Map.addInitHook('addHandler', 'scrollWheelZoom', L.Map.ScrollWheelZoom); +// @namespace GeoJSON +// @factory L.geoJSON(geojson?: Object, options?: GeoJSON options) +// Creates a GeoJSON layer. Optionally accepts an object in +// [GeoJSON format](http://geojson.org/geojson-spec.html) to display on the map +// (you can alternatively add it later with `addData` method) and an `options` object. +L.geoJSON = function (geojson, options) { + return new L.GeoJSON(geojson, options); +}; +// Backward compatibility. +L.geoJson = L.geoJSON; + /* - * Extends the event handling code with double tap support for mobile browsers. + * @class Draggable + * @aka L.Draggable + * @inherits Evented + * + * A class for making DOM elements draggable (including touch support). + * Used internally for map and marker dragging. Only works for elements + * that were positioned with [`L.DomUtil.setPosition`](#domutil-setposition). + * + * @example + * ```js + * var draggable = new L.Draggable(elementToDrag); + * draggable.enable(); + * ``` */ -L.extend(L.DomEvent, { - - _touchstart: L.Browser.msPointer ? 'MSPointerDown' : L.Browser.pointer ? 'pointerdown' : 'touchstart', - _touchend: L.Browser.msPointer ? 'MSPointerUp' : L.Browser.pointer ? 'pointerup' : 'touchend', +L.Draggable = L.Evented.extend({ - // inspired by Zepto touch code by Thomas Fuchs - addDoubleTapListener: function (obj, handler, id) { - var last, - doubleTap = false, - delay = 250, - touch, - pre = '_leaflet_', - touchstart = this._touchstart, - touchend = this._touchend, - trackedTouches = []; + options: { + // @option clickTolerance: Number = 3 + // The max number of pixels a user can shift the mouse pointer during a click + // for it to be considered a valid click (as opposed to a mouse drag). + clickTolerance: 3 + }, - function onTouchStart(e) { - var count; + statics: { + START: L.Browser.touch ? ['touchstart', 'mousedown'] : ['mousedown'], + END: { + mousedown: 'mouseup', + touchstart: 'touchend', + pointerdown: 'touchend', + MSPointerDown: 'touchend' + }, + MOVE: { + mousedown: 'mousemove', + touchstart: 'touchmove', + pointerdown: 'touchmove', + MSPointerDown: 'touchmove' + } + }, - if (L.Browser.pointer) { - trackedTouches.push(e.pointerId); - count = trackedTouches.length; - } else { - count = e.touches.length; - } - if (count > 1) { - return; - } + // @constructor L.Draggable(el: HTMLElement, dragHandle?: HTMLElement, preventOutline: Boolean) + // Creates a `Draggable` object for moving `el` when you start dragging the `dragHandle` element (equals `el` itself by default). + initialize: function (element, dragStartTarget, preventOutline) { + this._element = element; + this._dragStartTarget = dragStartTarget || element; + this._preventOutline = preventOutline; + }, - var now = Date.now(), - delta = now - (last || now); + // @method enable() + // Enables the dragging ability + enable: function () { + if (this._enabled) { return; } - touch = e.touches ? e.touches[0] : e; - doubleTap = (delta > 0 && delta <= delay); - last = now; - } + L.DomEvent.on(this._dragStartTarget, L.Draggable.START.join(' '), this._onDown, this); - function onTouchEnd(e) { - if (L.Browser.pointer) { - var idx = trackedTouches.indexOf(e.pointerId); - if (idx === -1) { - return; - } - trackedTouches.splice(idx, 1); - } + this._enabled = true; + }, - if (doubleTap) { - if (L.Browser.pointer) { - // work around .type being readonly with MSPointer* events - var newTouch = { }, - prop; + // @method disable() + // Disables the dragging ability + disable: function () { + if (!this._enabled) { return; } - // jshint forin:false - for (var i in touch) { - prop = touch[i]; - if (typeof prop === 'function') { - newTouch[i] = prop.bind(touch); - } else { - newTouch[i] = prop; - } - } - touch = newTouch; - } - touch.type = 'dblclick'; - handler(touch); - last = null; - } + // If we're currently dragging this draggable, + // disabling it counts as first ending the drag. + if (L.Draggable._dragging === this) { + this.finishDrag(); } - obj[pre + touchstart + id] = onTouchStart; - obj[pre + touchend + id] = onTouchEnd; - // on pointer we need to listen on the document, otherwise a drag starting on the map and moving off screen - // will not come through to us, so we will lose track of how many touches are ongoing - var endElement = L.Browser.pointer ? document.documentElement : obj; + L.DomEvent.off(this._dragStartTarget, L.Draggable.START.join(' '), this._onDown, this); - obj.addEventListener(touchstart, onTouchStart, false); - endElement.addEventListener(touchend, onTouchEnd, false); + this._enabled = false; + this._moved = false; + }, - if (L.Browser.pointer) { - endElement.addEventListener(L.DomEvent.POINTER_CANCEL, onTouchEnd, false); - } + _onDown: function (e) { + // Ignore simulated events, since we handle both touch and + // mouse explicitly; otherwise we risk getting duplicates of + // touch events, see #4315. + // Also ignore the event if disabled; this happens in IE11 + // under some circumstances, see #3666. + if (e._simulated || !this._enabled) { return; } - return this; - }, + this._moved = false; - removeDoubleTapListener: function (obj, id) { - var pre = '_leaflet_'; + if (L.DomUtil.hasClass(this._element, 'leaflet-zoom-anim')) { return; } - obj.removeEventListener(this._touchstart, obj[pre + this._touchstart + id], false); - (L.Browser.pointer ? document.documentElement : obj).removeEventListener( - this._touchend, obj[pre + this._touchend + id], false); + if (L.Draggable._dragging || e.shiftKey || ((e.which !== 1) && (e.button !== 1) && !e.touches)) { return; } + L.Draggable._dragging = this; // Prevent dragging multiple objects at once. - if (L.Browser.pointer) { - document.documentElement.removeEventListener(L.DomEvent.POINTER_CANCEL, obj[pre + this._touchend + id], - false); + if (this._preventOutline) { + L.DomUtil.preventOutline(this._element); } - return this; - } -}); - + L.DomUtil.disableImageDrag(); + L.DomUtil.disableTextSelection(); -/* - * Extends L.DomEvent to provide touch support for Internet Explorer and Windows-based devices. - */ + if (this._moving) { return; } -L.extend(L.DomEvent, { + // @event down: Event + // Fired when a drag is about to start. + this.fire('down'); - //static - POINTER_DOWN: L.Browser.msPointer ? 'MSPointerDown' : 'pointerdown', - POINTER_MOVE: L.Browser.msPointer ? 'MSPointerMove' : 'pointermove', - POINTER_UP: L.Browser.msPointer ? 'MSPointerUp' : 'pointerup', - POINTER_CANCEL: L.Browser.msPointer ? 'MSPointerCancel' : 'pointercancel', + var first = e.touches ? e.touches[0] : e; - _pointers: [], - _pointerDocumentListener: false, + this._startPoint = new L.Point(first.clientX, first.clientY); - // Provides a touch events wrapper for (ms)pointer events. - // Based on changes by veproza https://github.com/CloudMade/Leaflet/pull/1019 - //ref http://www.w3.org/TR/pointerevents/ https://www.w3.org/Bugs/Public/show_bug.cgi?id=22890 + L.DomEvent + .on(document, L.Draggable.MOVE[e.type], this._onMove, this) + .on(document, L.Draggable.END[e.type], this._onUp, this); + }, - addPointerListener: function (obj, type, handler, id) { + _onMove: function (e) { + // Ignore simulated events, since we handle both touch and + // mouse explicitly; otherwise we risk getting duplicates of + // touch events, see #4315. + // Also ignore the event if disabled; this happens in IE11 + // under some circumstances, see #3666. + if (e._simulated || !this._enabled) { return; } - switch (type) { - case 'touchstart': - return this.addPointerListenerStart(obj, type, handler, id); - case 'touchend': - return this.addPointerListenerEnd(obj, type, handler, id); - case 'touchmove': - return this.addPointerListenerMove(obj, type, handler, id); - default: - throw 'Unknown touch event type'; + if (e.touches && e.touches.length > 1) { + this._moved = true; + return; } - }, - addPointerListenerStart: function (obj, type, handler, id) { - var pre = '_leaflet_', - pointers = this._pointers; + var first = (e.touches && e.touches.length === 1 ? e.touches[0] : e), + newPoint = new L.Point(first.clientX, first.clientY), + offset = newPoint.subtract(this._startPoint); + + if (!offset.x && !offset.y) { return; } + if (Math.abs(offset.x) + Math.abs(offset.y) < this.options.clickTolerance) { return; } - var cb = function (e) { + L.DomEvent.preventDefault(e); - L.DomEvent.preventDefault(e); + if (!this._moved) { + // @event dragstart: Event + // Fired when a drag starts + this.fire('dragstart'); - var alreadyInArray = false; - for (var i = 0; i < pointers.length; i++) { - if (pointers[i].pointerId === e.pointerId) { - alreadyInArray = true; - break; - } - } - if (!alreadyInArray) { - pointers.push(e); + this._moved = true; + this._startPos = L.DomUtil.getPosition(this._element).subtract(offset); + + L.DomUtil.addClass(document.body, 'leaflet-dragging'); + + this._lastTarget = e.target || e.srcElement; + // IE and Edge do not give the element, so fetch it + // if necessary + if ((window.SVGElementInstance) && (this._lastTarget instanceof SVGElementInstance)) { + this._lastTarget = this._lastTarget.correspondingUseElement; } + L.DomUtil.addClass(this._lastTarget, 'leaflet-drag-target'); + } - e.touches = pointers.slice(); - e.changedTouches = [e]; + this._newPos = this._startPos.add(offset); + this._moving = true; - handler(e); - }; + L.Util.cancelAnimFrame(this._animRequest); + this._lastEvent = e; + this._animRequest = L.Util.requestAnimFrame(this._updatePosition, this, true); + }, - obj[pre + 'touchstart' + id] = cb; - obj.addEventListener(this.POINTER_DOWN, cb, false); - - // need to also listen for end events to keep the _pointers list accurate - // this needs to be on the body and never go away - if (!this._pointerDocumentListener) { - var internalCb = function (e) { - for (var i = 0; i < pointers.length; i++) { - if (pointers[i].pointerId === e.pointerId) { - pointers.splice(i, 1); - break; - } - } - }; - //We listen on the documentElement as any drags that end by moving the touch off the screen get fired there - document.documentElement.addEventListener(this.POINTER_UP, internalCb, false); - document.documentElement.addEventListener(this.POINTER_CANCEL, internalCb, false); + _updatePosition: function () { + var e = {originalEvent: this._lastEvent}; - this._pointerDocumentListener = true; - } + // @event predrag: Event + // Fired continuously during dragging *before* each corresponding + // update of the element's position. + this.fire('predrag', e); + L.DomUtil.setPosition(this._element, this._newPos); - return this; + // @event drag: Event + // Fired continuously during dragging. + this.fire('drag', e); }, - addPointerListenerMove: function (obj, type, handler, id) { - var pre = '_leaflet_', - touches = this._pointers; + _onUp: function (e) { + // Ignore simulated events, since we handle both touch and + // mouse explicitly; otherwise we risk getting duplicates of + // touch events, see #4315. + // Also ignore the event if disabled; this happens in IE11 + // under some circumstances, see #3666. + if (e._simulated || !this._enabled) { return; } + this.finishDrag(); + }, - function cb(e) { + finishDrag: function () { + L.DomUtil.removeClass(document.body, 'leaflet-dragging'); - // don't fire touch moves when mouse isn't down - if ((e.pointerType === e.MSPOINTER_TYPE_MOUSE || e.pointerType === 'mouse') && e.buttons === 0) { return; } + if (this._lastTarget) { + L.DomUtil.removeClass(this._lastTarget, 'leaflet-drag-target'); + this._lastTarget = null; + } - for (var i = 0; i < touches.length; i++) { - if (touches[i].pointerId === e.pointerId) { - touches[i] = e; - break; - } - } + for (var i in L.Draggable.MOVE) { + L.DomEvent + .off(document, L.Draggable.MOVE[i], this._onMove, this) + .off(document, L.Draggable.END[i], this._onUp, this); + } + + L.DomUtil.enableImageDrag(); + L.DomUtil.enableTextSelection(); - e.touches = touches.slice(); - e.changedTouches = [e]; + if (this._moved && this._moving) { + // ensure drag is not fired after dragend + L.Util.cancelAnimFrame(this._animRequest); - handler(e); + // @event dragend: DragEndEvent + // Fired when the drag ends. + this.fire('dragend', { + distance: this._newPos.distanceTo(this._startPos) + }); } - obj[pre + 'touchmove' + id] = cb; - obj.addEventListener(this.POINTER_MOVE, cb, false); + this._moving = false; + L.Draggable._dragging = false; + } - return this; - }, +}); - addPointerListenerEnd: function (obj, type, handler, id) { - var pre = '_leaflet_', - touches = this._pointers; - var cb = function (e) { - for (var i = 0; i < touches.length; i++) { - if (touches[i].pointerId === e.pointerId) { - touches.splice(i, 1); - break; - } - } - e.touches = touches.slice(); - e.changedTouches = [e]; +/* + L.Handler is a base class for handler classes that are used internally to inject + interaction features like dragging to classes like Map and Marker. +*/ - handler(e); - }; +// @class Handler +// @aka L.Handler +// Abstract class for map interaction handlers - obj[pre + 'touchend' + id] = cb; - obj.addEventListener(this.POINTER_UP, cb, false); - obj.addEventListener(this.POINTER_CANCEL, cb, false); +L.Handler = L.Class.extend({ + initialize: function (map) { + this._map = map; + }, + // @method enable(): this + // Enables the handler + enable: function () { + if (this._enabled) { return this; } + + this._enabled = true; + this.addHooks(); return this; }, - removePointerListener: function (obj, type, id) { - var pre = '_leaflet_', - cb = obj[pre + type + id]; - - switch (type) { - case 'touchstart': - obj.removeEventListener(this.POINTER_DOWN, cb, false); - break; - case 'touchmove': - obj.removeEventListener(this.POINTER_MOVE, cb, false); - break; - case 'touchend': - obj.removeEventListener(this.POINTER_UP, cb, false); - obj.removeEventListener(this.POINTER_CANCEL, cb, false); - break; - } + // @method disable(): this + // Disables the handler + disable: function () { + if (!this._enabled) { return this; } + this._enabled = false; + this.removeHooks(); return this; + }, + + // @method enabled(): Boolean + // Returns `true` if the handler is enabled + enabled: function () { + return !!this._enabled; } + + // @section Extension methods + // Classes inheriting from `Handler` must implement the two following methods: + // @method addHooks() + // Called when the handler is enabled, should add event hooks. + // @method removeHooks() + // Called when the handler is disabled, should remove the event hooks added previously. }); + /* - * L.Handler.TouchZoom is used by L.Map to add pinch zoom on supported mobile browsers. + * L.Handler.MapDrag is used to make the map draggable (with panning inertia), enabled by default. */ +// @namespace Map +// @section Interaction Options L.Map.mergeOptions({ - touchZoom: L.Browser.touch && !L.Browser.android23, - bounceAtZoomLimits: true -}); + // @option dragging: Boolean = true + // Whether the map be draggable with mouse/touch or not. + dragging: true, -L.Map.TouchZoom = L.Handler.extend({ - addHooks: function () { - L.DomEvent.on(this._map._container, 'touchstart', this._onTouchStart, this); - }, + // @section Panning Inertia Options + // @option inertia: Boolean = * + // If enabled, panning of the map will have an inertia effect where + // the map builds momentum while dragging and continues moving in + // the same direction for some time. Feels especially nice on touch + // devices. Enabled by default unless running on old Android devices. + inertia: !L.Browser.android23, - removeHooks: function () { - L.DomEvent.off(this._map._container, 'touchstart', this._onTouchStart, this); - }, + // @option inertiaDeceleration: Number = 3000 + // The rate with which the inertial movement slows down, in pixels/second². + inertiaDeceleration: 3400, // px/s^2 - _onTouchStart: function (e) { - var map = this._map; + // @option inertiaMaxSpeed: Number = Infinity + // Max speed of the inertial movement, in pixels/second. + inertiaMaxSpeed: Infinity, // px/s - if (!e.touches || e.touches.length !== 2 || map._animatingZoom || this._zooming) { return; } + // @option easeLinearity: Number = 0.2 + easeLinearity: 0.2, - var p1 = map.mouseEventToLayerPoint(e.touches[0]), - p2 = map.mouseEventToLayerPoint(e.touches[1]), - viewCenter = map._getCenterLayerPoint(); + // TODO refactor, move to CRS + // @option worldCopyJump: Boolean = false + // With this option enabled, the map tracks when you pan to another "copy" + // of the world and seamlessly jumps to the original one so that all overlays + // like markers and vector layers are still visible. + worldCopyJump: false, + + // @option maxBoundsViscosity: Number = 0.0 + // If `maxBounds` is set, this option will control how solid the bounds + // are when dragging the map around. The default value of `0.0` allows the + // user to drag outside the bounds at normal speed, higher values will + // slow down map dragging outside bounds, and `1.0` makes the bounds fully + // solid, preventing the user from dragging outside the bounds. + maxBoundsViscosity: 0.0 +}); - this._startCenter = p1.add(p2)._divideBy(2); - this._startDist = p1.distanceTo(p2); +L.Map.Drag = L.Handler.extend({ + addHooks: function () { + if (!this._draggable) { + var map = this._map; - this._moved = false; - this._zooming = true; + this._draggable = new L.Draggable(map._mapPane, map._container); + + this._draggable.on({ + down: this._onDown, + dragstart: this._onDragStart, + drag: this._onDrag, + dragend: this._onDragEnd + }, this); - this._centerOffset = viewCenter.subtract(this._startCenter); + this._draggable.on('predrag', this._onPreDragLimit, this); + if (map.options.worldCopyJump) { + this._draggable.on('predrag', this._onPreDragWrap, this); + map.on('zoomend', this._onZoomEnd, this); - if (map._panAnim) { - map._panAnim.stop(); + map.whenReady(this._onZoomEnd, this); + } } + L.DomUtil.addClass(this._map._container, 'leaflet-grab leaflet-touch-drag'); + this._draggable.enable(); + this._positions = []; + this._times = []; + }, - L.DomEvent - .on(document, 'touchmove', this._onTouchMove, this) - .on(document, 'touchend', this._onTouchEnd, this); + removeHooks: function () { + L.DomUtil.removeClass(this._map._container, 'leaflet-grab'); + L.DomUtil.removeClass(this._map._container, 'leaflet-touch-drag'); + this._draggable.disable(); + }, - L.DomEvent.preventDefault(e); + moved: function () { + return this._draggable && this._draggable._moved; }, - _onTouchMove: function (e) { - var map = this._map; + moving: function () { + return this._draggable && this._draggable._moving; + }, - if (!e.touches || e.touches.length !== 2 || !this._zooming) { return; } + _onDown: function () { + this._map._stop(); + }, - var p1 = map.mouseEventToLayerPoint(e.touches[0]), - p2 = map.mouseEventToLayerPoint(e.touches[1]); + _onDragStart: function () { + var map = this._map; - this._scale = p1.distanceTo(p2) / this._startDist; - this._delta = p1._add(p2)._divideBy(2)._subtract(this._startCenter); + if (this._map.options.maxBounds && this._map.options.maxBoundsViscosity) { + var bounds = L.latLngBounds(this._map.options.maxBounds); - if (this._scale === 1) { return; } + this._offsetLimit = L.bounds( + this._map.latLngToContainerPoint(bounds.getNorthWest()).multiplyBy(-1), + this._map.latLngToContainerPoint(bounds.getSouthEast()).multiplyBy(-1) + .add(this._map.getSize())); - if (!map.options.bounceAtZoomLimits) { - if ((map.getZoom() === map.getMinZoom() && this._scale < 1) || - (map.getZoom() === map.getMaxZoom() && this._scale > 1)) { return; } + this._viscosity = Math.min(1.0, Math.max(0.0, this._map.options.maxBoundsViscosity)); + } else { + this._offsetLimit = null; } - if (!this._moved) { - L.DomUtil.addClass(map._mapPane, 'leaflet-touching'); - - map - .fire('movestart') - .fire('zoomstart'); + map + .fire('movestart') + .fire('dragstart'); - this._moved = true; + if (map.options.inertia) { + this._positions = []; + this._times = []; } - - L.Util.cancelAnimFrame(this._animRequest); - this._animRequest = L.Util.requestAnimFrame( - this._updateOnMove, this, true, this._map._container); - - L.DomEvent.preventDefault(e); }, - _updateOnMove: function () { - var map = this._map, - origin = this._getScaleOrigin(), - center = map.layerPointToLatLng(origin), - zoom = map.getScaleZoom(this._scale); + _onDrag: function (e) { + if (this._map.options.inertia) { + var time = this._lastTime = +new Date(), + pos = this._lastPos = this._draggable._absPos || this._draggable._newPos; - map._animateZoom(center, zoom, this._startCenter, this._scale, this._delta, false, true); - }, + this._positions.push(pos); + this._times.push(time); - _onTouchEnd: function () { - if (!this._moved || !this._zooming) { - this._zooming = false; - return; + if (time - this._times[0] > 50) { + this._positions.shift(); + this._times.shift(); + } } - var map = this._map; + this._map + .fire('move', e) + .fire('drag', e); + }, - this._zooming = false; - L.DomUtil.removeClass(map._mapPane, 'leaflet-touching'); - L.Util.cancelAnimFrame(this._animRequest); + _onZoomEnd: function () { + var pxCenter = this._map.getSize().divideBy(2), + pxWorldCenter = this._map.latLngToLayerPoint([0, 0]); - L.DomEvent - .off(document, 'touchmove', this._onTouchMove) - .off(document, 'touchend', this._onTouchEnd); + this._initialWorldOffset = pxWorldCenter.subtract(pxCenter).x; + this._worldWidth = this._map.getPixelWorldBounds().getSize().x; + }, - var origin = this._getScaleOrigin(), - center = map.layerPointToLatLng(origin), + _viscousLimit: function (value, threshold) { + return value - (value - threshold) * this._viscosity; + }, - oldZoom = map.getZoom(), - floatZoomDelta = map.getScaleZoom(this._scale) - oldZoom, - roundZoomDelta = (floatZoomDelta > 0 ? - Math.ceil(floatZoomDelta) : Math.floor(floatZoomDelta)), + _onPreDragLimit: function () { + if (!this._viscosity || !this._offsetLimit) { return; } - zoom = map._limitZoom(oldZoom + roundZoomDelta), - scale = map.getZoomScale(zoom) / this._scale; + var offset = this._draggable._newPos.subtract(this._draggable._startPos); - map._animateZoom(center, zoom, origin, scale); - }, + var limit = this._offsetLimit; + if (offset.x < limit.min.x) { offset.x = this._viscousLimit(offset.x, limit.min.x); } + if (offset.y < limit.min.y) { offset.y = this._viscousLimit(offset.y, limit.min.y); } + if (offset.x > limit.max.x) { offset.x = this._viscousLimit(offset.x, limit.max.x); } + if (offset.y > limit.max.y) { offset.y = this._viscousLimit(offset.y, limit.max.y); } - _getScaleOrigin: function () { - var centerOffset = this._centerOffset.subtract(this._delta).divideBy(this._scale); - return this._startCenter.add(centerOffset); - } -}); + this._draggable._newPos = this._draggable._startPos.add(offset); + }, -L.Map.addInitHook('addHandler', 'touchZoom', L.Map.TouchZoom); + _onPreDragWrap: function () { + // TODO refactor to be able to adjust map pane position after zoom + var worldWidth = this._worldWidth, + halfWidth = Math.round(worldWidth / 2), + dx = this._initialWorldOffset, + x = this._draggable._newPos.x, + newX1 = (x - halfWidth + dx) % worldWidth + halfWidth - dx, + newX2 = (x + halfWidth + dx) % worldWidth - halfWidth - dx, + newX = Math.abs(newX1 + dx) < Math.abs(newX2 + dx) ? newX1 : newX2; + this._draggable._absPos = this._draggable._newPos.clone(); + this._draggable._newPos.x = newX; + }, -/* - * L.Map.Tap is used to enable mobile hacks like quick taps and long hold. - */ + _onDragEnd: function (e) { + var map = this._map, + options = map.options, -L.Map.mergeOptions({ - tap: true, - tapTolerance: 15 -}); + noInertia = !options.inertia || this._times.length < 2; -L.Map.Tap = L.Handler.extend({ - addHooks: function () { - L.DomEvent.on(this._map._container, 'touchstart', this._onDown, this); - }, + map.fire('dragend', e); - removeHooks: function () { - L.DomEvent.off(this._map._container, 'touchstart', this._onDown, this); - }, + if (noInertia) { + map.fire('moveend'); - _onDown: function (e) { - if (!e.touches) { return; } + } else { - L.DomEvent.preventDefault(e); + var direction = this._lastPos.subtract(this._positions[0]), + duration = (this._lastTime - this._times[0]) / 1000, + ease = options.easeLinearity, - this._fireClick = true; + speedVector = direction.multiplyBy(ease / duration), + speed = speedVector.distanceTo([0, 0]), - // don't simulate click or track longpress if more than 1 touch - if (e.touches.length > 1) { - this._fireClick = false; - clearTimeout(this._holdTimeout); - return; - } + limitedSpeed = Math.min(options.inertiaMaxSpeed, speed), + limitedSpeedVector = speedVector.multiplyBy(limitedSpeed / speed), - var first = e.touches[0], - el = first.target; + decelerationDuration = limitedSpeed / (options.inertiaDeceleration * ease), + offset = limitedSpeedVector.multiplyBy(-decelerationDuration / 2).round(); - this._startPos = this._newPos = new L.Point(first.clientX, first.clientY); + if (!offset.x && !offset.y) { + map.fire('moveend'); - // if touching a link, highlight it - if (el.tagName && el.tagName.toLowerCase() === 'a') { - L.DomUtil.addClass(el, 'leaflet-active'); - } + } else { + offset = map._limitOffset(offset, map.options.maxBounds); - // simulate long hold but setting a timeout - this._holdTimeout = setTimeout(L.bind(function () { - if (this._isTapValid()) { - this._fireClick = false; - this._onUp(); - this._simulateEvent('contextmenu', first); + L.Util.requestAnimFrame(function () { + map.panBy(offset, { + duration: decelerationDuration, + easeLinearity: ease, + noMoveStart: true, + animate: true + }); + }); } - }, this), 1000); - - L.DomEvent - .on(document, 'touchmove', this._onMove, this) - .on(document, 'touchend', this._onUp, this); - }, + } + } +}); - _onUp: function (e) { - clearTimeout(this._holdTimeout); +// @section Handlers +// @property dragging: Handler +// Map dragging handler (by both mouse and touch). +L.Map.addInitHook('addHandler', 'dragging', L.Map.Drag); - L.DomEvent - .off(document, 'touchmove', this._onMove, this) - .off(document, 'touchend', this._onUp, this); - if (this._fireClick && e && e.changedTouches) { - var first = e.changedTouches[0], - el = first.target; +/* + * L.Handler.DoubleClickZoom is used to handle double-click zoom on the map, enabled by default. + */ - if (el && el.tagName && el.tagName.toLowerCase() === 'a') { - L.DomUtil.removeClass(el, 'leaflet-active'); - } +// @namespace Map +// @section Interaction Options - // simulate click if the touch didn't move too much - if (this._isTapValid()) { - this._simulateEvent('click', first); - } - } - }, +L.Map.mergeOptions({ + // @option doubleClickZoom: Boolean|String = true + // Whether the map can be zoomed in by double clicking on it and + // zoomed out by double clicking while holding shift. If passed + // `'center'`, double-click zoom will zoom to the center of the + // view regardless of where the mouse was. + doubleClickZoom: true +}); - _isTapValid: function () { - return this._newPos.distanceTo(this._startPos) <= this._map.options.tapTolerance; +L.Map.DoubleClickZoom = L.Handler.extend({ + addHooks: function () { + this._map.on('dblclick', this._onDoubleClick, this); }, - _onMove: function (e) { - var first = e.touches[0]; - this._newPos = new L.Point(first.clientX, first.clientY); + removeHooks: function () { + this._map.off('dblclick', this._onDoubleClick, this); }, - _simulateEvent: function (type, e) { - var simulatedEvent = document.createEvent('MouseEvents'); - - simulatedEvent._simulated = true; - e.target._simulatedClick = true; - - simulatedEvent.initMouseEvent( - type, true, true, window, 1, - e.screenX, e.screenY, - e.clientX, e.clientY, - false, false, false, false, 0, null); + _onDoubleClick: function (e) { + var map = this._map, + oldZoom = map.getZoom(), + delta = map.options.zoomDelta, + zoom = e.originalEvent.shiftKey ? oldZoom - delta : oldZoom + delta; - e.target.dispatchEvent(simulatedEvent); + if (map.options.doubleClickZoom === 'center') { + map.setZoom(zoom); + } else { + map.setZoomAround(e.containerPoint, zoom); + } } }); -if (L.Browser.touch && !L.Browser.pointer) { - L.Map.addInitHook('addHandler', 'tap', L.Map.Tap); -} +// @section Handlers +// +// Map properties include interaction handlers that allow you to control +// interaction behavior in runtime, enabling or disabling certain features such +// as dragging or touch zoom (see `Handler` methods). For example: +// +// ```js +// map.doubleClickZoom.disable(); +// ``` +// +// @property doubleClickZoom: Handler +// Double click zoom handler. +L.Map.addInitHook('addHandler', 'doubleClickZoom', L.Map.DoubleClickZoom); + /* - * L.Handler.ShiftDragZoom is used to add shift-drag zoom interaction to the map - * (zoom to a selected bounding box), enabled by default. + * L.Handler.ScrollWheelZoom is used by L.Map to enable mouse scroll wheel zoom on the map. */ +// @namespace Map +// @section Interaction Options L.Map.mergeOptions({ - boxZoom: true + // @section Mousewheel options + // @option scrollWheelZoom: Boolean|String = true + // Whether the map can be zoomed by using the mouse wheel. If passed `'center'`, + // it will zoom to the center of the view regardless of where the mouse was. + scrollWheelZoom: true, + + // @option wheelDebounceTime: Number = 40 + // Limits the rate at which a wheel can fire (in milliseconds). By default + // user can't zoom via wheel more often than once per 40 ms. + wheelDebounceTime: 40, + + // @option wheelPxPerZoomLevel: Number = 60 + // How many scroll pixels (as reported by [L.DomEvent.getWheelDelta](#domevent-getwheeldelta)) + // mean a change of one full zoom level. Smaller values will make wheel-zooming + // faster (and vice versa). + wheelPxPerZoomLevel: 60 }); -L.Map.BoxZoom = L.Handler.extend({ - initialize: function (map) { - this._map = map; - this._container = map._container; - this._pane = map._panes.overlayPane; - this._moved = false; - }, - +L.Map.ScrollWheelZoom = L.Handler.extend({ addHooks: function () { - L.DomEvent.on(this._container, 'mousedown', this._onMouseDown, this); - }, + L.DomEvent.on(this._map._container, 'mousewheel', this._onWheelScroll, this); - removeHooks: function () { - L.DomEvent.off(this._container, 'mousedown', this._onMouseDown); - this._moved = false; + this._delta = 0; }, - moved: function () { - return this._moved; + removeHooks: function () { + L.DomEvent.off(this._map._container, 'mousewheel', this._onWheelScroll, this); }, - _onMouseDown: function (e) { - this._moved = false; - - if (!e.shiftKey || ((e.which !== 1) && (e.button !== 1))) { return false; } - - L.DomUtil.disableTextSelection(); - L.DomUtil.disableImageDrag(); - - this._startLayerPoint = this._map.mouseEventToLayerPoint(e); + _onWheelScroll: function (e) { + var delta = L.DomEvent.getWheelDelta(e); - L.DomEvent - .on(document, 'mousemove', this._onMouseMove, this) - .on(document, 'mouseup', this._onMouseUp, this) - .on(document, 'keydown', this._onKeyDown, this); - }, + var debounce = this._map.options.wheelDebounceTime; - _onMouseMove: function (e) { - if (!this._moved) { - this._box = L.DomUtil.create('div', 'leaflet-zoom-box', this._pane); - L.DomUtil.setPosition(this._box, this._startLayerPoint); + this._delta += delta; + this._lastMousePos = this._map.mouseEventToContainerPoint(e); - //TODO refactor: move cursor to styles - this._container.style.cursor = 'crosshair'; - this._map.fire('boxzoomstart'); + if (!this._startTime) { + this._startTime = +new Date(); } - var startPoint = this._startLayerPoint, - box = this._box, - - layerPoint = this._map.mouseEventToLayerPoint(e), - offset = layerPoint.subtract(startPoint), - - newPos = new L.Point( - Math.min(layerPoint.x, startPoint.x), - Math.min(layerPoint.y, startPoint.y)); - - L.DomUtil.setPosition(box, newPos); + var left = Math.max(debounce - (+new Date() - this._startTime), 0); - this._moved = true; - - // TODO refactor: remove hardcoded 4 pixels - box.style.width = (Math.max(0, Math.abs(offset.x) - 4)) + 'px'; - box.style.height = (Math.max(0, Math.abs(offset.y) - 4)) + 'px'; - }, - - _finish: function () { - if (this._moved) { - this._pane.removeChild(this._box); - this._container.style.cursor = ''; - } - - L.DomUtil.enableTextSelection(); - L.DomUtil.enableImageDrag(); + clearTimeout(this._timer); + this._timer = setTimeout(L.bind(this._performZoom, this), left); - L.DomEvent - .off(document, 'mousemove', this._onMouseMove) - .off(document, 'mouseup', this._onMouseUp) - .off(document, 'keydown', this._onKeyDown); + L.DomEvent.stop(e); }, - _onMouseUp: function (e) { - - this._finish(); - + _performZoom: function () { var map = this._map, - layerPoint = map.mouseEventToLayerPoint(e); + zoom = map.getZoom(), + snap = this._map.options.zoomSnap || 0; - if (this._startLayerPoint.equals(layerPoint)) { return; } + map._stop(); // stop panning and fly animations if any - var bounds = new L.LatLngBounds( - map.layerPointToLatLng(this._startLayerPoint), - map.layerPointToLatLng(layerPoint)); + // map the delta with a sigmoid function to -4..4 range leaning on -1..1 + var d2 = this._delta / (this._map.options.wheelPxPerZoomLevel * 4), + d3 = 4 * Math.log(2 / (1 + Math.exp(-Math.abs(d2)))) / Math.LN2, + d4 = snap ? Math.ceil(d3 / snap) * snap : d3, + delta = map._limitZoom(zoom + (this._delta > 0 ? d4 : -d4)) - zoom; - map.fitBounds(bounds); + this._delta = 0; + this._startTime = null; - map.fire('boxzoomend', { - boxZoomBounds: bounds - }); - }, + if (!delta) { return; } - _onKeyDown: function (e) { - if (e.keyCode === 27) { - this._finish(); + if (map.options.scrollWheelZoom === 'center') { + map.setZoom(zoom + delta); + } else { + map.setZoomAround(this._lastMousePos, zoom + delta); } } }); -L.Map.addInitHook('addHandler', 'boxZoom', L.Map.BoxZoom); +// @section Handlers +// @property scrollWheelZoom: Handler +// Scroll wheel zoom handler. +L.Map.addInitHook('addHandler', 'scrollWheelZoom', L.Map.ScrollWheelZoom); + /* - * L.Map.Keyboard is handling keyboard interaction with the map, enabled by default. + * Extends the event handling code with double tap support for mobile browsers. */ -L.Map.mergeOptions({ - keyboard: true, - keyboardPanOffset: 80, - keyboardZoomOffset: 1 -}); - -L.Map.Keyboard = L.Handler.extend({ - - keyCodes: { - left: [37], - right: [39], - down: [40], - up: [38], - zoomIn: [187, 107, 61, 171], - zoomOut: [189, 109, 173] - }, - - initialize: function (map) { - this._map = map; +L.extend(L.DomEvent, { - this._setPanOffset(map.options.keyboardPanOffset); - this._setZoomOffset(map.options.keyboardZoomOffset); - }, + _touchstart: L.Browser.msPointer ? 'MSPointerDown' : L.Browser.pointer ? 'pointerdown' : 'touchstart', + _touchend: L.Browser.msPointer ? 'MSPointerUp' : L.Browser.pointer ? 'pointerup' : 'touchend', - addHooks: function () { - var container = this._map._container; + // inspired by Zepto touch code by Thomas Fuchs + addDoubleTapListener: function (obj, handler, id) { + var last, touch, + doubleTap = false, + delay = 250; - // make the container focusable by tabbing - if (container.tabIndex === -1) { - container.tabIndex = '0'; - } + function onTouchStart(e) { + var count; - L.DomEvent - .on(container, 'focus', this._onFocus, this) - .on(container, 'blur', this._onBlur, this) - .on(container, 'mousedown', this._onMouseDown, this); + if (L.Browser.pointer) { + if ((!L.Browser.edge) || e.pointerType === 'mouse') { return; } + count = L.DomEvent._pointersCount; + } else { + count = e.touches.length; + } - this._map - .on('focus', this._addHooks, this) - .on('blur', this._removeHooks, this); - }, + if (count > 1) { return; } - removeHooks: function () { - this._removeHooks(); + var now = Date.now(), + delta = now - (last || now); - var container = this._map._container; + touch = e.touches ? e.touches[0] : e; + doubleTap = (delta > 0 && delta <= delay); + last = now; + } - L.DomEvent - .off(container, 'focus', this._onFocus, this) - .off(container, 'blur', this._onBlur, this) - .off(container, 'mousedown', this._onMouseDown, this); + function onTouchEnd(e) { + if (doubleTap && !touch.cancelBubble) { + if (L.Browser.pointer) { + if ((!L.Browser.edge) || e.pointerType === 'mouse') { return; } - this._map - .off('focus', this._addHooks, this) - .off('blur', this._removeHooks, this); - }, + // work around .type being readonly with MSPointer* events + var newTouch = {}, + prop, i; - _onMouseDown: function () { - if (this._focused) { return; } + for (i in touch) { + prop = touch[i]; + newTouch[i] = prop && prop.bind ? prop.bind(touch) : prop; + } + touch = newTouch; + } + touch.type = 'dblclick'; + handler(touch); + last = null; + } + } - var body = document.body, - docEl = document.documentElement, - top = body.scrollTop || docEl.scrollTop, - left = body.scrollLeft || docEl.scrollLeft; + var pre = '_leaflet_', + touchstart = this._touchstart, + touchend = this._touchend; - this._map._container.focus(); + obj[pre + touchstart + id] = onTouchStart; + obj[pre + touchend + id] = onTouchEnd; + obj[pre + 'dblclick' + id] = handler; - window.scrollTo(left, top); - }, + obj.addEventListener(touchstart, onTouchStart, false); + obj.addEventListener(touchend, onTouchEnd, false); - _onFocus: function () { - this._focused = true; - this._map.fire('focus'); - }, + // On some platforms (notably, chrome<55 on win10 + touchscreen + mouse), + // the browser doesn't fire touchend/pointerup events but does fire + // native dblclicks. See #4127. + // Edge 14 also fires native dblclicks, but only for pointerType mouse, see #5180. + obj.addEventListener('dblclick', handler, false); - _onBlur: function () { - this._focused = false; - this._map.fire('blur'); + return this; }, - _setPanOffset: function (pan) { - var keys = this._panKeys = {}, - codes = this.keyCodes, - i, len; + removeDoubleTapListener: function (obj, id) { + var pre = '_leaflet_', + touchstart = obj[pre + this._touchstart + id], + touchend = obj[pre + this._touchend + id], + dblclick = obj[pre + 'dblclick' + id]; - for (i = 0, len = codes.left.length; i < len; i++) { - keys[codes.left[i]] = [-1 * pan, 0]; - } - for (i = 0, len = codes.right.length; i < len; i++) { - keys[codes.right[i]] = [pan, 0]; - } - for (i = 0, len = codes.down.length; i < len; i++) { - keys[codes.down[i]] = [0, pan]; - } - for (i = 0, len = codes.up.length; i < len; i++) { - keys[codes.up[i]] = [0, -1 * pan]; + obj.removeEventListener(this._touchstart, touchstart, false); + obj.removeEventListener(this._touchend, touchend, false); + if (!L.Browser.edge) { + obj.removeEventListener('dblclick', dblclick, false); } - }, - _setZoomOffset: function (zoom) { - var keys = this._zoomKeys = {}, - codes = this.keyCodes, - i, len; + return this; + } +}); - for (i = 0, len = codes.zoomIn.length; i < len; i++) { - keys[codes.zoomIn[i]] = zoom; - } - for (i = 0, len = codes.zoomOut.length; i < len; i++) { - keys[codes.zoomOut[i]] = -zoom; - } - }, - _addHooks: function () { - L.DomEvent.on(document, 'keydown', this._onKeyDown, this); - }, - _removeHooks: function () { - L.DomEvent.off(document, 'keydown', this._onKeyDown, this); - }, +/* + * Extends L.DomEvent to provide touch support for Internet Explorer and Windows-based devices. + */ - _onKeyDown: function (e) { - var key = e.keyCode, - map = this._map; +L.extend(L.DomEvent, { - if (key in this._panKeys) { + POINTER_DOWN: L.Browser.msPointer ? 'MSPointerDown' : 'pointerdown', + POINTER_MOVE: L.Browser.msPointer ? 'MSPointerMove' : 'pointermove', + POINTER_UP: L.Browser.msPointer ? 'MSPointerUp' : 'pointerup', + POINTER_CANCEL: L.Browser.msPointer ? 'MSPointerCancel' : 'pointercancel', + TAG_WHITE_LIST: ['INPUT', 'SELECT', 'OPTION'], - if (map._panAnim && map._panAnim._inProgress) { return; } + _pointers: {}, + _pointersCount: 0, + + // Provides a touch events wrapper for (ms)pointer events. + // ref http://www.w3.org/TR/pointerevents/ https://www.w3.org/Bugs/Public/show_bug.cgi?id=22890 - map.panBy(this._panKeys[key]); + addPointerListener: function (obj, type, handler, id) { - if (map.options.maxBounds) { - map.panInsideBounds(map.options.maxBounds); - } + if (type === 'touchstart') { + this._addPointerStart(obj, handler, id); - } else if (key in this._zoomKeys) { - map.setZoom(map.getZoom() + this._zoomKeys[key]); + } else if (type === 'touchmove') { + this._addPointerMove(obj, handler, id); - } else { - return; + } else if (type === 'touchend') { + this._addPointerEnd(obj, handler, id); } - L.DomEvent.stop(e); - } -}); - -L.Map.addInitHook('addHandler', 'keyboard', L.Map.Keyboard); + return this; + }, + removePointerListener: function (obj, type, id) { + var handler = obj['_leaflet_' + type + id]; -/* - * L.Handler.MarkerDrag is used internally by L.Marker to make the markers draggable. - */ + if (type === 'touchstart') { + obj.removeEventListener(this.POINTER_DOWN, handler, false); -L.Handler.MarkerDrag = L.Handler.extend({ - initialize: function (marker) { - this._marker = marker; - }, + } else if (type === 'touchmove') { + obj.removeEventListener(this.POINTER_MOVE, handler, false); - addHooks: function () { - var icon = this._marker._icon; - if (!this._draggable) { - this._draggable = new L.Draggable(icon, icon); + } else if (type === 'touchend') { + obj.removeEventListener(this.POINTER_UP, handler, false); + obj.removeEventListener(this.POINTER_CANCEL, handler, false); } - this._draggable - .on('dragstart', this._onDragStart, this) - .on('drag', this._onDrag, this) - .on('dragend', this._onDragEnd, this); - this._draggable.enable(); - L.DomUtil.addClass(this._marker._icon, 'leaflet-marker-draggable'); + return this; }, - removeHooks: function () { - this._draggable - .off('dragstart', this._onDragStart, this) - .off('drag', this._onDrag, this) - .off('dragend', this._onDragEnd, this); + _addPointerStart: function (obj, handler, id) { + var onDown = L.bind(function (e) { + if (e.pointerType !== 'mouse' && e.MSPOINTER_TYPE_MOUSE && e.pointerType !== e.MSPOINTER_TYPE_MOUSE) { + // In IE11, some touch events needs to fire for form controls, or + // the controls will stop working. We keep a whitelist of tag names that + // need these events. For other target tags, we prevent default on the event. + if (this.TAG_WHITE_LIST.indexOf(e.target.tagName) < 0) { + L.DomEvent.preventDefault(e); + } else { + return; + } + } - this._draggable.disable(); - L.DomUtil.removeClass(this._marker._icon, 'leaflet-marker-draggable'); - }, + this._handlePointer(e, handler); + }, this); - moved: function () { - return this._draggable && this._draggable._moved; + obj['_leaflet_touchstart' + id] = onDown; + obj.addEventListener(this.POINTER_DOWN, onDown, false); + + // need to keep track of what pointers and how many are active to provide e.touches emulation + if (!this._pointerDocListener) { + var pointerUp = L.bind(this._globalPointerUp, this); + + // we listen documentElement as any drags that end by moving the touch off the screen get fired there + document.documentElement.addEventListener(this.POINTER_DOWN, L.bind(this._globalPointerDown, this), true); + document.documentElement.addEventListener(this.POINTER_MOVE, L.bind(this._globalPointerMove, this), true); + document.documentElement.addEventListener(this.POINTER_UP, pointerUp, true); + document.documentElement.addEventListener(this.POINTER_CANCEL, pointerUp, true); + + this._pointerDocListener = true; + } }, - _onDragStart: function () { - this._marker - .closePopup() - .fire('movestart') - .fire('dragstart'); + _globalPointerDown: function (e) { + this._pointers[e.pointerId] = e; + this._pointersCount++; + }, + + _globalPointerMove: function (e) { + if (this._pointers[e.pointerId]) { + this._pointers[e.pointerId] = e; + } }, - _onDrag: function () { - var marker = this._marker, - shadow = marker._shadow, - iconPos = L.DomUtil.getPosition(marker._icon), - latlng = marker._map.layerPointToLatLng(iconPos); + _globalPointerUp: function (e) { + delete this._pointers[e.pointerId]; + this._pointersCount--; + }, - // update shadow position - if (shadow) { - L.DomUtil.setPosition(shadow, iconPos); + _handlePointer: function (e, handler) { + e.touches = []; + for (var i in this._pointers) { + e.touches.push(this._pointers[i]); } + e.changedTouches = [e]; - marker._latlng = latlng; + handler(e); + }, - marker - .fire('move', {latlng: latlng}) - .fire('drag'); + _addPointerMove: function (obj, handler, id) { + var onMove = L.bind(function (e) { + // don't fire touch moves when mouse isn't down + if ((e.pointerType === e.MSPOINTER_TYPE_MOUSE || e.pointerType === 'mouse') && e.buttons === 0) { return; } + + this._handlePointer(e, handler); + }, this); + + obj['_leaflet_touchmove' + id] = onMove; + obj.addEventListener(this.POINTER_MOVE, onMove, false); }, - _onDragEnd: function (e) { - this._marker - .fire('moveend') - .fire('dragend', e); + _addPointerEnd: function (obj, handler, id) { + var onUp = L.bind(function (e) { + this._handlePointer(e, handler); + }, this); + + obj['_leaflet_touchend' + id] = onUp; + obj.addEventListener(this.POINTER_UP, onUp, false); + obj.addEventListener(this.POINTER_CANCEL, onUp, false); } }); + /* - * L.Control is a base class for implementing map controls. Handles positioning. - * All other controls extend from this class. + * L.Handler.TouchZoom is used by L.Map to add pinch zoom on supported mobile browsers. */ -L.Control = L.Class.extend({ - options: { - position: 'topright' - }, +// @namespace Map +// @section Interaction Options +L.Map.mergeOptions({ + // @section Touch interaction options + // @option touchZoom: Boolean|String = * + // Whether the map can be zoomed by touch-dragging with two fingers. If + // passed `'center'`, it will zoom to the center of the view regardless of + // where the touch events (fingers) were. Enabled for touch-capable web + // browsers except for old Androids. + touchZoom: L.Browser.touch && !L.Browser.android23, - initialize: function (options) { - L.setOptions(this, options); + // @option bounceAtZoomLimits: Boolean = true + // Set it to false if you don't want the map to zoom beyond min/max zoom + // and then bounce back when pinch-zooming. + bounceAtZoomLimits: true +}); + +L.Map.TouchZoom = L.Handler.extend({ + addHooks: function () { + L.DomUtil.addClass(this._map._container, 'leaflet-touch-zoom'); + L.DomEvent.on(this._map._container, 'touchstart', this._onTouchStart, this); }, - getPosition: function () { - return this.options.position; + removeHooks: function () { + L.DomUtil.removeClass(this._map._container, 'leaflet-touch-zoom'); + L.DomEvent.off(this._map._container, 'touchstart', this._onTouchStart, this); }, - setPosition: function (position) { + _onTouchStart: function (e) { var map = this._map; + if (!e.touches || e.touches.length !== 2 || map._animatingZoom || this._zooming) { return; } - if (map) { - map.removeControl(this); + var p1 = map.mouseEventToContainerPoint(e.touches[0]), + p2 = map.mouseEventToContainerPoint(e.touches[1]); + + this._centerPoint = map.getSize()._divideBy(2); + this._startLatLng = map.containerPointToLatLng(this._centerPoint); + if (map.options.touchZoom !== 'center') { + this._pinchStartLatLng = map.containerPointToLatLng(p1.add(p2)._divideBy(2)); } - this.options.position = position; + this._startDist = p1.distanceTo(p2); + this._startZoom = map.getZoom(); - if (map) { - map.addControl(this); - } + this._moved = false; + this._zooming = true; - return this; - }, + map._stop(); - getContainer: function () { - return this._container; + L.DomEvent + .on(document, 'touchmove', this._onTouchMove, this) + .on(document, 'touchend', this._onTouchEnd, this); + + L.DomEvent.preventDefault(e); }, - addTo: function (map) { - this._map = map; + _onTouchMove: function (e) { + if (!e.touches || e.touches.length !== 2 || !this._zooming) { return; } - var container = this._container = this.onAdd(map), - pos = this.getPosition(), - corner = map._controlCorners[pos]; + var map = this._map, + p1 = map.mouseEventToContainerPoint(e.touches[0]), + p2 = map.mouseEventToContainerPoint(e.touches[1]), + scale = p1.distanceTo(p2) / this._startDist; - L.DomUtil.addClass(container, 'leaflet-control'); - if (pos.indexOf('bottom') !== -1) { - corner.insertBefore(container, corner.firstChild); + this._zoom = map.getScaleZoom(scale, this._startZoom); + + if (!map.options.bounceAtZoomLimits && ( + (this._zoom < map.getMinZoom() && scale < 1) || + (this._zoom > map.getMaxZoom() && scale > 1))) { + this._zoom = map._limitZoom(this._zoom); + } + + if (map.options.touchZoom === 'center') { + this._center = this._startLatLng; + if (scale === 1) { return; } } else { - corner.appendChild(container); + // Get delta from pinch to center, so centerLatLng is delta applied to initial pinchLatLng + var delta = p1._add(p2)._divideBy(2)._subtract(this._centerPoint); + if (scale === 1 && delta.x === 0 && delta.y === 0) { return; } + this._center = map.unproject(map.project(this._pinchStartLatLng, this._zoom).subtract(delta), this._zoom); } - return this; - }, + if (!this._moved) { + map._moveStart(true); + this._moved = true; + } - removeFrom: function (map) { - var pos = this.getPosition(), - corner = map._controlCorners[pos]; + L.Util.cancelAnimFrame(this._animRequest); - corner.removeChild(this._container); - this._map = null; + var moveFn = L.bind(map._move, map, this._center, this._zoom, {pinch: true, round: false}); + this._animRequest = L.Util.requestAnimFrame(moveFn, this, true); - if (this.onRemove) { - this.onRemove(map); + L.DomEvent.preventDefault(e); + }, + + _onTouchEnd: function () { + if (!this._moved || !this._zooming) { + this._zooming = false; + return; } - return this; - }, + this._zooming = false; + L.Util.cancelAnimFrame(this._animRequest); - _refocusOnMap: function () { - if (this._map) { - this._map.getContainer().focus(); + L.DomEvent + .off(document, 'touchmove', this._onTouchMove) + .off(document, 'touchend', this._onTouchEnd); + + // Pinch updates GridLayers' levels only when zoomSnap is off, so zoomSnap becomes noUpdate. + if (this._map.options.zoomAnimation) { + this._map._animateZoom(this._center, this._map._limitZoom(this._zoom), true, this._map.options.zoomSnap); + } else { + this._map._resetView(this._center, this._map._limitZoom(this._zoom)); } } }); -L.control = function (options) { - return new L.Control(options); -}; - +// @section Handlers +// @property touchZoom: Handler +// Touch zoom handler. +L.Map.addInitHook('addHandler', 'touchZoom', L.Map.TouchZoom); -// adds control-related methods to L.Map -L.Map.include({ - addControl: function (control) { - control.addTo(this); - return this; - }, - removeControl: function (control) { - control.removeFrom(this); - return this; - }, +/* + * L.Map.Tap is used to enable mobile hacks like quick taps and long hold. + */ - _initControlPos: function () { - var corners = this._controlCorners = {}, - l = 'leaflet-', - container = this._controlContainer = - L.DomUtil.create('div', l + 'control-container', this._container); +// @namespace Map +// @section Interaction Options +L.Map.mergeOptions({ + // @section Touch interaction options + // @option tap: Boolean = true + // Enables mobile hacks for supporting instant taps (fixing 200ms click + // delay on iOS/Android) and touch holds (fired as `contextmenu` events). + tap: true, - function createCorner(vSide, hSide) { - var className = l + vSide + ' ' + l + hSide; + // @option tapTolerance: Number = 15 + // The max number of pixels a user can shift his finger during touch + // for it to be considered a valid tap. + tapTolerance: 15 +}); - corners[vSide + hSide] = L.DomUtil.create('div', className, container); - } +L.Map.Tap = L.Handler.extend({ + addHooks: function () { + L.DomEvent.on(this._map._container, 'touchstart', this._onDown, this); + }, - createCorner('top', 'left'); - createCorner('top', 'right'); - createCorner('bottom', 'left'); - createCorner('bottom', 'right'); + removeHooks: function () { + L.DomEvent.off(this._map._container, 'touchstart', this._onDown, this); }, - _clearControlPos: function () { - this._container.removeChild(this._controlContainer); - } -}); + _onDown: function (e) { + if (!e.touches) { return; } + L.DomEvent.preventDefault(e); -/* - * L.Control.Zoom is used for the default zoom buttons on the map. - */ + this._fireClick = true; -L.Control.Zoom = L.Control.extend({ - options: { - position: 'topleft', - zoomInText: '+', - zoomInTitle: 'Zoom in', - zoomOutText: '-', - zoomOutTitle: 'Zoom out' - }, + // don't simulate click or track longpress if more than 1 touch + if (e.touches.length > 1) { + this._fireClick = false; + clearTimeout(this._holdTimeout); + return; + } - onAdd: function (map) { - var zoomName = 'leaflet-control-zoom', - container = L.DomUtil.create('div', zoomName + ' leaflet-bar'); + var first = e.touches[0], + el = first.target; - this._map = map; + this._startPos = this._newPos = new L.Point(first.clientX, first.clientY); - this._zoomInButton = this._createButton( - this.options.zoomInText, this.options.zoomInTitle, - zoomName + '-in', container, this._zoomIn, this); - this._zoomOutButton = this._createButton( - this.options.zoomOutText, this.options.zoomOutTitle, - zoomName + '-out', container, this._zoomOut, this); + // if touching a link, highlight it + if (el.tagName && el.tagName.toLowerCase() === 'a') { + L.DomUtil.addClass(el, 'leaflet-active'); + } - this._updateDisabled(); - map.on('zoomend zoomlevelschange', this._updateDisabled, this); + // simulate long hold but setting a timeout + this._holdTimeout = setTimeout(L.bind(function () { + if (this._isTapValid()) { + this._fireClick = false; + this._onUp(); + this._simulateEvent('contextmenu', first); + } + }, this), 1000); - return container; - }, + this._simulateEvent('mousedown', first); - onRemove: function (map) { - map.off('zoomend zoomlevelschange', this._updateDisabled, this); + L.DomEvent.on(document, { + touchmove: this._onMove, + touchend: this._onUp + }, this); }, - _zoomIn: function (e) { - this._map.zoomIn(e.shiftKey ? 3 : 1); - }, + _onUp: function (e) { + clearTimeout(this._holdTimeout); - _zoomOut: function (e) { - this._map.zoomOut(e.shiftKey ? 3 : 1); - }, + L.DomEvent.off(document, { + touchmove: this._onMove, + touchend: this._onUp + }, this); - _createButton: function (html, title, className, container, fn, context) { - var link = L.DomUtil.create('a', className, container); - link.innerHTML = html; - link.href = '#'; - link.title = title; + if (this._fireClick && e && e.changedTouches) { - var stop = L.DomEvent.stopPropagation; + var first = e.changedTouches[0], + el = first.target; - L.DomEvent - .on(link, 'click', stop) - .on(link, 'mousedown', stop) - .on(link, 'dblclick', stop) - .on(link, 'click', L.DomEvent.preventDefault) - .on(link, 'click', fn, context) - .on(link, 'click', this._refocusOnMap, context); + if (el && el.tagName && el.tagName.toLowerCase() === 'a') { + L.DomUtil.removeClass(el, 'leaflet-active'); + } - return link; + this._simulateEvent('mouseup', first); + + // simulate click if the touch didn't move too much + if (this._isTapValid()) { + this._simulateEvent('click', first); + } + } }, - _updateDisabled: function () { - var map = this._map, - className = 'leaflet-disabled'; + _isTapValid: function () { + return this._newPos.distanceTo(this._startPos) <= this._map.options.tapTolerance; + }, - L.DomUtil.removeClass(this._zoomInButton, className); - L.DomUtil.removeClass(this._zoomOutButton, className); + _onMove: function (e) { + var first = e.touches[0]; + this._newPos = new L.Point(first.clientX, first.clientY); + this._simulateEvent('mousemove', first); + }, - if (map._zoom === map.getMinZoom()) { - L.DomUtil.addClass(this._zoomOutButton, className); - } - if (map._zoom === map.getMaxZoom()) { - L.DomUtil.addClass(this._zoomInButton, className); - } - } -}); + _simulateEvent: function (type, e) { + var simulatedEvent = document.createEvent('MouseEvents'); -L.Map.mergeOptions({ - zoomControl: true -}); + simulatedEvent._simulated = true; + e.target._simulatedClick = true; -L.Map.addInitHook(function () { - if (this.options.zoomControl) { - this.zoomControl = new L.Control.Zoom(); - this.addControl(this.zoomControl); + simulatedEvent.initMouseEvent( + type, true, true, window, 1, + e.screenX, e.screenY, + e.clientX, e.clientY, + false, false, false, false, 0, null); + + e.target.dispatchEvent(simulatedEvent); } }); -L.control.zoom = function (options) { - return new L.Control.Zoom(options); -}; +// @section Handlers +// @property tap: Handler +// Mobile touch hacks (quick tap and touch hold) handler. +if (L.Browser.touch && !L.Browser.pointer) { + L.Map.addInitHook('addHandler', 'tap', L.Map.Tap); +} /* - * L.Control.Attribution is used for displaying attribution on the map (added by default). + * L.Handler.BoxZoom is used to add shift-drag zoom interaction to the map + * (zoom to a selected bounding box), enabled by default. */ -L.Control.Attribution = L.Control.extend({ - options: { - position: 'bottomright', - prefix: 'Leaflet' +// @namespace Map +// @section Interaction Options +L.Map.mergeOptions({ + // @option boxZoom: Boolean = true + // Whether the map can be zoomed to a rectangular area specified by + // dragging the mouse while pressing the shift key. + boxZoom: true +}); + +L.Map.BoxZoom = L.Handler.extend({ + initialize: function (map) { + this._map = map; + this._container = map._container; + this._pane = map._panes.overlayPane; }, - initialize: function (options) { - L.setOptions(this, options); + addHooks: function () { + L.DomEvent.on(this._container, 'mousedown', this._onMouseDown, this); + }, - this._attributions = {}; + removeHooks: function () { + L.DomEvent.off(this._container, 'mousedown', this._onMouseDown, this); }, - onAdd: function (map) { - this._container = L.DomUtil.create('div', 'leaflet-control-attribution'); - L.DomEvent.disableClickPropagation(this._container); + moved: function () { + return this._moved; + }, - for (var i in map._layers) { - if (map._layers[i].getAttribution) { - this.addAttribution(map._layers[i].getAttribution()); - } - } - - map - .on('layeradd', this._onLayerAdd, this) - .on('layerremove', this._onLayerRemove, this); + _resetState: function () { + this._moved = false; + }, - this._update(); + _onMouseDown: function (e) { + if (!e.shiftKey || ((e.which !== 1) && (e.button !== 1))) { return false; } - return this._container; - }, + this._resetState(); - onRemove: function (map) { - map - .off('layeradd', this._onLayerAdd) - .off('layerremove', this._onLayerRemove); + L.DomUtil.disableTextSelection(); + L.DomUtil.disableImageDrag(); - }, + this._startPoint = this._map.mouseEventToContainerPoint(e); - setPrefix: function (prefix) { - this.options.prefix = prefix; - this._update(); - return this; + L.DomEvent.on(document, { + contextmenu: L.DomEvent.stop, + mousemove: this._onMouseMove, + mouseup: this._onMouseUp, + keydown: this._onKeyDown + }, this); }, - addAttribution: function (text) { - if (!text) { return; } + _onMouseMove: function (e) { + if (!this._moved) { + this._moved = true; - if (!this._attributions[text]) { - this._attributions[text] = 0; - } - this._attributions[text]++; + this._box = L.DomUtil.create('div', 'leaflet-zoom-box', this._container); + L.DomUtil.addClass(this._container, 'leaflet-crosshair'); - this._update(); + this._map.fire('boxzoomstart'); + } - return this; - }, + this._point = this._map.mouseEventToContainerPoint(e); - removeAttribution: function (text) { - if (!text) { return; } + var bounds = new L.Bounds(this._point, this._startPoint), + size = bounds.getSize(); - if (this._attributions[text]) { - this._attributions[text]--; - this._update(); - } + L.DomUtil.setPosition(this._box, bounds.min); - return this; + this._box.style.width = size.x + 'px'; + this._box.style.height = size.y + 'px'; }, - _update: function () { - if (!this._map) { return; } + _finish: function () { + if (this._moved) { + L.DomUtil.remove(this._box); + L.DomUtil.removeClass(this._container, 'leaflet-crosshair'); + } - var attribs = []; + L.DomUtil.enableTextSelection(); + L.DomUtil.enableImageDrag(); - for (var i in this._attributions) { - if (this._attributions[i]) { - attribs.push(i); - } - } + L.DomEvent.off(document, { + contextmenu: L.DomEvent.stop, + mousemove: this._onMouseMove, + mouseup: this._onMouseUp, + keydown: this._onKeyDown + }, this); + }, - var prefixAndAttribs = []; + _onMouseUp: function (e) { + if ((e.which !== 1) && (e.button !== 1)) { return; } - if (this.options.prefix) { - prefixAndAttribs.push(this.options.prefix); - } - if (attribs.length) { - prefixAndAttribs.push(attribs.join(', ')); - } + this._finish(); - this._container.innerHTML = prefixAndAttribs.join(' | '); - }, + if (!this._moved) { return; } + // Postpone to next JS tick so internal click event handling + // still see it as "moved". + setTimeout(L.bind(this._resetState, this), 0); - _onLayerAdd: function (e) { - if (e.layer.getAttribution) { - this.addAttribution(e.layer.getAttribution()); - } + var bounds = new L.LatLngBounds( + this._map.containerPointToLatLng(this._startPoint), + this._map.containerPointToLatLng(this._point)); + + this._map + .fitBounds(bounds) + .fire('boxzoomend', {boxZoomBounds: bounds}); }, - _onLayerRemove: function (e) { - if (e.layer.getAttribution) { - this.removeAttribution(e.layer.getAttribution()); + _onKeyDown: function (e) { + if (e.keyCode === 27) { + this._finish(); } } }); -L.Map.mergeOptions({ - attributionControl: true -}); - -L.Map.addInitHook(function () { - if (this.options.attributionControl) { - this.attributionControl = (new L.Control.Attribution()).addTo(this); - } -}); +// @section Handlers +// @property boxZoom: Handler +// Box (shift-drag with mouse) zoom handler. +L.Map.addInitHook('addHandler', 'boxZoom', L.Map.BoxZoom); -L.control.attribution = function (options) { - return new L.Control.Attribution(options); -}; /* - * L.Control.Scale is used for displaying metric/imperial scale on the map. + * L.Map.Keyboard is handling keyboard interaction with the map, enabled by default. */ -L.Control.Scale = L.Control.extend({ - options: { - position: 'bottomleft', - maxWidth: 100, - metric: true, - imperial: true, - updateWhenIdle: false +// @namespace Map +// @section Keyboard Navigation Options +L.Map.mergeOptions({ + // @option keyboard: Boolean = true + // Makes the map focusable and allows users to navigate the map with keyboard + // arrows and `+`/`-` keys. + keyboard: true, + + // @option keyboardPanDelta: Number = 80 + // Amount of pixels to pan when pressing an arrow key. + keyboardPanDelta: 80 +}); + +L.Map.Keyboard = L.Handler.extend({ + + keyCodes: { + left: [37], + right: [39], + down: [40], + up: [38], + zoomIn: [187, 107, 61, 171], + zoomOut: [189, 109, 54, 173] }, - onAdd: function (map) { + initialize: function (map) { this._map = map; - var className = 'leaflet-control-scale', - container = L.DomUtil.create('div', className), - options = this.options; + this._setPanDelta(map.options.keyboardPanDelta); + this._setZoomDelta(map.options.zoomDelta); + }, - this._addScales(options, className, container); + addHooks: function () { + var container = this._map._container; - map.on(options.updateWhenIdle ? 'moveend' : 'move', this._update, this); - map.whenReady(this._update, this); + // make the container focusable by tabbing + if (container.tabIndex <= 0) { + container.tabIndex = '0'; + } - return container; - }, + L.DomEvent.on(container, { + focus: this._onFocus, + blur: this._onBlur, + mousedown: this._onMouseDown + }, this); - onRemove: function (map) { - map.off(this.options.updateWhenIdle ? 'moveend' : 'move', this._update, this); + this._map.on({ + focus: this._addHooks, + blur: this._removeHooks + }, this); }, - _addScales: function (options, className, container) { - if (options.metric) { - this._mScale = L.DomUtil.create('div', className + '-line', container); - } - if (options.imperial) { - this._iScale = L.DomUtil.create('div', className + '-line', container); - } + removeHooks: function () { + this._removeHooks(); + + L.DomEvent.off(this._map._container, { + focus: this._onFocus, + blur: this._onBlur, + mousedown: this._onMouseDown + }, this); + + this._map.off({ + focus: this._addHooks, + blur: this._removeHooks + }, this); }, - _update: function () { - var bounds = this._map.getBounds(), - centerLat = bounds.getCenter().lat, - halfWorldMeters = 6378137 * Math.PI * Math.cos(centerLat * Math.PI / 180), - dist = halfWorldMeters * (bounds.getNorthEast().lng - bounds.getSouthWest().lng) / 180, + _onMouseDown: function () { + if (this._focused) { return; } - size = this._map.getSize(), - options = this.options, - maxMeters = 0; + var body = document.body, + docEl = document.documentElement, + top = body.scrollTop || docEl.scrollTop, + left = body.scrollLeft || docEl.scrollLeft; - if (size.x > 0) { - maxMeters = dist * (options.maxWidth / size.x); - } + this._map._container.focus(); - this._updateScales(options, maxMeters); + window.scrollTo(left, top); }, - _updateScales: function (options, maxMeters) { - if (options.metric && maxMeters) { - this._updateMetric(maxMeters); + _onFocus: function () { + this._focused = true; + this._map.fire('focus'); + }, + + _onBlur: function () { + this._focused = false; + this._map.fire('blur'); + }, + + _setPanDelta: function (panDelta) { + var keys = this._panKeys = {}, + codes = this.keyCodes, + i, len; + + for (i = 0, len = codes.left.length; i < len; i++) { + keys[codes.left[i]] = [-1 * panDelta, 0]; + } + for (i = 0, len = codes.right.length; i < len; i++) { + keys[codes.right[i]] = [panDelta, 0]; + } + for (i = 0, len = codes.down.length; i < len; i++) { + keys[codes.down[i]] = [0, panDelta]; } + for (i = 0, len = codes.up.length; i < len; i++) { + keys[codes.up[i]] = [0, -1 * panDelta]; + } + }, - if (options.imperial && maxMeters) { - this._updateImperial(maxMeters); + _setZoomDelta: function (zoomDelta) { + var keys = this._zoomKeys = {}, + codes = this.keyCodes, + i, len; + + for (i = 0, len = codes.zoomIn.length; i < len; i++) { + keys[codes.zoomIn[i]] = zoomDelta; + } + for (i = 0, len = codes.zoomOut.length; i < len; i++) { + keys[codes.zoomOut[i]] = -zoomDelta; } }, - _updateMetric: function (maxMeters) { - var meters = this._getRoundNum(maxMeters); + _addHooks: function () { + L.DomEvent.on(document, 'keydown', this._onKeyDown, this); + }, - this._mScale.style.width = this._getScaleWidth(meters / maxMeters) + 'px'; - this._mScale.innerHTML = meters < 1000 ? meters + ' m' : (meters / 1000) + ' km'; + _removeHooks: function () { + L.DomEvent.off(document, 'keydown', this._onKeyDown, this); }, - _updateImperial: function (maxMeters) { - var maxFeet = maxMeters * 3.2808399, - scale = this._iScale, - maxMiles, miles, feet; + _onKeyDown: function (e) { + if (e.altKey || e.ctrlKey || e.metaKey) { return; } - if (maxFeet > 5280) { - maxMiles = maxFeet / 5280; - miles = this._getRoundNum(maxMiles); + var key = e.keyCode, + map = this._map, + offset; - scale.style.width = this._getScaleWidth(miles / maxMiles) + 'px'; - scale.innerHTML = miles + ' mi'; + if (key in this._panKeys) { - } else { - feet = this._getRoundNum(maxFeet); + if (map._panAnim && map._panAnim._inProgress) { return; } - scale.style.width = this._getScaleWidth(feet / maxFeet) + 'px'; - scale.innerHTML = feet + ' ft'; - } - }, + offset = this._panKeys[key]; + if (e.shiftKey) { + offset = L.point(offset).multiplyBy(3); + } - _getScaleWidth: function (ratio) { - return Math.round(this.options.maxWidth * ratio) - 10; - }, + map.panBy(offset); - _getRoundNum: function (num) { - var pow10 = Math.pow(10, (Math.floor(num) + '').length - 1), - d = num / pow10; + if (map.options.maxBounds) { + map.panInsideBounds(map.options.maxBounds); + } - d = d >= 10 ? 10 : d >= 5 ? 5 : d >= 3 ? 3 : d >= 2 ? 2 : 1; + } else if (key in this._zoomKeys) { + map.setZoom(map.getZoom() + (e.shiftKey ? 3 : 1) * this._zoomKeys[key]); - return pow10 * d; + } else if (key === 27) { + map.closePopup(); + + } else { + return; + } + + L.DomEvent.stop(e); } }); -L.control.scale = function (options) { - return new L.Control.Scale(options); -}; +// @section Handlers +// @section Handlers +// @property keyboard: Handler +// Keyboard navigation handler. +L.Map.addInitHook('addHandler', 'keyboard', L.Map.Keyboard); + + + +/* + * L.Handler.MarkerDrag is used internally by L.Marker to make the markers draggable. + */ -/* - * L.Control.Layers is a control to allow users to switch between different layers on the map. +/* @namespace Marker + * @section Interaction handlers + * + * Interaction handlers are properties of a marker instance that allow you to control interaction behavior in runtime, enabling or disabling certain features such as dragging (see `Handler` methods). Example: + * + * ```js + * marker.dragging.disable(); + * ``` + * + * @property dragging: Handler + * Marker dragging handler (by both mouse and touch). */ -L.Control.Layers = L.Control.extend({ - options: { - collapsed: true, - position: 'topright', - autoZIndex: true +L.Handler.MarkerDrag = L.Handler.extend({ + initialize: function (marker) { + this._marker = marker; }, - initialize: function (baseLayers, overlays, options) { - L.setOptions(this, options); - - this._layers = {}; - this._lastZIndex = 0; - this._handlingClick = false; + addHooks: function () { + var icon = this._marker._icon; - for (var i in baseLayers) { - this._addLayer(baseLayers[i], i); + if (!this._draggable) { + this._draggable = new L.Draggable(icon, icon, true); } - for (i in overlays) { - this._addLayer(overlays[i], i, true); - } - }, + this._draggable.on({ + dragstart: this._onDragStart, + drag: this._onDrag, + dragend: this._onDragEnd + }, this).enable(); - onAdd: function (map) { - this._initLayout(); - this._update(); + L.DomUtil.addClass(icon, 'leaflet-marker-draggable'); + }, - map - .on('layeradd', this._onLayerChange, this) - .on('layerremove', this._onLayerChange, this); + removeHooks: function () { + this._draggable.off({ + dragstart: this._onDragStart, + drag: this._onDrag, + dragend: this._onDragEnd + }, this).disable(); - return this._container; + if (this._marker._icon) { + L.DomUtil.removeClass(this._marker._icon, 'leaflet-marker-draggable'); + } }, - onRemove: function (map) { - map - .off('layeradd', this._onLayerChange, this) - .off('layerremove', this._onLayerChange, this); + moved: function () { + return this._draggable && this._draggable._moved; }, - addBaseLayer: function (layer, name) { - this._addLayer(layer, name); - this._update(); - return this; - }, + _onDragStart: function () { + // @section Dragging events + // @event dragstart: Event + // Fired when the user starts dragging the marker. - addOverlay: function (layer, name) { - this._addLayer(layer, name, true); - this._update(); - return this; - }, + // @event movestart: Event + // Fired when the marker starts moving (because of dragging). - removeLayer: function (layer) { - var id = L.stamp(layer); - delete this._layers[id]; - this._update(); - return this; + this._oldLatLng = this._marker.getLatLng(); + this._marker + .closePopup() + .fire('movestart') + .fire('dragstart'); }, - _initLayout: function () { - var className = 'leaflet-control-layers', - container = this._container = L.DomUtil.create('div', className); - - //Makes this work on IE10 Touch devices by stopping it from firing a mouseout event when the touch is released - container.setAttribute('aria-haspopup', true); + _onDrag: function (e) { + var marker = this._marker, + shadow = marker._shadow, + iconPos = L.DomUtil.getPosition(marker._icon), + latlng = marker._map.layerPointToLatLng(iconPos); - if (!L.Browser.touch) { - L.DomEvent - .disableClickPropagation(container) - .disableScrollPropagation(container); - } else { - L.DomEvent.on(container, 'click', L.DomEvent.stopPropagation); + // update shadow position + if (shadow) { + L.DomUtil.setPosition(shadow, iconPos); } - var form = this._form = L.DomUtil.create('form', className + '-list'); + marker._latlng = latlng; + e.latlng = latlng; + e.oldLatLng = this._oldLatLng; - if (this.options.collapsed) { - if (!L.Browser.android) { - L.DomEvent - .on(container, 'mouseover', this._expand, this) - .on(container, 'mouseout', this._collapse, this); - } - var link = this._layersLink = L.DomUtil.create('a', className + '-toggle', container); - link.href = '#'; - link.title = 'Layers'; + // @event drag: Event + // Fired repeatedly while the user drags the marker. + marker + .fire('move', e) + .fire('drag', e); + }, - if (L.Browser.touch) { - L.DomEvent - .on(link, 'click', L.DomEvent.stop) - .on(link, 'click', this._expand, this); - } - else { - L.DomEvent.on(link, 'focus', this._expand, this); - } - //Work around for Firefox android issue https://github.com/Leaflet/Leaflet/issues/2033 - L.DomEvent.on(form, 'click', function () { - setTimeout(L.bind(this._onInputClick, this), 0); - }, this); + _onDragEnd: function (e) { + // @event dragend: DragEndEvent + // Fired when the user stops dragging the marker. - this._map.on('click', this._collapse, this); - // TODO keyboard accessibility - } else { - this._expand(); - } + // @event moveend: Event + // Fired when the marker stops moving (because of dragging). + delete this._oldLatLng; + this._marker + .fire('moveend') + .fire('dragend', e); + } +}); - this._baseLayersList = L.DomUtil.create('div', className + '-base', form); - this._separator = L.DomUtil.create('div', className + '-separator', form); - this._overlaysList = L.DomUtil.create('div', className + '-overlays', form); - container.appendChild(form); - }, - _addLayer: function (layer, name, overlay) { - var id = L.stamp(layer); +/* + * @class Control + * @aka L.Control + * @inherits Class + * + * L.Control is a base class for implementing map controls. Handles positioning. + * All other controls extend from this class. + */ - this._layers[id] = { - layer: layer, - name: name, - overlay: overlay - }; +L.Control = L.Class.extend({ + // @section + // @aka Control options + options: { + // @option position: String = 'topright' + // The position of the control (one of the map corners). Possible values are `'topleft'`, + // `'topright'`, `'bottomleft'` or `'bottomright'` + position: 'topright' + }, - if (this.options.autoZIndex && layer.setZIndex) { - this._lastZIndex++; - layer.setZIndex(this._lastZIndex); - } + initialize: function (options) { + L.setOptions(this, options); }, - _update: function () { - if (!this._container) { - return; - } + /* @section + * Classes extending L.Control will inherit the following methods: + * + * @method getPosition: string + * Returns the position of the control. + */ + getPosition: function () { + return this.options.position; + }, - this._baseLayersList.innerHTML = ''; - this._overlaysList.innerHTML = ''; + // @method setPosition(position: string): this + // Sets the position of the control. + setPosition: function (position) { + var map = this._map; - var baseLayersPresent = false, - overlaysPresent = false, - i, obj; + if (map) { + map.removeControl(this); + } - for (i in this._layers) { - obj = this._layers[i]; - this._addItem(obj); - overlaysPresent = overlaysPresent || obj.overlay; - baseLayersPresent = baseLayersPresent || !obj.overlay; + this.options.position = position; + + if (map) { + map.addControl(this); } - this._separator.style.display = overlaysPresent && baseLayersPresent ? '' : 'none'; + return this; }, - _onLayerChange: function (e) { - var obj = this._layers[L.stamp(e.layer)]; + // @method getContainer: HTMLElement + // Returns the HTMLElement that contains the control. + getContainer: function () { + return this._container; + }, - if (!obj) { return; } + // @method addTo(map: Map): this + // Adds the control to the given map. + addTo: function (map) { + this.remove(); + this._map = map; - if (!this._handlingClick) { - this._update(); - } + var container = this._container = this.onAdd(map), + pos = this.getPosition(), + corner = map._controlCorners[pos]; - var type = obj.overlay ? - (e.type === 'layeradd' ? 'overlayadd' : 'overlayremove') : - (e.type === 'layeradd' ? 'baselayerchange' : null); + L.DomUtil.addClass(container, 'leaflet-control'); - if (type) { - this._map.fire(type, obj); + if (pos.indexOf('bottom') !== -1) { + corner.insertBefore(container, corner.firstChild); + } else { + corner.appendChild(container); } - }, - // IE7 bugs out if you create a radio dynamically, so you have to do it this hacky way (see http://bit.ly/PqYLBe) - _createRadioElement: function (name, checked) { + return this; + }, - var radioHtml = ' 0 && e.screenY > 0) { + this._map.getContainer().focus(); + } + } +}); - label.appendChild(input); - label.appendChild(name); +L.control = function (options) { + return new L.Control(options); +}; - var container = obj.overlay ? this._overlaysList : this._baseLayersList; - container.appendChild(label); +/* @section Extension methods + * @uninheritable + * + * Every control should extend from `L.Control` and (re-)implement the following methods. + * + * @method onAdd(map: Map): HTMLElement + * Should return the container DOM element for the control and add listeners on relevant map events. Called on [`control.addTo(map)`](#control-addTo). + * + * @method onRemove(map: Map) + * Optional method. Should contain all clean up code that removes the listeners previously added in [`onAdd`](#control-onadd). Called on [`control.remove()`](#control-remove). + */ - return label; +/* @namespace Map + * @section Methods for Layers and Controls + */ +L.Map.include({ + // @method addControl(control: Control): this + // Adds the given control to the map + addControl: function (control) { + control.addTo(this); + return this; }, - _onInputClick: function () { - var i, input, obj, - inputs = this._form.getElementsByTagName('input'), - inputsLen = inputs.length; - - this._handlingClick = true; + // @method removeControl(control: Control): this + // Removes the given control from the map + removeControl: function (control) { + control.remove(); + return this; + }, - for (i = 0; i < inputsLen; i++) { - input = inputs[i]; - obj = this._layers[input.layerId]; + _initControlPos: function () { + var corners = this._controlCorners = {}, + l = 'leaflet-', + container = this._controlContainer = + L.DomUtil.create('div', l + 'control-container', this._container); - if (input.checked && !this._map.hasLayer(obj.layer)) { - this._map.addLayer(obj.layer); + function createCorner(vSide, hSide) { + var className = l + vSide + ' ' + l + hSide; - } else if (!input.checked && this._map.hasLayer(obj.layer)) { - this._map.removeLayer(obj.layer); - } + corners[vSide + hSide] = L.DomUtil.create('div', className, container); } - this._handlingClick = false; - - this._refocusOnMap(); - }, - - _expand: function () { - L.DomUtil.addClass(this._container, 'leaflet-control-layers-expanded'); + createCorner('top', 'left'); + createCorner('top', 'right'); + createCorner('bottom', 'left'); + createCorner('bottom', 'right'); }, - _collapse: function () { - this._container.className = this._container.className.replace(' leaflet-control-layers-expanded', ''); + _clearControlPos: function () { + L.DomUtil.remove(this._controlContainer); } }); -L.control.layers = function (baseLayers, overlays, options) { - return new L.Control.Layers(baseLayers, overlays, options); -}; /* - * L.PosAnimation is used by Leaflet internally for pan animations. + * @class Control.Zoom + * @aka L.Control.Zoom + * @inherits Control + * + * A basic zoom control with two buttons (zoom in and zoom out). It is put on the map by default unless you set its [`zoomControl` option](#map-zoomcontrol) to `false`. Extends `Control`. */ -L.PosAnimation = L.Class.extend({ - includes: L.Mixin.Events, +L.Control.Zoom = L.Control.extend({ + // @section + // @aka Control.Zoom options + options: { + position: 'topleft', + + // @option zoomInText: String = '+' + // The text set on the 'zoom in' button. + zoomInText: '+', - run: function (el, newPos, duration, easeLinearity) { // (HTMLElement, Point[, Number, Number]) - this.stop(); + // @option zoomInTitle: String = 'Zoom in' + // The title set on the 'zoom in' button. + zoomInTitle: 'Zoom in', - this._el = el; - this._inProgress = true; - this._newPos = newPos; + // @option zoomOutText: String = '-' + // The text set on the 'zoom out' button. + zoomOutText: '-', - this.fire('start'); + // @option zoomOutTitle: String = 'Zoom out' + // The title set on the 'zoom out' button. + zoomOutTitle: 'Zoom out' + }, - el.style[L.DomUtil.TRANSITION] = 'all ' + (duration || 0.25) + - 's cubic-bezier(0,0,' + (easeLinearity || 0.5) + ',1)'; + onAdd: function (map) { + var zoomName = 'leaflet-control-zoom', + container = L.DomUtil.create('div', zoomName + ' leaflet-bar'), + options = this.options; - L.DomEvent.on(el, L.DomUtil.TRANSITION_END, this._onTransitionEnd, this); - L.DomUtil.setPosition(el, newPos); + this._zoomInButton = this._createButton(options.zoomInText, options.zoomInTitle, + zoomName + '-in', container, this._zoomIn); + this._zoomOutButton = this._createButton(options.zoomOutText, options.zoomOutTitle, + zoomName + '-out', container, this._zoomOut); - // toggle reflow, Chrome flickers for some reason if you don't do this - L.Util.falseFn(el.offsetWidth); + this._updateDisabled(); + map.on('zoomend zoomlevelschange', this._updateDisabled, this); - // there's no native way to track value updates of transitioned properties, so we imitate this - this._stepTimer = setInterval(L.bind(this._onStep, this), 50); + return container; }, - stop: function () { - if (!this._inProgress) { return; } + onRemove: function (map) { + map.off('zoomend zoomlevelschange', this._updateDisabled, this); + }, - // if we just removed the transition property, the element would jump to its final position, - // so we need to make it stay at the current position + disable: function () { + this._disabled = true; + this._updateDisabled(); + return this; + }, - L.DomUtil.setPosition(this._el, this._getPos()); - this._onTransitionEnd(); - L.Util.falseFn(this._el.offsetWidth); // force reflow in case we are about to start a new animation + enable: function () { + this._disabled = false; + this._updateDisabled(); + return this; }, - _onStep: function () { - var stepPos = this._getPos(); - if (!stepPos) { - this._onTransitionEnd(); - return; + _zoomIn: function (e) { + if (!this._disabled && this._map._zoom < this._map.getMaxZoom()) { + this._map.zoomIn(this._map.options.zoomDelta * (e.shiftKey ? 3 : 1)); } - // jshint camelcase: false - // make L.DomUtil.getPosition return intermediate position value during animation - this._el._leaflet_pos = stepPos; - - this.fire('step'); }, - // you can't easily get intermediate values of properties animated with CSS3 Transitions, - // we need to parse computed style (in case of transform it returns matrix string) + _zoomOut: function (e) { + if (!this._disabled && this._map._zoom > this._map.getMinZoom()) { + this._map.zoomOut(this._map.options.zoomDelta * (e.shiftKey ? 3 : 1)); + } + }, - _transformRe: /([-+]?(?:\d*\.)?\d+)\D*, ([-+]?(?:\d*\.)?\d+)\D*\)/, + _createButton: function (html, title, className, container, fn) { + var link = L.DomUtil.create('a', className, container); + link.innerHTML = html; + link.href = '#'; + link.title = title; - _getPos: function () { - var left, top, matches, - el = this._el, - style = window.getComputedStyle(el); + /* + * Will force screen readers like VoiceOver to read this as "Zoom in - button" + */ + link.setAttribute('role', 'button'); + link.setAttribute('aria-label', title); - if (L.Browser.any3d) { - matches = style[L.DomUtil.TRANSFORM].match(this._transformRe); - if (!matches) { return; } - left = parseFloat(matches[1]); - top = parseFloat(matches[2]); - } else { - left = parseFloat(style.left); - top = parseFloat(style.top); - } + L.DomEvent + .on(link, 'mousedown dblclick', L.DomEvent.stopPropagation) + .on(link, 'click', L.DomEvent.stop) + .on(link, 'click', fn, this) + .on(link, 'click', this._refocusOnMap, this); - return new L.Point(left, top, true); + return link; }, - _onTransitionEnd: function () { - L.DomEvent.off(this._el, L.DomUtil.TRANSITION_END, this._onTransitionEnd, this); - - if (!this._inProgress) { return; } - this._inProgress = false; + _updateDisabled: function () { + var map = this._map, + className = 'leaflet-disabled'; - this._el.style[L.DomUtil.TRANSITION] = ''; + L.DomUtil.removeClass(this._zoomInButton, className); + L.DomUtil.removeClass(this._zoomOutButton, className); - // jshint camelcase: false - // make sure L.DomUtil.getPosition returns the final position value after animation - this._el._leaflet_pos = this._newPos; + if (this._disabled || map._zoom === map.getMinZoom()) { + L.DomUtil.addClass(this._zoomOutButton, className); + } + if (this._disabled || map._zoom === map.getMaxZoom()) { + L.DomUtil.addClass(this._zoomInButton, className); + } + } +}); - clearInterval(this._stepTimer); +// @namespace Map +// @section Control options +// @option zoomControl: Boolean = true +// Whether a [zoom control](#control-zoom) is added to the map by default. +L.Map.mergeOptions({ + zoomControl: true +}); - this.fire('step').fire('end'); +L.Map.addInitHook(function () { + if (this.options.zoomControl) { + this.zoomControl = new L.Control.Zoom(); + this.addControl(this.zoomControl); } - }); +// @namespace Control.Zoom +// @factory L.control.zoom(options: Control.Zoom options) +// Creates a zoom control +L.control.zoom = function (options) { + return new L.Control.Zoom(options); +}; -/* - * Extends L.Map to handle panning animations. - */ -L.Map.include({ - setView: function (center, zoom, options) { +/* + * @class Control.Attribution + * @aka L.Control.Attribution + * @inherits Control + * + * The attribution control allows you to display attribution data in a small text box on a map. It is put on the map by default unless you set its [`attributionControl` option](#map-attributioncontrol) to `false`, and it fetches attribution texts from layers with the [`getAttribution` method](#layer-getattribution) automatically. Extends Control. + */ - zoom = zoom === undefined ? this._zoom : this._limitZoom(zoom); - center = this._limitCenter(L.latLng(center), zoom, this.options.maxBounds); - options = options || {}; +L.Control.Attribution = L.Control.extend({ + // @section + // @aka Control.Attribution options + options: { + position: 'bottomright', - if (this._panAnim) { - this._panAnim.stop(); - } + // @option prefix: String = 'Leaflet' + // The HTML text shown before the attributions. Pass `false` to disable. + prefix: 'Leaflet' + }, - if (this._loaded && !options.reset && options !== true) { + initialize: function (options) { + L.setOptions(this, options); - if (options.animate !== undefined) { - options.zoom = L.extend({animate: options.animate}, options.zoom); - options.pan = L.extend({animate: options.animate}, options.pan); - } + this._attributions = {}; + }, - // try animating pan or zoom - var animated = (this._zoom !== zoom) ? - this._tryAnimatedZoom && this._tryAnimatedZoom(center, zoom, options.zoom) : - this._tryAnimatedPan(center, options.pan); + onAdd: function (map) { + map.attributionControl = this; + this._container = L.DomUtil.create('div', 'leaflet-control-attribution'); + if (L.DomEvent) { + L.DomEvent.disableClickPropagation(this._container); + } - if (animated) { - // prevent resize handler call, the view will refresh after animation anyway - clearTimeout(this._sizeTimer); - return this; + // TODO ugly, refactor + for (var i in map._layers) { + if (map._layers[i].getAttribution) { + this.addAttribution(map._layers[i].getAttribution()); } } - // animation didn't start, just reset the map view - this._resetView(center, zoom); + this._update(); + + return this._container; + }, + // @method setPrefix(prefix: String): this + // Sets the text before the attributions. + setPrefix: function (prefix) { + this.options.prefix = prefix; + this._update(); return this; }, - panBy: function (offset, options) { - offset = L.point(offset).round(); - options = options || {}; + // @method addAttribution(text: String): this + // Adds an attribution text (e.g. `'Vector data © Mapbox'`). + addAttribution: function (text) { + if (!text) { return this; } - if (!offset.x && !offset.y) { - return this; + if (!this._attributions[text]) { + this._attributions[text] = 0; } + this._attributions[text]++; - if (!this._panAnim) { - this._panAnim = new L.PosAnimation(); - - this._panAnim.on({ - 'step': this._onPanTransitionStep, - 'end': this._onPanTransitionEnd - }, this); - } + this._update(); - // don't fire movestart if animating inertia - if (!options.noMoveStart) { - this.fire('movestart'); - } + return this; + }, - // animate pan unless animate: false specified - if (options.animate !== false) { - L.DomUtil.addClass(this._mapPane, 'leaflet-pan-anim'); + // @method removeAttribution(text: String): this + // Removes an attribution text. + removeAttribution: function (text) { + if (!text) { return this; } - var newPos = this._getMapPanePos().subtract(offset); - this._panAnim.run(this._mapPane, newPos, options.duration || 0.25, options.easeLinearity); - } else { - this._rawPanBy(offset); - this.fire('move').fire('moveend'); + if (this._attributions[text]) { + this._attributions[text]--; + this._update(); } return this; }, - _onPanTransitionStep: function () { - this.fire('move'); - }, + _update: function () { + if (!this._map) { return; } - _onPanTransitionEnd: function () { - L.DomUtil.removeClass(this._mapPane, 'leaflet-pan-anim'); - this.fire('moveend'); - }, + var attribs = []; - _tryAnimatedPan: function (center, options) { - // difference between the new and current centers in pixels - var offset = this._getCenterOffset(center)._floor(); + for (var i in this._attributions) { + if (this._attributions[i]) { + attribs.push(i); + } + } - // don't animate too far unless animate: true specified in options - if ((options && options.animate) !== true && !this.getSize().contains(offset)) { return false; } + var prefixAndAttribs = []; - this.panBy(offset, options); + if (this.options.prefix) { + prefixAndAttribs.push(this.options.prefix); + } + if (attribs.length) { + prefixAndAttribs.push(attribs.join(', ')); + } - return true; + this._container.innerHTML = prefixAndAttribs.join(' | '); + } +}); + +// @namespace Map +// @section Control options +// @option attributionControl: Boolean = true +// Whether a [attribution control](#control-attribution) is added to the map by default. +L.Map.mergeOptions({ + attributionControl: true +}); + +L.Map.addInitHook(function () { + if (this.options.attributionControl) { + new L.Control.Attribution().addTo(this); } }); +// @namespace Control.Attribution +// @factory L.control.attribution(options: Control.Attribution options) +// Creates an attribution control. +L.control.attribution = function (options) { + return new L.Control.Attribution(options); +}; + + /* - * L.PosAnimation fallback implementation that powers Leaflet pan animations - * in browsers that don't support CSS3 Transitions. + * @class Control.Scale + * @aka L.Control.Scale + * @inherits Control + * + * A simple scale control that shows the scale of the current center of screen in metric (m/km) and imperial (mi/ft) systems. Extends `Control`. + * + * @example + * + * ```js + * L.control.scale().addTo(map); + * ``` */ -L.PosAnimation = L.DomUtil.TRANSITION ? L.PosAnimation : L.PosAnimation.extend({ +L.Control.Scale = L.Control.extend({ + // @section + // @aka Control.Scale options + options: { + position: 'bottomleft', - run: function (el, newPos, duration, easeLinearity) { // (HTMLElement, Point[, Number, Number]) - this.stop(); + // @option maxWidth: Number = 100 + // Maximum width of the control in pixels. The width is set dynamically to show round values (e.g. 100, 200, 500). + maxWidth: 100, - this._el = el; - this._inProgress = true; - this._duration = duration || 0.25; - this._easeOutPower = 1 / Math.max(easeLinearity || 0.5, 0.2); + // @option metric: Boolean = True + // Whether to show the metric scale line (m/km). + metric: true, - this._startPos = L.DomUtil.getPosition(el); - this._offset = newPos.subtract(this._startPos); - this._startTime = +new Date(); + // @option imperial: Boolean = True + // Whether to show the imperial scale line (mi/ft). + imperial: true - this.fire('start'); + // @option updateWhenIdle: Boolean = false + // If `true`, the control is updated on [`moveend`](#map-moveend), otherwise it's always up-to-date (updated on [`move`](#map-move)). + }, - this._animate(); + onAdd: function (map) { + var className = 'leaflet-control-scale', + container = L.DomUtil.create('div', className), + options = this.options; + + this._addScales(options, className + '-line', container); + + map.on(options.updateWhenIdle ? 'moveend' : 'move', this._update, this); + map.whenReady(this._update, this); + + return container; }, - stop: function () { - if (!this._inProgress) { return; } + onRemove: function (map) { + map.off(this.options.updateWhenIdle ? 'moveend' : 'move', this._update, this); + }, - this._step(); - this._complete(); + _addScales: function (options, className, container) { + if (options.metric) { + this._mScale = L.DomUtil.create('div', className, container); + } + if (options.imperial) { + this._iScale = L.DomUtil.create('div', className, container); + } }, - _animate: function () { - // animation loop - this._animId = L.Util.requestAnimFrame(this._animate, this); - this._step(); + _update: function () { + var map = this._map, + y = map.getSize().y / 2; + + var maxMeters = map.distance( + map.containerPointToLatLng([0, y]), + map.containerPointToLatLng([this.options.maxWidth, y])); + + this._updateScales(maxMeters); }, - _step: function () { - var elapsed = (+new Date()) - this._startTime, - duration = this._duration * 1000; + _updateScales: function (maxMeters) { + if (this.options.metric && maxMeters) { + this._updateMetric(maxMeters); + } + if (this.options.imperial && maxMeters) { + this._updateImperial(maxMeters); + } + }, + + _updateMetric: function (maxMeters) { + var meters = this._getRoundNum(maxMeters), + label = meters < 1000 ? meters + ' m' : (meters / 1000) + ' km'; + + this._updateScale(this._mScale, label, meters / maxMeters); + }, + + _updateImperial: function (maxMeters) { + var maxFeet = maxMeters * 3.2808399, + maxMiles, miles, feet; + + if (maxFeet > 5280) { + maxMiles = maxFeet / 5280; + miles = this._getRoundNum(maxMiles); + this._updateScale(this._iScale, miles + ' mi', miles / maxMiles); - if (elapsed < duration) { - this._runFrame(this._easeOut(elapsed / duration)); } else { - this._runFrame(1); - this._complete(); + feet = this._getRoundNum(maxFeet); + this._updateScale(this._iScale, feet + ' ft', feet / maxFeet); } }, - _runFrame: function (progress) { - var pos = this._startPos.add(this._offset.multiplyBy(progress)); - L.DomUtil.setPosition(this._el, pos); - - this.fire('step'); + _updateScale: function (scale, text, ratio) { + scale.style.width = Math.round(this.options.maxWidth * ratio) + 'px'; + scale.innerHTML = text; }, - _complete: function () { - L.Util.cancelAnimFrame(this._animId); + _getRoundNum: function (num) { + var pow10 = Math.pow(10, (Math.floor(num) + '').length - 1), + d = num / pow10; - this._inProgress = false; - this.fire('end'); - }, + d = d >= 10 ? 10 : + d >= 5 ? 5 : + d >= 3 ? 3 : + d >= 2 ? 2 : 1; - _easeOut: function (t) { - return 1 - Math.pow(1 - t, this._easeOutPower); + return pow10 * d; } }); +// @factory L.control.scale(options?: Control.Scale options) +// Creates an scale control with the given options. +L.control.scale = function (options) { + return new L.Control.Scale(options); +}; + + + /* - * Extends L.Map to handle zoom animations. + * @class Control.Layers + * @aka L.Control.Layers + * @inherits Control + * + * The layers control gives users the ability to switch between different base layers and switch overlays on/off (check out the [detailed example](http://leafletjs.com/examples/layers-control.html)). Extends `Control`. + * + * @example + * + * ```js + * var baseLayers = { + * "Mapbox": mapbox, + * "OpenStreetMap": osm + * }; + * + * var overlays = { + * "Marker": marker, + * "Roads": roadsLayer + * }; + * + * L.control.layers(baseLayers, overlays).addTo(map); + * ``` + * + * The `baseLayers` and `overlays` parameters are object literals with layer names as keys and `Layer` objects as values: + * + * ```js + * { + * "": layer1, + * "": layer2 + * } + * ``` + * + * The layer names can contain HTML, which allows you to add additional styling to the items: + * + * ```js + * {" My Layer": myLayer} + * ``` */ -L.Map.mergeOptions({ - zoomAnimation: true, - zoomAnimationThreshold: 4 -}); -if (L.DomUtil.TRANSITION) { +L.Control.Layers = L.Control.extend({ + // @section + // @aka Control.Layers options + options: { + // @option collapsed: Boolean = true + // If `true`, the control will be collapsed into an icon and expanded on mouse hover or touch. + collapsed: true, + position: 'topright', - L.Map.addInitHook(function () { - // don't animate on browsers without hardware-accelerated transitions or old Android/Opera - this._zoomAnimated = this.options.zoomAnimation && L.DomUtil.TRANSITION && - L.Browser.any3d && !L.Browser.android23 && !L.Browser.mobileOpera; + // @option autoZIndex: Boolean = true + // If `true`, the control will assign zIndexes in increasing order to all of its layers so that the order is preserved when switching them on/off. + autoZIndex: true, - // zoom transitions run with the same duration for all layers, so if one of transitionend events - // happens after starting zoom animation (propagating to the map pane), we know that it ended globally - if (this._zoomAnimated) { - L.DomEvent.on(this._mapPane, L.DomUtil.TRANSITION_END, this._catchTransitionEnd, this); - } - }); -} + // @option hideSingleBase: Boolean = false + // If `true`, the base layers in the control will be hidden when there is only one. + hideSingleBase: false, -L.Map.include(!L.DomUtil.TRANSITION ? {} : { + // @option sortLayers: Boolean = false + // Whether to sort the layers. When `false`, layers will keep the order + // in which they were added to the control. + sortLayers: false, - _catchTransitionEnd: function (e) { - if (this._animatingZoom && e.propertyName.indexOf('transform') >= 0) { - this._onZoomTransitionEnd(); + // @option sortFunction: Function = * + // A [compare function](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) + // that will be used for sorting the layers, when `sortLayers` is `true`. + // The function receives both the `L.Layer` instances and their names, as in + // `sortFunction(layerA, layerB, nameA, nameB)`. + // By default, it sorts layers alphabetically by their name. + sortFunction: function (layerA, layerB, nameA, nameB) { + return nameA < nameB ? -1 : (nameB < nameA ? 1 : 0); } }, - _nothingToAnimate: function () { - return !this._container.getElementsByClassName('leaflet-zoom-animated').length; - }, - - _tryAnimatedZoom: function (center, zoom, options) { + initialize: function (baseLayers, overlays, options) { + L.setOptions(this, options); - if (this._animatingZoom) { return true; } + this._layers = []; + this._lastZIndex = 0; + this._handlingClick = false; - options = options || {}; + for (var i in baseLayers) { + this._addLayer(baseLayers[i], i); + } - // don't animate if disabled, not supported or zoom difference is too large - if (!this._zoomAnimated || options.animate === false || this._nothingToAnimate() || - Math.abs(zoom - this._zoom) > this.options.zoomAnimationThreshold) { return false; } + for (i in overlays) { + this._addLayer(overlays[i], i, true); + } + }, - // offset is the pixel coords of the zoom origin relative to the current center - var scale = this.getZoomScale(zoom), - offset = this._getCenterOffset(center)._divideBy(1 - 1 / scale), - origin = this._getCenterLayerPoint()._add(offset); + onAdd: function (map) { + this._initLayout(); + this._update(); - // don't animate if the zoom origin isn't within one screen from the current center, unless forced - if (options.animate !== true && !this.getSize().contains(offset)) { return false; } + this._map = map; + map.on('zoomend', this._checkDisabledLayers, this); - this - .fire('movestart') - .fire('zoomstart'); + return this._container; + }, - this._animateZoom(center, zoom, origin, scale, null, true); + onRemove: function () { + this._map.off('zoomend', this._checkDisabledLayers, this); - return true; + for (var i = 0; i < this._layers.length; i++) { + this._layers[i].layer.off('add remove', this._onLayerChange, this); + } }, - _animateZoom: function (center, zoom, origin, scale, delta, backwards, forTouchZoom) { + // @method addBaseLayer(layer: Layer, name: String): this + // Adds a base layer (radio button entry) with the given name to the control. + addBaseLayer: function (layer, name) { + this._addLayer(layer, name); + return (this._map) ? this._update() : this; + }, - if (!forTouchZoom) { - this._animatingZoom = true; - } + // @method addOverlay(layer: Layer, name: String): this + // Adds an overlay (checkbox entry) with the given name to the control. + addOverlay: function (layer, name) { + this._addLayer(layer, name, true); + return (this._map) ? this._update() : this; + }, - // put transform transition on all layers with leaflet-zoom-animated class - L.DomUtil.addClass(this._mapPane, 'leaflet-zoom-anim'); + // @method removeLayer(layer: Layer): this + // Remove the given layer from the control. + removeLayer: function (layer) { + layer.off('add remove', this._onLayerChange, this); - // remember what center/zoom to set after animation - this._animateToCenter = center; - this._animateToZoom = zoom; + var obj = this._getLayer(L.stamp(layer)); + if (obj) { + this._layers.splice(this._layers.indexOf(obj), 1); + } + return (this._map) ? this._update() : this; + }, - // disable any dragging during animation - if (L.Draggable) { - L.Draggable._disabled = true; + // @method expand(): this + // Expand the control container if collapsed. + expand: function () { + L.DomUtil.addClass(this._container, 'leaflet-control-layers-expanded'); + this._form.style.height = null; + var acceptableHeight = this._map.getSize().y - (this._container.offsetTop + 50); + if (acceptableHeight < this._form.clientHeight) { + L.DomUtil.addClass(this._form, 'leaflet-control-layers-scrollbar'); + this._form.style.height = acceptableHeight + 'px'; + } else { + L.DomUtil.removeClass(this._form, 'leaflet-control-layers-scrollbar'); } + this._checkDisabledLayers(); + return this; + }, - L.Util.requestAnimFrame(function () { - this.fire('zoomanim', { - center: center, - zoom: zoom, - origin: origin, - scale: scale, - delta: delta, - backwards: backwards - }); - }, this); + // @method collapse(): this + // Collapse the control container if expanded. + collapse: function () { + L.DomUtil.removeClass(this._container, 'leaflet-control-layers-expanded'); + return this; }, - _onZoomTransitionEnd: function () { + _initLayout: function () { + var className = 'leaflet-control-layers', + container = this._container = L.DomUtil.create('div', className), + collapsed = this.options.collapsed; - this._animatingZoom = false; + // makes this work on IE touch devices by stopping it from firing a mouseout event when the touch is released + container.setAttribute('aria-haspopup', true); - L.DomUtil.removeClass(this._mapPane, 'leaflet-zoom-anim'); + L.DomEvent.disableClickPropagation(container); + if (!L.Browser.touch) { + L.DomEvent.disableScrollPropagation(container); + } + + var form = this._form = L.DomUtil.create('form', className + '-list'); - this._resetView(this._animateToCenter, this._animateToZoom, true, true); + if (collapsed) { + this._map.on('click', this.collapse, this); - if (L.Draggable) { - L.Draggable._disabled = false; + if (!L.Browser.android) { + L.DomEvent.on(container, { + mouseenter: this.expand, + mouseleave: this.collapse + }, this); + } } - } -}); + var link = this._layersLink = L.DomUtil.create('a', className + '-toggle', container); + link.href = '#'; + link.title = 'Layers'; -/* - Zoom animation logic for L.TileLayer. -*/ + if (L.Browser.touch) { + L.DomEvent + .on(link, 'click', L.DomEvent.stop) + .on(link, 'click', this.expand, this); + } else { + L.DomEvent.on(link, 'focus', this.expand, this); + } -L.TileLayer.include({ - _animateZoom: function (e) { - if (!this._animating) { - this._animating = true; - this._prepareBgBuffer(); + // work around for Firefox Android issue https://github.com/Leaflet/Leaflet/issues/2033 + L.DomEvent.on(form, 'click', function () { + setTimeout(L.bind(this._onInputClick, this), 0); + }, this); + + // TODO keyboard accessibility + + if (!collapsed) { + this.expand(); } - var bg = this._bgBuffer, - transform = L.DomUtil.TRANSFORM, - initialTransform = e.delta ? L.DomUtil.getTranslateString(e.delta) : bg.style[transform], - scaleStr = L.DomUtil.getScaleString(e.scale, e.origin); + this._baseLayersList = L.DomUtil.create('div', className + '-base', form); + this._separator = L.DomUtil.create('div', className + '-separator', form); + this._overlaysList = L.DomUtil.create('div', className + '-overlays', form); - bg.style[transform] = e.backwards ? - scaleStr + ' ' + initialTransform : - initialTransform + ' ' + scaleStr; + container.appendChild(form); }, - _endZoomAnim: function () { - var front = this._tileContainer, - bg = this._bgBuffer; + _getLayer: function (id) { + for (var i = 0; i < this._layers.length; i++) { - front.style.visibility = ''; - front.parentNode.appendChild(front); // Bring to fore + if (this._layers[i] && L.stamp(this._layers[i].layer) === id) { + return this._layers[i]; + } + } + }, - // force reflow - L.Util.falseFn(bg.offsetWidth); + _addLayer: function (layer, name, overlay) { + layer.on('add remove', this._onLayerChange, this); - this._animating = false; - }, + this._layers.push({ + layer: layer, + name: name, + overlay: overlay + }); - _clearBgBuffer: function () { - var map = this._map; + if (this.options.sortLayers) { + this._layers.sort(L.bind(function (a, b) { + return this.options.sortFunction(a.layer, b.layer, a.name, b.name); + }, this)); + } - if (map && !map._animatingZoom && !map.touchZoom._zooming) { - this._bgBuffer.innerHTML = ''; - this._bgBuffer.style[L.DomUtil.TRANSFORM] = ''; + if (this.options.autoZIndex && layer.setZIndex) { + this._lastZIndex++; + layer.setZIndex(this._lastZIndex); } }, - _prepareBgBuffer: function () { - - var front = this._tileContainer, - bg = this._bgBuffer; + _update: function () { + if (!this._container) { return this; } - // if foreground layer doesn't have many tiles but bg layer does, - // keep the existing bg layer and just zoom it some more + L.DomUtil.empty(this._baseLayersList); + L.DomUtil.empty(this._overlaysList); - var bgLoaded = this._getLoadedTilesPercentage(bg), - frontLoaded = this._getLoadedTilesPercentage(front); + var baseLayersPresent, overlaysPresent, i, obj, baseLayersCount = 0; - if (bg && bgLoaded > 0.5 && frontLoaded < 0.5) { + for (i = 0; i < this._layers.length; i++) { + obj = this._layers[i]; + this._addItem(obj); + overlaysPresent = overlaysPresent || obj.overlay; + baseLayersPresent = baseLayersPresent || !obj.overlay; + baseLayersCount += !obj.overlay ? 1 : 0; + } - front.style.visibility = 'hidden'; - this._stopLoadingImages(front); - return; + // Hide base layers section if there's only one layer. + if (this.options.hideSingleBase) { + baseLayersPresent = baseLayersPresent && baseLayersCount > 1; + this._baseLayersList.style.display = baseLayersPresent ? '' : 'none'; } - // prepare the buffer to become the front tile pane - bg.style.visibility = 'hidden'; - bg.style[L.DomUtil.TRANSFORM] = ''; + this._separator.style.display = overlaysPresent && baseLayersPresent ? '' : 'none'; - // switch out the current layer to be the new bg layer (and vice-versa) - this._tileContainer = bg; - bg = this._bgBuffer = front; + return this; + }, - this._stopLoadingImages(bg); + _onLayerChange: function (e) { + if (!this._handlingClick) { + this._update(); + } - //prevent bg buffer from clearing right after zoom - clearTimeout(this._clearBgBufferTimer); - }, + var obj = this._getLayer(L.stamp(e.target)); - _getLoadedTilesPercentage: function (container) { - var tiles = container.getElementsByTagName('img'), - i, len, count = 0; + // @namespace Map + // @section Layer events + // @event baselayerchange: LayersControlEvent + // Fired when the base layer is changed through the [layer control](#control-layers). + // @event overlayadd: LayersControlEvent + // Fired when an overlay is selected through the [layer control](#control-layers). + // @event overlayremove: LayersControlEvent + // Fired when an overlay is deselected through the [layer control](#control-layers). + // @namespace Control.Layers + var type = obj.overlay ? + (e.type === 'add' ? 'overlayadd' : 'overlayremove') : + (e.type === 'add' ? 'baselayerchange' : null); - for (i = 0, len = tiles.length; i < len; i++) { - if (tiles[i].complete) { - count++; - } + if (type) { + this._map.fire(type, obj); } - return count / len; }, - // stops loading all tiles in the background layer - _stopLoadingImages: function (container) { - var tiles = Array.prototype.slice.call(container.getElementsByTagName('img')), - i, len, tile; + // IE7 bugs out if you create a radio dynamically, so you have to do it this hacky way (see http://bit.ly/PqYLBe) + _createRadioElement: function (name, checked) { - for (i = 0, len = tiles.length; i < len; i++) { - tile = tiles[i]; + var radioHtml = ''; - if (!tile.complete) { - tile.onload = L.Util.falseFn; - tile.onerror = L.Util.falseFn; - tile.src = L.Util.emptyImageUrl; + var radioFragment = document.createElement('div'); + radioFragment.innerHTML = radioHtml; - tile.parentNode.removeChild(tile); - } + return radioFragment.firstChild; + }, + + _addItem: function (obj) { + var label = document.createElement('label'), + checked = this._map.hasLayer(obj.layer), + input; + + if (obj.overlay) { + input = document.createElement('input'); + input.type = 'checkbox'; + input.className = 'leaflet-control-layers-selector'; + input.defaultChecked = checked; + } else { + input = this._createRadioElement('leaflet-base-layers', checked); } - } -}); + input.layerId = L.stamp(obj.layer); -/* - * Provides L.Map with convenient shortcuts for using browser geolocation features. - */ + L.DomEvent.on(input, 'click', this._onInputClick, this); -L.Map.include({ - _defaultLocateOptions: { - watch: false, - setView: false, - maxZoom: Infinity, - timeout: 10000, - maximumAge: 0, - enableHighAccuracy: false + var name = document.createElement('span'); + name.innerHTML = ' ' + obj.name; + + // Helps from preventing layer control flicker when checkboxes are disabled + // https://github.com/Leaflet/Leaflet/issues/2771 + var holder = document.createElement('div'); + + label.appendChild(holder); + holder.appendChild(input); + holder.appendChild(name); + + var container = obj.overlay ? this._overlaysList : this._baseLayersList; + container.appendChild(label); + + this._checkDisabledLayers(); + return label; }, - locate: function (/*Object*/ options) { + _onInputClick: function () { + var inputs = this._form.getElementsByTagName('input'), + input, layer, hasLayer; + var addedLayers = [], + removedLayers = []; - options = this._locateOptions = L.extend(this._defaultLocateOptions, options); + this._handlingClick = true; - if (!navigator.geolocation) { - this._handleGeolocationError({ - code: 0, - message: 'Geolocation not supported.' - }); - return this; - } + for (var i = inputs.length - 1; i >= 0; i--) { + input = inputs[i]; + layer = this._getLayer(input.layerId).layer; + hasLayer = this._map.hasLayer(layer); - var onResponse = L.bind(this._handleGeolocationResponse, this), - onError = L.bind(this._handleGeolocationError, this); + if (input.checked && !hasLayer) { + addedLayers.push(layer); - if (options.watch) { - this._locationWatchId = - navigator.geolocation.watchPosition(onResponse, onError, options); - } else { - navigator.geolocation.getCurrentPosition(onResponse, onError, options); + } else if (!input.checked && hasLayer) { + removedLayers.push(layer); + } } - return this; - }, - stopLocate: function () { - if (navigator.geolocation) { - navigator.geolocation.clearWatch(this._locationWatchId); + // Bugfix issue 2318: Should remove all old layers before readding new ones + for (i = 0; i < removedLayers.length; i++) { + this._map.removeLayer(removedLayers[i]); } - if (this._locateOptions) { - this._locateOptions.setView = false; + for (i = 0; i < addedLayers.length; i++) { + this._map.addLayer(addedLayers[i]); } - return this; - }, - - _handleGeolocationError: function (error) { - var c = error.code, - message = error.message || - (c === 1 ? 'permission denied' : - (c === 2 ? 'position unavailable' : 'timeout')); - if (this._locateOptions.setView && !this._loaded) { - this.fitWorld(); - } + this._handlingClick = false; - this.fire('locationerror', { - code: c, - message: 'Geolocation error: ' + message + '.' - }); + this._refocusOnMap(); }, - _handleGeolocationResponse: function (pos) { - var lat = pos.coords.latitude, - lng = pos.coords.longitude, - latlng = new L.LatLng(lat, lng), - - latAccuracy = 180 * pos.coords.accuracy / 40075017, - lngAccuracy = latAccuracy / Math.cos(L.LatLng.DEG_TO_RAD * lat), - - bounds = L.latLngBounds( - [lat - latAccuracy, lng - lngAccuracy], - [lat + latAccuracy, lng + lngAccuracy]), + _checkDisabledLayers: function () { + var inputs = this._form.getElementsByTagName('input'), + input, + layer, + zoom = this._map.getZoom(); - options = this._locateOptions; + for (var i = inputs.length - 1; i >= 0; i--) { + input = inputs[i]; + layer = this._getLayer(input.layerId).layer; + input.disabled = (layer.options.minZoom !== undefined && zoom < layer.options.minZoom) || + (layer.options.maxZoom !== undefined && zoom > layer.options.maxZoom); - if (options.setView) { - var zoom = Math.min(this.getBoundsZoom(bounds), options.maxZoom); - this.setView(latlng, zoom); } + }, - var data = { - latlng: latlng, - bounds: bounds, - timestamp: pos.timestamp - }; - - for (var i in pos.coords) { - if (typeof pos.coords[i] === 'number') { - data[i] = pos.coords[i]; - } - } + _expand: function () { + // Backward compatibility, remove me in 1.1. + return this.expand(); + }, - this.fire('locationfound', data); + _collapse: function () { + // Backward compatibility, remove me in 1.1. + return this.collapse(); } + }); -}(window, document)); \ No newline at end of file +// @factory L.control.layers(baselayers?: Object, overlays?: Object, options?: Control.Layers options) +// Creates an attribution control with the given layers. Base layers will be switched with radio buttons, while overlays will be switched with checkboxes. Note that all base layers should be passed in the base layers object, but only one should be added to the map during map instantiation. +L.control.layers = function (baseLayers, overlays, options) { + return new L.Control.Layers(baseLayers, overlays, options); +}; + + + +}(window, document)); +//# sourceMappingURL=leaflet-src.map \ No newline at end of file diff --git a/vendor/assets/leaflet/leaflet.locate.js b/vendor/assets/leaflet/leaflet.locate.js index 822b24da2..f1e6d39e1 100644 --- a/vendor/assets/leaflet/leaflet.locate.js +++ b/vendor/assets/leaflet/leaflet.locate.js @@ -1,340 +1,572 @@ -/* -Copyright (c) 2014 Dominik Moritz +/*! +Copyright (c) 2016 Dominik Moritz This file is part of the leaflet locate control. It is licensed under the MIT license. You can find the project at: https://github.com/domoritz/leaflet-locatecontrol */ -L.Control.Locate = L.Control.extend({ - options: { - position: 'topleft', - drawCircle: true, - follow: false, // follow with zoom and pan the user's location - stopFollowingOnDrag: false, // if follow is true, stop following when map is dragged (deprecated) - // range circle - circleStyle: { - color: '#136AEC', - fillColor: '#136AEC', - fillOpacity: 0.15, - weight: 2, - opacity: 0.5 - }, - // inner marker - markerStyle: { - color: '#136AEC', - fillColor: '#2A93EE', - fillOpacity: 0.7, - weight: 2, - opacity: 0.9, - radius: 5 - }, - // changes to range circle and inner marker while following - // it is only necessary to provide the things that should change - followCircleStyle: {}, - followMarkerStyle: { - //color: '#FFA500', - //fillColor: '#FFB000' - }, - icon: 'icon-location', // icon-location or icon-direction - iconLoading: 'icon-spinner animate-spin', - circlePadding: [0, 0], - metric: true, - onLocationError: function(err) { - // this event is called in case of any location error - // that is not a time out error. - alert(err.message); - }, - onLocationOutsideMapBounds: function(control) { - // this event is repeatedly called when the location changes - control.stopLocate(); - alert(context.options.strings.outsideMapBoundsMsg); +(function (factory, window) { + // see https://github.com/Leaflet/Leaflet/blob/master/PLUGIN-GUIDE.md#module-loaders + // for details on how to structure a leaflet plugin. + + // define an AMD module that relies on 'leaflet' + if (typeof define === 'function' && define.amd) { + define(['leaflet'], factory); + + // define a Common JS module that relies on 'leaflet' + } else if (typeof exports === 'object') { + if (typeof window !== 'undefined' && window.L) { + module.exports = factory(L); + } else { + module.exports = factory(require('leaflet')); + } + } + + // attach your plugin to the global 'L' variable + if(typeof window !== 'undefined' && window.L){ + window.L.Control.Locate = factory(L); + } +} (function (L) { + var LocateControl = L.Control.extend({ + options: { + /** Position of the control */ + position: 'topleft', + /** The layer that the user's location should be drawn on. By default creates a new layer. */ + layer: undefined, + /** + * Automatically sets the map view (zoom and pan) to the user's location as it updates. + * While the map is following the user's location, the control is in the `following` state, + * which changes the style of the control and the circle marker. + * + * Possible values: + * - false: never updates the map view when location changes. + * - 'once': set the view when the location is first determined + * - 'always': always updates the map view when location changes. + * The map view follows the users location. + * - 'untilPan': (default) like 'always', except stops updating the + * view if the user has manually panned the map. + * The map view follows the users location until she pans. + */ + setView: 'untilPan', + /** Keep the current map zoom level when setting the view and only pan. */ + keepCurrentZoomLevel: false, + /** Smooth pan and zoom to the location of the marker. Only works in Leaflet 1.0+. */ + flyTo: false, + /** + * The user location can be inside and outside the current view when the user clicks on the + * control that is already active. Both cases can be configures separately. + * Possible values are: + * - 'setView': zoom and pan to the current location + * - 'stop': stop locating and remove the location marker + */ + clickBehavior: { + /** What should happen if the user clicks on the control while the location is within the current view. */ + inView: 'stop', + /** What should happen if the user clicks on the control while the location is outside the current view. */ + outOfView: 'setView', + }, + /** + * If set, save the map bounds just before centering to the user's + * location. When control is disabled, set the view back to the + * bounds that were saved. + */ + returnToPrevBounds: false, + /** If set, a circle that shows the location accuracy is drawn. */ + drawCircle: true, + /** If set, the marker at the users' location is drawn. */ + drawMarker: true, + /** The class to be used to create the marker. For example L.CircleMarker or L.Marker */ + markerClass: L.CircleMarker, + /** Accuracy circle style properties. */ + circleStyle: { + color: '#136AEC', + fillColor: '#136AEC', + fillOpacity: 0.15, + weight: 2, + opacity: 0.5 + }, + /** Inner marker style properties. */ + markerStyle: { + color: '#136AEC', + fillColor: '#2A93EE', + fillOpacity: 0.7, + weight: 2, + opacity: 0.9, + radius: 5 + }, + /** + * Changes to accuracy circle and inner marker while following. + * It is only necessary to provide the properties that should change. + */ + followCircleStyle: {}, + followMarkerStyle: { + // color: '#FFA500', + // fillColor: '#FFB000' + }, + /** The CSS class for the icon. For example fa-location-arrow or fa-map-marker */ + icon: 'fa fa-map-marker', + iconLoading: 'fa fa-spinner fa-spin', + /** The element to be created for icons. For example span or i */ + iconElementTag: 'span', + /** Padding around the accuracy circle. */ + circlePadding: [0, 0], + /** Use metric units. */ + metric: true, + /** This event is called in case of any location error that is not a time out error. */ + onLocationError: function(err, control) { + alert(err.message); + }, + /** + * This even is called when the user's location is outside the bounds set on the map. + * The event is called repeatedly when the location changes. + */ + onLocationOutsideMapBounds: function(control) { + control.stop(); + alert(control.options.strings.outsideMapBoundsMsg); + }, + /** Display a pop-up when the user click on the inner marker. */ + showPopup: true, + strings: { + title: "Show me where I am", + metersUnit: "meters", + feetUnit: "feet", + popup: "You are within {distance} {unit} from this point", + outsideMapBoundsMsg: "You seem located outside the boundaries of the map" + }, + /** The default options passed to leaflets locate method. */ + locateOptions: { + maxZoom: Infinity, + watch: true, // if you overwrite this, visualization cannot be updated + setView: false // have to set this to false because we have to + // do setView manually + } }, - setView: true, // automatically sets the map view to the user's location - // keep the current map zoom level when displaying the user's location. (if 'false', use maxZoom) - keepCurrentZoomLevel: false, - strings: { - title: "Show me where I am", - popup: "You are within {distance} {unit} from this point", - outsideMapBoundsMsg: "You seem located outside the boundaries of the map" + + initialize: function (options) { + // set default options if nothing is set (merge one step deep) + for (var i in options) { + if (typeof this.options[i] === 'object') { + L.extend(this.options[i], options[i]); + } else { + this.options[i] = options[i]; + } + } + + // extend the follow marker style and circle from the normal style + this.options.followMarkerStyle = L.extend({}, this.options.markerStyle, this.options.followMarkerStyle); + this.options.followCircleStyle = L.extend({}, this.options.circleStyle, this.options.followCircleStyle); }, - locateOptions: { - maxZoom: Infinity, - watch: true // if you overwrite this, visualization cannot be updated - } - }, - onAdd: function (map) { - var container = L.DomUtil.create('div', 'control-locate'); + /** + * Add control to map. Returns the container for the control. + */ + onAdd: function (map) { + var container = L.DomUtil.create('div', + 'leaflet-control-locate leaflet-bar leaflet-control'); - var self = this; - this._layer = new L.LayerGroup(); - this._layer.addTo(map); - this._event = undefined; + this._layer = this.options.layer || new L.LayerGroup(); + this._layer.addTo(map); + this._event = undefined; - this._locateOptions = this.options.locateOptions; - L.extend(this._locateOptions, this.options.locateOptions); - L.extend(this._locateOptions, { - setView: false // have to set this to false because we have to - // do setView manually - }); + this._link = L.DomUtil.create('a', 'leaflet-bar-part leaflet-bar-part-single', container); + this._link.href = '#'; + this._link.title = this.options.strings.title; + this._icon = L.DomUtil.create(this.options.iconElementTag, this.options.icon, this._link); - // extend the follow marker style and circle from the normal style - var tmp = {}; - L.extend(tmp, this.options.markerStyle, this.options.followMarkerStyle); - this.options.followMarkerStyle = tmp; - tmp = {}; - L.extend(tmp, this.options.circleStyle, this.options.followCircleStyle); - this.options.followCircleStyle = tmp; - - var link = L.DomUtil.create('a', 'control-button ' + this.options.icon, container); - link.innerHTML = ""; - link.href = '#'; - link.title = this.options.strings.title; - - L.DomEvent - .on(link, 'click', L.DomEvent.stopPropagation) - .on(link, 'click', L.DomEvent.preventDefault) - .on(link, 'click', function() { - if (self._active && (self._event === undefined || map.getBounds().contains(self._event.latlng) || !self.options.setView || - isOutsideMapBounds())) { - stopLocate(); - } else { - locate(); - } - }) - .on(link, 'dblclick', L.DomEvent.stopPropagation); + L.DomEvent + .on(this._link, 'click', L.DomEvent.stopPropagation) + .on(this._link, 'click', L.DomEvent.preventDefault) + .on(this._link, 'click', this._onClick, this) + .on(this._link, 'dblclick', L.DomEvent.stopPropagation); - var locate = function () { - if (self.options.setView) { - self._locateOnNextLocationFound = true; - } - if(!self._active) { - map.locate(self._locateOptions); - } - self._active = true; - if (self.options.follow) { - startFollowing(); - } - if (!self._event) { - setClasses('requesting'); + this._resetVariables(); + + this._map.on('unload', this._unload, this); + + return container; + }, + + /** + * This method is called when the user clicks on the control. + */ + _onClick: function() { + this._justClicked = true; + this._userPanned = false; + this._prevBounds = null; + + if (this._active && !this._event) { + // click while requesting + this.stop(); + } else if (this._active && this._event !== undefined) { + var behavior = this._map.getBounds().contains(this._event.latlng) ? + this.options.clickBehavior.inView : this.options.clickBehavior.outOfView; + switch (behavior) { + case 'setView': + this.setView(); + break; + case 'stop': + this.stop(); + if (this.options.returnToPrevBounds) { + var f = this.options.flyTo ? this._map.flyToBounds : this._map.fitBounds; + f.bind(this._map)(this._prevBounds); + } + break; + } } else { - visualizeLocation(); + if (this.options.returnToPrevBounds) { + this._prevBounds = this._map.getBounds(); + } + this.start(); } - }; - var onLocationFound = function (e) { - // no need to do anything if the location has not changed - if (self._event && - (self._event.latlng.lat === e.latlng.lat && - self._event.latlng.lng === e.latlng.lng && - self._event.accuracy === e.accuracy)) { - return; - } + this._updateContainerStyle(); + }, - if (!self._active) { - return; - } + /** + * Starts the plugin: + * - activates the engine + * - draws the marker (if coordinates available) + */ + start: function() { + this._activate(); - self._event = e; + if (this._event) { + this._drawMarker(this._map); - if (self.options.follow && self._following) { - self._locateOnNextLocationFound = true; + // if we already have a location but the user clicked on the control + if (this.options.setView) { + this.setView(); + } } + this._updateContainerStyle(); + }, - visualizeLocation(); - }; + /** + * Stops the plugin: + * - deactivates the engine + * - reinitializes the button + * - removes the marker + */ + stop: function() { + this._deactivate(); - var startFollowing = function() { - map.fire('startfollowing', self); - self._following = true; - if (self.options.stopFollowingOnDrag) { - map.on('dragstart', stopFollowing); - } - }; + this._cleanClasses(); + this._resetVariables(); + + this._removeMarker(); + }, - var stopFollowing = function() { - map.fire('stopfollowing', self); - self._following = false; - if (self.options.stopFollowingOnDrag) { - map.off('dragstart', stopFollowing); + /** + * This method launches the location engine. + * It is called before the marker is updated, + * event if it does not mean that the event will be ready. + * + * Override it if you want to add more functionalities. + * It should set the this._active to true and do nothing if + * this._active is true. + */ + _activate: function() { + if (!this._active) { + this._map.locate(this.options.locateOptions); + this._active = true; + + // bind event listeners + this._map.on('locationfound', this._onLocationFound, this); + this._map.on('locationerror', this._onLocationError, this); + this._map.on('dragstart', this._onDrag, this); } - visualizeLocation(); - }; + }, - var isOutsideMapBounds = function () { - if (self._event === undefined) - return false; - return map.options.maxBounds && - !map.options.maxBounds.contains(self._event.latlng); - }; - - var visualizeLocation = function() { - if (self._event.accuracy === undefined) - self._event.accuracy = 0; - - var radius = self._event.accuracy; - if (self._locateOnNextLocationFound) { - if (isOutsideMapBounds()) { - self.options.onLocationOutsideMapBounds(self); + /** + * Called to stop the location engine. + * + * Override it to shutdown any functionalities you added on start. + */ + _deactivate: function() { + this._map.stopLocate(); + this._active = false; + + // unbind event listeners + this._map.off('locationfound', this._onLocationFound, this); + this._map.off('locationerror', this._onLocationError, this); + this._map.off('dragstart', this._onDrag, this); + }, + + /** + * Zoom (unless we should keep the zoom level) and an to the current view. + */ + setView: function() { + this._drawMarker(); + if (this._isOutsideMapBounds()) { + this.options.onLocationOutsideMapBounds(this); + } else { + if (this.options.keepCurrentZoomLevel) { + var f = this.options.flyTo ? this._map.flyTo : this._map.panTo; + f.bind(this._map)([this._event.latitude, this._event.longitude]); } else { - map.fitBounds(self._event.bounds, { - padding: self.options.circlePadding, - maxZoom: self.options.keepCurrentZoomLevel ? map.getZoom() : self._locateOptions.maxZoom + var f = this.options.flyTo ? this._map.flyToBounds : this._map.fitBounds; + f.bind(this._map)(this._event.bounds, { + padding: this.options.circlePadding, + maxZoom: this.options.locateOptions.maxZoom }); } - self._locateOnNextLocationFound = false; } + }, + + /** + * Draw the marker and accuracy circle on the map. + * + * Uses the event retrieved from onLocationFound from the map. + */ + _drawMarker: function() { + if (this._event.accuracy === undefined) { + this._event.accuracy = 0; + } + + var radius = this._event.accuracy; + var latlng = this._event.latlng; // circle with the radius of the location's accuracy - var style, o; - if (self.options.drawCircle) { - if (self._following) { - style = self.options.followCircleStyle; - } else { - style = self.options.circleStyle; - } + if (this.options.drawCircle) { + var style = this._isFollowing() ? this.options.followCircleStyle : this.options.circleStyle; - if (!self._circle) { - self._circle = L.circle(self._event.latlng, radius, style) - .addTo(self._layer); + if (!this._circle) { + this._circle = L.circle(latlng, radius, style).addTo(this._layer); } else { - self._circle.setLatLng(self._event.latlng).setRadius(radius); - for (o in style) { - self._circle.options[o] = style[o]; - } + this._circle.setLatLng(latlng).setRadius(radius).setStyle(style); } } var distance, unit; - if (self.options.metric) { + if (this.options.metric) { distance = radius.toFixed(0); - unit = "meters"; + unit = this.options.strings.metersUnit; } else { distance = (radius * 3.2808399).toFixed(0); - unit = "feet"; + unit = this.options.strings.feetUnit; } // small inner marker - var mStyle; - if (self._following) { - mStyle = self.options.followMarkerStyle; - } else { - mStyle = self.options.markerStyle; + if (this.options.drawMarker) { + var mStyle = this._isFollowing() ? this.options.followMarkerStyle : this.options.markerStyle; + + if (!this._marker) { + this._marker = new this.options.markerClass(latlng, mStyle).addTo(this._layer); + } else { + this._marker.setLatLng(latlng).setStyle(mStyle); + } } - var t = self.options.strings.popup; - if (!self._circleMarker) { - self._circleMarker = L.circleMarker(self._event.latlng, mStyle) + var t = this.options.strings.popup; + if (this.options.showPopup && t && this._marker) { + this._marker .bindPopup(L.Util.template(t, {distance: distance, unit: unit})) - .addTo(self._layer); - } else { - self._circleMarker.setLatLng(self._event.latlng) - .bindPopup(L.Util.template(t, {distance: distance, unit: unit})) - ._popup.setLatLng(self._event.latlng); - for (o in mStyle) { - self._circleMarker.options[o] = mStyle[o]; - } + ._popup.setLatLng(latlng); } + }, + + /** + * Remove the marker from map. + */ + _removeMarker: function() { + this._layer.clearLayers(); + this._marker = undefined; + this._circle = undefined; + }, + + /** + * Unload the plugin and all event listeners. + * Kind of the opposite of onAdd. + */ + _unload: function() { + this.stop(); + this._map.off('unload', this._unload, this); + }, - if (!self._container) + /** + * Calls deactivate and dispatches an error. + */ + _onLocationError: function(err) { + // ignore time out error if the location is watched + if (err.code == 3 && this.options.locateOptions.watch) { return; - if (self._following) { - setClasses('following'); - } else { - setClasses('active'); } - }; - var setClasses = function(state) { - if (state == 'requesting') { - L.DomUtil.removeClasses(self._container, "active following"); - L.DomUtil.addClasses(self._container, "requesting"); + this.stop(); + this.options.onLocationError(err, this); + }, - L.DomUtil.removeClasses(link, self.options.icon); - L.DomUtil.addClasses(link, self.options.iconLoading); - } else if (state == 'active') { - L.DomUtil.removeClasses(self._container, "requesting following"); - L.DomUtil.addClasses(self._container, "active"); + /** + * Stores the received event and updates the marker. + */ + _onLocationFound: function(e) { + // no need to do anything if the location has not changed + if (this._event && + (this._event.latlng.lat === e.latlng.lat && + this._event.latlng.lng === e.latlng.lng && + this._event.accuracy === e.accuracy)) { + return; + } - L.DomUtil.removeClasses(link, self.options.iconLoading); - L.DomUtil.addClasses(link, self.options.icon); - } else if (state == 'following') { - L.DomUtil.removeClasses(self._container, "requesting"); - L.DomUtil.addClasses(self._container, "active following"); + if (!this._active) { + // we may have a stray event + return; + } + + this._event = e; + + this._drawMarker(); + this._updateContainerStyle(); - L.DomUtil.removeClasses(link, self.options.iconLoading); - L.DomUtil.addClasses(link, self.options.icon); + switch (this.options.setView) { + case 'once': + if (this._justClicked) { + this.setView(); + } + break; + case 'untilPan': + if (!this._userPanned) { + this.setView(); + } + break; + case 'always': + this.setView(); + break; + case false: + // don't set the view + break; } - } - var resetVariables = function() { - self._active = false; - self._locateOnNextLocationFound = self.options.setView; - self._following = false; - }; + this._justClicked = false; + }, - resetVariables(); + /** + * When the user drags. Need a separate even so we can bind and unbind even listeners. + */ + _onDrag: function() { + // only react to drags once we have a location + if (this._event) { + this._userPanned = true; + this._updateContainerStyle(); + this._drawMarker(); + } + }, - var stopLocate = function() { - map.stopLocate(); - map.off('dragstart', stopFollowing); - if (self.options.follow && self._following) { - stopFollowing(); + /** + * Compute whether the map is following the user location with pan and zoom. + */ + _isFollowing: function() { + if (!this._active) { + return false; } - L.DomUtil.removeClass(self._container, "requesting"); - L.DomUtil.removeClass(self._container, "active"); - L.DomUtil.removeClass(self._container, "following"); - resetVariables(); + if (this.options.setView === 'always') { + return true; + } else if (this.options.setView === 'untilPan') { + return !this._userPanned; + } + }, - self._layer.clearLayers(); - self._circleMarker = undefined; - self._circle = undefined; - }; + /** + * Check if location is in map bounds + */ + _isOutsideMapBounds: function() { + if (this._event === undefined) { + return false; + } + return this._map.options.maxBounds && + !this._map.options.maxBounds.contains(this._event.latlng); + }, - var onLocationError = function (err) { - // ignore time out error if the location is watched - if (err.code == 3 && self._locateOptions.watch) { + /** + * Toggles button class between following and active. + */ + _updateContainerStyle: function() { + if (!this._container) { return; } - stopLocate(); - self.options.onLocationError(err); - }; + if (this._active && !this._event) { + // active but don't have a location yet + this._setClasses('requesting'); + } else if (this._isFollowing()) { + this._setClasses('following'); + } else if (this._active) { + this._setClasses('active'); + } else { + this._cleanClasses(); + } + }, - // event hooks - map.on('locationfound', onLocationFound, self); - map.on('locationerror', onLocationError, self); + /** + * Sets the CSS classes for the state. + */ + _setClasses: function(state) { + if (state == 'requesting') { + L.DomUtil.removeClasses(this._container, "active following"); + L.DomUtil.addClasses(this._container, "requesting"); - // make locate functions available to outside world - this.locate = locate; - this.stopLocate = stopLocate; - this.stopFollowing = stopFollowing; + L.DomUtil.removeClasses(this._icon, this.options.icon); + L.DomUtil.addClasses(this._icon, this.options.iconLoading); + } else if (state == 'active') { + L.DomUtil.removeClasses(this._container, "requesting following"); + L.DomUtil.addClasses(this._container, "active"); - return container; - } -}); + L.DomUtil.removeClasses(this._icon, this.options.iconLoading); + L.DomUtil.addClasses(this._icon, this.options.icon); + } else if (state == 'following') { + L.DomUtil.removeClasses(this._container, "requesting"); + L.DomUtil.addClasses(this._container, "active following"); -L.Map.addInitHook(function () { - if (this.options.locateControl) { - this.locateControl = L.control.locate(); - this.addControl(this.locateControl); - } -}); - -L.control.locate = function (options) { - return new L.Control.Locate(options); -}; - -(function(){ - // leaflet.js raises bug when trying to addClass / removeClass multiple classes at once - // Let's create a wrapper on it which fixes it. - var LDomUtilApplyClassesMethod = function(method, element, classNames) { - classNames = classNames.split(' '); - classNames.forEach(function(className) { - L.DomUtil[method].call(this, element, className); + L.DomUtil.removeClasses(this._icon, this.options.iconLoading); + L.DomUtil.addClasses(this._icon, this.options.icon); + } + }, + + /** + * Removes all classes from button. + */ + _cleanClasses: function() { + L.DomUtil.removeClass(this._container, "requesting"); + L.DomUtil.removeClass(this._container, "active"); + L.DomUtil.removeClass(this._container, "following"); + + L.DomUtil.removeClasses(this._icon, this.options.iconLoading); + L.DomUtil.addClasses(this._icon, this.options.icon); + }, + + /** + * Reinitializes state variables. + */ + _resetVariables: function() { + // whether locate is active or not + this._active = false; + + // true if the control was clicked for the first time + // we need this so we can pan and zoom once we have the location + this._justClicked = false; + + // true if the user has panned the map after clicking the control + this._userPanned = false; + } }); - }; - L.DomUtil.addClasses = function(el, names) { LDomUtilApplyClassesMethod('addClass', el, names); } - L.DomUtil.removeClasses = function(el, names) { LDomUtilApplyClassesMethod('removeClass', el, names); } -})(); + L.control.locate = function (options) { + return new L.Control.Locate(options); + }; + + (function(){ + // leaflet.js raises bug when trying to addClass / removeClass multiple classes at once + // Let's create a wrapper on it which fixes it. + var LDomUtilApplyClassesMethod = function(method, element, classNames) { + classNames = classNames.split(' '); + classNames.forEach(function(className) { + L.DomUtil[method].call(this, element, className); + }); + }; + + L.DomUtil.addClasses = function(el, names) { LDomUtilApplyClassesMethod('addClass', el, names); }; + L.DomUtil.removeClasses = function(el, names) { LDomUtilApplyClassesMethod('removeClass', el, names); }; + })(); + + return LocateControl; +}, window)); diff --git a/vendor/assets/leaflet/leaflet.locationfilter.js b/vendor/assets/leaflet/leaflet.locationfilter.js index d120adc30..0a977ed41 100644 --- a/vendor/assets/leaflet/leaflet.locationfilter.js +++ b/vendor/assets/leaflet/leaflet.locationfilter.js @@ -90,7 +90,7 @@ L.Control.ButtonContainer = L.Control.extend({ } }); -L.LocationFilter = L.Class.extend({ +L.LocationFilter = L.Layer.extend({ includes: L.Mixin.Events, options: { diff --git a/vendor/assets/leaflet/leaflet.osm.js b/vendor/assets/leaflet/leaflet.osm.js index cbedd045a..2a0592af0 100644 --- a/vendor/assets/leaflet/leaflet.osm.js +++ b/vendor/assets/leaflet/leaflet.osm.js @@ -25,14 +25,18 @@ L.OSM.Mapnik = L.OSM.TileLayer.extend({ L.OSM.CycleMap = L.OSM.TileLayer.extend({ options: { - url: 'http://{s}.tile.thunderforest.com/cycle/{z}/{x}/{y}.png', + url: document.location.protocol === 'https:' ? + 'https://{s}.tile.thunderforest.com/cycle/{z}/{x}/{y}.png?apikey={apikey}' : + 'http://{s}.tile.thunderforest.com/cycle/{z}/{x}/{y}.png?apikey={apikey}', attribution: '© OpenStreetMap contributors. Tiles courtesy of Andy Allan' } }); L.OSM.TransportMap = L.OSM.TileLayer.extend({ options: { - url: 'http://{s}.tile.thunderforest.com/transport/{z}/{x}/{y}.png', + url: document.location.protocol === 'https:' ? + 'https://{s}.tile.thunderforest.com/transport/{z}/{x}/{y}.png?apikey={apikey}' : + 'http://{s}.tile.thunderforest.com/transport/{z}/{x}/{y}.png?apikey={apikey}', attribution: '© OpenStreetMap contributors. Tiles courtesy of Andy Allan' } }); @@ -51,13 +55,25 @@ L.OSM.MapQuestOpen = L.OSM.TileLayer.extend({ L.OSM.HOT = L.OSM.TileLayer.extend({ options: { - url: 'http://{s}.tile.openstreetmap.fr/hot/{z}/{x}/{y}.png', + url: document.location.protocol === 'https:' ? + 'https://tile-{s}.openstreetmap.fr/hot/{z}/{x}/{y}.png' : + 'http://tile-{s}.openstreetmap.fr/hot/{z}/{x}/{y}.png', maxZoom: 20, subdomains: 'abc', attribution: '© OpenStreetMap contributors. Tiles courtesy of Humanitarian OpenStreetMap Team' } }); +L.OSM.GPS = L.OSM.TileLayer.extend({ + options: { + url: document.location.protocol === 'https:' ? + 'https://gps-{s}.tile.openstreetmap.org/lines/{z}/{x}/{y}.png' : + 'http://gps-{s}.tile.openstreetmap.org/lines/{z}/{x}/{y}.png', + maxZoom: 20, + subdomains: 'abc' + } +}); + L.OSM.DataLayer = L.FeatureGroup.extend({ options: { areaTags: ['area', 'building', 'leisure', 'tourism', 'ruins', 'historic', 'landuse', 'military', 'natural', 'sport'], diff --git a/vendor/assets/leaflet/leaflet.polyline.js b/vendor/assets/leaflet/leaflet.polyline.js index 5f35ed0de..772e7ebc6 100644 --- a/vendor/assets/leaflet/leaflet.polyline.js +++ b/vendor/assets/leaflet/leaflet.polyline.js @@ -13,223 +13,221 @@ */ (function () { - 'use strict'; + 'use strict'; - var defaultOptions = function (options) { - if (typeof options === 'number') { - // Legacy - options = { precision: options }; - } else { - options = options || {}; - } + var defaultOptions = function (options) { + if (typeof options === 'number') { + // Legacy + options = { + precision: options + }; + } else { + options = options || {}; + } - options.precision = options.precision || 5; - options.factor = options.factor || Math.pow(10, options.precision); - options.dimension = options.dimension || 2; - return options; - }; + options.precision = options.precision || 5; + options.factor = options.factor || Math.pow(10, options.precision); + options.dimension = options.dimension || 2; + return options; + }; - var PolylineUtil = { - encode: function (points, options) { - options = defaultOptions(options); + var PolylineUtil = { + encode: function (points, options) { + options = defaultOptions(options); - var flatPoints = []; - for (var i = 0, len = points.length; i < len; ++i) { - var point = points[i]; + var flatPoints = []; + for (var i = 0, len = points.length; i < len; ++i) { + var point = points[i]; - if (options.dimension === 2) { - flatPoints.push(point.lat || point[0]); - flatPoints.push(point.lng || point[1]); - } else { - for (var dim = 0; dim < options.dimension; ++dim) { - flatPoints.push(point[dim]); - } - } - } + if (options.dimension === 2) { + flatPoints.push(point.lat || point[0]); + flatPoints.push(point.lng || point[1]); + } else { + for (var dim = 0; dim < options.dimension; ++dim) { + flatPoints.push(point[dim]); + } + } + } + + return this.encodeDeltas(flatPoints, options); + }, + + decode: function (encoded, options) { + options = defaultOptions(options); + + var flatPoints = this.decodeDeltas(encoded, options); + + var points = []; + for (var i = 0, len = flatPoints.length; i + (options.dimension - 1) < len;) { + var point = []; + + for (var dim = 0; dim < options.dimension; ++dim) { + point.push(flatPoints[i++]); + } - return this.encodeDeltas(flatPoints, options); - }, + points.push(point); + } - decode: function (encoded, options) { - options = defaultOptions(options); + return points; + }, + + encodeDeltas: function (numbers, options) { + options = defaultOptions(options); + + var lastNumbers = []; - var flatPoints = this.decodeDeltas(encoded, options); - - var points = []; - for (var i = 0, len = flatPoints.length; i + (options.dimension - 1) < len;) { - var point = []; - - for (var dim = 0; dim < options.dimension; ++dim) { - point.push(flatPoints[i++]); - } - - points.push(point); - } - - return points; - }, - - encodeDeltas: function(numbers, options) { - options = defaultOptions(options); - - var lastNumbers = []; - - for (var i = 0, len = numbers.length; i < len;) { - for (var d = 0; d < options.dimension; ++d, ++i) { - var num = numbers[i]; - var delta = num - (lastNumbers[d] || 0); - lastNumbers[d] = num; - - numbers[i] = delta; - } - } - - return this.encodeFloats(numbers, options); - }, - - decodeDeltas: function(encoded, options) { - options = defaultOptions(options); - - var lastNumbers = []; - - var numbers = this.decodeFloats(encoded, options); - for (var i = 0, len = numbers.length; i < len;) { - for (var d = 0; d < options.dimension; ++d, ++i) { - numbers[i] = lastNumbers[d] = numbers[i] + (lastNumbers[d] || 0); - } - } - - return numbers; - }, - - encodeFloats: function(numbers, options) { - options = defaultOptions(options); - - for (var i = 0, len = numbers.length; i < len; ++i) { - numbers[i] = Math.round(numbers[i] * options.factor); - } - - return this.encodeSignedIntegers(numbers); - }, - - decodeFloats: function(encoded, options) { - options = defaultOptions(options); - - var numbers = this.decodeSignedIntegers(encoded); - for (var i = 0, len = numbers.length; i < len; ++i) { - numbers[i] /= options.factor; - } - - return numbers; - }, - - /* jshint bitwise:false */ - - encodeSignedIntegers: function(numbers) { - for (var i = 0, len = numbers.length; i < len; ++i) { - var num = numbers[i]; - numbers[i] = (num < 0) ? ~(num << 1) : (num << 1); - } - - return this.encodeUnsignedIntegers(numbers); - }, - - decodeSignedIntegers: function(encoded) { - var numbers = this.decodeUnsignedIntegers(encoded); - - for (var i = 0, len = numbers.length; i < len; ++i) { - var num = numbers[i]; - numbers[i] = (num & 1) ? ~(num >> 1) : (num >> 1); - } - - return numbers; - }, - - encodeUnsignedIntegers: function(numbers) { - var encoded = ''; - for (var i = 0, len = numbers.length; i < len; ++i) { - encoded += this.encodeUnsignedInteger(numbers[i]); - } - return encoded; - }, - - decodeUnsignedIntegers: function(encoded) { - var numbers = []; - - var current = 0; - var shift = 0; - - for (var i = 0, len = encoded.length; i < len; ++i) { - var b = encoded.charCodeAt(i) - 63; - - current |= (b & 0x1f) << shift; - - if (b < 0x20) { - numbers.push(current); - current = 0; - shift = 0; - } else { - shift += 5; - } - } - - return numbers; - }, - - encodeSignedInteger: function (num) { - num = (num < 0) ? ~(num << 1) : (num << 1); - return this.encodeUnsignedInteger(num); - }, - - // This function is very similar to Google's, but I added - // some stuff to deal with the double slash issue. - encodeUnsignedInteger: function (num) { - var value, encoded = ''; - while (num >= 0x20) { - value = (0x20 | (num & 0x1f)) + 63; - encoded += (String.fromCharCode(value)); - num >>= 5; - } - value = num + 63; - encoded += (String.fromCharCode(value)); - - return encoded; - } - - /* jshint bitwise:true */ - }; - - // Export Node module - if (typeof module === 'object' && typeof module.exports === 'object') { - module.exports = PolylineUtil; - } - - // Inject functionality into Leaflet - if (typeof L === 'object') { - if (!(L.Polyline.prototype.fromEncoded)) { - L.Polyline.fromEncoded = function (encoded, options) { - return new L.Polyline(PolylineUtil.decode(encoded), options); - }; - } - if (!(L.Polygon.prototype.fromEncoded)) { - L.Polygon.fromEncoded = function (encoded, options) { - return new L.Polygon(PolylineUtil.decode(encoded), options); - }; - } - - var encodeMixin = { - encodePath: function () { - return PolylineUtil.encode(this.getLatLngs()); - } - }; - - if (!L.Polyline.prototype.encodePath) { - L.Polyline.include(encodeMixin); - } - if (!L.Polygon.prototype.encodePath) { - L.Polygon.include(encodeMixin); - } - - L.PolylineUtil = PolylineUtil; - } + for (var i = 0, len = numbers.length; i < len;) { + for (var d = 0; d < options.dimension; ++d, ++i) { + var num = numbers[i]; + var delta = num - (lastNumbers[d] || 0); + lastNumbers[d] = num; + + numbers[i] = delta; + } + } + + return this.encodeFloats(numbers, options); + }, + + decodeDeltas: function (encoded, options) { + options = defaultOptions(options); + + var lastNumbers = []; + + var numbers = this.decodeFloats(encoded, options); + for (var i = 0, len = numbers.length; i < len;) { + for (var d = 0; d < options.dimension; ++d, ++i) { + numbers[i] = Math.round((lastNumbers[d] = numbers[i] + (lastNumbers[d] || 0)) * options.factor) / options.factor; + } + } + + return numbers; + }, + + encodeFloats: function (numbers, options) { + options = defaultOptions(options); + + for (var i = 0, len = numbers.length; i < len; ++i) { + numbers[i] = Math.round(numbers[i] * options.factor); + } + + return this.encodeSignedIntegers(numbers); + }, + + decodeFloats: function (encoded, options) { + options = defaultOptions(options); + + var numbers = this.decodeSignedIntegers(encoded); + for (var i = 0, len = numbers.length; i < len; ++i) { + numbers[i] /= options.factor; + } + + return numbers; + }, + + encodeSignedIntegers: function (numbers) { + for (var i = 0, len = numbers.length; i < len; ++i) { + var num = numbers[i]; + numbers[i] = (num < 0) ? ~(num << 1) : (num << 1); + } + + return this.encodeUnsignedIntegers(numbers); + }, + + decodeSignedIntegers: function (encoded) { + var numbers = this.decodeUnsignedIntegers(encoded); + + for (var i = 0, len = numbers.length; i < len; ++i) { + var num = numbers[i]; + numbers[i] = (num & 1) ? ~(num >> 1) : (num >> 1); + } + + return numbers; + }, + + encodeUnsignedIntegers: function (numbers) { + var encoded = ''; + for (var i = 0, len = numbers.length; i < len; ++i) { + encoded += this.encodeUnsignedInteger(numbers[i]); + } + return encoded; + }, + + decodeUnsignedIntegers: function (encoded) { + var numbers = []; + + var current = 0; + var shift = 0; + + for (var i = 0, len = encoded.length; i < len; ++i) { + var b = encoded.charCodeAt(i) - 63; + + current |= (b & 0x1f) << shift; + + if (b < 0x20) { + numbers.push(current); + current = 0; + shift = 0; + } else { + shift += 5; + } + } + + return numbers; + }, + + encodeSignedInteger: function (num) { + num = (num < 0) ? ~(num << 1) : (num << 1); + return this.encodeUnsignedInteger(num); + }, + + // This function is very similar to Google's, but I added + // some stuff to deal with the double slash issue. + encodeUnsignedInteger: function (num) { + var value, encoded = ''; + while (num >= 0x20) { + value = (0x20 | (num & 0x1f)) + 63; + encoded += (String.fromCharCode(value)); + num >>= 5; + } + value = num + 63; + encoded += (String.fromCharCode(value)); + + return encoded; + } + }; + + // Export Node module + if (typeof module === 'object' && typeof module.exports === 'object') { + module.exports = PolylineUtil; + } + + // Inject functionality into Leaflet + if (typeof L === 'object') { + if (!(L.Polyline.prototype.fromEncoded)) { + L.Polyline.fromEncoded = function (encoded, options) { + return L.polyline(PolylineUtil.decode(encoded), options); + }; + } + if (!(L.Polygon.prototype.fromEncoded)) { + L.Polygon.fromEncoded = function (encoded, options) { + return L.polygon(PolylineUtil.decode(encoded), options); + }; + } + + var encodeMixin = { + encodePath: function () { + return PolylineUtil.encode(this.getLatLngs()); + } + }; + + if (!L.Polyline.prototype.encodePath) { + L.Polyline.include(encodeMixin); + } + if (!L.Polygon.prototype.encodePath) { + L.Polygon.include(encodeMixin); + } + + L.PolylineUtil = PolylineUtil; + } })(); diff --git a/vendor/assets/potlatch2/potlatch2.swf b/vendor/assets/potlatch2/potlatch2.swf index 8aa81911d..8330b5b02 100644 Binary files a/vendor/assets/potlatch2/potlatch2.swf and b/vendor/assets/potlatch2/potlatch2.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/assets.zip b/vendor/assets/potlatch2/potlatch2/assets.zip index c94def715..1d28f3319 100644 Binary files a/vendor/assets/potlatch2/potlatch2/assets.zip and b/vendor/assets/potlatch2/potlatch2/assets.zip differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/af.swf b/vendor/assets/potlatch2/potlatch2/locales/af.swf index 0efac14d1..1e681fd71 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/af.swf and b/vendor/assets/potlatch2/potlatch2/locales/af.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/ar.swf b/vendor/assets/potlatch2/potlatch2/locales/ar.swf index ae8d6b7bf..794a47c02 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/ar.swf and b/vendor/assets/potlatch2/potlatch2/locales/ar.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/arc.swf b/vendor/assets/potlatch2/potlatch2/locales/arc.swf index 298bce500..1962ca34c 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/arc.swf and b/vendor/assets/potlatch2/potlatch2/locales/arc.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/ast.swf b/vendor/assets/potlatch2/potlatch2/locales/ast.swf index 1826e1988..baad54eb0 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/ast.swf and b/vendor/assets/potlatch2/potlatch2/locales/ast.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/az.swf b/vendor/assets/potlatch2/potlatch2/locales/az.swf index 98643d62c..e3386de06 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/az.swf and b/vendor/assets/potlatch2/potlatch2/locales/az.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/ba.swf b/vendor/assets/potlatch2/potlatch2/locales/ba.swf index 45534a40d..3f289fdb7 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/ba.swf and b/vendor/assets/potlatch2/potlatch2/locales/ba.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/be-tarask.swf b/vendor/assets/potlatch2/potlatch2/locales/be-tarask.swf index 09a164e15..e0e6348bc 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/be-tarask.swf and b/vendor/assets/potlatch2/potlatch2/locales/be-tarask.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/be.swf b/vendor/assets/potlatch2/potlatch2/locales/be.swf index e62e483cf..f2efc2efe 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/be.swf and b/vendor/assets/potlatch2/potlatch2/locales/be.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/bg.swf b/vendor/assets/potlatch2/potlatch2/locales/bg.swf index bf1378db1..0f2efd32d 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/bg.swf and b/vendor/assets/potlatch2/potlatch2/locales/bg.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/bn.swf b/vendor/assets/potlatch2/potlatch2/locales/bn.swf index 7a84bd81d..04cdc9d82 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/bn.swf and b/vendor/assets/potlatch2/potlatch2/locales/bn.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/br.swf b/vendor/assets/potlatch2/potlatch2/locales/br.swf index 251c6636d..7637432b7 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/br.swf and b/vendor/assets/potlatch2/potlatch2/locales/br.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/bs.swf b/vendor/assets/potlatch2/potlatch2/locales/bs.swf index fcc73c403..cb00ca024 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/bs.swf and b/vendor/assets/potlatch2/potlatch2/locales/bs.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/ca.swf b/vendor/assets/potlatch2/potlatch2/locales/ca.swf index 57ca1acce..ce9139924 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/ca.swf and b/vendor/assets/potlatch2/potlatch2/locales/ca.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/ce.swf b/vendor/assets/potlatch2/potlatch2/locales/ce.swf index 14d4f54ac..886d062a9 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/ce.swf and b/vendor/assets/potlatch2/potlatch2/locales/ce.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/cs_CZ.swf b/vendor/assets/potlatch2/potlatch2/locales/cs_CZ.swf index a6b2ef105..72ad6dcfe 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/cs_CZ.swf and b/vendor/assets/potlatch2/potlatch2/locales/cs_CZ.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/cy.swf b/vendor/assets/potlatch2/potlatch2/locales/cy.swf new file mode 100644 index 000000000..9202bb135 Binary files /dev/null and b/vendor/assets/potlatch2/potlatch2/locales/cy.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/da.swf b/vendor/assets/potlatch2/potlatch2/locales/da.swf index 2784f0bec..5e55ab458 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/da.swf and b/vendor/assets/potlatch2/potlatch2/locales/da.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/de-formal.swf b/vendor/assets/potlatch2/potlatch2/locales/de-formal.swf index eb240a632..41c137bde 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/de-formal.swf and b/vendor/assets/potlatch2/potlatch2/locales/de-formal.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/de_DE.swf b/vendor/assets/potlatch2/potlatch2/locales/de_DE.swf index 529a4b133..af99095bd 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/de_DE.swf and b/vendor/assets/potlatch2/potlatch2/locales/de_DE.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/diq.swf b/vendor/assets/potlatch2/potlatch2/locales/diq.swf index 981b83466..8a92e6954 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/diq.swf and b/vendor/assets/potlatch2/potlatch2/locales/diq.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/dsb.swf b/vendor/assets/potlatch2/potlatch2/locales/dsb.swf index 651aa4e2f..d31c26f71 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/dsb.swf and b/vendor/assets/potlatch2/potlatch2/locales/dsb.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/el.swf b/vendor/assets/potlatch2/potlatch2/locales/el.swf index ee5f6e153..8840d9376 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/el.swf and b/vendor/assets/potlatch2/potlatch2/locales/el.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/en_GB.swf b/vendor/assets/potlatch2/potlatch2/locales/en_GB.swf index 3d17ff88b..7044c7df3 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/en_GB.swf and b/vendor/assets/potlatch2/potlatch2/locales/en_GB.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/en_US.swf b/vendor/assets/potlatch2/potlatch2/locales/en_US.swf index c98f0d639..dafd55148 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/en_US.swf and b/vendor/assets/potlatch2/potlatch2/locales/en_US.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/eo.swf b/vendor/assets/potlatch2/potlatch2/locales/eo.swf index 33b7774cb..d9769950e 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/eo.swf and b/vendor/assets/potlatch2/potlatch2/locales/eo.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/es_ES.swf b/vendor/assets/potlatch2/potlatch2/locales/es_ES.swf index ecd8daee8..d40c8760d 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/es_ES.swf and b/vendor/assets/potlatch2/potlatch2/locales/es_ES.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/et.swf b/vendor/assets/potlatch2/potlatch2/locales/et.swf index dadd3161d..7bb1f2305 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/et.swf and b/vendor/assets/potlatch2/potlatch2/locales/et.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/eu.swf b/vendor/assets/potlatch2/potlatch2/locales/eu.swf index 6eb7f33bc..1babfe386 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/eu.swf and b/vendor/assets/potlatch2/potlatch2/locales/eu.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/fa.swf b/vendor/assets/potlatch2/potlatch2/locales/fa.swf index 75e9efa46..acc3f1f29 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/fa.swf and b/vendor/assets/potlatch2/potlatch2/locales/fa.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/fi.swf b/vendor/assets/potlatch2/potlatch2/locales/fi.swf index 3f5722d2a..07d31fb96 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/fi.swf and b/vendor/assets/potlatch2/potlatch2/locales/fi.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/fo.swf b/vendor/assets/potlatch2/potlatch2/locales/fo.swf index d4294a910..a636f7263 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/fo.swf and b/vendor/assets/potlatch2/potlatch2/locales/fo.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/fr_FR.swf b/vendor/assets/potlatch2/potlatch2/locales/fr_FR.swf index eb9ab80a2..8ce561971 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/fr_FR.swf and b/vendor/assets/potlatch2/potlatch2/locales/fr_FR.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/fur.swf b/vendor/assets/potlatch2/potlatch2/locales/fur.swf index 41f45a8f6..c0e0a4c81 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/fur.swf and b/vendor/assets/potlatch2/potlatch2/locales/fur.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/ga.swf b/vendor/assets/potlatch2/potlatch2/locales/ga.swf index 233a2bffc..9cf693561 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/ga.swf and b/vendor/assets/potlatch2/potlatch2/locales/ga.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/gd.swf b/vendor/assets/potlatch2/potlatch2/locales/gd.swf index ca2af36ac..149ddbaab 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/gd.swf and b/vendor/assets/potlatch2/potlatch2/locales/gd.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/gl.swf b/vendor/assets/potlatch2/potlatch2/locales/gl.swf index da8ef32a2..dad0c2b14 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/gl.swf and b/vendor/assets/potlatch2/potlatch2/locales/gl.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/grc.swf b/vendor/assets/potlatch2/potlatch2/locales/grc.swf index 426bf412e..2141dfb0c 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/grc.swf and b/vendor/assets/potlatch2/potlatch2/locales/grc.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/he.swf b/vendor/assets/potlatch2/potlatch2/locales/he.swf index 7495f8c9a..d52f328cf 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/he.swf and b/vendor/assets/potlatch2/potlatch2/locales/he.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/hr.swf b/vendor/assets/potlatch2/potlatch2/locales/hr.swf index aa950e140..6be823004 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/hr.swf and b/vendor/assets/potlatch2/potlatch2/locales/hr.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/hsb.swf b/vendor/assets/potlatch2/potlatch2/locales/hsb.swf index dc340806c..d2856baf8 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/hsb.swf and b/vendor/assets/potlatch2/potlatch2/locales/hsb.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/hu.swf b/vendor/assets/potlatch2/potlatch2/locales/hu.swf index e29cda3a9..54bc6d3a7 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/hu.swf and b/vendor/assets/potlatch2/potlatch2/locales/hu.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/ia.swf b/vendor/assets/potlatch2/potlatch2/locales/ia.swf index 77cd2b92e..3dcda7ff4 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/ia.swf and b/vendor/assets/potlatch2/potlatch2/locales/ia.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/id.swf b/vendor/assets/potlatch2/potlatch2/locales/id.swf index 653815daf..177c2ee35 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/id.swf and b/vendor/assets/potlatch2/potlatch2/locales/id.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/is.swf b/vendor/assets/potlatch2/potlatch2/locales/is.swf new file mode 100644 index 000000000..31ba9fb78 Binary files /dev/null and b/vendor/assets/potlatch2/potlatch2/locales/is.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/it_IT.swf b/vendor/assets/potlatch2/potlatch2/locales/it_IT.swf index fedf16075..f0d9d67d0 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/it_IT.swf and b/vendor/assets/potlatch2/potlatch2/locales/it_IT.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/ja_JP.swf b/vendor/assets/potlatch2/potlatch2/locales/ja_JP.swf index b3b08e2ef..11e99cf70 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/ja_JP.swf and b/vendor/assets/potlatch2/potlatch2/locales/ja_JP.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/ka.swf b/vendor/assets/potlatch2/potlatch2/locales/ka.swf index 2d48e9454..8ed169cc3 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/ka.swf and b/vendor/assets/potlatch2/potlatch2/locales/ka.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/km.swf b/vendor/assets/potlatch2/potlatch2/locales/km.swf index 190e79715..eb5e6d468 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/km.swf and b/vendor/assets/potlatch2/potlatch2/locales/km.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/kn.swf b/vendor/assets/potlatch2/potlatch2/locales/kn.swf index feb0b1ba6..b2bcd6a28 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/kn.swf and b/vendor/assets/potlatch2/potlatch2/locales/kn.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/ko.swf b/vendor/assets/potlatch2/potlatch2/locales/ko.swf index 60804f58c..9a7316cea 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/ko.swf and b/vendor/assets/potlatch2/potlatch2/locales/ko.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/krc.swf b/vendor/assets/potlatch2/potlatch2/locales/krc.swf index a72ea2754..6c769d4c7 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/krc.swf and b/vendor/assets/potlatch2/potlatch2/locales/krc.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/ksh.swf b/vendor/assets/potlatch2/potlatch2/locales/ksh.swf index 6ade1eac0..70ab863b1 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/ksh.swf and b/vendor/assets/potlatch2/potlatch2/locales/ksh.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/ku-latn.swf b/vendor/assets/potlatch2/potlatch2/locales/ku-latn.swf index 88705bbcb..7c0a1edeb 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/ku-latn.swf and b/vendor/assets/potlatch2/potlatch2/locales/ku-latn.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/ky.swf b/vendor/assets/potlatch2/potlatch2/locales/ky.swf index 0cb4cb211..88222052c 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/ky.swf and b/vendor/assets/potlatch2/potlatch2/locales/ky.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/lb.swf b/vendor/assets/potlatch2/potlatch2/locales/lb.swf index e8f63165a..57a4f2346 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/lb.swf and b/vendor/assets/potlatch2/potlatch2/locales/lb.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/lez.swf b/vendor/assets/potlatch2/potlatch2/locales/lez.swf index a8adf14bc..4178ffd4e 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/lez.swf and b/vendor/assets/potlatch2/potlatch2/locales/lez.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/lt.swf b/vendor/assets/potlatch2/potlatch2/locales/lt.swf index a9b583954..89161cca0 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/lt.swf and b/vendor/assets/potlatch2/potlatch2/locales/lt.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/lv.swf b/vendor/assets/potlatch2/potlatch2/locales/lv.swf index c6bdad855..c8b44ddd4 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/lv.swf and b/vendor/assets/potlatch2/potlatch2/locales/lv.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/lzz.swf b/vendor/assets/potlatch2/potlatch2/locales/lzz.swf index 6255726e0..3bfa7af62 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/lzz.swf and b/vendor/assets/potlatch2/potlatch2/locales/lzz.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/mk.swf b/vendor/assets/potlatch2/potlatch2/locales/mk.swf index 43aeb3671..09205c5d7 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/mk.swf and b/vendor/assets/potlatch2/potlatch2/locales/mk.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/mr.swf b/vendor/assets/potlatch2/potlatch2/locales/mr.swf index ebe647eca..2a047b66c 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/mr.swf and b/vendor/assets/potlatch2/potlatch2/locales/mr.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/ms.swf b/vendor/assets/potlatch2/potlatch2/locales/ms.swf index ab20e961f..d5227201a 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/ms.swf and b/vendor/assets/potlatch2/potlatch2/locales/ms.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/nb_NO.swf b/vendor/assets/potlatch2/potlatch2/locales/nb_NO.swf index abf925b26..17a9aeabc 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/nb_NO.swf and b/vendor/assets/potlatch2/potlatch2/locales/nb_NO.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/nl_NL.swf b/vendor/assets/potlatch2/potlatch2/locales/nl_NL.swf index b27562d51..9a8e78bdd 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/nl_NL.swf and b/vendor/assets/potlatch2/potlatch2/locales/nl_NL.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/nn_NO.swf b/vendor/assets/potlatch2/potlatch2/locales/nn_NO.swf index 9066bf6dd..ed1075ce3 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/nn_NO.swf and b/vendor/assets/potlatch2/potlatch2/locales/nn_NO.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/oc.swf b/vendor/assets/potlatch2/potlatch2/locales/oc.swf index 2a9a5f035..8276fc08a 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/oc.swf and b/vendor/assets/potlatch2/potlatch2/locales/oc.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/pa.swf b/vendor/assets/potlatch2/potlatch2/locales/pa.swf index 8893dc796..9ecc5b599 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/pa.swf and b/vendor/assets/potlatch2/potlatch2/locales/pa.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/pl_PL.swf b/vendor/assets/potlatch2/potlatch2/locales/pl_PL.swf index c6ce3d73f..6cd915fe6 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/pl_PL.swf and b/vendor/assets/potlatch2/potlatch2/locales/pl_PL.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/ps.swf b/vendor/assets/potlatch2/potlatch2/locales/ps.swf index 9014004ab..928c85439 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/ps.swf and b/vendor/assets/potlatch2/potlatch2/locales/ps.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/pt_BR.swf b/vendor/assets/potlatch2/potlatch2/locales/pt_BR.swf index a8eb48942..40560d901 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/pt_BR.swf and b/vendor/assets/potlatch2/potlatch2/locales/pt_BR.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/pt_PT.swf b/vendor/assets/potlatch2/potlatch2/locales/pt_PT.swf index 6892fceff..fde148a9d 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/pt_PT.swf and b/vendor/assets/potlatch2/potlatch2/locales/pt_PT.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/ro.swf b/vendor/assets/potlatch2/potlatch2/locales/ro.swf index 5f530731e..5aeaff7f1 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/ro.swf and b/vendor/assets/potlatch2/potlatch2/locales/ro.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/ru.swf b/vendor/assets/potlatch2/potlatch2/locales/ru.swf index 175f4b031..0eafb3b60 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/ru.swf and b/vendor/assets/potlatch2/potlatch2/locales/ru.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/rue.swf b/vendor/assets/potlatch2/potlatch2/locales/rue.swf index 3676f4eb6..344ad55d8 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/rue.swf and b/vendor/assets/potlatch2/potlatch2/locales/rue.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/sah.swf b/vendor/assets/potlatch2/potlatch2/locales/sah.swf index 5de29a29d..0fa7d06ea 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/sah.swf and b/vendor/assets/potlatch2/potlatch2/locales/sah.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/scn.swf b/vendor/assets/potlatch2/potlatch2/locales/scn.swf new file mode 100644 index 000000000..aa83ad460 Binary files /dev/null and b/vendor/assets/potlatch2/potlatch2/locales/scn.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/sk.swf b/vendor/assets/potlatch2/potlatch2/locales/sk.swf index 357c3208b..c127129da 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/sk.swf and b/vendor/assets/potlatch2/potlatch2/locales/sk.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/sl.swf b/vendor/assets/potlatch2/potlatch2/locales/sl.swf index 4c0c91023..dc877c572 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/sl.swf and b/vendor/assets/potlatch2/potlatch2/locales/sl.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/sq.swf b/vendor/assets/potlatch2/potlatch2/locales/sq.swf index ebb9f3ff7..129fbb76b 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/sq.swf and b/vendor/assets/potlatch2/potlatch2/locales/sq.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/sr-ec.swf b/vendor/assets/potlatch2/potlatch2/locales/sr-ec.swf index 38b314eef..96110d17a 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/sr-ec.swf and b/vendor/assets/potlatch2/potlatch2/locales/sr-ec.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/sr-el.swf b/vendor/assets/potlatch2/potlatch2/locales/sr-el.swf index bfea8f46c..dc409a197 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/sr-el.swf and b/vendor/assets/potlatch2/potlatch2/locales/sr-el.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/sv_SE.swf b/vendor/assets/potlatch2/potlatch2/locales/sv_SE.swf index b8f7a5f64..033090cf2 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/sv_SE.swf and b/vendor/assets/potlatch2/potlatch2/locales/sv_SE.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/ta.swf b/vendor/assets/potlatch2/potlatch2/locales/ta.swf index b26dde96a..8d32a33e1 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/ta.swf and b/vendor/assets/potlatch2/potlatch2/locales/ta.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/te.swf b/vendor/assets/potlatch2/potlatch2/locales/te.swf index 4486ba302..cce8b495a 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/te.swf and b/vendor/assets/potlatch2/potlatch2/locales/te.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/tl.swf b/vendor/assets/potlatch2/potlatch2/locales/tl.swf index 267c3f4fa..6701c073c 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/tl.swf and b/vendor/assets/potlatch2/potlatch2/locales/tl.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/tly.swf b/vendor/assets/potlatch2/potlatch2/locales/tly.swf index ae8b265f6..32230921f 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/tly.swf and b/vendor/assets/potlatch2/potlatch2/locales/tly.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/tr.swf b/vendor/assets/potlatch2/potlatch2/locales/tr.swf index 646cda50e..ac59eb301 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/tr.swf and b/vendor/assets/potlatch2/potlatch2/locales/tr.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/tyv.swf b/vendor/assets/potlatch2/potlatch2/locales/tyv.swf index 393f81f9e..2b86df955 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/tyv.swf and b/vendor/assets/potlatch2/potlatch2/locales/tyv.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/tzm.swf b/vendor/assets/potlatch2/potlatch2/locales/tzm.swf index 12189bf0d..ce2996332 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/tzm.swf and b/vendor/assets/potlatch2/potlatch2/locales/tzm.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/uk.swf b/vendor/assets/potlatch2/potlatch2/locales/uk.swf index cf86d4bc0..f8da48aa9 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/uk.swf and b/vendor/assets/potlatch2/potlatch2/locales/uk.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/vi_VN.swf b/vendor/assets/potlatch2/potlatch2/locales/vi_VN.swf index e7bcfdcb3..15520a2af 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/vi_VN.swf and b/vendor/assets/potlatch2/potlatch2/locales/vi_VN.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/vo.swf b/vendor/assets/potlatch2/potlatch2/locales/vo.swf index 264a06485..e92534998 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/vo.swf and b/vendor/assets/potlatch2/potlatch2/locales/vo.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/yi.swf b/vendor/assets/potlatch2/potlatch2/locales/yi.swf index 23734b572..8d133c737 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/yi.swf and b/vendor/assets/potlatch2/potlatch2/locales/yi.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/zh_CN.swf b/vendor/assets/potlatch2/potlatch2/locales/zh_CN.swf index 49e7af1c7..1123be539 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/zh_CN.swf and b/vendor/assets/potlatch2/potlatch2/locales/zh_CN.swf differ diff --git a/vendor/assets/potlatch2/potlatch2/locales/zh_TW.swf b/vendor/assets/potlatch2/potlatch2/locales/zh_TW.swf index 23eb0a419..834bee950 100644 Binary files a/vendor/assets/potlatch2/potlatch2/locales/zh_TW.swf and b/vendor/assets/potlatch2/potlatch2/locales/zh_TW.swf differ