From: Andy Allan Date: Wed, 4 Dec 2019 11:48:34 +0000 (+0100) Subject: Merge pull request #2427 from mmd-osm/patch/remove_expand_bbox X-Git-Tag: live~3421 X-Git-Url: https://git.openstreetmap.org/rails.git/commitdiff_plain/f1c6a87aa137c11d0aff5a4b0e563ac2c2a8f82d?hp=fc8923c3059dd5fb603c84cbd0dde9c039b0eb44 Merge pull request #2427 from mmd-osm/patch/remove_expand_bbox Remove expand_bbox endpoint --- diff --git a/.rubocop.yml b/.rubocop.yml index cbd62a052..18bf69b9b 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -38,9 +38,6 @@ Naming/FileName: Naming/UncommunicativeMethodParamName: Enabled: false -Rails/ApplicationRecord: - Enabled: false - Rails/CreateTableWithTimestamps: Enabled: false diff --git a/Gemfile b/Gemfile index c2bb066b7..8ccc5026b 100644 --- a/Gemfile +++ b/Gemfile @@ -1,7 +1,7 @@ source "https://rubygems.org" # Require rails -gem "rails", "5.2.3" +gem "rails", "6.0.1" # Require things which have moved to gems in ruby 1.9 gem "bigdecimal", "~> 1.1.0", :platforms => :ruby_19 @@ -21,18 +21,14 @@ gem "sassc-rails" # Use Uglifier as compressor for JavaScript assets gem "uglifier", ">= 1.3.0" -# Use CoffeeScript for .js.coffee assets and views -gem "coffee-rails", "~> 4.2" - # Use jquery as the JavaScript library gem "jquery-rails" # Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder -# gem 'jbuilder', '~> 2.0' -gem "jsonify-rails" +gem "jbuilder", "~> 2.7" # Reduces boot times through caching; required in config/boot.rb -gem "bootsnap", ">= 1.1.0", :require => false +gem "bootsnap", ">= 1.4.2", :require => false # Use R2 for RTL conversion gem "r2", "~> 0.2.7" @@ -44,21 +40,20 @@ gem "autoprefixer-rails", "~> 8.6.3" gem "image_optim_rails" # Load rails plugins -gem "actionpack-page_caching" gem "active_record_union" gem "activerecord-import" gem "cancancan" -gem "composite_primary_keys", "~> 11.1.0" +gem "composite_primary_keys", "~> 12.0.0" gem "config" gem "delayed_job_active_record" gem "dynamic_form" gem "http_accept_language", "~> 2.0.0" gem "i18n-js", ">= 3.0.0" gem "oauth-plugin", ">= 0.5.1" +gem "openstreetmap-actionpack-page_caching", ">= 1.1.2", :require => "actionpack/page_caching" gem "openstreetmap-deadlock_retry", ">= 1.3.0", :require => "deadlock_retry" gem "rack-cors" gem "rails-i18n", "~> 4.0.0" -gem "record_tag_helper" gem "rinku", ">= 2.0.6", :require => "rails_rinku" gem "strong_migrations" gem "validates_email_format_of", ">= 1.5.1" @@ -153,10 +148,11 @@ end # Needed in development as well so rake can see konacha tasks group :development, :test do - gem "capybara", "~> 2.13" + gem "capybara", ">= 2.15" gem "coveralls", :require => false gem "erb_lint", :require => false gem "factory_bot_rails" gem "poltergeist" - gem "puma", "~> 3.7" + gem "puma", "~> 3.11" + gem "selenium-webdriver" end diff --git a/Gemfile.lock b/Gemfile.lock index 7fe5ac89f..e9dd8af4b 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -4,74 +4,85 @@ GEM SystemTimer (1.2.3) aasm (5.0.6) concurrent-ruby (~> 1.0) - actioncable (5.2.3) - actionpack (= 5.2.3) + actioncable (6.0.1) + actionpack (= 6.0.1) nio4r (~> 2.0) websocket-driver (>= 0.6.1) - actionmailer (5.2.3) - actionpack (= 5.2.3) - actionview (= 5.2.3) - activejob (= 5.2.3) + actionmailbox (6.0.1) + actionpack (= 6.0.1) + activejob (= 6.0.1) + activerecord (= 6.0.1) + activestorage (= 6.0.1) + activesupport (= 6.0.1) + mail (>= 2.7.1) + actionmailer (6.0.1) + actionpack (= 6.0.1) + actionview (= 6.0.1) + activejob (= 6.0.1) mail (~> 2.5, >= 2.5.4) rails-dom-testing (~> 2.0) - actionpack (5.2.3) - actionview (= 5.2.3) - activesupport (= 5.2.3) + actionpack (6.0.1) + actionview (= 6.0.1) + activesupport (= 6.0.1) rack (~> 2.0) rack-test (>= 0.6.3) rails-dom-testing (~> 2.0) - rails-html-sanitizer (~> 1.0, >= 1.0.2) - actionpack-page_caching (1.1.1) - actionpack (>= 4.0.0, < 6) - actionview (5.2.3) - activesupport (= 5.2.3) + rails-html-sanitizer (~> 1.0, >= 1.2.0) + actiontext (6.0.1) + actionpack (= 6.0.1) + activerecord (= 6.0.1) + activestorage (= 6.0.1) + activesupport (= 6.0.1) + nokogiri (>= 1.8.5) + actionview (6.0.1) + activesupport (= 6.0.1) builder (~> 3.1) erubi (~> 1.4) rails-dom-testing (~> 2.0) - rails-html-sanitizer (~> 1.0, >= 1.0.3) + rails-html-sanitizer (~> 1.1, >= 1.2.0) active_record_union (1.3.0) activerecord (>= 4.0) - activejob (5.2.3) - activesupport (= 5.2.3) + activejob (6.0.1) + activesupport (= 6.0.1) globalid (>= 0.3.6) - activemodel (5.2.3) - activesupport (= 5.2.3) - activerecord (5.2.3) - activemodel (= 5.2.3) - activesupport (= 5.2.3) - arel (>= 9.0) + activemodel (6.0.1) + activesupport (= 6.0.1) + activerecord (6.0.1) + activemodel (= 6.0.1) + activesupport (= 6.0.1) activerecord-import (1.0.3) activerecord (>= 3.2) - activestorage (5.2.3) - actionpack (= 5.2.3) - activerecord (= 5.2.3) + activestorage (6.0.1) + actionpack (= 6.0.1) + activejob (= 6.0.1) + activerecord (= 6.0.1) marcel (~> 0.3.1) - activesupport (5.2.3) + activesupport (6.0.1) concurrent-ruby (~> 1.0, >= 1.0.2) i18n (>= 0.7, < 2) minitest (~> 5.1) tzinfo (~> 1.1) + zeitwerk (~> 2.2) addressable (2.7.0) public_suffix (>= 2.0.2, < 5.0) - annotate (3.0.2) + annotate (3.0.3) activerecord (>= 3.2, < 7.0) - rake (>= 10.4, < 13.0) - arel (9.0.0) + rake (>= 10.4, < 14.0) ast (2.4.0) autoprefixer-rails (8.6.5) execjs aws-eventstream (1.0.3) - aws-partitions (1.232.0) - aws-sdk-core (3.73.0) + aws-partitions (1.244.0) + aws-sdk-core (3.81.0) aws-eventstream (~> 1.0, >= 1.0.2) - aws-partitions (~> 1, >= 1.228.0) + aws-partitions (~> 1, >= 1.239.0) aws-sigv4 (~> 1.1) jmespath (~> 1.0) aws-sdk-kms (1.25.0) aws-sdk-core (~> 3, >= 3.71.0) aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.53.0) - aws-sdk-core (~> 3, >= 3.71.0) + aws-sdk-s3 (1.57.0) + aws-sdk-core (~> 3, >= 3.77.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.1) aws-sigv4 (1.1.0) @@ -93,31 +104,26 @@ GEM debug_inspector (>= 0.0.1) bootsnap (1.4.5) msgpack (~> 1.0) - browser (2.6.1) + browser (2.7.0) builder (3.2.3) bzip2-ffi (1.0.0) ffi (~> 1.0) cancancan (3.0.1) canonical-rails (0.2.6) rails (>= 4.1, < 6.1) - capybara (2.18.0) + capybara (3.29.0) addressable mini_mime (>= 0.1.3) - nokogiri (>= 1.3.3) - rack (>= 1.0.0) - rack-test (>= 0.5.4) - xpath (>= 2.0, < 4.0) + nokogiri (~> 1.8) + rack (>= 1.6.0) + rack-test (>= 0.6.3) + regexp_parser (~> 1.5) + xpath (~> 3.2) + childprocess (3.0.0) cliver (0.3.2) coderay (1.1.2) - coffee-rails (4.2.2) - coffee-script (>= 2.2.0) - railties (>= 4.0.0) - coffee-script (2.4.1) - coffee-script-source - execjs - coffee-script-source (1.12.2) - composite_primary_keys (11.1.0) - activerecord (~> 5.2.1) + composite_primary_keys (12.0.0) + activerecord (~> 6.0.0) concurrent-ruby (1.1.5) config (2.0.0) activesupport (>= 4.2) @@ -141,7 +147,7 @@ GEM activerecord (>= 3.0, < 6.1) delayed_job (>= 3.0, < 5) docile (1.3.2) - dry-configurable (0.8.3) + dry-configurable (0.9.0) concurrent-ruby (~> 1.0) dry-core (~> 0.4, >= 0.4.7) dry-container (0.7.2) @@ -149,10 +155,10 @@ GEM dry-configurable (~> 0.1, >= 0.1.3) dry-core (0.4.9) concurrent-ruby (~> 1.0) - dry-equalizer (0.2.2) + dry-equalizer (0.3.0) dry-inflector (0.2.0) - dry-initializer (3.0.1) - dry-logic (1.0.3) + dry-initializer (3.0.2) + dry-logic (1.0.5) concurrent-ruby (~> 1.0) dry-core (~> 0.2) dry-equalizer (~> 0.2) @@ -164,7 +170,7 @@ GEM dry-initializer (~> 3.0) dry-logic (~> 1.0) dry-types (~> 1.2) - dry-types (1.2.0) + dry-types (1.2.1) concurrent-ruby (~> 1.0) dry-container (~> 0.3) dry-core (~> 0.4, >= 0.4.4) @@ -190,7 +196,7 @@ GEM fakefs (0.20.1) faraday (0.17.0) multipart-post (>= 1.2, < 3) - ffi (1.11.1) + ffi (1.11.2) ffi-libarchive (0.4.10) ffi (~> 1.0) fspath (3.1.2) @@ -206,7 +212,7 @@ GEM http_accept_language (2.0.5) i18n (0.9.5) concurrent-ruby (~> 1.0) - i18n-js (3.4.1) + i18n-js (3.5.0) i18n (>= 0.6.6) image_optim (0.26.5) exifr (~> 1.2, >= 1.2.2) @@ -221,17 +227,14 @@ GEM image_size (2.0.2) in_threads (1.5.3) jaro_winkler (1.5.4) + jbuilder (2.9.1) + activesupport (>= 4.2.0) jmespath (1.4.0) jquery-rails (4.3.5) rails-dom-testing (>= 1, < 3) railties (>= 4.2.0) thor (>= 0.14, < 2.0) json (2.2.0) - jsonify (0.3.1) - multi_json (~> 1.0) - jsonify-rails (0.3.2) - actionpack - jsonify (< 0.4.0) jwt (2.2.1) kgio (2.11.2) kramdown (2.1.0) @@ -264,7 +267,7 @@ GEM nio4r (2.5.2) nokogiri (1.10.5) mini_portile2 (~> 2.4.0) - nokogumbo (2.0.1) + nokogumbo (2.0.2) nokogiri (~> 1.8, >= 1.8.4) oauth (0.4.7) oauth-plugin (0.5.1) @@ -305,8 +308,10 @@ GEM omniauth-windowslive (0.0.12) multi_json (~> 1.12) omniauth-oauth2 (~> 1.4) + openstreetmap-actionpack-page_caching (1.1.2) + actionpack (>= 5.0.0) openstreetmap-deadlock_retry (1.3.0) - parallel (1.18.0) + parallel (1.19.1) parser (2.6.5.0) ast (~> 2.4.0) pg (1.1.4) @@ -321,25 +326,28 @@ GEM quad_tile (1.0.1) r2 (0.2.7) rack (2.0.7) - rack-cors (1.0.3) + rack-cors (1.1.0) + rack (>= 2.0.0) rack-openid (1.3.1) rack (>= 1.1.0) ruby-openid (>= 2.1.8) rack-test (1.1.0) rack (>= 1.0, < 3) rack-uri_sanitizer (0.0.2) - rails (5.2.3) - actioncable (= 5.2.3) - actionmailer (= 5.2.3) - actionpack (= 5.2.3) - actionview (= 5.2.3) - activejob (= 5.2.3) - activemodel (= 5.2.3) - activerecord (= 5.2.3) - activestorage (= 5.2.3) - activesupport (= 5.2.3) + rails (6.0.1) + actioncable (= 6.0.1) + actionmailbox (= 6.0.1) + actionmailer (= 6.0.1) + actionpack (= 6.0.1) + actiontext (= 6.0.1) + actionview (= 6.0.1) + activejob (= 6.0.1) + activemodel (= 6.0.1) + activerecord (= 6.0.1) + activestorage (= 6.0.1) + activesupport (= 6.0.1) bundler (>= 1.3.0) - railties (= 5.2.3) + railties (= 6.0.1) sprockets-rails (>= 2.0.0) rails-controller-testing (1.0.4) actionpack (>= 5.0.1.x) @@ -353,19 +361,18 @@ GEM rails-i18n (4.0.2) i18n (~> 0.6) rails (>= 4.0) - railties (5.2.3) - actionpack (= 5.2.3) - activesupport (= 5.2.3) + railties (6.0.1) + actionpack (= 6.0.1) + activesupport (= 6.0.1) method_source rake (>= 0.8.7) - thor (>= 0.19.0, < 2.0) + thor (>= 0.20.3, < 2.0) rainbow (3.0.0) - rake (12.3.3) + rake (13.0.1) rb-fsevent (0.10.3) rb-inotify (0.10.0) ffi (~> 1.0) - record_tag_helper (1.0.0) - actionview (~> 5.x) + regexp_parser (1.6.0) request_store (1.4.1) rack (>= 1.4) rinku (2.0.6) @@ -378,13 +385,14 @@ GEM rainbow (>= 2.2.2, < 4.0) ruby-progressbar (~> 1.7) unicode-display_width (>= 1.4.0, < 1.7) - rubocop-performance (1.5.0) + rubocop-performance (1.5.1) rubocop (>= 0.71.0) rubocop-rails (2.3.2) rack (>= 1.1) rubocop (>= 0.72.0) ruby-openid (2.9.2) ruby-progressbar (1.10.1) + rubyzip (2.0.0) safe_yaml (1.0.5) sanitize (5.1.0) crass (~> 1.0.2) @@ -399,6 +407,9 @@ GEM sprockets-rails tilt secure_headers (6.1.1) + selenium-webdriver (3.142.6) + childprocess (>= 0.5, < 4.0) + rubyzip (>= 1.2.2) simplecov (0.16.1) docile (~> 1.1) json (>= 1.8, < 3) @@ -419,7 +430,7 @@ GEM thor (0.20.3) thread_safe (0.3.6) tilt (2.0.10) - tins (1.22.0) + tins (1.22.2) tzinfo (1.2.5) thread_safe (~> 0.1) uglifier (4.2.0) @@ -437,6 +448,7 @@ GEM websocket-extensions (0.1.4) xpath (3.2.0) nokogiri (~> 1.8) + zeitwerk (2.2.1) PLATFORMS ruby @@ -444,7 +456,6 @@ PLATFORMS DEPENDENCIES SystemTimer (>= 1.1.3) aasm - actionpack-page_caching active_record_union activerecord-import annotate @@ -453,14 +464,13 @@ DEPENDENCIES better_errors bigdecimal (~> 1.1.0) binding_of_caller - bootsnap (>= 1.1.0) + bootsnap (>= 1.4.2) browser bzip2-ffi cancancan canonical-rails - capybara (~> 2.13) - coffee-rails (~> 4.2) - composite_primary_keys (~> 11.1.0) + capybara (>= 2.15) + composite_primary_keys (~> 12.0.0) config coveralls dalli @@ -477,9 +487,9 @@ DEPENDENCIES http_accept_language (~> 2.0.0) i18n-js (>= 3.0.0) image_optim_rails + jbuilder (~> 2.7) jquery-rails json - jsonify-rails kgio kramdown libxml-ruby (>= 2.0.5) @@ -496,19 +506,19 @@ DEPENDENCIES omniauth-mediawiki (>= 0.0.4) omniauth-openid omniauth-windowslive + openstreetmap-actionpack-page_caching (>= 1.1.2) openstreetmap-deadlock_retry (>= 1.3.0) pg poltergeist psych - puma (~> 3.7) + puma (~> 3.11) quad_tile (~> 1.0.1) r2 (~> 0.2.7) rack-cors rack-uri_sanitizer - rails (= 5.2.3) + rails (= 6.0.1) rails-controller-testing rails-i18n (~> 4.0.0) - record_tag_helper rinku (>= 2.0.6) rotp rubocop @@ -517,6 +527,7 @@ DEPENDENCIES sanitize sassc-rails secure_headers + selenium-webdriver strong_migrations uglifier (>= 1.3.0) validates_email_format_of (>= 1.5.1) diff --git a/Vendorfile b/Vendorfile index ad59f91eb..1d41ad348 100644 --- a/Vendorfile +++ b/Vendorfile @@ -74,7 +74,6 @@ folder 'vendor/assets' do folder 'javascripts' do file 'html5shiv.js', 'https://raw.githubusercontent.com/aFarkas/html5shiv/master/src/html5shiv.js' - file 'bowser.js', 'https://github.com/lancedikson/bowser/releases/download/1.9.4/bowser.js' end folder 'swfobject' do diff --git a/app/abilities/ability.rb b/app/abilities/ability.rb index c34f357a9..f0cebb380 100644 --- a/app/abilities/ability.rb +++ b/app/abilities/ability.rb @@ -40,7 +40,7 @@ class Ability can [:new, :create, :reply, :show, :inbox, :outbox, :mark, :destroy], Message can [:close, :reopen], Note can [:new, :create], Report - can [:mine, :new, :create, :edit, :update, :delete], Trace + can [:mine, :new, :create, :edit, :update, :destroy], Trace can [:account, :go_public, :make_friend, :remove_friend], User if user.moderator? diff --git a/app/abilities/api_ability.rb b/app/abilities/api_ability.rb index 7aef15f11..62cd2b17e 100644 --- a/app/abilities/api_ability.rb +++ b/app/abilities/api_ability.rb @@ -34,7 +34,7 @@ class ApiAbility can [:new, :create], Report can [:create, :show, :update, :destroy, :data], Trace can [:details, :gpx_files], User - can [:read, :read_one, :update, :update_one, :delete_one], UserPreference + can [:index, :show, :update, :update_all, :destroy], UserPreference if user.terms_agreed? can [:create, :update, :upload, :close, :subscribe, :unsubscribe], Changeset diff --git a/app/abilities/api_capability.rb b/app/abilities/api_capability.rb index a4ca25204..beb4d39bf 100644 --- a/app/abilities/api_capability.rb +++ b/app/abilities/api_capability.rb @@ -10,8 +10,8 @@ class ApiCapability can [:create, :update, :destroy], Trace if capability?(token, :allow_write_gpx) can [:details], User if capability?(token, :allow_read_prefs) can [:gpx_files], User if capability?(token, :allow_read_gpx) - can [:read, :read_one], UserPreference if capability?(token, :allow_read_prefs) - can [:update, :update_one, :delete_one], UserPreference if capability?(token, :allow_write_prefs) + can [:index, :show], UserPreference if capability?(token, :allow_read_prefs) + can [:update, :update_all, :destroy], UserPreference if capability?(token, :allow_write_prefs) if token&.user&.terms_agreed? can [:create, :update, :upload, :close, :subscribe, :unsubscribe], Changeset if capability?(token, :allow_write_api) diff --git a/app/assets/images/banners/sotm_africa_2019.png b/app/assets/images/banners/sotm_africa_2019.png new file mode 100644 index 000000000..aefd48819 Binary files /dev/null and b/app/assets/images/banners/sotm_africa_2019.png differ diff --git a/app/assets/images/banners/sotm_asia_2019.png b/app/assets/images/banners/sotm_asia_2019.png deleted file mode 100644 index ef2f1c20b..000000000 Binary files a/app/assets/images/banners/sotm_asia_2019.png and /dev/null differ diff --git a/app/assets/images/browse/alpinehut.p.16.png b/app/assets/images/browse/alpinehut.p.16.png deleted file mode 100644 index 0499c586a..000000000 Binary files a/app/assets/images/browse/alpinehut.p.16.png and /dev/null differ diff --git a/app/assets/images/browse/brownfield.png b/app/assets/images/browse/brownfield.png index 1b1603399..c245020ce 100644 Binary files a/app/assets/images/browse/brownfield.png and b/app/assets/images/browse/brownfield.png differ diff --git a/app/assets/images/browse/building.png b/app/assets/images/browse/building.png index fd37114c9..e83961d81 100644 Binary files a/app/assets/images/browse/building.png and b/app/assets/images/browse/building.png differ diff --git a/app/assets/images/browse/cemetery.png b/app/assets/images/browse/cemetery.png index f89cf18e2..53ae8536f 100644 Binary files a/app/assets/images/browse/cemetery.png and b/app/assets/images/browse/cemetery.png differ diff --git a/app/assets/images/browse/commercial.png b/app/assets/images/browse/commercial.png index 3008f1809..a18dc4114 100644 Binary files a/app/assets/images/browse/commercial.png and b/app/assets/images/browse/commercial.png differ diff --git a/app/assets/images/browse/farmland.png b/app/assets/images/browse/farmland.png index c894c8455..bfd959150 100644 Binary files a/app/assets/images/browse/farmland.png and b/app/assets/images/browse/farmland.png differ diff --git a/app/assets/images/browse/farmyard.png b/app/assets/images/browse/farmyard.png index ca41410a8..6be69f2f0 100644 Binary files a/app/assets/images/browse/farmyard.png and b/app/assets/images/browse/farmyard.png differ diff --git a/app/assets/images/browse/forest.png b/app/assets/images/browse/forest.png index da748f81d..6bd4403fa 100644 Binary files a/app/assets/images/browse/forest.png and b/app/assets/images/browse/forest.png differ diff --git a/app/assets/images/browse/golf.png b/app/assets/images/browse/golf.png index 4f7afc4fa..a485580d5 100644 Binary files a/app/assets/images/browse/golf.png and b/app/assets/images/browse/golf.png differ diff --git a/app/assets/images/browse/grass.png b/app/assets/images/browse/grass.png index 79baac3ee..c909bfa87 100644 Binary files a/app/assets/images/browse/grass.png and b/app/assets/images/browse/grass.png differ diff --git a/app/assets/images/browse/grassland.png b/app/assets/images/browse/grassland.png index 79baac3ee..c909bfa87 100644 Binary files a/app/assets/images/browse/grassland.png and b/app/assets/images/browse/grassland.png differ diff --git a/app/assets/images/browse/heathland.png b/app/assets/images/browse/heathland.png index cb2fc225d..c35d96fee 100644 Binary files a/app/assets/images/browse/heathland.png and b/app/assets/images/browse/heathland.png differ diff --git a/app/assets/images/browse/industrial.png b/app/assets/images/browse/industrial.png index 4ad4e5193..3b3be37f9 100644 Binary files a/app/assets/images/browse/industrial.png and b/app/assets/images/browse/industrial.png differ diff --git a/app/assets/images/browse/lake.png b/app/assets/images/browse/lake.png index c838303f6..2fee498ed 100644 Binary files a/app/assets/images/browse/lake.png and b/app/assets/images/browse/lake.png differ diff --git a/app/assets/images/browse/meadow.png b/app/assets/images/browse/meadow.png index 79baac3ee..c909bfa87 100644 Binary files a/app/assets/images/browse/meadow.png and b/app/assets/images/browse/meadow.png differ diff --git a/app/assets/images/browse/park.png b/app/assets/images/browse/park.png index a60755dd0..0922b56f9 100644 Binary files a/app/assets/images/browse/park.png and b/app/assets/images/browse/park.png differ diff --git a/app/assets/images/browse/pitch.png b/app/assets/images/browse/pitch.png index a49af3010..7d18def41 100644 Binary files a/app/assets/images/browse/pitch.png and b/app/assets/images/browse/pitch.png differ diff --git a/app/assets/images/browse/residential.png b/app/assets/images/browse/residential.png index e3b850e46..429fcd0d1 100644 Binary files a/app/assets/images/browse/residential.png and b/app/assets/images/browse/residential.png differ diff --git a/app/assets/images/browse/retail.png b/app/assets/images/browse/retail.png index 23b097ba4..62309746f 100644 Binary files a/app/assets/images/browse/retail.png and b/app/assets/images/browse/retail.png differ diff --git a/app/assets/images/browse/school.png b/app/assets/images/browse/school.png deleted file mode 100644 index 9361041fc..000000000 Binary files a/app/assets/images/browse/school.png and /dev/null differ diff --git a/app/assets/images/browse/scrub.png b/app/assets/images/browse/scrub.png new file mode 100644 index 000000000..ca85ab8f5 Binary files /dev/null and b/app/assets/images/browse/scrub.png differ diff --git a/app/assets/images/browse/tourism_alpine_hut.16.png b/app/assets/images/browse/tourism_alpine_hut.16.png new file mode 100644 index 000000000..adeb45778 Binary files /dev/null and b/app/assets/images/browse/tourism_alpine_hut.16.png differ diff --git a/app/assets/images/browse/tourism_wilderness_hut.16.png b/app/assets/images/browse/tourism_wilderness_hut.16.png new file mode 100644 index 000000000..33ccbfba0 Binary files /dev/null and b/app/assets/images/browse/tourism_wilderness_hut.16.png differ diff --git a/app/assets/images/browse/wood.png b/app/assets/images/browse/wood.png index 329bfa483..6bd4403fa 100644 Binary files a/app/assets/images/browse/wood.png and b/app/assets/images/browse/wood.png differ diff --git a/app/assets/javascripts/index.js b/app/assets/javascripts/index.js index 039cc0ef6..704016c66 100644 --- a/app/assets/javascripts/index.js +++ b/app/assets/javascripts/index.js @@ -20,7 +20,6 @@ //= require index/changeset //= require index/query //= require router -//= require bowser //= require querystring $(document).ready(function () { @@ -255,12 +254,7 @@ $(document).ready(function () { bottom: bbox.getSouth() - 0.0001 }; - if (location.protocol === "http" || - bowser.check({ chrome: "53", firefox: "55" })) { - url = "http://127.0.0.1:8111/load_and_zoom?"; - } else { - url = "https://127.0.0.1:8112/load_and_zoom?"; - } + url = "http://127.0.0.1:8111/load_and_zoom?"; if (object) query.select = object.type + object.id; diff --git a/app/assets/stylesheets/browse.scss b/app/assets/stylesheets/browse.scss index 2db397a07..7c6f4b365 100644 --- a/app/assets/stylesheets/browse.scss +++ b/app/assets/stylesheets/browse.scss @@ -121,7 +121,7 @@ .shop.shoes::before { content: image-url('browse/shop_shoes.16.png'); } .shop.supermarket::before { content: image-url('browse/shop_supermarket.p.16.png'); } - .tourism.alpine_hut::before { content: image-url('browse/alpinehut.p.16.png'); } + .tourism.alpine_hut::before { content: image-url('browse/tourism_alpine_hut.16.png'); } .tourism.camp_site::before { content: image-url('browse/tourism_camp_site.16.png'); } .tourism.caravan_site::before { content: image-url('browse/tourism_caravan_site.16.png'); } .tourism.hostel::before { content: image-url('browse/tourism_hostel.16.png'); } @@ -130,6 +130,7 @@ .tourism.museum::before { content: image-url('browse/tourism_museum.16.png'); } .tourism.picnic_site::before { content: image-url('browse/tourism_picnic_site.16.png'); } .tourism.viewpoint::before { content: image-url('browse/view_point.p.16.png'); } + .tourism.wilderness_hut::before { content: image-url('browse/tourism_wilderness_hut.16.png'); } /* Ways */ @@ -184,6 +185,7 @@ .natural.grassland::before { content: image-url('browse/grassland.png'); } .natural.heath::before { content: image-url('browse/heathland.png'); } + .natural.scrub::before { content: image-url('browse/scrub.png'); } .natural.water::before { content: image-url('browse/lake.png'); } .natural.wood::before { content: image-url('browse/wood.png'); } diff --git a/app/controllers/api/user_preferences_controller.rb b/app/controllers/api/user_preferences_controller.rb index 39e0dff30..83e28bc4e 100644 --- a/app/controllers/api/user_preferences_controller.rb +++ b/app/controllers/api/user_preferences_controller.rb @@ -9,31 +9,22 @@ module Api ## # return all the preferences as an XML document - def read - doc = OSM::API.new.get_xml_doc + def index + @user_preferences = current_user.preferences - prefs = current_user.preferences - - el1 = XML::Node.new "preferences" - - prefs.each do |pref| - el1 << pref.to_xml_node - end - - doc.root << el1 - render :xml => doc.to_s + render :formats => [:xml] end ## # return the value for a single preference - def read_one + def show pref = UserPreference.find([current_user.id, params[:preference_key]]) render :plain => pref.v.to_s end # update the entire set of preferences - def update + def update_all old_preferences = current_user.preferences.each_with_object({}) do |preference, preferences| preferences[preference.k] = preference end @@ -63,7 +54,7 @@ module Api ## # update the value of a single preference - def update_one + def update begin pref = UserPreference.find([current_user.id, params[:preference_key]]) rescue ActiveRecord::RecordNotFound @@ -80,7 +71,7 @@ module Api ## # delete a single preference - def delete_one + def destroy UserPreference.find([current_user.id, params[:preference_key]]).delete render :plain => "" diff --git a/app/controllers/traces_controller.rb b/app/controllers/traces_controller.rb index a0852d2ce..b800d305e 100644 --- a/app/controllers/traces_controller.rb +++ b/app/controllers/traces_controller.rb @@ -7,9 +7,9 @@ class TracesController < ApplicationController authorize_resource - before_action :check_database_writable, :only => [:new, :create, :edit, :delete] + before_action :check_database_writable, :only => [:new, :create, :edit, :destroy] before_action :offline_warning, :only => [:mine, :show] - before_action :offline_redirect, :only => [:new, :create, :edit, :delete, :data] + before_action :offline_redirect, :only => [:new, :create, :edit, :destroy, :data] # Counts and selects pages of GPX traces for various criteria (by user, tags, public etc.). # target_user - if set, specifies the user to fetch traces for. if not set will fetch all traces @@ -184,7 +184,7 @@ class TracesController < ApplicationController head :not_found end - def delete + def destroy trace = Trace.find(params[:id]) if !trace.visible? diff --git a/app/mailers/notifier.rb b/app/mailers/notifier.rb index 4509f1011..6e0c81a39 100644 --- a/app/mailers/notifier.rb +++ b/app/mailers/notifier.rb @@ -1,6 +1,8 @@ class Notifier < ActionMailer::Base include ActionView::Helpers::AssetUrlHelper + self.delivery_job = ActionMailer::MailDeliveryJob + default :from => Settings.email_from, :return_path => Settings.email_return_path, :auto_submitted => "auto-generated" diff --git a/app/models/acl.rb b/app/models/acl.rb index 895ed61e4..06f754c22 100644 --- a/app/models/acl.rb +++ b/app/models/acl.rb @@ -17,7 +17,7 @@ # index_acls_on_mx (mx) # -class Acl < ActiveRecord::Base +class Acl < ApplicationRecord validates :k, :presence => true def self.match(address, options = {}) diff --git a/app/models/application_record.rb b/app/models/application_record.rb new file mode 100644 index 000000000..10a4cba84 --- /dev/null +++ b/app/models/application_record.rb @@ -0,0 +1,3 @@ +class ApplicationRecord < ActiveRecord::Base + self.abstract_class = true +end diff --git a/app/models/changeset.rb b/app/models/changeset.rb index 47f03c795..990eae407 100644 --- a/app/models/changeset.rb +++ b/app/models/changeset.rb @@ -25,7 +25,7 @@ # changesets_user_id_fkey (user_id => users.id) # -class Changeset < ActiveRecord::Base +class Changeset < ApplicationRecord require "xml/libxml" belongs_to :user, :counter_cache => true diff --git a/app/models/changeset_comment.rb b/app/models/changeset_comment.rb index 75b1a055b..ceb7d3559 100644 --- a/app/models/changeset_comment.rb +++ b/app/models/changeset_comment.rb @@ -19,7 +19,7 @@ # changeset_comments_changeset_id_fkey (changeset_id => changesets.id) # -class ChangesetComment < ActiveRecord::Base +class ChangesetComment < ApplicationRecord belongs_to :changeset belongs_to :author, :class_name => "User" diff --git a/app/models/changeset_tag.rb b/app/models/changeset_tag.rb index 751029e03..600ace4a6 100644 --- a/app/models/changeset_tag.rb +++ b/app/models/changeset_tag.rb @@ -15,7 +15,7 @@ # changeset_tags_id_fkey (changeset_id => changesets.id) # -class ChangesetTag < ActiveRecord::Base +class ChangesetTag < ApplicationRecord self.primary_keys = "changeset_id", "k" belongs_to :changeset diff --git a/app/models/client_application.rb b/app/models/client_application.rb index ae95e2908..67ff075f1 100644 --- a/app/models/client_application.rb +++ b/app/models/client_application.rb @@ -30,7 +30,7 @@ # client_applications_user_id_fkey (user_id => users.id) # -class ClientApplication < ActiveRecord::Base +class ClientApplication < ApplicationRecord belongs_to :user has_many :tokens, :class_name => "OauthToken", :dependent => :delete_all has_many :access_tokens diff --git a/app/models/diary_comment.rb b/app/models/diary_comment.rb index 4ae21be88..05f5044c5 100644 --- a/app/models/diary_comment.rb +++ b/app/models/diary_comment.rb @@ -22,7 +22,7 @@ # diary_comments_user_id_fkey (user_id => users.id) # -class DiaryComment < ActiveRecord::Base +class DiaryComment < ApplicationRecord belongs_to :user belongs_to :diary_entry diff --git a/app/models/diary_entry.rb b/app/models/diary_entry.rb index 4affe8b59..4ff1eeb35 100644 --- a/app/models/diary_entry.rb +++ b/app/models/diary_entry.rb @@ -26,7 +26,7 @@ # diary_entries_user_id_fkey (user_id => users.id) # -class DiaryEntry < ActiveRecord::Base +class DiaryEntry < ApplicationRecord belongs_to :user, :counter_cache => true belongs_to :language, :foreign_key => "language_code" diff --git a/app/models/diary_entry_subscription.rb b/app/models/diary_entry_subscription.rb index 6e9a103ad..ed6de79e4 100644 --- a/app/models/diary_entry_subscription.rb +++ b/app/models/diary_entry_subscription.rb @@ -15,7 +15,7 @@ # diary_entry_subscriptions_user_id_fkey (user_id => users.id) # -class DiaryEntrySubscription < ActiveRecord::Base +class DiaryEntrySubscription < ApplicationRecord self.primary_keys = "user_id", "diary_entry_id" belongs_to :user diff --git a/app/models/friendship.rb b/app/models/friendship.rb index 27b25aee1..476821b47 100644 --- a/app/models/friendship.rb +++ b/app/models/friendship.rb @@ -17,7 +17,7 @@ # friends_user_id_fkey (user_id => users.id) # -class Friendship < ActiveRecord::Base +class Friendship < ApplicationRecord self.table_name = "friends" belongs_to :befriender, :class_name => "User", :foreign_key => :user_id diff --git a/app/models/issue.rb b/app/models/issue.rb index f18581b5f..14c5f8231 100644 --- a/app/models/issue.rb +++ b/app/models/issue.rb @@ -30,7 +30,7 @@ # issues_updated_by_fkey (updated_by => users.id) # -class Issue < ActiveRecord::Base +class Issue < ApplicationRecord belongs_to :reportable, :polymorphic => true belongs_to :reported_user, :class_name => "User", :foreign_key => :reported_user_id belongs_to :user_resolved, :class_name => "User", :foreign_key => :resolved_by diff --git a/app/models/issue_comment.rb b/app/models/issue_comment.rb index 0841295e1..69aa8bde9 100644 --- a/app/models/issue_comment.rb +++ b/app/models/issue_comment.rb @@ -20,7 +20,7 @@ # issue_comments_user_id_fkey (user_id => users.id) # -class IssueComment < ActiveRecord::Base +class IssueComment < ApplicationRecord belongs_to :issue belongs_to :user diff --git a/app/models/language.rb b/app/models/language.rb index bb1aa4bd2..cdf85a52b 100644 --- a/app/models/language.rb +++ b/app/models/language.rb @@ -7,7 +7,7 @@ # native_name :string # -class Language < ActiveRecord::Base +class Language < ApplicationRecord self.primary_key = "code" has_many :diary_entries, :foreign_key => "language" diff --git a/app/models/message.rb b/app/models/message.rb index 4ab129e91..44b1d8745 100644 --- a/app/models/message.rb +++ b/app/models/message.rb @@ -24,7 +24,7 @@ # messages_to_user_id_fkey (to_user_id => users.id) # -class Message < ActiveRecord::Base +class Message < ApplicationRecord belongs_to :sender, :class_name => "User", :foreign_key => :from_user_id belongs_to :recipient, :class_name => "User", :foreign_key => :to_user_id diff --git a/app/models/node.rb b/app/models/node.rb index c5df1f79e..4d48112fc 100644 --- a/app/models/node.rb +++ b/app/models/node.rb @@ -21,7 +21,7 @@ # current_nodes_changeset_id_fkey (changeset_id => changesets.id) # -class Node < ActiveRecord::Base +class Node < ApplicationRecord require "xml/libxml" include GeoRecord @@ -200,28 +200,6 @@ class Node < ActiveRecord::Base save_with_history! end - def to_xml - doc = OSM::API.new.get_xml_doc - doc.root << to_xml_node - doc - end - - def to_xml_node(changeset_cache = {}, user_display_name_cache = {}) - el = XML::Node.new "node" - el["id"] = id.to_s - - add_metadata_to_xml_node(el, self, changeset_cache, user_display_name_cache) - - if visible? - el["lat"] = lat.to_s - el["lon"] = lon.to_s - end - - add_tags_to_xml_node(el, node_tags) - - el - end - def tags_as_hash tags end diff --git a/app/models/node_tag.rb b/app/models/node_tag.rb index 86404599b..fa21b1ff6 100644 --- a/app/models/node_tag.rb +++ b/app/models/node_tag.rb @@ -11,7 +11,7 @@ # current_node_tags_id_fkey (node_id => current_nodes.id) # -class NodeTag < ActiveRecord::Base +class NodeTag < ApplicationRecord self.table_name = "current_node_tags" self.primary_keys = "node_id", "k" diff --git a/app/models/note.rb b/app/models/note.rb index fa9d0b1ae..ec57b770b 100644 --- a/app/models/note.rb +++ b/app/models/note.rb @@ -18,7 +18,7 @@ # notes_updated_at_idx (updated_at) # -class Note < ActiveRecord::Base +class Note < ApplicationRecord include GeoRecord has_many :comments, -> { left_joins(:author).where(:visible => true, :users => { :status => [nil, "active", "confirmed"] }).order(:created_at) }, :class_name => "NoteComment", :foreign_key => :note_id diff --git a/app/models/note_comment.rb b/app/models/note_comment.rb index 448703ffa..9611cfe3a 100644 --- a/app/models/note_comment.rb +++ b/app/models/note_comment.rb @@ -23,7 +23,7 @@ # note_comments_note_id_fkey (note_id => notes.id) # -class NoteComment < ActiveRecord::Base +class NoteComment < ApplicationRecord belongs_to :note, :foreign_key => :note_id, :touch => true belongs_to :author, :class_name => "User", :foreign_key => :author_id diff --git a/app/models/oauth_nonce.rb b/app/models/oauth_nonce.rb index 9d2773e8f..5f0920a96 100644 --- a/app/models/oauth_nonce.rb +++ b/app/models/oauth_nonce.rb @@ -15,7 +15,7 @@ # Simple store of nonces. The OAuth Spec requires that any given pair of nonce and timestamps are unique. # Thus you can use the same nonce with a different timestamp and viceversa. -class OauthNonce < ActiveRecord::Base +class OauthNonce < ApplicationRecord validates :timestamp, :presence => true validates :nonce, :presence => true, :uniqueness => { :scope => :timestamp } diff --git a/app/models/oauth_token.rb b/app/models/oauth_token.rb index 5eeda48ba..affdcdeb8 100644 --- a/app/models/oauth_token.rb +++ b/app/models/oauth_token.rb @@ -35,7 +35,7 @@ # oauth_tokens_user_id_fkey (user_id => users.id) # -class OauthToken < ActiveRecord::Base +class OauthToken < ApplicationRecord belongs_to :client_application belongs_to :user diff --git a/app/models/old_node.rb b/app/models/old_node.rb index bdf8cb47e..12099498e 100644 --- a/app/models/old_node.rb +++ b/app/models/old_node.rb @@ -24,7 +24,7 @@ # nodes_redaction_id_fkey (redaction_id => redactions.id) # -class OldNode < ActiveRecord::Base +class OldNode < ApplicationRecord include GeoRecord include ConsistencyValidations include ObjectMetadata diff --git a/app/models/old_node_tag.rb b/app/models/old_node_tag.rb index a3e1c3aaf..f2cba896c 100644 --- a/app/models/old_node_tag.rb +++ b/app/models/old_node_tag.rb @@ -12,7 +12,7 @@ # node_tags_id_fkey (node_id => nodes.node_id) # -class OldNodeTag < ActiveRecord::Base +class OldNodeTag < ApplicationRecord self.table_name = "node_tags" self.primary_keys = "node_id", "version", "k" diff --git a/app/models/old_relation.rb b/app/models/old_relation.rb index 109f7d968..c0025653f 100644 --- a/app/models/old_relation.rb +++ b/app/models/old_relation.rb @@ -20,7 +20,7 @@ # relations_redaction_id_fkey (redaction_id => redactions.id) # -class OldRelation < ActiveRecord::Base +class OldRelation < ApplicationRecord include ConsistencyValidations include ObjectMetadata diff --git a/app/models/old_relation_member.rb b/app/models/old_relation_member.rb index f8d4a359f..1714f3c85 100644 --- a/app/models/old_relation_member.rb +++ b/app/models/old_relation_member.rb @@ -18,7 +18,7 @@ # relation_members_id_fkey (relation_id => relations.relation_id) # -class OldRelationMember < ActiveRecord::Base +class OldRelationMember < ApplicationRecord self.table_name = "relation_members" self.primary_keys = "relation_id", "version", "sequence_id" diff --git a/app/models/old_relation_tag.rb b/app/models/old_relation_tag.rb index c674f708b..d6e6e19c2 100644 --- a/app/models/old_relation_tag.rb +++ b/app/models/old_relation_tag.rb @@ -12,7 +12,7 @@ # relation_tags_id_fkey (relation_id => relations.relation_id) # -class OldRelationTag < ActiveRecord::Base +class OldRelationTag < ApplicationRecord self.table_name = "relation_tags" self.primary_keys = "relation_id", "version", "k" diff --git a/app/models/old_way.rb b/app/models/old_way.rb index 31e230c38..b515322e3 100644 --- a/app/models/old_way.rb +++ b/app/models/old_way.rb @@ -20,7 +20,7 @@ # ways_redaction_id_fkey (redaction_id => redactions.id) # -class OldWay < ActiveRecord::Base +class OldWay < ApplicationRecord include ConsistencyValidations include ObjectMetadata diff --git a/app/models/old_way_node.rb b/app/models/old_way_node.rb index 836e76e47..d89227936 100644 --- a/app/models/old_way_node.rb +++ b/app/models/old_way_node.rb @@ -16,7 +16,7 @@ # way_nodes_id_fkey (way_id => ways.way_id) # -class OldWayNode < ActiveRecord::Base +class OldWayNode < ApplicationRecord self.table_name = "way_nodes" self.primary_keys = "way_id", "version", "sequence_id" diff --git a/app/models/old_way_tag.rb b/app/models/old_way_tag.rb index ae4ad605e..90bf704b6 100644 --- a/app/models/old_way_tag.rb +++ b/app/models/old_way_tag.rb @@ -12,7 +12,7 @@ # way_tags_id_fkey (way_id => ways.way_id) # -class OldWayTag < ActiveRecord::Base +class OldWayTag < ApplicationRecord self.table_name = "way_tags" self.primary_keys = "way_id", "version", "k" diff --git a/app/models/redaction.rb b/app/models/redaction.rb index d9b2a5579..f4eedde0a 100644 --- a/app/models/redaction.rb +++ b/app/models/redaction.rb @@ -24,7 +24,7 @@ # record's title and description fields, which can be # displayed linked from the redacted records. # -class Redaction < ActiveRecord::Base +class Redaction < ApplicationRecord belongs_to :user has_many :old_nodes diff --git a/app/models/relation.rb b/app/models/relation.rb index dc2b71ac4..3f812d1b1 100644 --- a/app/models/relation.rb +++ b/app/models/relation.rb @@ -17,7 +17,7 @@ # current_relations_changeset_id_fkey (changeset_id => changesets.id) # -class Relation < ActiveRecord::Base +class Relation < ApplicationRecord require "xml/libxml" include ConsistencyValidations @@ -121,31 +121,6 @@ class Relation < ActiveRecord::Base relation end - def to_xml - doc = OSM::API.new.get_xml_doc - doc.root << to_xml_node - doc - end - - def to_xml_node(changeset_cache = {}, user_display_name_cache = {}) - el = XML::Node.new "relation" - el["id"] = id.to_s - - add_metadata_to_xml_node(el, self, changeset_cache, user_display_name_cache) - - relation_members.each do |member| - member_el = XML::Node.new "member" - member_el["type"] = member.member_type.downcase - member_el["ref"] = member.member_id.to_s - member_el["role"] = member.member_role - el << member_el - end - - add_tags_to_xml_node(el, relation_tags) - - el - end - # FIXME: is this really needed? def members @members ||= relation_members.map do |member| diff --git a/app/models/relation_member.rb b/app/models/relation_member.rb index 7c399c3a8..7f07dda9b 100644 --- a/app/models/relation_member.rb +++ b/app/models/relation_member.rb @@ -17,7 +17,7 @@ # current_relation_members_id_fkey (relation_id => current_relations.id) # -class RelationMember < ActiveRecord::Base +class RelationMember < ApplicationRecord self.table_name = "current_relation_members" self.primary_keys = "relation_id", "sequence_id" diff --git a/app/models/relation_tag.rb b/app/models/relation_tag.rb index b186f505d..ad9a93266 100644 --- a/app/models/relation_tag.rb +++ b/app/models/relation_tag.rb @@ -11,7 +11,7 @@ # current_relation_tags_id_fkey (relation_id => current_relations.id) # -class RelationTag < ActiveRecord::Base +class RelationTag < ApplicationRecord self.table_name = "current_relation_tags" self.primary_keys = "relation_id", "k" diff --git a/app/models/report.rb b/app/models/report.rb index 9bbf221df..9afedb04e 100644 --- a/app/models/report.rb +++ b/app/models/report.rb @@ -21,7 +21,7 @@ # reports_user_id_fkey (user_id => users.id) # -class Report < ActiveRecord::Base +class Report < ApplicationRecord belongs_to :issue, :counter_cache => true belongs_to :user diff --git a/app/models/trace.rb b/app/models/trace.rb index f1cd72acd..d500784af 100644 --- a/app/models/trace.rb +++ b/app/models/trace.rb @@ -25,7 +25,7 @@ # gpx_files_user_id_fkey (user_id => users.id) # -class Trace < ActiveRecord::Base +class Trace < ApplicationRecord self.table_name = "gpx_files" belongs_to :user, :counter_cache => true diff --git a/app/models/tracepoint.rb b/app/models/tracepoint.rb index 6473c9430..6352824fd 100644 --- a/app/models/tracepoint.rb +++ b/app/models/tracepoint.rb @@ -20,7 +20,7 @@ # gps_points_gpx_id_fkey (gpx_id => gpx_files.id) # -class Tracepoint < ActiveRecord::Base +class Tracepoint < ApplicationRecord include GeoRecord self.table_name = "gps_points" diff --git a/app/models/tracetag.rb b/app/models/tracetag.rb index 8d2f4fffa..f13f7269f 100644 --- a/app/models/tracetag.rb +++ b/app/models/tracetag.rb @@ -16,7 +16,7 @@ # gpx_file_tags_gpx_id_fkey (gpx_id => gpx_files.id) # -class Tracetag < ActiveRecord::Base +class Tracetag < ApplicationRecord self.table_name = "gpx_file_tags" belongs_to :trace, :foreign_key => "gpx_id" diff --git a/app/models/user.rb b/app/models/user.rb index 1095dc6ea..609982389 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -43,9 +43,11 @@ # users_home_idx (home_tile) # -class User < ActiveRecord::Base +class User < ApplicationRecord require "xml/libxml" + self.ignored_columns = ["nearby"] + has_many :traces, -> { where(:visible => true) } has_many :diary_entries, -> { order(:created_at => :desc) } has_many :diary_comments, -> { order(:created_at => :desc) } diff --git a/app/models/user_block.rb b/app/models/user_block.rb index 92cee16cd..60f680ac3 100644 --- a/app/models/user_block.rb +++ b/app/models/user_block.rb @@ -24,7 +24,7 @@ # user_blocks_user_id_fkey (user_id => users.id) # -class UserBlock < ActiveRecord::Base +class UserBlock < ApplicationRecord validate :moderator_permissions validates :reason, :characters => true diff --git a/app/models/user_preference.rb b/app/models/user_preference.rb index 583ced3c5..d5cad3978 100644 --- a/app/models/user_preference.rb +++ b/app/models/user_preference.rb @@ -11,20 +11,11 @@ # user_preferences_user_id_fkey (user_id => users.id) # -class UserPreference < ActiveRecord::Base +class UserPreference < ApplicationRecord self.primary_keys = "user_id", "k" belongs_to :user validates :user, :presence => true, :associated => true validates :k, :v, :length => 1..255, :characters => true - - # Turn this Node in to an XML Node without the wrapper. - def to_xml_node - el1 = XML::Node.new "preference" - el1["k"] = k - el1["v"] = v - - el1 - end end diff --git a/app/models/user_role.rb b/app/models/user_role.rb index f3d48cade..a081361a7 100644 --- a/app/models/user_role.rb +++ b/app/models/user_role.rb @@ -19,7 +19,7 @@ # user_roles_user_id_fkey (user_id => users.id) # -class UserRole < ActiveRecord::Base +class UserRole < ApplicationRecord belongs_to :user belongs_to :granter, :class_name => "User" diff --git a/app/models/user_token.rb b/app/models/user_token.rb index 844357d8d..8c9bf4aeb 100644 --- a/app/models/user_token.rb +++ b/app/models/user_token.rb @@ -18,7 +18,7 @@ # user_tokens_user_id_fkey (user_id => users.id) # -class UserToken < ActiveRecord::Base +class UserToken < ApplicationRecord belongs_to :user after_initialize :set_defaults diff --git a/app/models/way.rb b/app/models/way.rb index b3466213c..d0d1e2a2e 100644 --- a/app/models/way.rb +++ b/app/models/way.rb @@ -17,7 +17,7 @@ # current_ways_changeset_id_fkey (changeset_id => changesets.id) # -class Way < ActiveRecord::Base +class Way < ApplicationRecord require "xml/libxml" include ConsistencyValidations @@ -106,44 +106,6 @@ class Way < ActiveRecord::Base way end - # Find a way given it's ID, and in a single SQL call also grab its nodes and tags - def to_xml - doc = OSM::API.new.get_xml_doc - doc.root << to_xml_node - doc - end - - def to_xml_node(visible_nodes = nil, changeset_cache = {}, user_display_name_cache = {}) - el = XML::Node.new "way" - el["id"] = id.to_s - - add_metadata_to_xml_node(el, self, changeset_cache, user_display_name_cache) - - # make sure nodes are output in sequence_id order - ordered_nodes = [] - way_nodes.each do |nd| - if visible_nodes - # if there is a list of visible nodes then use that to weed out deleted nodes - ordered_nodes[nd.sequence_id] = nd.node_id.to_s if visible_nodes[nd.node_id] - else - # otherwise, manually go to the db to check things - ordered_nodes[nd.sequence_id] = nd.node_id.to_s if nd.node&.visible? - end - end - - ordered_nodes.each do |nd_id| - next unless nd_id && nd_id != "0" - - node_el = XML::Node.new "nd" - node_el["ref"] = nd_id - el << node_el - end - - add_tags_to_xml_node(el, way_tags) - - el - end - def nds @nds ||= way_nodes.collect(&:node_id) end diff --git a/app/models/way_node.rb b/app/models/way_node.rb index 0788a631c..0626fb240 100644 --- a/app/models/way_node.rb +++ b/app/models/way_node.rb @@ -16,7 +16,7 @@ # current_way_nodes_node_id_fkey (node_id => current_nodes.id) # -class WayNode < ActiveRecord::Base +class WayNode < ApplicationRecord self.table_name = "current_way_nodes" self.primary_keys = "way_id", "sequence_id" diff --git a/app/models/way_tag.rb b/app/models/way_tag.rb index 6637c1585..0d32d8c41 100644 --- a/app/models/way_tag.rb +++ b/app/models/way_tag.rb @@ -11,7 +11,7 @@ # current_way_tags_id_fkey (way_id => current_ways.id) # -class WayTag < ActiveRecord::Base +class WayTag < ApplicationRecord self.table_name = "current_way_tags" self.primary_keys = "way_id", "k" diff --git a/app/views/api/notes/_note.json.jsonify b/app/views/api/notes/_note.json.jbuilder similarity index 81% rename from app/views/api/notes/_note.json.jsonify rename to app/views/api/notes/_note.json.jbuilder index b96439922..34f796880 100644 --- a/app/views/api/notes/_note.json.jsonify +++ b/app/views/api/notes/_note.json.jbuilder @@ -2,7 +2,7 @@ json.type "Feature" json.geometry do json.type "Point" - json.coordinates [ note.lon.to_f, note.lat.to_f ] + json.coordinates [note.lon.to_f, note.lat.to_f] end json.properties do @@ -16,12 +16,12 @@ json.properties do json.close_url close_note_url(note, :format => params[:format]) end - json.date_created note.created_at + json.date_created note.created_at.to_s json.status note.status - json.closed_at note.closed_at if note.closed? + json.closed_at note.closed_at.to_s if note.closed? json.comments(note.comments) do |comment| - json.date comment.created_at + json.date comment.created_at.to_s if comment.author json.uid comment.author.id diff --git a/app/views/api/notes/index.json.jsonify b/app/views/api/notes/index.json.jbuilder similarity index 70% rename from app/views/api/notes/index.json.jsonify rename to app/views/api/notes/index.json.jbuilder index bfc8ffcf8..7909391f5 100644 --- a/app/views/api/notes/index.json.jsonify +++ b/app/views/api/notes/index.json.jbuilder @@ -1,5 +1,5 @@ json.type "FeatureCollection" json.features(@notes) do |note| - json.ingest! render(note) + json.partial! note end diff --git a/app/views/api/notes/show.json.jbuilder b/app/views/api/notes/show.json.jbuilder new file mode 100644 index 000000000..71d9408c2 --- /dev/null +++ b/app/views/api/notes/show.json.jbuilder @@ -0,0 +1 @@ +json.partial! @note diff --git a/app/views/api/notes/show.json.jsonify b/app/views/api/notes/show.json.jsonify deleted file mode 100644 index 10d127291..000000000 --- a/app/views/api/notes/show.json.jsonify +++ /dev/null @@ -1 +0,0 @@ -json.ingest! render(@note) diff --git a/app/views/api/user_preferences/_user_preference.xml.builder b/app/views/api/user_preferences/_user_preference.xml.builder new file mode 100644 index 000000000..ae830bed3 --- /dev/null +++ b/app/views/api/user_preferences/_user_preference.xml.builder @@ -0,0 +1,6 @@ +attrs = { + "k" => user_preference.k, + "v" => user_preference.v +} + +xml.preference(attrs) diff --git a/app/views/api/user_preferences/index.xml.builder b/app/views/api/user_preferences/index.xml.builder new file mode 100644 index 000000000..0a852b269 --- /dev/null +++ b/app/views/api/user_preferences/index.xml.builder @@ -0,0 +1,7 @@ +xml.instruct! + +xml.osm(OSM::API.new.xml_root_attributes) do |osm| + osm.preferences do |preferences| + preferences << (render(@user_preferences) || "") + end +end diff --git a/app/views/messages/destroy.json.jsonify b/app/views/messages/destroy.json.jbuilder similarity index 100% rename from app/views/messages/destroy.json.jsonify rename to app/views/messages/destroy.json.jbuilder diff --git a/app/views/messages/mark.json.jsonify b/app/views/messages/mark.json.jbuilder similarity index 100% rename from app/views/messages/mark.json.jsonify rename to app/views/messages/mark.json.jbuilder diff --git a/app/views/oauth_clients/index.html.erb b/app/views/oauth_clients/index.html.erb index 80cae9a6d..f1dc4afcd 100644 --- a/app/views/oauth_clients/index.html.erb +++ b/app/views/oauth_clients/index.html.erb @@ -6,19 +6,22 @@

<%= t ".my_tokens" %>

<%= t ".list_tokens" %>

- - + + + + + <% @tokens.each do |token| %> - <%= content_tag_for :tr, token do %> + - <% end %> + <% end %>
<%= t ".application" %><%= t ".issued_at" %> 
<%= t ".application" %><%= t ".issued_at" %> 
<%= link_to token.client_application.name, token.client_application.url %> <%= token.authorized_at %> - <%= form_tag :controller => "oauth", :action => "revoke" do %> - <%= hidden_field_tag "token", token.token %> - <%= submit_tag t(".revoke") %> - <% end %> + <%= form_tag :controller => "oauth", :action => "revoke" do %> + <%= hidden_field_tag "token", token.token %> + <%= submit_tag t(".revoke") %> + <% end %>
<% end %> @@ -28,9 +31,9 @@ <% else %>

<%= t ".registered_apps" %>

<% @client_applications.each do |client| %> - <%= div_for client do %> +
<%= link_to client.name, :action => :show, :id => client.id %> - <% end %> +
<% end %> <% end %>

<%= link_to t(".register_new"), :action => :new %>

diff --git a/app/views/traces/show.html.erb b/app/views/traces/show.html.erb index 0ebbd827f..b25ecad53 100644 --- a/app/views/traces/show.html.erb +++ b/app/views/traces/show.html.erb @@ -59,6 +59,6 @@ <% if current_user == @trace.user %> <%= link_to t(".edit_trace"), edit_trace_path(@trace), :class => "button" %> <% end %> - <%= button_to t(".delete_trace"), { :controller => "traces", :action => "delete", :id => @trace.id }, { :data => { :confirm => t(".confirm_delete") } } %> + <%= button_to t(".delete_trace"), { :controller => "traces", :action => "destroy", :method => :delete, :id => @trace.id }, { :data => { :confirm => t(".confirm_delete") } } %> <% end %> diff --git a/bin/setup b/bin/setup index ebdfd0277..9944e82a3 100755 --- a/bin/setup +++ b/bin/setup @@ -1,6 +1,5 @@ #!/usr/bin/env ruby require "fileutils" -include FileUtils # path to your application root. APP_ROOT = File.expand_path("..", __dir__) @@ -9,24 +8,25 @@ def system!(*args) system(*args) || abort("\n== Command #{args} failed ==") end -chdir APP_ROOT do - # This script is a starting point to setup your application. +FileUtils.chdir APP_ROOT do + # This script is a way to setup or update your development environment automatically. + # This script is idempotent, so that you can run it at anytime and get an expectable outcome. # Add necessary setup steps to this file. puts "== Installing dependencies ==" system! "gem install bundler --conservative" system("bundle check") || system!("bundle install") - # Install JavaScript dependencies if using Yarn + # Install JavaScript dependencies # system('bin/yarn') # puts "\n== Copying sample files ==" # unless File.exist?('config/database.yml') - # cp 'config/database.yml.sample', 'config/database.yml' + # FileUtils.cp 'config/database.yml.sample', 'config/database.yml' # end puts "\n== Preparing database ==" - system! "bin/rails db:setup" + system! "bin/rails db:prepare" puts "\n== Removing old logs and tempfiles ==" system! "bin/rails log:clear tmp:clear" diff --git a/config/banners.yml b/config/banners.yml index d8b8ecb49..75e95d741 100644 --- a/config/banners.yml +++ b/config/banners.yml @@ -1,6 +1,6 @@ -sotm_asia_2019: - id: sotm_asia_2019 - alt: State of the Map Asia 2019 - link: https://stateofthemap.asia/ - img: banners/sotm_asia_2019.png - enddate: 2019-nov-03 +sotm_africa_2019: + id: sotm_africa_2019 + alt: State of the Map Africa 2019 + link: https://2019.stateofthemap.africa/ + img: banners/sotm_africa_2019.png + enddate: 2019-nov-24 diff --git a/config/environments/development.rb b/config/environments/development.rb index 9a3976f76..14bf9b54d 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -16,6 +16,7 @@ Rails.application.configure do # Run rails dev:cache to toggle caching. if Rails.root.join("tmp", "caching-dev.txt").exist? config.action_controller.perform_caching = true + config.action_controller.enable_fragment_cache_logging = true config.cache_store = :memory_store config.public_file_server.headers = { @@ -27,7 +28,7 @@ Rails.application.configure do config.cache_store = :null_store end - # Store uploaded files on the local file system (see config/storage.yml for options) + # Store uploaded files on the local file system (see config/storage.yml for options). config.active_storage.service = :local # Don't care if the mailer can't send. @@ -52,13 +53,16 @@ Rails.application.configure do # Suppress logger output for asset requests. config.assets.quiet = true - # Export translations automatically + # Export translations automatically. config.middleware.use I18n::JS::Middleware - # Raises error for missing translations + # Raises error for missing translations. # config.action_view.raise_on_missing_translations = true # Use an evented file watcher to asynchronously detect changes in source code, # routes, locales, etc. This feature depends on the listen gem. config.file_watcher = ActiveSupport::EventedFileUpdateChecker + + # Disable host validation. + config.hosts = [] end diff --git a/config/environments/production.rb b/config/environments/production.rb index ba781e5af..4016be615 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -22,15 +22,12 @@ Rails.application.configure do # Apache or NGINX already handles this. config.public_file_server.enabled = ENV["RAILS_SERVE_STATIC_FILES"].present? - # Compress JavaScripts and CSS. - config.assets.js_compressor = :uglifier + # Compress CSS using a preprocessor. # config.assets.css_compressor = :sass # Do not fallback to assets pipeline if a precompiled asset is missed. config.assets.compile = false - # `config.assets.precompile` and `config.assets.version` have moved to config/initializers/assets.rb - # Enable serving of images, stylesheets, and JavaScripts from an asset server. # config.action_controller.asset_host = 'http://assets.example.com' @@ -38,10 +35,10 @@ Rails.application.configure do # config.action_dispatch.x_sendfile_header = 'X-Sendfile' # for Apache # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for NGINX - # Store uploaded files on the local file system (see config/storage.yml for options) + # Store uploaded files on the local file system (see config/storage.yml for options). config.active_storage.service = Settings.storage_service.to_sym - # Mount Action Cable outside main process or domain + # Mount Action Cable outside main process or domain. # config.action_cable.mount_path = nil # config.action_cable.url = 'wss://example.com/cable' # config.action_cable.allowed_request_origins = [ 'http://example.com', /http:\/\/example.*/ ] @@ -62,9 +59,10 @@ Rails.application.configure do # Use a different cache store in production. # config.cache_store = :mem_cache_store - # Use a real queuing backend for Active Job (and separate queues per environment) + # Use a real queuing backend for Active Job (and separate queues per environment). # config.active_job.queue_adapter = :resque - # config.active_job.queue_name_prefix = "openstreetmap_#{Rails.env}" + # config.active_job.queue_name_prefix = "openstreetmap_production" + config.action_mailer.perform_caching = false # Configure caching of static assets @@ -97,6 +95,27 @@ Rails.application.configure do # Do not dump schema after migrations. config.active_record.dump_schema_after_migration = false unless Settings.status == "database_offline" + # Inserts middleware to perform automatic connection switching. + # The `database_selector` hash is used to pass options to the DatabaseSelector + # middleware. The `delay` is used to determine how long to wait after a write + # to send a subsequent read to the primary. + # + # The `database_resolver` class is used by the middleware to determine which + # database is appropriate to use based on the time delay. + # + # The `database_resolver_context` class is used by the middleware to set + # timestamps for the last write to the primary. The resolver uses the context + # class timestamps to determine how long to wait before reading from the + # replica. + # + # By default Rails will store a last write timestamp in the session. The + # DatabaseSelector middleware is designed as such you can define your own + # strategy for connection switching and pass that into the middleware through + # these configuration options. + # config.active_record.database_selector = { delay: 2.seconds } + # config.active_record.database_resolver = ActiveRecord::Middleware::DatabaseSelector::Resolver + # config.active_record.database_resolver_context = ActiveRecord::Middleware::DatabaseSelector::Resolver::Session + # Enable autoloading of dependencies. config.enable_dependency_loading = true diff --git a/config/environments/test.rb b/config/environments/test.rb index 38975deef..fad06fe51 100644 --- a/config/environments/test.rb +++ b/config/environments/test.rb @@ -1,10 +1,11 @@ +# The test environment is used exclusively to run your application's +# test suite. You never need to work with it otherwise. Remember that +# your test database is "scratch space" for the test suite and is wiped +# and recreated between test runs. Don't rely on the data there! + Rails.application.configure do # Settings specified here will take precedence over those in config/application.rb. - # The test environment is used exclusively to run your application's - # test suite. You never need to work with it otherwise. Remember that - # your test database is "scratch space" for the test suite and is wiped - # and recreated between test runs. Don't rely on the data there! config.cache_classes = true # Do not eager load code on boot. This avoids loading your whole application @@ -21,6 +22,7 @@ Rails.application.configure do # Show full error reports and disable caching. config.consider_all_requests_local = true config.action_controller.perform_caching = false + config.cache_store = :null_store # Raise exceptions instead of rendering exception templates. config.action_dispatch.show_exceptions = false @@ -28,7 +30,7 @@ Rails.application.configure do # Disable request forgery protection in test environment. config.action_controller.allow_forgery_protection = false - # Store uploaded files on the local file system in a temporary directory + # Store uploaded files on the local file system in a temporary directory. config.active_storage.service = :test config.action_mailer.perform_caching = false @@ -41,12 +43,12 @@ Rails.application.configure do # Print deprecation notices to the stderr. config.active_support.deprecation = :stderr - # Export translations automatically + # Export translations automatically. config.middleware.use I18n::JS::Middleware - # Raises error for missing translations + # Raises error for missing translations. config.action_view.raise_on_missing_translations = true - # Use the test adapter for ActiveJob during testing + # Use the test adapter for ActiveJob during testing. config.active_job.queue_adapter = :test end diff --git a/config/eslint.json b/config/eslint.json index cd235e678..7a9e7d4e4 100644 --- a/config/eslint.json +++ b/config/eslint.json @@ -7,7 +7,6 @@ "eslint:recommended" ], "globals": { - "bowser": "readonly", "I18n": "readonly", "L": "readonly", "OSM": "writable", diff --git a/config/initializers/active_storage.rb b/config/initializers/active_storage.rb index bc9091080..361e2edee 100644 --- a/config/initializers/active_storage.rb +++ b/config/initializers/active_storage.rb @@ -1,5 +1,5 @@ -Rails.application.config.active_storage.queue = :storage -Rails.application.config.active_storage.variable_content_types << "image/bmp" +Rails.application.config.active_storage.queues.analysis = :storage +Rails.application.config.active_storage.queues.purge = :storage Rails.configuration.after_initialize do require "active_storage/service/s3_service" @@ -32,5 +32,5 @@ Rails.configuration.after_initialize do ActiveStorage::Variant.prepend(OpenStreetMap::ActiveStorage::Variant) end - ActiveStorage::Service.url_expires_in = 1.week + ActiveStorage.service_urls_expire_in = 1.week end diff --git a/config/initializers/assets.rb b/config/initializers/assets.rb index 255ae108e..156449635 100644 --- a/config/initializers/assets.rb +++ b/config/initializers/assets.rb @@ -9,8 +9,6 @@ Rails.application.config.assets.manifest = Rails.root.join("tmp", "manifest.json # Add additional assets to the asset load path. Rails.application.config.assets.paths << Rails.root.join("config") -# Add additional assets to the asset load path. -# Rails.application.config.assets.paths << Emoji.images_path # Add Yarn node_modules folder to the asset load path. Rails.application.config.assets.paths << Rails.root.join("node_modules") diff --git a/config/initializers/content_security_policy.rb b/config/initializers/content_security_policy.rb index d3bcaa5ec..35d0f26fc 100644 --- a/config/initializers/content_security_policy.rb +++ b/config/initializers/content_security_policy.rb @@ -11,6 +11,8 @@ # policy.object_src :none # policy.script_src :self, :https # policy.style_src :self, :https +# # If you are using webpack-dev-server then specify webpack-dev-server host +# policy.connect_src :self, :https, "http://localhost:3035", "ws://localhost:3035" if Rails.env.development? # # Specify URI for violation reports # # policy.report_uri "/csp-violation-report-endpoint" @@ -19,6 +21,9 @@ # If you are using UJS then enable automatic nonce generation # Rails.application.config.content_security_policy_nonce_generator = -> request { SecureRandom.base64(16) } +# Set the nonce only to specific directives +# Rails.application.config.content_security_policy_nonce_directives = %w(script-src) + # Report CSP violations to a specified URI # For further information see the following documentation: # https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy-Report-Only diff --git a/config/initializers/cors.rb b/config/initializers/cors.rb index 2bd558d2f..7992ecdce 100644 --- a/config/initializers/cors.rb +++ b/config/initializers/cors.rb @@ -1,4 +1,4 @@ -require "rack/cors" +# Be sure to restart your server when you modify this file. # Mark CORS responses as uncacheable as we don't want a browser to # try and reuse a response that had a different origin, even with @@ -18,7 +18,7 @@ end # so browser-requests should be similarly permitted. (Though the API does not # require any custom headers, Ajax frameworks may automatically add headers # such as X-Requested-By to requests.) -Rails.configuration.middleware.use OpenStreetMap::Cors do +Rails.application.config.middleware.insert_before 0, OpenStreetMap::Cors do allow do origins "*" resource "/oauth/*", :headers => :any, :methods => [:get, :post] diff --git a/config/initializers/field_error.rb b/config/initializers/field_error.rb index a3e3d3aac..34b224296 100644 --- a/config/initializers/field_error.rb +++ b/config/initializers/field_error.rb @@ -4,6 +4,6 @@ ActionView::Base.field_error_proc = proc do |html_tag, _instance| if class_attr_index html_tag.insert class_attr_index + 7, "field_with_errors " else - html_tag.insert html_tag.index(%r{/?>}), ' class="field_with_errors"' + html_tag.insert html_tag.index(%r{/?>}), ' class="field_with_errors"'.html_safe end end diff --git a/config/initializers/new_framework_defaults_5_2.rb b/config/initializers/new_framework_defaults_5_2.rb new file mode 100644 index 000000000..c383d072b --- /dev/null +++ b/config/initializers/new_framework_defaults_5_2.rb @@ -0,0 +1,38 @@ +# Be sure to restart your server when you modify this file. +# +# This file contains migration options to ease your Rails 5.2 upgrade. +# +# Once upgraded flip defaults one by one to migrate to the new default. +# +# Read the Guide for Upgrading Ruby on Rails for more info on each option. + +# Make Active Record use stable #cache_key alongside new #cache_version method. +# This is needed for recyclable cache keys. +# Rails.application.config.active_record.cache_versioning = true + +# Use AES-256-GCM authenticated encryption for encrypted cookies. +# Also, embed cookie expiry in signed or encrypted cookies for increased security. +# +# This option is not backwards compatible with earlier Rails versions. +# It's best enabled when your entire app is migrated and stable on 5.2. +# +# Existing cookies will be converted on read then written with the new scheme. +# Rails.application.config.action_dispatch.use_authenticated_cookie_encryption = true + +# Use AES-256-GCM authenticated encryption as default cipher for encrypting messages +# instead of AES-256-CBC, when use_authenticated_message_encryption is set to true. +# Rails.application.config.active_support.use_authenticated_message_encryption = true + +# Add default protection from forgery to ActionController::Base instead of in +# ApplicationController. +# Rails.application.config.action_controller.default_protect_from_forgery = true + +# Store boolean values are in sqlite3 databases as 1 and 0 instead of 't' and +# 'f' after migrating old data. +# Rails.application.config.active_record.sqlite3.represent_boolean_as_integer = true + +# Use SHA-1 instead of MD5 to generate non-sensitive digests, such as the ETag header. +# Rails.application.config.active_support.use_sha1_digests = true + +# Make `form_with` generate id attributes for any generated HTML tags. +# Rails.application.config.action_view.form_with_generates_ids = true diff --git a/config/initializers/new_framework_defaults_6_0.rb b/config/initializers/new_framework_defaults_6_0.rb new file mode 100644 index 000000000..92240ef5f --- /dev/null +++ b/config/initializers/new_framework_defaults_6_0.rb @@ -0,0 +1,45 @@ +# Be sure to restart your server when you modify this file. +# +# This file contains migration options to ease your Rails 6.0 upgrade. +# +# Once upgraded flip defaults one by one to migrate to the new default. +# +# Read the Guide for Upgrading Ruby on Rails for more info on each option. + +# Don't force requests from old versions of IE to be UTF-8 encoded. +# Rails.application.config.action_view.default_enforce_utf8 = false + +# Embed purpose and expiry metadata inside signed and encrypted +# cookies for increased security. +# +# This option is not backwards compatible with earlier Rails versions. +# It's best enabled when your entire app is migrated and stable on 6.0. +# Rails.application.config.action_dispatch.use_cookies_with_metadata = true + +# Change the return value of `ActionDispatch::Response#content_type` to Content-Type header without modification. +# Rails.application.config.action_dispatch.return_only_media_type_on_content_type = false + +# Return false instead of self when enqueuing is aborted from a callback. +# Rails.application.config.active_job.return_false_on_aborted_enqueue = true + +# Send Active Storage analysis and purge jobs to dedicated queues. +# Rails.application.config.active_storage.queues.analysis = :active_storage_analysis +# Rails.application.config.active_storage.queues.purge = :active_storage_purge + +# When assigning to a collection of attachments declared via `has_many_attached`, replace existing +# attachments instead of appending. Use #attach to add new attachments without replacing existing ones. +# Rails.application.config.active_storage.replace_on_assign_to_many = true + +# Use ActionMailer::MailDeliveryJob for sending parameterized and normal mail. +# +# The default delivery jobs (ActionMailer::Parameterized::DeliveryJob, ActionMailer::DeliveryJob), +# will be removed in Rails 6.1. This setting is not backwards compatible with earlier Rails versions. +# If you send mail in the background, job workers need to have a copy of +# MailDeliveryJob to ensure all delivery jobs are processed properly. +# Make sure your entire app is migrated and stable on 6.0 before using this setting. +# Rails.application.config.action_mailer.delivery_job = "ActionMailer::MailDeliveryJob" + +# Enable the same cache key to be reused when the object being cached of type +# `ActiveRecord::Relation` changes by moving the volatile information (max updated at and count) +# of the relation's cache key into the cache version to support recycling cache key. +# Rails.application.config.active_record.collection_cache_versioning = true diff --git a/config/initializers/wrap_parameters.rb b/config/initializers/wrap_parameters.rb index cf733efd1..bbfc3961b 100644 --- a/config/initializers/wrap_parameters.rb +++ b/config/initializers/wrap_parameters.rb @@ -10,5 +10,5 @@ end # To enable root element in JSON for ActiveRecord objects. # ActiveSupport.on_load(:active_record) do -# self.include_root_in_json = true +# self.include_root_in_json = true # end diff --git a/config/locales/ar.yml b/config/locales/ar.yml index 8c7ee56e0..ae4e7c05d 100644 --- a/config/locales/ar.yml +++ b/config/locales/ar.yml @@ -316,6 +316,7 @@ ar: tag: صفحة وصف الويكي للوسم %{key}=%{value} wikidata_link: العنصر %{page} على ويكي بيانات wikipedia_link: مقالة %{page} على ويكيبيديا + wikimedia_commons_link: العنصر %{page} في ويكيميديا ​​كومنز telephone_link: اتصل بـ%{phone_number} colour_preview: معاينة اللون %{colour_value} note: diff --git a/config/locales/ast.yml b/config/locales/ast.yml index 3cc37c646..757b8682b 100644 --- a/config/locales/ast.yml +++ b/config/locales/ast.yml @@ -283,6 +283,7 @@ ast: tag: La páxina wiki de descripción de la etiqueta %{key}=%{value} wikidata_link: L'elementu %{page} en Wikidata wikipedia_link: L'artículu %{page} en Wikipedia + wikimedia_commons_link: L'elementu %{page} en Wikimedia Commons telephone_link: Llamar a %{phone_number} colour_preview: Entever el color %{colour_value} note: @@ -1279,10 +1280,10 @@ ast: de cambios' subject_other: '[OpenStreetMap] %{commenter} comentó sobro un conxuntu de cambios que t''interesa' - your_changeset: '%{commenter} dexó un comentariu n''unu de los tos conxuntos - de cambios creáu el %{time}' - commented_changeset: '%{commenter} dexó un comentariu nun conxuntu de cambios - del mapa que tas siguiendo creáu por %{changeset_author} el %{time}' + your_changeset: '%{commenter} dexó un comentariu a les %{time} n''unu de los + tos conxuntos de cambios' + commented_changeset: '%{commenter} dexó un comentariu a les %{time} nun conxuntu + de cambios del mapa que tas siguiendo creáu por %{changeset_author}' partial_changeset_with_comment: col comentariu '%{changeset_comment}' partial_changeset_without_comment: ensin comentarios details: Puen alcontrase más detalles del conxuntu de cambios en %{url} @@ -1889,7 +1890,9 @@ ast: newer: Traces más nueves trace: pending: PENDIENTE - count_points: '%{count} puntos' + count_points: + one: 1 puntu + other: '%{count} puntos' more: más trace_details: Amosar detalles de la traza view_map: Ver el Mapa diff --git a/config/locales/be-Tarask.yml b/config/locales/be-Tarask.yml index 68c7c5a50..646655b26 100644 --- a/config/locales/be-Tarask.yml +++ b/config/locales/be-Tarask.yml @@ -17,6 +17,9 @@ be-Tarask: submit: diary_comment: create: Захаваць + diary_entry: + create: Апублікаваць + update: Абнавіць issue_comment: create: Дадаць камэнтар message: @@ -24,6 +27,9 @@ be-Tarask: client_application: create: Рэгістрацыя update: Рэдагаваць + redaction: + create: Стварыць рэдакцыю + update: Захаваць рэдакцыю trace: create: Загрузіць update: Захаваць зьмены @@ -33,6 +39,7 @@ be-Tarask: activerecord: errors: messages: + invalid_email_address: не падобны на карэктны адрас э-пошты email_address_not_routable: не маршрутызаваны models: acl: Сьпіс абмежаваньня доступу @@ -156,6 +163,15 @@ be-Tarask: description: Аддаленае кіраваньне (JOSM ці Merkaartor) api: notes: + comment: + 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} entry: full: Поўны тэкст browse: diff --git a/config/locales/bg.yml b/config/locales/bg.yml index be785a2ba..f52404543 100644 --- a/config/locales/bg.yml +++ b/config/locales/bg.yml @@ -1339,7 +1339,9 @@ bg: newer: По-нови следи trace: pending: Обработва се - count_points: '%{count} точки' + count_points: + one: 1 точка + other: '%{count} точки' view_map: Вижте на картата edit: променяне edit_map: Редактиране на картата diff --git a/config/locales/ca.yml b/config/locales/ca.yml index f4f199283..3b2351e05 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -310,6 +310,7 @@ ca: tag: La pàgina de descripció del wiki per a l'etiqueta %{key}=%{value} wikidata_link: L'element %{page} a Wikidata wikipedia_link: L'article %{page} a la Viquipèdia + wikimedia_commons_link: L'element %{page} a Wikimedia Commons telephone_link: Telefona %{phone_number} colour_preview: Previsualització de color %{colour_value} note: @@ -1061,7 +1062,7 @@ ca: search: Cerca search_guidance: 'Cerca incidències:' user_not_found: El compte d’usuari no existeix - issues_not_found: No s'ha trobat cap incidència + issues_not_found: No s'ha trobat cap incidència d'aquest tipus status: Estat reports: Informes last_updated: Darrera actualització @@ -1148,7 +1149,7 @@ ca: vandal_label: Aquest usuari és un vàndal other_label: Un altre note: - spam_label: Aquesta nota és spam + spam_label: Aquesta nota és brossa personal_label: Aquesta nota conté dades personals abusive_label: Aquesta nota és injuriosa other_label: Un altre @@ -1167,7 +1168,7 @@ ca: log_in_tooltip: Inicia una sessió amb un compte existent sign_up: Crea un compte start_mapping: Comença a cartografiar - sign_up_tooltip: Crea un usuari per editar + sign_up_tooltip: Crea un compte per a col·laborar edit: Modifica history: Historial export: Exporta @@ -1187,7 +1188,7 @@ ca: hosting_partners_html: L'allotjament és a càrrec de %{ucl}, %{bytemark} i d'altres %{partners}. partners_ucl: UCL - partners_bytemark: Allotjament Bytemark + partners_bytemark: Bytemark Hosting partners_partners: socis tou: Condicions d’ús osm_offline: La base de dades OpenStreetMap és fora de línia mentre es fan les @@ -1389,9 +1390,9 @@ ca: destroy_button: Suprimeix back: Enrere to: Per a - wrong_user: Heu iniciat la sessió com a "%{user}", però el missatge que voleu - llegir no ha estat enviat per aquest usuari o a aquest usuari. Per a poder - llegir-lo, inicieu la sessió amb l'usuari correcte. + wrong_user: Heu iniciat la sessió com a "%{user}", però aquest usuari no ha + escrit ni ha rebut el missatge que voleu llegir. Per a poder llegir-lo, inicieu + la sessió amb l'usuari correcte. sent_message_summary: destroy_button: Suprimeix mark: @@ -1402,7 +1403,7 @@ ca: site: about: next: Següent - copyright_html: Col·laboradors de
©OpenStreetMap + copyright_html: ©Col·laboradors d'
OpenStreetMap used_by: '%{name} proporciona dades cartogràfiques a milers de llocs web, aplicacions per a mòbils i dispositius' lede_text: OpenStreetMap està fet per una comunitat de cartògrafs que aporten @@ -1418,9 +1419,9 @@ ca: Si voleu conèixer més sobre la comunitat, visiteu els diaris d'usuari, els blogs de la comunitat, i la pàgina web de la Fundació OSM. open_data_title: Dades obertes open_data_html: 'OpenStreetMap són dades lliures: sou lliures d''usar-lo - per a qualsevol propòsit, sempre que doneu crèdit a OpenStreetMap i els seus - contribuïdors. Si modifiqueu o construïu sobre les dades en alguna manera - concreta, podeu distribuir el resultat només sota la mateixa llicència. Vegeu + per a qualsevol propòsit, sempre que especifiqueu que són obra d''OpenStreetMap + i els seus col·laboradors. Si modifiqueu o amplieu les dades de determinades + maneres, només podreu distribuir el resultat sota la mateixa llicència. Vegeu la pàgina de copyright i llicència per a més detalls.' legal_title: Avisos legals @@ -1440,59 +1441,54 @@ ca: foreign: title: Quant a la traducció text: En cas de conflicte entre aquesta pàgina traduïda i %{english_original_link}, - la pàgina en anglès té prioritat + la pàgina en anglès té prevalènça english_link: l'original en anglès native: title: Sobre aquesta pàgina text: Esteu veient la versió anglesa de la pàgina de drets d'autor. Podeu tornar a la %{native_link} d'aquesta pàgina o podeu deixar de llegir sobre - el copyright i anar a %{mapping_link}. - native_link: versió català + els drets d'autor i %{mapping_link}. + native_link: Versió en català mapping_link: Comença a cartografiar legal_babble: title_html: Drets d'autor i llicència intro_1_html: |- - Les dades obertes d'OpenStreetMap® estan publicades sota la open data d'OpenStreetMap® estan publicades sota la llicència de base de dades oberta (ODbL) per la Fundació OpenStreetMap (OSMF). - intro_2_html: "Sou lliure de copiar, distribuir, comunicar públicament i fer-ne - obres \nderivades de les nostres dades, sempre que atribuïu els crèdits - a \nOpenStreetMap i els seus col·laboradors. Si modifiqueu o utilitzeu les\nnostres - dades fer fer obres derivades, només podreu distribuir l'obra \nresultant - amb la mateixa llicència. Aquest \ntext - legal\ncode sencer que explica detalladament els vostres drets i responsabbilitats." - intro_3_html: |- - La cartografia de les nostres tessel·les i la nostra documentació són ofertes - sota llicència Text de la llicència de Creative Commons Reconeixement-Compartir Igual 2.0(CC-BY-SA). - credit_title_html: Com a crèdit OpenStreetMap - credit_1_html: |- - Exigim que l'atribució de drets d'autor sigui “© Col·laboradors d'OpenStreetMap - ”. + intro_2_html: "Sou lliure de copiar, distribuir, comunicar públicament i fer + obres derivades de les nostres dades, sempre que especifiqueu que són obra + d'OpenStreetMap i els seus col·laboradors. Si modifiqueu o amplieu les\nnostres + dades, només podreu distribuir l'obra \nresultant amb la mateixa llicència. + El\ncodi legal + complet explica detalladament els vostres drets i responsabilitats." + intro_3_html: La cartografia de les nostres tessel·les i la nostra documentació + són disponibles sota llicència Text + de la llicència de Creative Commons Reconeixement-Compartir Igual 2.0(CC-BY-SA). + credit_title_html: Com atribuir autoria a OpenStreetMap + credit_1_html: Demanem que es reconegui “© Col·laboradors d'OpenStreetMap” + com a autors. credit_2_html: També heu de deixar clar que les dades són disponibles sota - llicència obereta, i si s'utilitzen les nostres tessel·les de mapes, que - la cartografia és llicenciada com CC-BY-SA. Podeu fer això enllaçant a aquest pàgina de copyright. - D'altra banda, i com a requisit obligatori si voleu distribuir OSM en forma - de dades en brut, podeu citar i enllaçar directament a la llicència. En - el cas d'utilitzar suports on els enllaços d'hipertext no són possibles - (per exemple, obres impreses), us suggerim d'adreçar els lectors a openstreetmap.org - (potser indicant l'adreça completa d'OpenStreetMap), a opendatacommons.org - i si s'escau, a creativecommons.org. + llicència de base de dades oberta i, si utilitzeu els nostres mapes, que + la cartografia té llicència CC-BY-SA. Podeu fer-ho enllaçant a aquesta + pàgina de copyright. De manera alternativa, però com a requisit obligatori + si distribuïu OSM en forma de dades en brut, podeu citar i enllaçar directament + a la llicència. En el cas d'utilitzar suports on els enllaços d'hipertext + no són possibles (per exemple, obres impreses), us suggerim d'adreçar els + lectors a openstreetmap.org (potser indicant l'adreça completa d'OpenStreetMap), + a opendatacommons.org i, si s'escau, a creativecommons.org. credit_3_html: |- En el cas d'un mapa electrònic navegable, els crèdits han d'aparèixer a la cantonada del mapa. Per exemple: attribution_example: - alt: Exemple de com atribuir OpenStreetMap a una pàgina web - title: Exemple d'atribució + alt: Exemple de com atribuir l'autoria a OpenStreetMap en una pàgina web + title: Exemple d'atribució d'autoria more_title_html: Saber-ne més more_1_html: |- - Llegiu més informació sobre com utilitzar les nostres dades, i com donar-ne crèdit, a la pàgina de llicència OSMF i a les Preguntes - Freqüents sobre legalitat. + Per a més informació sobre com utilitzar les nostres dades i com atribuir-ne l'autorita, visiteu la pàgina de llicència de la OSMF. 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 política + oferir una API gratuïta a tercers. Vegeu la política d'ús de l'API, la política d'ús de les tessel·les i la política d'ús de Nominatim. @@ -1500,32 +1496,31 @@ ca: contributors_intro_html: 'Els nostres col·laboradors són milers de persones. També incloem dades amb llicència oberta de les agències públiques de cartografia i d''altres fonts, entre elles:' - contributors_at_html: |- - Àustria: conté dades de - Stadt Wien sota - CC BY. - contributors_au_html: |- - Austràlia: conté dades suburbi basats - en les dades d'Austràlia Oficina d'estadístiques. - contributors_ca_html: |- - Canadà: conté dades de - GeoBase ®, GeoGratis (© Departament de Natural - Recursos Canadà), CanVec (© Departament de Natural - Recursos Canadà) i StatCan (Divisió de Geografia, - Canadà de Estadístiques). + contributors_at_html: 'Àustria: conté dades de Stadt + Wien (sota CC + BY), el Land + Voralberg i el Land Tirol (sota CC + BY AT amb correccions.' + contributors_au_html: 'Austràlia: Conté dades de PSMA + Autralia Limited publicades per Commonwealth of Australia sota els termes + de CC BY 4.0.' + contributors_ca_html: 'Canadà: conté dades de GeoBase ®, + GeoGratis (© Departament de Recursos Naturals de Canadà), CanVec (© Departament + de Recursos Naturals de Canadà) i StatCan (Divisió de Geografia, Institut + d''Estadística de Canadà).' contributors_fi_html: 'Finlàndia: Conté dades de la base de dades topogràfica del National Land Survey of Finland i d''altres bases - de dades, sota la llicència + de dades sota la llicència NLSFI.' contributors_fr_html: |- - França: conté dades d'origen de - Direcció Générale des Impôts. + França: conté dades de la + Direction Générale des Impôts. contributors_nl_html: 'Països Baixos: Conté © dades d''Automotive Navigation Data (AND), 2007 (www.and.com)' contributors_nz_html: 'Nova Zelanda: Conté dades de LINZ Data Service amb permís per a reutilització sota .' contributors_si_html: 'Eslovènia: Conté dades de l''Autoritat - de Topografia i Cartografia i el Ministeri + de Topografia i Cartografia i del Ministeri d''Agricultura, Silvicultura i Alimentació (informació pública d''Eslovènia).' contributors_es_html: |- Spain: Conté dades de l'Institut Geogràfic Nacional espanyol(IGN) i del Sistema Cartgràfic Nacional (SCNE) @@ -1533,16 +1528,15 @@ ca: contributors_za_html: |- Sud-àfrica: conté dades del Chief Directorate: - National Geo-Spatial Information, drets d'autor reservat per l'estat. + National Geo-Spatial Information, drets d'autor reservats per l'estat. contributors_gb_html: 'Regne Unit: Conté dades del Ordnance Survey © Drets d''autor de la Corona i de la base de dades 2010-19.' contributors_footer_1_html: |- Per a més detalls sobre aquesta i d'altres fonts que han estat utilitzades per millorar els mapes de l'OpenStreetMap, visiteu la pàgina dedicada als Col·laboradors del wiki d'OSM. - contributors_footer_2_html: |- - Inclusió de dades en OpenStreetMap no implica que l'original - el proveïdor de dades recolza OpenStreetMap, proporciona cap garantia, o - accepta qualsevol responsabilitat. + contributors_footer_2_html: La inclusió de dades a l'OpenStreetMap no implica + que el proveïdor original de les dades dona suport a l'OpenStreetMap, proporciona + cap garantia o accepta cap responsabilitat. infringement_title_html: Violació dels drets d'autor infringement_1_html: Recordem als col·laboradors de l'OSM que mai no s'han d'afegir dades de cap font amb drets d'autor registrats (com Google Maps @@ -1559,8 +1553,8 @@ ca: sobre l’ús de les marques, consulteu la política de marques registrades. index: - js_1: Tampoc està utilitzant un navegador que no suporta JavaScript o té deshabilitat - JavaScript. + js_1: O bé esteu utilitzant un navegador no compatible amb JavaScript o bé teniu + JavaScript deshabilitat. js_2: L'OpenStreetMap utilitza JavaScript per al mapa lliscant. permalink: Enllaç permanent shortlink: Enllaç curt @@ -1568,60 +1562,59 @@ ca: license: copyright: Copyright d'OpenStreetMap i els seus col·laboradors sota llicència oberta - 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 + remote_failed: L'edició ha fallat. Assegureu-vos que el JOSM o el Merkaartor + està executant-se i que l'opció de comandament a distància està habilitada edit: - not_public: No heu fet les configuracions necessàries perquè les vostres modificacions - siguin públiques. + not_public: No heu configurat les vostres modificacions perquè 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}. user_page_link: pàgina d'usuari - anon_edits_link_text: Esbrina perquè aquest és el cas. + anon_edits_link_text: Llegeix aquí perquè. flash_player_required: Necessiteu un reproductor de Flash per a usar el Potlatch, l'editor Flash de l'OpenStreetMap. Podeu baixar el reproductor Flash Player des del web Adobe.com. També hi ha altres opcions per a editar l'OpenStreetMap. potlatch_unsaved_changes: Teniu canvis sense desar. (Per desar els canvis al - Potlatch, heu de desseleccionar la via o el punt actual, si esteu en l'edicó - en viu, o fer clic a "desa", si teniu un botó "desa".) + Potlatch, desseleccioneu la via o el punt actuals si esteu en mode d'edició + en viu o feu clic a "Desa" si teniu un botó "Desa".) potlatch2_not_configured: No s'ha configurat el Potlatch 2 - mireu http://wiki.openstreetmap.org/wiki/The_Rails_Port#Potlatch_2 per a més informació potlatch2_unsaved_changes: Teniu canvis sense desar. (Per desar els canvis al - Potlatch 2, heu de fer clic a "desa".) + Potlatch 2, feu clic a "Desa".) id_not_configured: iD no s'ha configurat - no_iframe_support: El navegador no suporta iframes HTML, que són necessàries - per a aquesta funcionalitat. + no_iframe_support: El vostre navegador no és compatible amb iframes HTML, que + són necessàries per a aquesta funcionalitat. export: - title: Exportar + title: Exporta area_to_export: Àrea a exportar manually_select: Selecciona manualment una àrea diferent format_to_export: Format d'exportació - osm_xml_data: OpenStreetMap XML Data + osm_xml_data: Dades XML d'OpenStreetMap map_image: Imatge de mapa (mostra una capa estàndard) - embeddable_html: HTML que es pot incloure + embeddable_html: HTML incrustable licence: Llicència export_details: Les dades d'OpenStreetMap són publicades sota el termes de la - llicència Creative - Commons Attribution-ShareAlike 2.0. + Open Data Commons + Open Database License (ODbL). too_large: - advice: 'Si falla l''exportació anterior, si us plau, penseu a utilitzar una - de les fonts llistades a continuació:' - body: Aquesta zona és massa gran per ser exportada com a dades XML de OpenStreetMap. - Si us plau seleccioneu una àrea més petita o bé una de les següents fonts + advice: 'Si l''exportació anterior falla, proveu-ho amb alguna de les fonts + incloses a la llista següent:' + body: Aquesta zona és massa gran per ser exportada com a dades XML d'OpenStreetMap. + Feu zoom, seleccioneu una àrea més petita o useu una de les següents fonts per descarregar quantitats grans de dades. planet: title: Planeta OSM description: Còpies actualitzades regularment de la base de dades d'OpenStreetMap al complet overpass: - title: API Overpass - description: Descarrega aquest requadre des d'una rèplica de la base de - dades d'OpenStreetMap + title: Overpass API + description: Descarrega aquest requadre delimitador des d'una rèplica de + la base de dades d'OpenStreetMap geofabrik: title: Descàrregues de Geofabrik description: Extractes actualitzats regularment de continents, països i - de les ciutats seleccionades + ciutats seleccionades metro: title: Extractes de Metro description: Extractes per a les ciutats més grans del món i les seves àrees @@ -1639,7 +1632,7 @@ ca: latitude: 'Lat:' longitude: 'Lon:' output: Sortida - paste_html: Enganxa HTML per incloure'l al lloc web + paste_html: Enganxa HTML per incrustar-lo al lloc web export_button: Exporta fixthemap: title: Informeu d'un problema / Corregiu el mapa @@ -1647,29 +1640,29 @@ ca: title: Com contribuir join_the_community: title: Afegiu-vos a la comunitat - explanation_html: Si heu trobat un problema amb les nostres dades del mapa, - com per exemple l'omissió d'una carretera o bé de la vostra adreça, la - millor forma d'arreglar-ho és unint-se a la comunitat d'OpenStreetMap - i afegir o bé corregir les dades vós mateix. + explanation_html: Si heu trobat un error en el mapa, com per exemple una + carretera que falta o bé la vostra adreça, la millor forma d'arreglar-ho + és unint-vos a la comunitat d'OpenStreetMap i afegir o bé corregir les + dades vós mateix. add_a_note: instructions_html: Feu clic a o a la mateixa icona sobre el mapa. Això afegirà un marcador al mapa, que podeu desplaçar arrossegant-lo. Afegiu el vostre missatge, deseu-lo i els altres usuaris ho investigaran. other_concerns: - title: Altres aspectes - explanation_html: Si us preocupa la utilització de les nostres dades o bé - el contingut d'aquestes, consulteu la pàgina de drets - d'autor per a més informació, o bé contacteu el grup + title: Altres qüestions + explanation_html: Si us preocupa el contingut de les nostres dades o l'ús + que se'n fa, consulteu la pàgina de drets d'autor + per a més informació, o bé contacteu amb el grup de treball d'OSMF corresponent. help: - title: Obtenir ajuda - introduction: OpenStreetMap té multitud de recursos per conèixer aquest projecte, - per plantejar i respondre preguntes, i per participar en discussions col·laboratives - i documentar temes de cartografia. + title: Com obtenir ajuda + introduction: OpenStreetMap té diversos recursos per conèixer el projecte, per + plantejar i respondre preguntes, i per discutir i documentar temes de cartografia + de manera col·laborativa. welcome: url: /welcome title: Benvingut a OpenStreetMap - description: Comença amb aquesta guia ràpida sobre els aspectes bàsics de + description: Comenceu amb aquesta guia ràpida sobre els aspectes bàsics de l'OpenStreetMap. beginners_guide: url: http://wiki.openstreetmap.org/wiki/Ca:Beginners%27_guide @@ -1682,26 +1675,26 @@ ca: i respostes d'OpenStreetMap. 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. + description: Pregunta o debat sobre qüestions interessants en un ampli ventall + de llistes de correu temàtiques i 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. + description: Preguntes i debats per als que prefereixen un estil d'interfície + de 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. + description: Ajuda per a empreses i organitzacions que volen migrar als mapes + i altres serveis basats en OpenStreetMap. welcomemat: url: https://welcome.openstreetmap.org/ title: Per a organitzacions description: Ets amb una organització que vol usar OpenStreetMap? Troba el que et cal saber a la nostra estoreta de benviguda. wiki: - url: http://wiki.openstreetmap.org/ + url: https://wiki.openstreetmap.org/ title: Wiki d'OpenStreetMap description: Navegueu per la wiki per a trobar documentació detallada d'OpenStreetMap. sidebar: @@ -1709,7 +1702,7 @@ ca: close: Tanca search: search: Cerca - get_directions: Obtenir indicacions + get_directions: Obtén indicacions get_directions_title: Trobeu indicacions entre dos punts from: De to: A @@ -1722,16 +1715,16 @@ ca: entry: motorway: Autopista main_road: Carretera principal - trunk: Autovia de + trunk: Autovia primary: Carretera principal secondary: Carretera secundària unclassified: Carretera sense classificar track: Pista bridleway: Camí de ferradura cycleway: Carril bici - cycleway_national: Via ciclista nacional - cycleway_regional: Via ciclista regional - cycleway_local: Via ciclista local + cycleway_national: Carril bici nacional + cycleway_regional: Carril bici regional + cycleway_local: Carril bici local footway: Camí de vianants rail: Ferrocarril subway: Metro @@ -1739,24 +1732,24 @@ ca: - Tren lleuger - tramvia cable: - - Cable car + - Telefèric - telecadira runway: - Pista d'aeroport - - carril de taxi + - carrer de rodada apron: - - Davantal de l'Aeroport + - Estacionament d'avions - terminal - admin: Límits administratius + admin: Límit administratiu forest: Bosc wood: Fusta golf: Camp de golf park: Parc resident: Zona residencial common: - - Comú - - Prat - retail: Zona de venda al detall + - Àrea comunal + - prat + retail: Àrea comercial industrial: Zona industrial commercial: Zona comercial heathland: Bruguerar @@ -1764,7 +1757,7 @@ ca: - Llac - Embassament farm: Granja - brownfield: Lloc Brownfield + brownfield: Àrea industrial abandonada cemetery: Cementiri allotments: Horts pitch: Camp d'esports @@ -1779,13 +1772,13 @@ ca: summit: - Cim - pic - tunnel: Carcassa de guions = túnel - bridge: Embolcall negre = bridge + tunnel: Línia discontínua = túnel + bridge: Línia negra = bridge private: Accés privat - destination: Accés de destinació + destination: Servitud de pas construction: Carreteres en construcció bicycle_shop: Botiga de bicicletes - bicycle_parking: Aparcament de bicicleta + bicycle_parking: Aparcament de bicicletes toilets: Lavabos richtext_area: edit: Modifica @@ -1794,7 +1787,7 @@ ca: title_html: Analitzat amb kramdown headings: Encapçalaments heading: Encapçalament - subheading: Subencapçalament + subheading: Subtítol unordered: Llista sense ordenar ordered: Llista ordenada first: Primer element @@ -1805,43 +1798,42 @@ ca: alt: Text alternatiu url: URL welcome: - title: Benvingut! - introduction_html: Us donem la benvinguda a l'OpenStreetMap, el mapa lliure - i editable del món. Ara que ja us heu registrat, ja ho teniu tot a punt per - començar a editar el mapa. Aquí hi ha una guia ràpida amb les coses més importants + title: Us donem la benvinguda! + introduction_html: Us donem la benvinguda a l'OpenStreetMap, el mapamundi lliure + i editable. Ara que ja us heu registrat, ja ho teniu tot a punt per començar + a editar el mapa. Aquí hi ha una guia ràpida amb les coses més importants que cal saber whats_on_the_map: title: Què hi ha al mapa - on_html: L'OpenStreetMap és un lloc per incloure al mapa coses que són reals - i normals- això inclou milions d'edificis, carreteres, i altres detalls - sobre llocs. Pots cartografiar totes les característiques del món real que - et semblin interessants. + on_html: L'OpenStreetMap cartografia coses que són reals i actuals- + això inclou milions d'edificis, carreteres i altres detalls sobre llocs. + Pots cartografiar totes els elements del món real que et semblin interessants. off_html: El que no inclou són dades subjectives com ara puntuacions, - característiques històriques o hipotètiques i dades de fonts subjectes a - copyright. A no ser que posseeixis un permís especial no copiïs res de mapes - de paper o en línia. + característiques històriques o hipotètiques i dades de fonts amb drets d'autor. + Tret que posseeixis un permís especial, no copiïs res de mapes de paper + o en línia. basic_terms: title: Condicions bàsiques per editar el mapa - paragraph_1_html: l'OpenStreetMap té algunes paraules del seu propi argot. - Aquí hi han unes quantes paraules clau que et poden venir bé. + paragraph_1_html: L'OpenStreetMap té un argot propi. Aquí tens unes quantes + paraules clau que et poden venir bé. editor_html: Un editor és un programa o pàgina web que pots utilitzar per editar el mapa. node_html: Un node és un punt al mapa, com ara un restaurant o un arbre. way_html: Una via és una línia o àrea, com ara una carretera, - sèquia, llac o edifici. + un rierol, un llac o un edifici. tag_html: Una etiqueta é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 + paragraph_1_html: "L'OpenStreetMap té poques les regles formals però 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' \nImportació + Si voler dur a terme\naltres activitats que no siguin l'edició manual, llegiu + i seguiu les directrius d' \nImportació i \nEdició Automàtica." questions: - title: Alguna pregunta més? + title: Alguna pregunta? paragraph_1_html: "OpenStreetMap té diversos recursos per a conèixer aquest projecte, per a plantejar i respondre preguntes, i per a debatre i documentar de forma col·laborativa qüestions de cartografia. \nAjuda. @@ -1849,23 +1841,24 @@ ca: un cop d'ull a la nostra estoreta de benviguda." start_mapping: Comença a editar el mapa add_a_note: - title: No tens temps per editar? Afegeix una nota! + title: No tens temps per editar? Escriu una nota paragraph_1_html: Si només voleu fer una petita modificació però no disposeu - del temps per registrar-vos i aprendre com editar, deixeu una nota al mapa. + del temps per registrar-vos i aprendre a editar, deixeu una nota al mapa. paragraph_2_html: 'Només cal que us dirigiu almapa - i cliqueu l''icona de la nota: . Això afegirà + i cliqueu la icona de la nota: . Això afegirà un marcador al mapa que podeu moure arrossegant-lo. Afegiu el vostre missatge, - cliqueu el botó de desat, i altres usuaris ho investigaran.' + cliqueu el botó de desar, i altres usuaris ho investigaran.' traces: visibility: - private: Privat (només compartit com anònim, el punts són desordenats) - public: Públic (mostrat en llista de traça i com anònims, desordenada punts) - trackable: Seguiments (només compartit com punts anònims, ordenades amb timestamps) - identifiable: Identifiable (mostrat en llista de traça i com a punts d'identificació, - ordenades amb timestamps) + private: Privat (només compartit com a punts anònims no ordenats) + public: Públic (mostrat a la llista de traces i com a punts anònims no ordenats) + trackable: Traçable (només compartit com a punts anònims ordenats segons marques + temporals) + identifiable: Identificable (mostrat a la llista de traes i com a punts identificables + ordenats segons marques temporals) new: - upload_trace: Carrega una traça GPS - upload_gpx: 'Carregui l''arxiu GPX:' + upload_trace: Puja una traça GPS + upload_gpx: 'Puja l''arxiu GPX:' description: 'Descripció:' tags: 'Etiquetes:' tags_help: separat per comes @@ -1876,19 +1869,19 @@ ca: help: Ajuda help_url: https://wiki.openstreetmap.org/wiki/Upload create: - upload_trace: Pujar traça de GPS - trace_uploaded: El fitxer GPX s'ha pujat i està pendent d'inserció a la base - de dades. Això passarà en general dins d'una mitja hora, i se us enviarà un - correu electrònic en finalitzar. + upload_trace: Puja una traça de GPS + trace_uploaded: El fitxer GPX s'ha pujat i està pendent de ser inclòs a la base + de dades. Aquest procés triga generalment una mitja hora. Rebreu un correu + electrònic quan s'hagi completat. upload_failed: No s'ha pogut carregar el GPX. Un administrador ha estat alertat de l'error. Proveu-ho de nou traces_waiting: - one: Teniu %{count} traça esperant en cua per a pujar. Considereu esperar - a que aquesta traça acabi abans de pujar-ne més, així no blocareu la cua - per a altres usuaris. - other: Teniu %{count} traces esperant en cua per a pujar. Considereu esperar - a que aquestes traces acabin abans de pujar-ne més, així no blocareu la - cua per a altres usuaris. + one: Teniu %{count} traça esperant en cua per a pujar. Espereu a que aquesta + traça acabi abans de pujar-ne més, per tal de no blocar la cua per a altres + usuaris. + other: Teniu %{count} traces esperant en cua per a pujar. Espereu a que aquestes + traces acabin abans de pujar-ne més, per tal de no blocar la cua per a altres + usuaris. edit: title: Editant traça %{name} heading: Editant traça %{name} @@ -1896,7 +1889,7 @@ ca: download: descàrrega uploaded_at: 'Pujat a:' points: 'Punts:' - start_coord: 'Coordenada d''inici:' + start_coord: 'Coordenades d''inici:' map: mapa edit: modificació owner: 'Propietari:' @@ -1904,7 +1897,7 @@ ca: tags: 'Etiquetes:' tags_help: separat per comes visibility: 'Visibilitat:' - visibility_help: Què vol dir això? + visibility_help: què vol dir això? update: updated: Traça actualitzada trace_optionals: @@ -1917,13 +1910,13 @@ ca: download: baixada uploaded: 'Pujat el:' points: 'Punts:' - start_coordinates: 'coordenada d''inici:' + start_coordinates: 'Coordenades d''inici:' map: mapa edit: modificació owner: 'Propietari:' description: 'Descripció:' tags: 'Etiquetes:' - none: Ningú + none: Cap edit_trace: Edita aquesta traça delete_trace: Suprimeix aquesta traça trace_not_found: No s'ha trobat la traça! @@ -1932,7 +1925,7 @@ ca: trace_paging_nav: showing_page: Pàgina %{page} older: Traces més antigues - newer: Tracks més recents + newer: Traces més recents trace: pending: PENDENT count_points: @@ -1947,112 +1940,114 @@ ca: identifiable: IDENTIFICABLE private: PRIVAT trackable: RASTREJABLE - by: en - in: a + by: per + in: en map: mapa index: public_traces: Traces GPS públiques my_traces: Les meves traçes de GPS - public_traces_from: Tracks GPS públics de %{user} - description: Navega pels tracks pujats recentment - tagged_with: ' etiquetat amb %{tags}' - empty_html: Aquí encara no hi ha res. Pujeu un nou - track o apreneu més sobre els tracks GPS a la pàgina + public_traces_from: Traces GPS públiques de %{user} + description: Navega per les traces pujades recentment + tagged_with: etiquetat amb %{tags} + empty_html: Aquí encara no hi ha res. Pugeu una nova + traça o apreneu més sobre les traces GPS a la pàgina wiki. upload_trace: Puja una traça see_all_traces: Mostra totes les traces see_my_traces: Veure les meves traces delete: - scheduled_for_deletion: Track programat per a ser suprimit + scheduled_for_deletion: Traça programada per a ser suprimida make_public: made_public: Traça feta pública offline_warning: message: El sistema de càrrega de fitxers GPX no està disponible actualment offline: - heading: GPX emmagatzematge fora de línia - message: L'emmagatzematge i el sistema de pujada de fitxers GPX no són operatius + heading: Emmagatzematge GPX fora de línia + message: El sistema d'emmagatzematge i pujada de fitxers GPX no està disponible actualment. georss: title: Traces GPS d'OpenStreetMap description: description_with_count: - one: fitxer GPX amb %{count} punt de %{user} - other: fitxer GPX amb %{count} punts de %{user} + one: Fitxer GPX amb %{count} punt de %{user} + other: Fitxer GPX amb %{count} punts de %{user} description_without_count: Fitxer GPX de %{user} application: permission_denied: No tens permís per a accedir aquesta acció require_cookies: - cookies_needed: Sembla que teniu les galetes inhabilitades - habiliteu les galetes - al navegador abans de continuar. + cookies_needed: Sembla que teniu les galetes inhabilitades al navegador; habiliteu-les + abans de continuar. require_admin: not_an_admin: Cal que sigueu administrador per dur a terme aquesta acció. setup_user_auth: blocked_zero_hour: Teniu un missatge urgent en el lloc web d'OpenStreetMap. Cal que el llegiu per a poder desar els vostres canvis. - blocked: El vostre accés a l'API ha estat blocat. Si us plau, connecteu-vos - a la interfície web per obtenir més informació. - need_to_see_terms: L'accés a l'API és temporalment suspeses. Si us plau, log-in - a la interfície de web per veure els termes de col. laborador. Vostè no necessita - estar d'acord, però cal veure-les. + blocked: El vostre accés a l'API ha estat blocat. Inicieu sessió a la interfície + web per obtenir més informació. + need_to_see_terms: El vostre accés a l'API està suspès temporalment. Inicieu + sessió a la interfície web per veure les condicions de col·laboració. No cal + cal que les accepteu, però sí que les llegiu. oauth: authorize: - title: Autoritzar l'accés al vostre compte + title: Autoritzeu l'accés al vostre compte request_access: L'aplicació %{app_name} sol·licita accés al vostre compte, %{user}. - Marqueu si voleu autoritzar l'aplicació amb les següents funcions. Podeu triar - les que vulgueu. - allow_to: 'Permet la sol·licitud de client per:' - allow_read_prefs: llegiu les vostres preferències d'usuari. - allow_write_prefs: modificar les preferències d'usuari. + Marqueu si voleu autoritzar l'aplicació a tenir les següents funcions. Podeu + triar les que vulgueu. + allow_to: 'Permeteu a l''aplicació client de:' + allow_read_prefs: llegir les vostres preferències d'usuari. + allow_write_prefs: modificar les vostres preferències d'usuari. allow_write_diary: crear entrades de diari, comentaris i fer amics. allow_write_api: modificar el mapa. 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 + grant_access: Permet l'accés authorize_success: title: Sol·licitud d'autorització permesa allowed: Heu permès que l'aplicació %{app_name} accedeixi al vostre compte. verification: El codi de verificació és %{code}. authorize_failure: - title: Sol·licitud d'autorització errònia + title: La sol·licitud d'autorització ha fallat denied: Heu denegat que l'aplicació %{app_name} accedeixi al vostre compte. invalid: El testimoni d’autorització no és vàlid. revoke: - flash: He estat revocat el testimoni per %{application} + flash: Heu anul·lat el testimoni per %{application} permissions: missing: No heu permès l'accés de l'aplicació a aquesta característica oauth_clients: new: - title: Registrar-se una nova aplicació + title: Registreu una nova aplicació edit: - title: Editar la vostra aplicació + title: Editeu la vostra aplicació show: - title: OAuth detalls per %{app_name} - key: 'Clau de consum:' - secret: 'Secret de consum:' - url: 'URL del testimoni de la sol·licitud:' - access_url: 'Accés Fitxa URL:' - authorize_url: 'Autoritza URL:' - support_notice: Suportem les signatures de tipus HMAC-SHA1 (recomanat) i RSA-SHA1. + title: Detalls OAuth per %{app_name} + key: 'Clau de consumidor:' + secret: 'Pregunta secret del consumidor:' + url: 'URL del testimoni de sol·licitud:' + access_url: 'URL del testimoni d''accés:' + authorize_url: 'Autoritzeu URL:' + support_notice: Som compatibles amb les signatures de tipus HMAC-SHA1 (recomanades) + i RSA-SHA1. edit: Edita els detalls - delete: Suprimeix el client + delete: Esborra el client confirm: N'esteu segur? - requests: 'Sol·licitar els permisos següents des de l''usuari:' + requests: 'Demana els permisos següents a l''usuari:' allow_read_prefs: llegir les vostres preferències d'usuari. allow_write_prefs: modificar les vostres preferències d'usuari. allow_write_diary: crear entrades de diari, comentaris i fer amics. allow_write_api: modificar el mapa. - allow_read_gpx: llegir les seves traces GPS privats. - allow_write_gpx: carregar traces GPS. - allow_write_notes: modificar les notes + allow_read_gpx: llegir les vostres traces GPS privades. + allow_write_gpx: pujar traces GPS. + allow_write_notes: modificar notes. index: - title: Les meves dades OAuth - my_tokens: Meves aplicacions autoritzada - list_tokens: 'Les fitxes següents s''han emès per aplicacions en el vostre nom:' - application: Nom d'aplicació + title: Els meus detalls OAuth + my_tokens: Les meves aplicacions autoritzades + list_tokens: 'Els testimonis següents han estat enviats a aplicacions en el + vostre nom:' + application: 'Nom de l’aplicació:' issued_at: Emès A revoke: Revoca! - my_apps: Meves aplicacions de Client + my_apps: Les meves aplicacions client no_apps: ¿Teniu cap aplicació que voldríeu inscriure per usar amb nosaltres utilitzant l'estàndard %{oauth}? Heu de registrar la vostra aplicació web abans que pugui fer peticions OAuth a aquest servei. @@ -2061,105 +2056,105 @@ ca: form: name: Nom required: Requerit - url: Principal aplicació URL - callback_url: Resposta d'URL + url: URL principal de l'aplicació + callback_url: URL de devolució de trucada support_url: URL de suport - requests: 'Sol·licitar els permisos següents des de l''usuari:' - allow_read_prefs: llegir les seves preferències d'usuari. - allow_write_prefs: modificar les seves preferències d'usuari. + requests: 'Sol·licitar els permisos següents a l''usuari:' + allow_read_prefs: llegir les vostres preferències d'usuari. + allow_write_prefs: modificar les vostres preferències d'usuari. allow_write_diary: crear entrades de diari, comentaris i fer amics. allow_write_api: modificar el mapa. - allow_read_gpx: llegir les seves traces GPS privats. + allow_read_gpx: llegir les vostres traces GPS privades. allow_write_gpx: carregar traces GPS. - allow_write_notes: modifcar les notes. + allow_write_notes: modificar notes. not_found: - sorry: Ho sento, no s'ha pogut trobar el %{type}. + sorry: No s'ha pogut trobar aquest %{type}. create: flash: La informació s'ha enregistrat correctament update: - flash: La informació de client ha actualitzat correctament + flash: La informació del client s'ha actualitzat correctament destroy: flash: S'ha destruït el registre de l'aplicació client users: login: title: Accés heading: Accés - email or username: 'Adreça de correu o usuari:' + email or username: 'Adreça de correu o nom d''usuari:' password: 'Contrasenya:' openid: '%{logo} OpenID:' - remember: 'Recorda''m:' + remember: Recorda'm lost password link: Heu perdut la contrasenya? login_button: Accés register now: Registreu-vos-hi ara - with username: 'Ja teniu un compte de l''OpenStreetMap? Incieu sessió amb el + with username: 'Ja teniu un compte de l''OpenStreetMap? Inicieu 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. - create account minute: Crear un compte. Només es triga un minut. + to make changes: Per fer canvis a les dades de l'OpenStreetMap, heu de tenir + un compte. + create account minute: Creeu un compte. Només trigareu un minut. no account: No teniu cap compte? - account not active: Ho sentim, el vostre compte encara no és actiu.
Utilitzeu - l'enllaç al correu de confirmació per activar el vostre compte, o demanar + account not active: El vostre compte encara no és actiu.
Utilitzeu l'enllaç + al correu de confirmació per activar el vostre compte o
demaneu un nou correu electrònic de confirmació. - account is suspended: Ho sentim, s'ha suspès el vostre compte per presentar - una activitat sospitosa.
Contacteu amb el webmestre - si voleu parlar-ne. - auth failure: Ho sentim, no podeu registrar-vos amb aquesta informació. + account is suspended: S'ha suspès el vostre compte a causa d'activitat sospitosa.
Contacteu amb el l'administrador del web per + parlar-ne. + auth failure: No podeu iniciar la sessió 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 + alt: Inicia sessió amb una URL OpenID google: title: Inicieu la sessió amb Google - alt: Inici de sessió amb un compte OpenID de Google + alt: Inicieu la sessió amb un compte OpenID de Google facebook: title: Inicieu la sessió amb Facebook - alt: Entrar amb un Compte de Facebook + alt: Inicieu la sessió amb un compte de Facebook windowslive: - title: Inici de sessió amb Windows Live - alt: Inici de sessió amb un Compte de Windows Live + title: Inicieu la sessió amb Windows Live + alt: Inicieu de sessió amb un compte de Windows Live github: - title: Inicia la sessió amb GitHub - alt: Inicia la sessió amb un compte de GitHub + title: Inicieu la sessió amb GitHub + alt: Inicieu 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 + title: Inicieu la sessió amb Viquipèdia + alt: Inicieu 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 + alt: Inicieu la sessió amb un compte OpenID de Yahoo wordpress: - title: Inicieu sessió amb Wordpress - alt: Inici de sessió amb un compte OpenID de Wordpress + title: Inicieu la sessió amb Wordpress + alt: Inicieu la sessió amb un compte OpenID de Wordpress aol: - title: Inici de sessió amb AOL - alt: Inici de sessió amb un compte OpenID d'AOL + title: Inicieu la sessió amb AOL + alt: Inicieu la sessió amb un compte OpenID d'AOL logout: title: Tanca la sessió heading: Tanca la sessió d'OpenStreetMap logout_button: Tanca la sessió lost_password: - title: contrasenya perduda + title: Contrasenya perduda heading: Heu oblidat la contrasenya? email address: 'Adreça de correu electrònic:' new password button: Restableix la contrasenya - help_text: Introduïu l'adreça de correu electrònic que va utilitzar per registrar-se, - us enviarem un enllaç a ella que pot utilitzar per restablir la contrasenya. - notice email on way: Lamentem que l'hàgiu perdut :-( però us hem enviat un correu, - així podreu restaurar-la ràpidament. - notice email cannot find: Podria no trobar aquesta adreça de correu. + help_text: Introduïu l'adreça de correu electrònic que vau utilitzar per registrar-vos; + us hi enviarem un enllaç per restablir la contrasenya. + notice email on way: Lamentem que l'hàgiu perdut :-( però ja us hem enviat un + correu i la podreu restablir ben aviat. + notice email cannot find: No s'ha trobat aquesta adreça de correu. reset_password: title: Restableix la contrasenya - heading: Restableix la contrasenya per %{user} + heading: Restableix la contrasenya per a %{user} password: 'Contrasenya:' confirm password: 'Confirmeu la contrasenya:' reset: Restableix la contrasenya flash changed: S'ha canviat la contrasenya. - flash token bad: No ha trobat que comproven token, l'URL potser? + flash token bad: No s'ha trobat el testimoni. Comproveu la URL. new: - title: Crear un compte - no_auto_account_create: No us podem crear automàticament un compte. + title: Creeu un compte + no_auto_account_create: No us podem crear un compte automàticament. contact_webmaster: Contacteu amb el webmestre per gestionar la creació d'un compte - intentarem tractar la sol·licitud tan aviat com sigui possible. diff --git a/config/locales/de.yml b/config/locales/de.yml index 188469dd8..ed36779ae 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -52,6 +52,7 @@ # Author: Purodha # Author: Raymond # Author: Reneman +# Author: Schmackes # Author: SimonPoole # Author: Snocker15 # Author: Str4nd @@ -83,8 +84,8 @@ de: create: Registrieren update: Bearbeiten redaction: - create: Publikation erstellen - update: Publikation speichern + create: Redaction erstellen + update: Redaction speichern trace: create: Hochladen update: Änderungen speichern @@ -94,11 +95,10 @@ de: activerecord: errors: messages: - invalid_email_address: Die eingegebene E-Mail-Adresse scheint nicht gültig - zu sein. - email_address_not_routable: ist nicht routbar + invalid_email_address: scheint keine gültige E-Mail-Adresse zu sein + email_address_not_routable: ist nicht routingfähig models: - acl: Zugangskontrollliste + acl: Zugriffssteuerungsliste changeset: Änderungssatz changeset_tag: Änderungssatz-Attribut country: Staat @@ -111,16 +111,16 @@ de: node_tag: Knoten-Attribut notifier: Benachrichtiger old_node: Alter Knoten - old_node_tag: Altes Knoten-Attribut + old_node_tag: Alter-Knoten-Attribut old_relation: Alte Relation - old_relation_member: Altes Relations-Mitglied - old_relation_tag: Altes Relations-Attribut + old_relation_member: Alte-Relation-Mitglied + old_relation_tag: Alte-Relation-Attribut old_way: Alte Linie - old_way_node: Alter Linien-Knoten - old_way_tag: Altes Linien-Attribut + old_way_node: Alte-Linie-Knoten + old_way_tag: Alte-Linie-Attribut relation: Relation relation_member: Relations-Mitglied - relation_tag: Relations-Attribut + relation_tag: Relation-Attribut session: Sitzung trace: Track tracepoint: Trackpunkt @@ -130,10 +130,10 @@ de: user_token: Benutzer-Token way: Linie way_node: Linienknoten - way_tag: Linienattribut + way_tag: Linie-Attribut attributes: diary_comment: - body: Text + body: Textkörper diary_entry: user: Benutzer title: Betreff @@ -155,7 +155,7 @@ de: message: sender: Absender title: Betreff - body: Text + body: Textkörper recipient: Empfänger user: email: E-Mail @@ -342,6 +342,7 @@ de: tag: Die Wiki-Erläuterungsseite für das Attribut %{key}=%{value} wikidata_link: Das Objekt %{page} auf Wikidata wikipedia_link: Der Artikel zu %{page} in der Wikipedia + wikimedia_commons_link: Das %{page} Element auf Wikimedia Commons telephone_link: '%{phone_number} anrufen' colour_preview: Farbe %{colour_value} Vorschau note: diff --git a/config/locales/el.yml b/config/locales/el.yml index 88f7dfb81..f45f37695 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -132,7 +132,43 @@ el: pass_crypt: Κωδικός datetime: distance_in_words_ago: + about_x_hours: + one: περίπου μία ώρα πριν + other: περίπου %{count} ώρες πριν + about_x_months: + one: περίπου έναν μήνα πριν + other: περίπου %{count} μήνες πριν + about_x_years: + one: περίπου έναν χρόνο πριν + other: περίπου %{count} χρόνια πριν + almost_x_years: + one: σχεδόν ένα χρόνο πριν + other: σχεδόν %{count} χρόνια πριν half_a_minute: μισό λεπτό πριν + less_than_x_seconds: + one: λιγότερο από ένα δευτερόλεπτο πριν + other: λιγότερο από %{count} δευτερόλεπτα πριν + less_than_x_minutes: + one: λιγότερο από ένα λεπτό πριν + other: λιγότερο από %{count} λεπτά πριν + over_x_years: + one: πάνω από έναν χρόνο πριν + other: πάνω από %{count} χρόνια πριν + x_seconds: + one: ένα δευτερόλεπτο πριν + other: '%{count} δευτερόλεπτα πριν' + x_minutes: + one: ένα λεπτό πριν + other: '%{count} λεπτά πριν' + x_days: + one: μία ημέρα πριν + other: '%{count} ημέρες πριν' + x_months: + one: έναν μήνα πριν + other: '%{count} μήνες πριν' + x_years: + one: ένα χρόνο πριν + other: '%{count} χρόνια πριν' printable_name: with_version: '%{id}, v%{version}' editor: diff --git a/config/locales/en-GB.yml b/config/locales/en-GB.yml index 2a87a59b7..a5157a12d 100644 --- a/config/locales/en-GB.yml +++ b/config/locales/en-GB.yml @@ -15,6 +15,7 @@ # Author: IknowJoseph # Author: Jagwar # Author: Jguthrie100 +# Author: Jlrb+ # Author: Kosovastar # Author: Macofe # Author: Meno25 @@ -1614,8 +1615,8 @@ en-GB: will be sent to you on completion. traces_waiting: one: You have %{count} trace waiting for upload. Please consider waiting for - these to finish before uploading any more, so as not to block the queue - for other users. + this to finish before uploading any more, so as not to block the queue for + other users. other: You have %{count} traces waiting for upload. Please consider waiting for these to finish before uploading any more, so as not to block the queue for other users. diff --git a/config/locales/eo.yml b/config/locales/eo.yml index bb143a1a0..22a4584c7 100644 --- a/config/locales/eo.yml +++ b/config/locales/eo.yml @@ -235,8 +235,8 @@ eo: title_comment: Ŝanĝaro %{id} - %{comment} join_discussion: Ensalutu por aliĝi al la diskuto discussion: Diskuto - still_open: Ŝanĝaro plue malfermita - diskuto estos malfermita ekde kiam ĝi - estos malfermita. + still_open: Ŝanĝaro plue malfermita - diskuto estos malfermita ekde kiam la + ŝanĝaro estos fermita. node: title: 'Nodo: %{name}' history_title: 'Historio de nodo: %{name}' @@ -297,6 +297,7 @@ eo: tag: La viki-paĝo priskribanta la etikedon '%{key}=%{value}' wikidata_link: La %{page} elemento en Vikidatumoj wikipedia_link: La artikolo %{page} en Vikipedio + wikimedia_commons_link: Objekto %{page} ĉe Vikimedia Komunejo telephone_link: Telefoni %{phone_number} colour_preview: AntaÅ­vido de koloro “%{colour_value}” note: diff --git a/config/locales/fa.yml b/config/locales/fa.yml index 7c55655bf..7fcd4acc7 100644 --- a/config/locales/fa.yml +++ b/config/locales/fa.yml @@ -914,7 +914,7 @@ fa: clothes: فروشگاه پوشاک computer: فروشگاه رایانه confectionery: فروشگاه قنادی - convenience: فروشگاه زنجیره ای + convenience: سوپرمارکت copyshop: مغازه فتوکپی cosmetics: فروشگاه لوازم آرایشی deli: اغذیه فروشی @@ -966,7 +966,7 @@ fa: shoes: فروشگاه کفش sports: فروشگاه ورزشی stationery: فروشگاه نوشت‌افزار - supermarket: سوپرمارکت + supermarket: فروشگاه بزرگ tailor: خیاطی ticket: فروشگاه بلیط tobacco: فروشگاه توتون و تنباکو @@ -1606,11 +1606,11 @@ fa: description: دریافت این محدوده از یکی از آینه‌های پایگاه‌دادهٔ OpenStreetMap geofabrik: title: دانلودهای Geofabrik - description: گزیدهٔ اطلاعات قاره‌ها، کشورها، و شهرهای منتخب که به‌طور منظم + description: استخراج اطلاعات قاره‌ها، کشورها، و شهرهای منتخب که به‌طور منظم روزآمد می‌شود metro: title: خلاصه های مترو - description: خلاصه هایی برای شهرهای بزرگ جهان و مناطق اطرافشان + description: استخراج‌هایی برای شهرهای بزرگ جهان و مناطق اطرافشان other: title: سایر منابع description: منابع بیشتر در ویکی OpenStreetMap ذکر شده است diff --git a/config/locales/fit.yml b/config/locales/fit.yml index 884d4de8a..563ec8122 100644 --- a/config/locales/fit.yml +++ b/config/locales/fit.yml @@ -66,6 +66,7 @@ fit: tracetag: Jäljen tagi user: Käyttäjä user_preference: Käyttäjän asetus + user_token: Käyttäjän poletti way: Viiva way_node: Viivan piste way_tag: Viivan tagi @@ -435,6 +436,13 @@ fit: geonames_reverse: Hakuresyltaatit GeoNamesista search_osm_nominatim: prefix: + aerialway: + cable_car: Köysirata + chair_lift: Tuolihissi + drag_lift: Vetohissi + gondola: Gondolihissi + platter: Hiihtohissi + pylon: Pylväs amenity: cafe: Kahvila hospital: Siukhuusi @@ -447,6 +455,7 @@ fit: sauna: Sauna school: Skoulu toilets: Tualetit + university: Yniversiteetti leisure: sauna: Sauna office: @@ -493,7 +502,16 @@ fit: states: open: Avvaa resolved: Ratkaistu + update: + new_report: Ilmianto on vastaanotettu + successful_update: Ilmianto on päivitetty + provide_details: Täyennä tarvittavat tiot show: + title: '%{status} Tapaus #%{issue_id}' + reports: + zero: Ei ilmiantoa + one: Yksi ilmianto + other: '%{count} ilmiantoa' report_created_at: Ilmotettu ensimmäisen kerran %{datetime} last_resolved_at: Ratkastu %{datetime} last_updated_at: Viimeisin käsittelijä %{displayname} %{datetime} @@ -506,11 +524,25 @@ fit: other_issues_against_this_user: Muut tähän käyttäjään kohistetut ilmiannot no_other_issues: Ei muita tähän käyttäjään kohistuvia ilmiantoja. comments_on_this_issue: Tapauksen kommentit + resolve: + resolved: Tapaus on markeerattu ratkaistuksi + ignore: + ignored: Tapaus on markeerattu aiheettomaksi + reopen: + reopened: Tapaus on markeerattu käsittelyssä olevaksi comments: created_at: '%{datetime}' + reassign_param: Haluatko määrittää tapauksen tilan uuelleen? reports: updated_at: '%{datetime}' reported_by_html: Käyttäjä %{user} ilmiantanut merkinnällä %{category} + helper: + reportable_title: + diary_comment: '%{entry_title}, kommenttitunnus %{comment_id}' + note: Karttailmoitustunnus %{note_id} + issue_comments: + create: + comment_created: Kommentti jätetty reports: new: title_html: Ilmianna %{link} @@ -604,13 +636,29 @@ fit: changeset_comment_notification: hi: Hei %{to_user}, greeting: Hei, + commented: + partial_changeset_with_comment: kommentin kanssa '%{changeset_comment}' + partial_changeset_without_comment: ei kommenttia + details: 'Lisätioja muutoskokoelmasta: %{url}' + unsubscribe: Peruaksesi tilauksen päivityksistä tähän muutoskokoelmaan, vieraile + sivula %{url} ja klikkaa "Unsubscribe". messages: inbox: + title: Saapuneet my_inbox: Saapuneet outbox: Lähetetyt + messages: Kansiossa on %{new_messages} ja %{old_messages}. + new_messages: + one: '%{count} lukematon viesti' + other: '%{count} lukematonta viestiä' + old_messages: + one: '%{count} luettu viesti' + other: '%{count} luettua viestiä' from: Lähättäjä subject: Otsikko date: Taatumi + no_messages_yet: Ei viestejä. %{people_mapping_nearby_link} + people_mapping_nearby: Lähiseudun kartoittajat message_summary: unread_button: Markeeraa lukemattomaksi read_button: Markeeraa luetuksi @@ -624,14 +672,39 @@ fit: back_to_inbox: Takashiin saapuneisiin create: message_sent: Viesti on lähätetty. + limit_exceeded: Olet lähettänyt runsaasti viestejä lyhyessä ajassa. Odota hetki + ennen kuin yrität lähettää lisää. + no_such_message: + title: Ei sellaista viestiä + heading: Ei sellaista viestiä outbox: + title: Lähätetyt my_inbox: Minun %{inbox_link} + inbox: Saapuneet + outbox: Lähätetyt + messages: + one: Kansiossa on %{count} lähätetty viesti. + other: Kansiossa on %{count} lähätettyä viestiä. + to: Vastaanottaja + subject: Otsikko date: Taatumi + no_sent_messages: Et ole lähettänyt vielä viestejä. Miksi et ottaisi yhteyttä + joihinkin %{people_mapping_nearby_link}? + people_mapping_nearby: lähellä kartoittaviin käyttäjiin + reply: + wrong_user: Olet lokannu sisäle konttulla `%{user}' mutta viestiä, johon tahot + vastata, ei ole lähätetty kyseiselle käyttäjälle. Ole hyvä ja lokkaa sisäle + oikealla käyttäjäkonttulla vastataksesi. show: + title: Lue viesti + from: 'Lähettäjä:' + subject: Otsikko date: Taatumi + reply_button: Vastaa unread_button: Markeeraa lukemattomaksi destroy_button: Ota poies back: Takashiin + to: 'Vastaanottaja:' sent_message_summary: destroy_button: Ota poies mark: @@ -642,11 +715,45 @@ fit: site: about: next: Seuraava + copyright_html: ©OpenStreetMapin
tekijät + used_by: Tuhannet verkkosivustot, mupiilisovellukset 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. + local_knowledge_title: Paikallistuntemus + local_knowledge_html: OpenStreetMapissa korostuu paikallistuntemus. Kartoittajat + käyttävät ilmakuvia, GPS-paikantamia ja jalkautumista pitääkseen OpenStreetMap-kartan + ajan tasalla. + community_driven_title: Yhteisön voima + community_driven_html: |- + OpenStreetMap-yhteisö on monipuolinen, intohimoinen ja kasvaa joka päivä. Yhteisöön kuuluu harrastajakartoittajia, GIS-ammattilaisia, järjestelmää ylläpitäviä insinöörejä, humanitaarisia auttajia, jotka kartoittavat katastrofin kärsineitä alueita sekä monia muita. Lisätietoja yhteisöstä saa lukemalla OpenStreetMap-blogia, käyttäjien päiväkirjoja, + yhteisöblogeja ja + OSM-säätiön verkkosivua. open_data_title: Avoin taatta + open_data_html: 'OpenStreetMap on avointa taattaa: palvelua saa käyttää + vapaasti mihin tahansa, kunhan OpenStreetMap tekijöineen mainitaan. Jos palvelua + kehitetään tai muuunnellaan, sitä saa levittää eteenpäin vain samala lisensillä. + Lisätietoja on Tekijänoikeus ja lisensi + -sivula.' + legal_title: Lakitekninen jako + legal_html: "Tämä ja monet muut OSM-sivustot ovat muodollisesti OpenStreetMap-säätiön + (OSMF) hallinnoimia OSM-yhteisön puolesta. Kaikkien näiden sivustojen käyttöön + sovelletaan \nsallitun + käytön käytäntöjä, käyttöehtoja + ja tietosuojakäytäntöä + (molemmat sisällöt saatavilla vain englanniksi).\n
\nOta + yhteys OSMF:ään lisensointi-, tekijänoikeus- ja muissa lakiteknisissä + kysymyksissä.\n
\nNimi OpenStreetMap, suurennuslasilogo ja slogan State + of the Map ovat säätiön + rekisteröimiä tavaramerkkejä." + partners_title: Kumppanit copyright: foreign: title: Tietoja tästä käänöksestä - english_link: englanninenkielisen alkuperäisversuunin + text: Jos tämän käänätyn sivun ja %{english_original_link} välillä on eroja, + englantinkielinen sivu on aina etusijalla. + english_link: englantinkielisen alkuperäisversuunin native: title: Tästä sivusta text: Tällä sivula on alkuperänen englanninkielinen versuuni tekijäoikeuksista. @@ -669,6 +776,21 @@ fit: Kartta-aineisto ja dokumentaatio on lisensoitu Creative Commons Nimeä-Jaa samoin 2.0 -lisensillä (CC-BY-SA). credit_title_html: OpenStreetMapin mainitseminen + credit_1_html: OpenStreetMapin sisältöä levitettäessä on mainittava teksti + "© OpenStreetMapin tekijät" tai sen englantinkielinen vastine + "© OpenStreetMap contributors". + credit_2_html: "Levittäjän tulee tehdä selväksi, että aineisto on saatavilla + Open Database -lisenssillä\nja kartta-aineisto CC-BY-SA-lisenssillä. Tämä + voidaan tehdä sijoittamalla sivulle linkki\ntälle + tekijänoikeussivulle. \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: 'Sivustolle upotetun interaktiivisen karttaikkunan tulee sisältää + tekijän nimi kartan alaosassa:' + attribution_example: + alt: Esimerkki siitä, miten nimetä OpenStreetMap nettisivulla + title: Nimeämisesimerkki + more_title_html: Lisätietoja contributors_title_html: Meän tekijät index: permalink: Ikunen länkki @@ -681,12 +803,26 @@ fit: format_to_export: Eksporteerausmuoto osm_xml_data: OpenStreetMap XML-taatta licence: Lisensi + too_large: + other: + title: Muut läheet + description: Muut läheet ovat esillä OpenStreetMap-wikissä options: Inställninkit format: 'Fiilimuoto:' + scale: Mittakaava + max: eninthään + image_size: Kuvan koko + zoom: Suurennostaso + add_marker: Lissää vietävään kartaan kohemerkki + latitude: 'Lev:' + longitude: 'Pit:' output: Tulos + paste_html: Kopioi ja liitä tämä HTML-kooti verkkosivulesi export_button: Eksporteeraa fixthemap: + title: Ilmota ongelmasta / Korjaa karttaa how_to_help: + title: Kuinka voin auttaa join_the_community: title: Liity föreeninkhiin help: @@ -708,6 +844,11 @@ fit: search: search: Haku submit_text: Hae + key: + table: + entry: + school: + 1: yniversiteetti richtext_area: edit: Mookkaa preview: Etukattelu @@ -727,7 +868,7 @@ fit: description: 'Kuvvaus:' help: Apua edit: - title: Mookataan jälkeä %{name} + title: Mookathaan jälkeä %{name} filename: 'Fiilinimi:' uploaded_at: 'Ylösladattu:' edit: mookkaa @@ -744,6 +885,16 @@ fit: trace: edit: mookkaa edit_map: Mookkaa karttaa + public: JULKINEN + identifiable: TUNNISTETTAVA + private: YKSITYINEN + trackable: SEURATTAVA + by: käyttäjältä + in: avainsanoilla + map: sijainti kartalla + index: + public_traces: Julkiset GPS-jäljet + my_traces: Minun GPS-jäljet oauth_clients: edit: title: Mookkaa sovellustasi @@ -886,6 +1037,7 @@ fit: comment: Kommentoi directions: instructions: + unnamed: nimetön tie courtesy: Reittiohjeet tarjoaa %{link} exit_counts: first: ensimmäisestä diff --git a/config/locales/fr.yml b/config/locales/fr.yml index abd5b7aa4..4ad3a0a87 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -285,7 +285,7 @@ fr: title_comment: Groupe de modifications %{id} — %{comment} join_discussion: Se connecter pour rejoindre la discussion discussion: Discussion - still_open: Ensemble de modifications toujours ouvert — la discussion s’ouvrira + still_open: Ensemble de modifications toujours ouvert – la discussion s’ouvrira une fois que l’ensemble de modifications sera fermé. node: title: 'Nœud : %{name}' @@ -348,6 +348,7 @@ fr: tag: La description de l’attribut %{key}=%{value} sur le wiki wikidata_link: L’élément %{page} sur Wikidata wikipedia_link: L’article « %{page} » sur Wikipédia + wikimedia_commons_link: L’élément %{page} sur Wikimedia Commons telephone_link: Appeler %{phone_number} colour_preview: Aperçu de la couleur %{colour_value} note: @@ -359,13 +360,13 @@ fr: hidden_title: Note masquée nº %{note_name} open_by: Créée par %{user}, %{when} open_by_anonymous: Créée par un utilisateur anonyme, %{when} - commented_by: Commenté par %{user} %{when} - commented_by_anonymous: Commenté par un utilisateur anonyme %{when} - closed_by: Résolu par %{user} %{when} - closed_by_anonymous: Résolu par un utilisateur anonyme le %{when} + commented_by: Commenté par %{user} %{when} + commented_by_anonymous: Commenté par un utilisateur anonyme %{when} + closed_by: Résolu par %{user} %{when} + closed_by_anonymous: Résolu par un utilisateur anonyme le %{when} reopened_by: Réactivée par %{user}, %{when} - reopened_by_anonymous: Réactivé par un utilisateur anonyme %{when} - hidden_by: Masqué par %{user} %{when} + reopened_by_anonymous: Réactivé par un utilisateur anonyme %{when} + hidden_by: Masqué par %{user} %{when} report: Signaler cette note query: title: Requête sur les objets @@ -375,8 +376,8 @@ fr: changesets: changeset_paging_nav: showing_page: Page %{page} - next: Suivant » - previous: « Précédent + next: Suivant ›› + previous: ‹‹ Précédent changeset: anonymous: Anonyme no_edits: (aucune modification) @@ -404,16 +405,15 @@ fr: met trop de temps pour être chargée. changeset_comments: comment: - comment: Nouveau commentaire sur le groupe de modifications nº %{changeset_id} + comment: Nouveau commentaire sur le groupe de modifications nº %{changeset_id} par %{author} commented_at_by_html: Mis à jour le %{when} par %{user} comments: - comment: Nouveau commentaire sur le groupe de modifications n° %{changeset_id} + comment: Nouveau commentaire sur le groupe de modifications nº %{changeset_id} par %{author} index: title_all: Discussion sur le groupe de modifications OpenStreetMap - title_particular: Discussion sur le groupe de modifications OpenStreetMap nº - %{changeset_id} + title_particular: Discussion sur le groupe de modifications OpenStreetMap nº %{changeset_id} timeout: sorry: Désolé, la liste des commentaires d’ensembles de modifications que vous avez demandée est trop longue à récupérer. @@ -421,12 +421,12 @@ fr: new: title: Nouvelle entrée du journal form: - subject: 'Sujet :' - body: 'Corps :' - language: 'Langue :' - location: 'Lieu :' - latitude: 'Latitude :' - longitude: 'Longitude :' + subject: 'Sujet :' + body: 'Corps :' + language: 'Langue :' + location: 'Lieu :' + latitude: 'Latitude :' + longitude: 'Longitude :' use_map_link: utiliser la carte index: title: Journaux des utilisateurs @@ -450,8 +450,8 @@ fr: login_to_leave_a_comment: '%{login_link} pour laisser un commentaire' login: Se connecter no_such_entry: - title: Pas d’entrée du journal correspondante - heading: 'Aucune entrée avec l’id : %{id}' + title: Aucune entrée du journal correspondante + heading: 'Aucune entrée avec l’id : %{id}' body: Désolé, il n’y a aucune entrée ou commentaire dans le journal avec l’id %{id}. Veuillez vérifier votre orthographe ou la validité du lien que vous avez cliqué. @@ -461,7 +461,7 @@ fr: reply_link: Répondre à cette entrée comment_count: zero: Aucun commentaire - one: '%{count} commentaire' + one: Un commentaire other: '%{count} commentaires' edit_link: Modifier cette entrée hide_link: Masquer cette entrée @@ -475,7 +475,7 @@ fr: confirm: Confirmer report: Signaler ce commentaire location: - location: 'Lieu :' + location: 'Lieu :' view: Afficher edit: Modifier feed: @@ -491,7 +491,7 @@ fr: description: Entrées récentes des journaux d’utilisateurs de OpenStreetMap comments: has_commented_on: '%{display_name} a commenté les entrées de journal suivantes' - post: Article + post: Billet when: Quand comment: Commentaire newer_comments: Commentaires plus récents @@ -504,8 +504,8 @@ fr: osm_nominatim: Résultats de OpenStreetMap Nominatim geonames: Résultats depuis GeoNames - osm_nominatim_reverse: Résultats de OpenStreetMap - Nominatim + osm_nominatim_reverse: Résultats de Nominatim + sur OpenStreetMap geonames_reverse: Résultats de GeoNames search_osm_nominatim: prefix: @@ -667,7 +667,7 @@ fr: emergency_access_point: Point d’accès d’urgence footway: Chemin piéton ford: Gué - give_way: Panneau cédez le passage + give_way: Panneau « Cédez le passage » living_street: Rue en zone de rencontre milestone: Borne kilométrique motorway: Autoroute @@ -690,7 +690,7 @@ fr: services: Services autoroutiers speed_camera: Radar de vitesse steps: Escalier - stop: Signe d'arrêt + stop: Panneau « Stop / Arrêt » street_lamp: Lampadaire tertiary: Route tertiaire tertiary_link: Route tertiaire @@ -710,7 +710,7 @@ fr: bunker: Bunker castle: Château church: Église - city_gate: Porte de ville / porte de fortifications + city_gate: Porte de ville / porte fortifiée citywalls: Remparts / murailles fort: Fort heritage: Site / objet du patrimoine @@ -737,7 +737,7 @@ fr: basin: Bassin brownfield: Friche industrielle cemetery: Cimetière - commercial: Zone tertiaire / Zone d'activités + commercial: Zone tertiaire / Zone d’activités conservation: Zone préservée construction: Zone en construction farm: Ferme @@ -899,12 +899,12 @@ fr: country: Pays county: Comté farm: Ferme - hamlet: Hameau ou lieu-dit habité + hamlet: Hameau habité house: Maison houses: Maisons island: Île islet: Îlot - isolated_dwelling: Lieu-dit habité + isolated_dwelling: Lieu-dit habité isolé locality: Lieu-dit inhabité municipality: Municipalité neighbourhood: Quartier @@ -996,7 +996,7 @@ fr: kiosk: Kiosque kitchen: Magasin de cuisine laundry: Blanchisserie - lottery: Loto + lottery: Loterie mall: Centre commercial market: Marché massage: Massage @@ -1025,7 +1025,7 @@ fr: travel_agency: Agence de voyage tyres: Magasin de pneus vacant: Commerce vacant - variety_store: Magasin à prix unique ou à bas prix + variety_store: Magasin à prix unique ou réduit video: Magasin de vidéos wine: Caviste "yes": Boutique @@ -1083,8 +1083,8 @@ fr: level10: Limite de quartier description: title: - osm_nominatim: Localisation depuis OpenStreetMap - Nominatim + osm_nominatim: Localisation depuis Nominatim + sur OpenStreetMap geonames: Localisation depuis GeoNames types: cities: Villes @@ -1102,17 +1102,18 @@ fr: reported_user: Utilisateur signalé not_updated: Non mis à jour search: Rechercher - search_guidance: 'Problèmes de recherche :' + search_guidance: 'Problèmes de recherche :' user_not_found: L’utilisateur n’existe pas - issues_not_found: Pas trouvé de tel problème + issues_not_found: Aucun problème trouvé de ce type status: État reports: Rapports last_updated: Dernière mise à jour - last_updated_time_html: %{time} - last_updated_time_user_html: à %{time} par %{user} + last_updated_time_html: %{time} + last_updated_time_user_html: à %{time} par %{user} link_to_reports: Afficher les rapports reports_count: - one: 1 rapport + zero: Aucun rapport + one: Un rapport other: '%{count} rapports' reported_item: Élément signalé states: @@ -1124,7 +1125,7 @@ fr: successful_update: Votre rapport a bien été mis à jour provide_details: Veuillez fournir les détails demandés show: - title: '%{status} Problème #%{issue_id}' + title: Problème %{status} nº %{issue_id} reports: zero: Aucun rapport one: 1 rapport @@ -1134,7 +1135,7 @@ fr: last_updated_at: Dernière mise à jour à %{datetime} par %{displayname} resolve: Résoudre ignore: Ignorer - reopen: Réouvrir + reopen: Rouvrir reports_of_this_issue: Rapports de ce problème read_reports: Lire les rapports new_reports: Nouveaux rapports @@ -1142,11 +1143,11 @@ fr: no_other_issues: Aucun autre problème avec cet utilisateur. comments_on_this_issue: Commentaires sur ce problème resolve: - resolved: L’état du problème a été mis à 'Résolu' + resolved: L’état du problème a été mis à « Résolu » ignore: - ignored: L’état du problème a été mis à 'Ignoré' + ignored: L’état du problème a été mis à « Ignoré » reopen: - reopened: L’état du problème a été mis à 'Ouvert' + reopened: L’état du problème a été mis à « Ouvert » comments: created_at: Le %{datetime} reassign_param: Réaffecter le problème ? @@ -1155,8 +1156,8 @@ fr: reported_by_html: Signalé comme %{category} par %{user} helper: reportable_title: - diary_comment: '%{entry_title}, commentaire #%{comment_id}' - note: 'Note #%{note_id}' + diary_comment: '%{entry_title}, commentaire nº %{comment_id}' + note: Note nº %{note_id} issue_comments: create: comment_created: Votre commentaire a bien été créé @@ -1165,15 +1166,15 @@ fr: title_html: Rapport %{link} missing_params: Impossible de créer un nouveau rapport details: Veuillez fournir plus de détails sur le problème (obligatoire). - select: 'Sélectionner un motif pour votre rapport :' + select: 'Sélectionnez un motif pour votre rapport :' disclaimer: intro: 'Avant d’envoyer votre rapport aux modérateurs du site, veuillez vous - assurer que :' - not_just_mistake: Vous êtes certain que le problème n’est pas juste une erreur - unable_to_fix: Vous êtes incapable de régler le problème par vous-même ou - avec l’aide des membres de votre communauté - resolve_with_user: Vous avez déjà essayé de résoudre le problème avec l’utilisateur - concerné + assurer que :' + not_just_mistake: vous êtes certain que le problème n’est pas juste une erreur ; + unable_to_fix: vous êtes incapable de régler le problème par vous-même ou + avec l’aide des membres de votre proche communauté ; + resolve_with_user: vous avez déjà essayé de résoudre le problème avec l’utilisateur + concerné. categories: diary_entry: spam_label: Cette entrée de l’agenda est/contient du pourriel @@ -1227,8 +1228,8 @@ fr: intro_2_create_account: Créez un compte d’utilisateur hosting_partners_html: L’hébergement est pris en charge par %{ucl}, %{bytemark}, et d’autres %{partners}. - partners_ucl: L’University College de Londres - partners_bytemark: l'hébergeur Bytemark + partners_ucl: l’University College de Londres + partners_bytemark: l'Hébergeur Bytemark partners_partners: partenaires tou: Conditions d’utilisation osm_offline: La base de données OpenStreetMap est actuellement hors ligne ; une @@ -1373,16 +1374,18 @@ fr: outbox: boîte d’envoi messages: Vous avez %{new_messages} et %{old_messages} new_messages: - one: '%{count} nouveau message' + zero: zéro nouveau message + one: un nouveau message other: '%{count} nouveaux messages' old_messages: - one: '%{count} ancien message' + zero: aucun ancien message + one: un ancien message other: '%{count} anciens messages' from: De subject: Objet date: Date no_messages_yet: Vous n’avez actuellement aucun message. Pourquoi ne pas entrer - en contact avec quelques %{people_mapping_nearby_link} ? + en contact avec quelques %{people_mapping_nearby_link} ? people_mapping_nearby: personnes qui cartographient aux alentours message_summary: unread_button: Marquer comme non lu @@ -1409,16 +1412,16 @@ fr: inbox: boîte de réception outbox: boîte d’envoi messages: - one: Vous avez %{count} message envoyé + one: Vous n’avez aucun 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 - en contact avec quelques %{people_mapping_nearby_link} ? + 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 + 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. show: @@ -1431,20 +1434,20 @@ fr: destroy_button: Supprimer back: Retour to: À - wrong_user: Vous êtes identifié comme « %{user} » mais le message que vous essayez + wrong_user: Vous êtes identifié comme « %{user} » mais le message que vous essayez 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: destroy_button: Supprimer mark: as_read: Message marqué comme lu - as_unread: Message marqué comme non-lu + as_unread: Message marqué comme non lu destroy: destroyed: Message supprimé site: about: next: Suivant - copyright_html: ©Contributeurs
d’OpenStreetMap + copyright_html: © Contributeurs
d’OpenStreetMap 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 @@ -1460,30 +1463,28 @@ fr: 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 beaucoup d’autres.\nPour en savoir plus sur la communauté, consultez \nle blogue OpenStreetMap,\nles - annuaires d’utilisateurs, \nles - blogues communautaires et \nle site web de la Fondation + et beaucoup d’autres.\nPour en savoir plus sur la communauté, consultez \nle + blogue OpenStreetMap,\nles + journaux d’utilisateurs, \nles blogues + communautaires et \nle site web de la Fondation OSM." - open_data_title: Données libres - open_data_html: 'OpenStreetMap est en données ouvertes : vous êtes libre - de l’utiliser pour n’importe quel but tant que vous créditez OpenStreetMap + open_data_title: Données ouvertes + open_data_html: 'OpenStreetMap est en données ouvertes : vous êtes libre + de l’utiliser dans 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 distribuer le résultat seulement suivant la - même licence. Consultez la page sur les droits + même licence. Consultez la page sur les droits d’auteur et licence pour plus de détails.' - legal_title: Juridique - legal_html: "Ce site et de nombreux autres services connexes sont formellement - exploités par la \nFondation OpenStreetMap - (OSMF) \nau nom de la communauté. L’utilisation de tous les services offerts - par l’OSMF est sujette\nà nos Conditions - d’utilisation, à notre \nPolitique - des usages acceptés et à notre Politique - de confidentialité.\n
\nVeuillez contacter - l’OSMF \nsi vous avez des questions ou problèmes concernant les licences, - les droits d’auteur ou d’autres aspects juridiques.\n
\nOpenStreetMap, - le logo avec la loupe et ''State of the Map'' sont des - marques déposées de OSMF." + legal_title: Informations juridiques + legal_html: |- + Ce site et de nombreux autres services connexes sont formellement exploités par la + Fondation OpenStreetMap (OSMF) au nom de la communauté. L’utilisation de tous les services offerts par l’OSMF est sujette + à nos Conditions d’utilisation, à notre Politique des usages acceptés et à notre Politique de confidentialité. +
+ Veuillez contacter l’OSMF + si vous avez des questions ou problèmes concernant les licences, les droits d’auteur ou d’autres aspects juridiques. +
+ OpenStreetMap, le logo avec la loupe et ''State of the Map'' sont des marques déposées de l’OSMF. partners_title: Partenaires copyright: foreign: @@ -1501,58 +1502,61 @@ fr: legal_babble: title_html: Droits d’auteur et licence intro_1_html: |- - OpenStreetMap® est un ensemble de données ouvertes, disponibles sous licence libre Open Data Commons Open Database License (ODbL) auprès de la ® est un ensemble de données ouvertes, disponibles sous la licence libre Open Data Commons Open Database License (ODbL) accordée par la Fondation OpenStreetMap (OSMF). - intro_2_html: Vous êtes libre de copier, distribuer, transmettre et adapter - nos données, à condition que vous créditiez, OpenStreetMap et ses contributeurs. - Si vous modifiez ou utilisez nos données dans d’autres œuvres dérivées, - vous ne pouvez distribuer celles-ci que sous la même licence. Le texte + intro_2_html: |- + Vous êtes libre de copier, distribuer, transmettre et adapter nos données, + à condition que vous créditiez OpenStreetMap et ses + contributeurs. Si vous modifiez ou utilisez nos données dans d’autres œuvres dérivées, vous + ne pouvez distribuer celles-ci que sous la même licence. Le texte légal complet détaille vos droits et responsabilités. - intro_3_html: Nos carreaux de rendu cartographiques, ainsi que notre documentation, - sont disponibles sous la licence Creative + intro_3_html: |- + Nos carreaux de rendu cartographiques, ainsi que notre documentation, sont disponibles sous + la licence Creative Commons paternité – partage à l’identique 2.0 (CC-BY-SA). credit_title_html: Comment créditer OpenStreetMap - credit_1_html: Nous demandons que votre crédit comporte la mention « © les - contributeurs d’OpenStreetMap ». + credit_1_html: Nous demandons que votre crédit comporte la mention « © les + contributeurs d’OpenStreetMap ». credit_2_html: |- - Vous devez également préciser clairement que les données sont disponibles sous la licence ODbL et, si vous utilisez les tuiles de notre carte, que la carte est sous la licence CC-BY-SA. Vous pouvez mentionner ceci avec un lien hypertexte vers + Vous devez également préciser clairement que les données sont disponibles sous la licence + ODbL (Open Database License) et, si vous utilisez les tuiles de notre carte, que la carte est sous la + licence CC BY-SA. Vous pouvez mentionner ceci avec un lien hypertexte vers cette page de mentions légales. - Alternativement, et obligatoirement si vous distribuez OpenStreetMap sous forme de données brutes, vous pouvez directement nommer et fournir un lien vers la ou les licences. Sur les supports où les liens hypertexte sont impossibles (par exemple sur un support papier), nous vous suggérons de rediriger vos lecteurs vers le site openstreetmap.org (éventuellement en développant « OpenStreetMap » en l’adresse openstreetmap.org), vers opendatacommons.org et, si c’est pertinent, vers creativecommons.org. + Alternativement, et obligatoirement si vous distribuez OpenStreetMap sous forme de données brutes, vous pouvez directement nommer et fournir un lien vers la ou les licences. Sur les supports où les liens hypertexte sont impossibles (par exemple sur un support papier), nous vous suggérons de rediriger vos lecteurs vers le site openstreetmap.org (éventuellement en développant « OpenStreetMap » en son adresse complète openstreetmap.org), vers opendatacommons.org et, si c’est pertinent, vers creativecommons.org. credit_3_html: |- - Pour une carte électronique navigable, le crédit devrait apparaître dans le coin de la carte. + Pour une carte électronique navigable, le crédit devrait apparaître dans un coin de la carte. Par exemple : attribution_example: - alt: Exemple d’attribution d’OpenStreetMap sur une page internet + alt: Exemple d’attribution d’OpenStreetMap sur une page Internet title: Exemple d’attribution more_title_html: Pour trouver plus d’informations more_1_html: |- Pour obtenir plus d’informations sur la façon de réutiliser nos données et de nous créditer, veuillez lire la Licence OSMF et le FAQ Légal. - 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 politique - d’utilisation de l’API, \n à notre politique - d’utilisation des tuiles, \net à la politique - d’utilisation de Nominatim." + 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. + Veuillez vous référer à notre politique d’utilisation de l’API, + à notre politique d’utilisation des tuiles + et à la politique d’utilisation de Nominatim. 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 agences nationales de cartographie et par d’autres sources, notamment :' - contributors_at_html: 'Autriche : contient des données sur - la ville de Vienne (sous licence - CC BY), - la région - du Vorarlberg et la région du Tyrol (sous licence CC - BY AT avec amendements).' - contributors_au_html: "Australie : contient des données source - de \nPSMA - Australia Limited\ndont la licence appartient au Commonwealth d'Australie - sous \nCC BY 4.0." + contributors_at_html: |- + Autriche : contient des données sur la ville de Vienne (sous + licence CC BY), la + région du Vorarlberg et la + région du Tyrol (sous licence CC BY AT avec amendements). + contributors_au_html: |- + Australie : contient des données sourcées de + PSMA Australia Limited publiées sous la licence + CC BY 4.0 accordée par le Commonwealth d’Australie. contributors_ca_html: 'Canada : contient des données de GeoBase®, - GeoGratis (© Département des Ressources naturelles du Canada), - CanVec (© Département des Ressources naturelles du Canada) et StatCan + GeoGratis (© Département des Ressources naturelles du Canada), + CanVec (© Département des Ressources naturelles du Canada) et StatCan (Division Géographie, Statistiques du Canada).' contributors_fi_html: 'Finlande : contient des données de la Base de données topographique de l’Inspection nationale du territoire @@ -1561,8 +1565,8 @@ fr: contributors_fr_html: 'France : contient des données de la Direction générale des finances publiques (anciennement la Direction générale des impôts).' - contributors_nl_html: 'Pays-Bas : contient des données © - AND, 2007 (www.and.com).' + contributors_nl_html: 'Pays-Bas : contient des données © AND, 2007 (www.and.com).' contributors_nz_html: "Nouvelle-Zélande : contient des données provenant du service de données LINZ et pour la réutilisation, sous licence \nCC @@ -1579,9 +1583,10 @@ fr: contributors_za_html: |- Afrique du Sud : contient des données issues de la Direction principale des Informations Géospatiales Nationales, copyright de l’État réservé. - contributors_gb_html: 'Royaume-Uni : contient des données - issues de l’Ordnance Survey © 2010-2019 Droits d’auteurs et - de la base de données de la Couronne.' + contributors_gb_html: |- + Royaume-Uni : contient des données issues de + l’Ordnance Survey © 2010–2019 Droits d’auteurs et de la + base de données de la Couronne. contributors_footer_1_html: Pour plus de détails sur celles-ci et sur les autres sources utilisées pour aider à améliorer OpenStreetMap, consultez la page des contributeurs @@ -1741,8 +1746,8 @@ fr: 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. + description: Aide pour les entreprises et les organisations qui veulent migrer + à des cartes et d’autres services basés sur OpenStreetMap. welcomemat: url: https://wiki.openstreetmap.org/wiki/FR:Page_principale title: Pour les organisations diff --git a/config/locales/gl.yml b/config/locales/gl.yml index 56e793f40..151ed88ec 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -4,6 +4,7 @@ # Author: Abijeet Patro # Author: Athena in Wonderland # Author: Banjo +# Author: Breogan2008 # Author: Elisardojm # Author: Gallaecio # Author: Iváns @@ -69,9 +70,9 @@ gl: old_relation: Relación vella old_relation_member: Membro da relación vella old_relation_tag: Etiqueta da relación vella - old_way: Camiño vello - old_way_node: Nó do camiño vello - old_way_tag: Etiqueta do camiño vello + old_way: Vía vella + old_way_node: Nó da vía vella + old_way_tag: Etiqueta da vía vella relation: Relación relation_member: Membro da relación relation_tag: Etiqueta da relación @@ -296,8 +297,9 @@ gl: tag: A páxina de descrición da etiqueta %{key}=%{value} wikidata_link: O elemento %{page} no Wikidata wikipedia_link: O artigo sobre %{page} na Wikipedia + wikimedia_commons_link: O elemento %{page} en Wikimedia Comúns telephone_link: Chamar a %{phone_number} - colour_preview: Previsualización %{colour_value} da cor + colour_preview: Previsualización da cor %{colour_value} note: title: 'Nota: %{id}' new_note: Nova nota diff --git a/config/locales/he.yml b/config/locales/he.yml index 930026422..b52b8bcae 100644 --- a/config/locales/he.yml +++ b/config/locales/he.yml @@ -313,6 +313,7 @@ he: tag: עמוד התיאור עבור התג %{key}=%{value} wikidata_link: פריט %{page} בוויקינתונים wikipedia_link: הערך %{page} בוויקיפדיה + wikimedia_commons_link: הפריט %{page} בוויקישיתוף telephone_link: להתקשר למספר %{phone_number} colour_preview: תצוגה מקדימה של הצבע %{colour_value} note: diff --git a/config/locales/hu.yml b/config/locales/hu.yml index 57d02de70..831abb846 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -148,11 +148,11 @@ hu: one: kevesebb, mint 1 másodperce other: kevesebb, mint %{count} másodperce less_than_x_minutes: - one: kevesebb, mint 1 perce - other: kevesebb, mint %{count} perce + one: kevesebb mint 1 perce + other: kevesebb mint %{count} perce over_x_years: - one: több, mint 1 éve - other: több, mint %{count} éve + one: több mint 1 éve + other: több mint %{count} éve x_seconds: one: 1 másodperccel ezelőtt other: '%{count} másodperccel ezelőtt' @@ -324,7 +324,7 @@ hu: report: Jegyzet jelentése query: title: Funkciók lekérdezése - introduction: Kattintson a térképen, a közeli funkciók kereséséhez. + introduction: Kattintson a térképen a közeli funkciók kereséséhez. nearby: Közeli funkciók enclosing: Bentfoglalt funkciók changesets: @@ -1282,12 +1282,12 @@ hu: commented_note: '%{commenter} hozzászólt az egyik jegyzethez, amelyhez te is, %{place} közelében.' closed: - subject_own: '[OpenStreetMap] %{commenter} megoldotta az egyik jegyztetedet' + subject_own: '[OpenStreetMap] %{commenter} megoldotta az egyik jegyzetedet' subject_other: '[OpenStreetMap] %{commenter} megoldotta az egyik jegyzetet, amelyet te is figyelsz' your_note: '[OpenStreetMap] %{commenter} megoldotta az egyik jegyzetedet %{place} közelében.' - commented_note: '%{commenter} megoldotta az egyik jegyzetet amelyhez hozzászóltál, + commented_note: '%{commenter} megoldotta az egyik jegyzetet, amelyhez hozzászóltál, %{place} közelében.' reopened: subject_own: '[OpenStreetMap] %{commenter} újra megnyitotta az egyik jegyzetedet' @@ -1304,7 +1304,7 @@ hu: 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' - your_changeset: '%{commenter} egy megjegyzést fűzött a %{time}-i módosításcsomagodhoz.' + your_changeset: '%{commenter} megjegyzést fűzött a %{time}-i módosításcsomagodhoz.' commented_changeset: '%{commenter} egy megjegyzést fűzött %{changeset_author} %{time}-i módosításcsomagjához, amit figyelsz.' partial_changeset_with_comment: „%{changeset_comment}” megjegyzéssel @@ -1316,7 +1316,7 @@ hu: messages: inbox: title: Beérkezett üzenetek - my_inbox: Beérkezett üzenetek + my_inbox: Beérkezett üzeneteim outbox: Elküldött üzenetek messages: '%{new_messages} és %{old_messages} van' new_messages: @@ -1430,9 +1430,9 @@ hu: english_link: az eredeti angol nyelvű native: title: Erről az oldalról - text: Jelenleg a szerzői jogi oldal angol nyelvű változatát látod. Visszaléphetsz - ezen oldal %{native_link}, vagy befejezheted a szerzői jogról szóló oldal - olvasását, és %{mapping_link}. + text: 'Jelenleg a szerzői jogi oldal angol nyelvű változatát látod. Visszaléphetsz + ezen oldalra: %{native_link}, vagy befejezheted a szerzői jogról szóló oldal + és %{mapping_link} olvasását.' native_link: magyar nyelvű változatára mapping_link: kezdheted a térképezést legal_babble: @@ -1447,14 +1447,14 @@ hu: href="https://opendatacommons.org/licenses/odbl/1.0/">jogi szabályzat ismerteti a jogaidat és kötelezettségeidet. intro_3_html: |2- - Az OpenStreetMap térképeire a térképeire és dokumentumaira a Creative Commons Nevezd meg! - Így add tovább! 2.0 licenc (CC BY-SA) vonatkozik. credit_title_html: Hogyan kell feltüntetned az OpenStreetMapot? credit_1_html: Kérjük, hogy forrásként a “© OpenStreetMap közreműködők” szöveget tüntesd fel. credit_2_html: Azt is egyértelművé kell tenned, hogy az adatok az Open Database - Licenc alatt elérhetőek, illetve ha a mi térkép csempéinket használod akkor + Licenc alatt elérhetőek, illetve ha a mi térkép csempéinket használod, akkor azt, hogy a grafikai megjelenítés a CC BY-SA licenc feltételeivel használható. Ezt megteheted egy erre a copyright oldalra való hivatkozással. Alternatívaként, ha az OSM-et adatokként @@ -1479,7 +1479,7 @@ hu: Lásd az API Felhasználási Irányelveinket, a Csempe Felhasználási Irányelveinket és a Nominatim Felhasználási Irányelveinket. 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 + contributors_intro_html: 'Több ezer 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, többek között:' contributors_at_html: |- @@ -1600,11 +1600,11 @@ hu: overpass: title: Overpass API description: A megjelenített befoglaló keret letöltése egy OpenStreetMap - tükörserverről + tükörszerverről geofabrik: title: Geofabrik letöltések description: Kontinensek, országok és kiválasztott városok rendszeresen - frissített kivonata + frissített kivonatai metro: title: Metro Extracts description: A főbb városok, valamint a környező területek kivonatai @@ -1651,7 +1651,7 @@ hu: welcome: url: /welcome title: Üdvözlünk az OpenStreetMapen - description: Eza gyors útmutató megismertet az OpenStreetMap alapjaival. + description: Ez a gyors útmutató megismertet az OpenStreetMap alapjaival. beginners_guide: url: https://wiki.openstreetmap.org/wiki/Hu:Beginners%27_guide title: Kezdők kézikönyve diff --git a/config/locales/ia.yml b/config/locales/ia.yml index 4d7b0090d..9dbba8edb 100644 --- a/config/locales/ia.yml +++ b/config/locales/ia.yml @@ -71,7 +71,7 @@ ia: tracetag: Etiquetta de tracia user: Usator user_preference: Preferentias de usator - user_token: Indicio de usator + user_token: Token del usator way: Via way_node: Nodo de via way_tag: Etiquetta de via @@ -283,6 +283,7 @@ ia: tag: Le pagina wiki que describe le etiquetta %{key}=%{value} wikidata_link: Le elemento %{page} in Wikidata wikipedia_link: Le articulo %{page} in Wikipedia + wikimedia_commons_link: Le objecto %{page} sur Wikimedia Commons telephone_link: Telephonar %{phone_number} colour_preview: Previsualisation del color %{colour_value} note: @@ -1964,9 +1965,9 @@ ia: authorize_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. + invalid: Le token de autorisation non es valide. revoke: - flash: Tu ha revocate le indicio pro %{application} + flash: Tu ha revocate le token pro %{application} permissions: missing: Tu non ha permittite al application le accesso a iste facilitate oauth_clients: @@ -1978,8 +1979,8 @@ ia: title: Detalios OAuth pro %{app_name} key: 'Clave de consumitor:' secret: 'Secreto de consumitor:' - url: 'URL del indicio de requesta:' - access_url: 'URL del indicio de accesso:' + url: 'URL del token de requesta:' + access_url: 'URL del token de accesso:' authorize_url: 'URL de autorisation:' support_notice: Nos supporta le signaturas HMAC-SHA1 (recommendate) e RSA-SHA1. edit: Modificar detalios @@ -1996,8 +1997,7 @@ ia: index: title: Mi detalios OAuth my_tokens: Mi applicationes autorisate - list_tokens: 'Le sequente indicios ha essite emittite a applicationes in tu - nomine:' + list_tokens: 'Le sequente tokens ha essite emittite a applicationes in tu nomine:' application: Nomine del application issued_at: Emittite le revoke: Revocar! @@ -2105,7 +2105,7 @@ ia: confirm password: 'Confirma contrasigno:' reset: Reinitialisar contrasigno flash changed: Tu contrasigno ha essite cambiate. - flash token bad: Indicio non trovate. Verifica le URL. + flash token bad: Token non trovate. Verifica le URL. new: title: Crear conto no_auto_account_create: Infortunatemente in iste momento non es possibile crear @@ -2333,7 +2333,7 @@ ia: adresse de e-mail. button: Confirmar success: Le cambio del adresse de e-mail ha essite confirmate. - failure: Un adresse de e-mail ha ja essite confirmate con iste indicio. + failure: Un adresse de e-mail ha ja essite confirmate con iste token. unknown_token: Iste codice de confirmation ha expirate o non existe. set_home: flash success: Position de origine confirmate con successo diff --git a/config/locales/is.yml b/config/locales/is.yml index 8aaad60d9..9aa60d33c 100644 --- a/config/locales/is.yml +++ b/config/locales/is.yml @@ -171,14 +171,14 @@ is: api: notes: comment: - opened_at_html: Búið til fyrir %{when} síðan - opened_at_by_html: Búið til fyrir %{when} síðan af %{user} - commented_at_html: Uppfært fyrir %{when} síðan - commented_at_by_html: Uppfært fyrir %{when} síðan af %{user} - closed_at_html: Leyst fyrir %{when} síðan - closed_at_by_html: Leyst fyrir %{when} síðan af %{user} - reopened_at_html: Endurvirkjað fyrir %{when} síðan - reopened_at_by_html: Endurvirkjað fyrir %{when} síðan af %{user} + opened_at_html: Búið til %{when} + opened_at_by_html: Búið til %{when} af %{user} + commented_at_html: Uppfært %{when} + commented_at_by_html: Uppfært %{when} af %{user} + closed_at_html: Leyst %{when} + closed_at_by_html: Leyst %{when} af %{user} + reopened_at_html: Endurvirkjað %{when} + reopened_at_by_html: Endurvirkjað %{when} af %{user} rss: title: Minnispunktar OpenStreetMap description_area: Listi yfir minnispunkta sem hafa verið tilkynntir, gerðar @@ -195,13 +195,12 @@ is: browse: created: Búið til closed: Lokað - created_html: Bjó til %{time} síðan - closed_html: Lokað fyrir %{time} síðan - created_by_html: Búið til fyrir %{time} síðan af - %{user} - deleted_by_html: Eytt fyrir %{time} síðan af %{user} - edited_by_html: Breytt fyrir %{time} síðan af %{user} - closed_by_html: Lokað fyrir %{time} síðan af %{user} + created_html: Bjó til %{time} + closed_html: Lokaði %{time} + created_by_html: '%{user} bjó til %{time}' + deleted_by_html: '%{user} eyddi %{time}' + edited_by_html: '%{user} breytti %{time}' + closed_by_html: '%{user} lokaði %{time}' version: Útgáfa in_changeset: Breytingasett anonymous: nafnlaus @@ -221,9 +220,8 @@ is: relation: Vensl (%{count}) relation_paginated: Vensl (%{x}-%{y} af %{count}) comment: Athugasemdir (%{count}) - hidden_commented_by: Falin umsögn frá %{user} %{when} - síðan - commented_by: Umsögn frá %{user} %{when} síðan + hidden_commented_by: Falin umsögn frá %{user} %{when} + commented_by: Umsögn frá %{user} %{when} changesetxml: Breytingasetts XML sniði osmchangexml: osmChange XML sniði feed: @@ -296,7 +294,9 @@ is: tag: Wiki-síðan fyrir merkið %{key}=%{value} wikidata_link: Atriðið %{page} á Wikidata wikipedia_link: „%{page}“ greinin á Wikipedia + wikimedia_commons_link: '%{page} atriðið á Wikimedia Commons' telephone_link: Hringja í %{phone_number} + colour_preview: Forskoðun á litnum %{colour_value} note: title: 'Minnispunktur: %{id}' new_note: Nýr minnispunktur @@ -1313,8 +1313,8 @@ is: sem þú hefur áhuga á' your_changeset: '%{commenter} hefur sett athugasemd við eitt af breytingasettunum þínum sem búið var til %{time}' - commented_changeset: '%{commenter} hefur sett athugasemd við breytingasett - á korti sem þú fylgist með og var búið til af %{changeset_author} - %{time}' + commented_changeset: '%{commenter} hefur sett athugasemd %{time} við breytingasett + á korti sem þú fylgist með og var búið til af %{changeset_author}' partial_changeset_with_comment: með umsögninni '%{changeset_comment}' partial_changeset_without_comment: án athugasemdar details: Nánari upplýsingar um breytingasettið er að finna á %{url}. @@ -1683,7 +1683,7 @@ is: spurningum, og ræða í hópum um málefni tengd kortagerð. welcome: url: /velkomin - title: Velkomin í OSM + title: Velkomin í OpenStreetMap description: Byrjaðu með þessum fljótlega leiðarvísi með helstu grunnatriðum varðandi OpenStreetMap. beginners_guide: @@ -1692,8 +1692,8 @@ is: description: Leiðarvísir fyrir byrjendur sem haldið er við af samfélaginu. help: url: https://help.openstreetmap.org/ - title: help.openstreetmap.org - description: Spyrðu spurninga eða flettu upp svörum á spyrja/svara hluta OSM-vefsvæðisins. + title: Hjálparvefur + description: Spyrðu spurninga eða flettu upp svörum á spyrja/svara hluta OpenStreetMap-vefsvæðisins. mailing_lists: title: Póstlistar description: Spyrðu spurninga eða spjallaðu um áhugaverð málefni á einhverjum @@ -1716,9 +1716,9 @@ is: Finndu það sem þú þarft að vita á kynningarsíðunni. wiki: url: https://wiki.openstreetmap.org/ - title: wiki.openstreetmap.org + title: Wiki-vefur OpenStreetMap description: Vafraðu um wiki/kvikuna til að sjá greinargóðar leiðbeiningar - varðandi OSM. + varðandi OpenStreetMap. sidebar: search_results: Leitarniðurstöður close: Loka @@ -1949,7 +1949,9 @@ is: newer: Nýrri ferlar trace: pending: Í BIÐ - count_points: '%{count} punktar' + count_points: + one: 1 punktur punktar + other: '%{count} punktar punktar' more: upplýsingar trace_details: Sýna upplýsingar um ferilinn view_map: Skoða kort @@ -2513,7 +2515,7 @@ is: title: Eyði banni á %{block_on} heading: Eyði banni á %{block_on} eftir %{block_by} time_future: Bannið endar eftir %{time}. - past: Bannið endaði fyrir %{time} síðan, ekki er hægt að eyða því núna. + past: Bannið endaði fyrir %{time} síðan og er ekki hægt að afturkalla það núna. confirm: Staðfestu að þú viljir eyða þessu banni. revoke: Eyða banninu flash: Banninu var eytt. @@ -2522,7 +2524,7 @@ is: until_login: Virkt þangað til notandinn skráir sig inn. time_future_and_until_login: Endar eftir %{time} og eftir að notandinn skráir sig inn. - time_past: Endaði fyrir %{time} síðan + time_past: Endaði %{time}. block_duration: hours: one: 1 stund diff --git a/config/locales/it.yml b/config/locales/it.yml index f76d2dbf2..0f66be34f 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -20,6 +20,7 @@ # Author: Frubino # Author: Gianfranco # Author: Isiond +# Author: Jlrb+ # Author: Kaitu # Author: Karika # Author: Lollo @@ -1637,7 +1638,7 @@ it: geofabrik: title: Geofabrik Downloads description: Estratti aggiornati regolarmente di continenti, paesi, e città - selezionata + selezionate metro: title: Metro Extracts description: Estratti per le principali città del mondo e le loro aree circostanti diff --git a/config/locales/ja.yml b/config/locales/ja.yml index f520cc1b2..02e7e7840 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -37,6 +37,7 @@ # Author: Wrightbus # Author: Yusuke1109 # Author: ネイ +# Author: 沈澄心 # Author: 神樂坂秀吉 # Author: 青子守歌 # Author: 아라 @@ -1784,7 +1785,9 @@ ja: newer: 以降のトレース trace: pending: 処理中 - count_points: '%{count} 個の点' + count_points: + one: 1個の点 + other: '%{count}個の点' more: 詳細 trace_details: トレースの詳細表示 view_map: 地図で表示 diff --git a/config/locales/mk.yml b/config/locales/mk.yml index cb625873f..9acddb2e9 100644 --- a/config/locales/mk.yml +++ b/config/locales/mk.yml @@ -286,6 +286,7 @@ mk: tag: Вики-страницата за ознаката %{key}=%{value} wikidata_link: Предметот за %{page} на Википодатоци wikipedia_link: Статијата %{page} на Википедија + wikimedia_commons_link: Ставката %{page} на Ризницата telephone_link: Јави се на %{phone_number} colour_preview: Преглед на бојата %{colour_value} note: diff --git a/config/locales/nb.yml b/config/locales/nb.yml index bb5d48691..eb84a96ff 100644 --- a/config/locales/nb.yml +++ b/config/locales/nb.yml @@ -36,6 +36,9 @@ nb: create: Lagre diary_entry: create: Publiser + update: Oppdater + issue_comment: + create: Legg til kommentar message: create: Send client_application: @@ -122,6 +125,17 @@ nb: description: Beskrivelse languages: SprÃ¥k pass_crypt: Passord + datetime: + distance_in_words_ago: + about_x_hours: + one: 'omkring #1 timer siden' + other: omkring %{count} timer siden + about_x_months: + one: omkring en mÃ¥ned siden + other: omkring %{count} mÃ¥neder siden + about_x_years: + one: omkring et Ã¥r siden + other: omkring %{count} Ã¥r siden editor: default: Standard (nÃ¥værende %{name}) potlatch: @@ -2516,7 +2530,7 @@ nb: gps: Offentlige GPS-sporinger overlays: Aktiver overlag for Ã¥ feilsøke kartet title: Lag - copyright: © OpenStreetMap bidragsytere + copyright: © OpenStreetMaps bidragsytere donate_link_text: site: edit_tooltip: Rediger kartet diff --git a/config/locales/pl.yml b/config/locales/pl.yml index b525a170c..8358a874f 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -349,6 +349,7 @@ pl: tag: Strona wiki dla znacznika %{key}=%{value} wikidata_link: '%{page} element na Wikidata' wikipedia_link: Artykuł %{page} w Wikipedii + wikimedia_commons_link: Plik %{page} na Wikimedia Commons telephone_link: Zadzwoń pod %{phone_number} colour_preview: Podgląd koloru %{colour_value} note: diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index dbca5e248..001af78c1 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -326,6 +326,7 @@ pt-BR: tag: A página no wiki com a descrição da etiqueta %{key}=%{value} wikidata_link: O item %{page} no Wikidata wikipedia_link: O artigo %{page} na Wikipédia + wikimedia_commons_link: A %{page} de item mo Wikimedia Commons telephone_link: Ligar para %{phone_number} colour_preview: Pré-visualização da cor %{colour_value} note: diff --git a/config/locales/pt-PT.yml b/config/locales/pt-PT.yml index 5888fa03b..5b63a830c 100644 --- a/config/locales/pt-PT.yml +++ b/config/locales/pt-PT.yml @@ -311,6 +311,7 @@ pt-PT: tag: A página wiki com a descrição da etiqueta %{key}=%{value} wikidata_link: O item %{page} como Wikidata wikipedia_link: A página %{page} na Wikipédia + wikimedia_commons_link: O elemento %{page} na wiki Wikimedia Commons telephone_link: Telefonar %{phone_number} colour_preview: Antevisão da cor %{colour_value} note: diff --git a/config/locales/sv.yml b/config/locales/sv.yml index 63da09a85..648d3d85e 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -320,6 +320,7 @@ sv: tag: Wiki-beskrivningssidan för %{key}=%{value}-taggen wikidata_link: Objektet %{page} pÃ¥ Wikidata wikipedia_link: Artikeln om %{page} pÃ¥ Wikipedia + wikimedia_commons_link: Sidan %{page} finner du pÃ¥ Wikimedia Commons telephone_link: Ring %{phone_number} colour_preview: Förhandsgranskning av färgen %{colour_value} note: @@ -1322,8 +1323,8 @@ sv: subject_own: '[OpenStreetMap] %{commenter} har kommenterat pÃ¥ en av dina ändringsset' subject_other: '[OpenStreetMap] %{commenter} har kommenterat pÃ¥ ett ändringsset du är intresserad av' - your_changeset: '%{commenter} har lämnat en kommentar pÃ¥ ett av dina ändringsset - skapas den %{time}' + your_changeset: '%{commenter} har lämnat en kommentar pÃ¥ ett av dina ändringsmängder + skapt den %{time}' commented_changeset: '%{commenter} har lämnat en kommentar pÃ¥ ändringarna pÃ¥ en karta du bevakar, skapad av %{changeset_author} %{time}' partial_changeset_with_comment: med kommentar '%{changeset_comment}' diff --git a/config/locales/tr.yml b/config/locales/tr.yml index 1a6cef660..bfa9c9110 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -317,6 +317,7 @@ tr: tag: '%{key}=%{value} parametresi için Viki açıklaması' wikidata_link: Vikidata'da bulunan %{page} öğesi wikipedia_link: Vikipedi'deki %{page} makalesi + wikimedia_commons_link: Wikimedia Commons'daki %{page} maddesi telephone_link: '%{phone_number} ara' colour_preview: Renk %{colour_value} önizleme note: diff --git a/config/locales/tt.yml b/config/locales/tt.yml index f7e1bc50c..24cb0968d 100644 --- a/config/locales/tt.yml +++ b/config/locales/tt.yml @@ -119,6 +119,10 @@ tt: one: 1 ел элек other: '%{count} ел элек' editor: + potlatch: + name: Potlatch 1 + id: + name: iD remote: name: Дистанцион идарә description: Дистанционн идарә (JOSM яки Merkaartor) @@ -681,7 +685,7 @@ tt: preview: Алдан карау markdown_help: headings: Башлыклар - heading: Башлык + heading: Бүлек башы link: Сылтама text: Текст image: Сурәт diff --git a/config/locales/uk.yml b/config/locales/uk.yml index 6653739d2..1281e0ae1 100644 --- a/config/locales/uk.yml +++ b/config/locales/uk.yml @@ -328,6 +328,7 @@ uk: tag: Сторінка вікі, що описує теґ %{key}=%{value} wikidata_link: '%{page} елемент на Вікіданих' wikipedia_link: Стаття %{page} у Вікіпедії + wikimedia_commons_link: Сторінка %{page} у Вікісховищі telephone_link: Зателефонуйте на %{phone_number} colour_preview: Перегляд кольору %{colour_value} note: @@ -1329,10 +1330,10 @@ uk: змін' subject_other: '[OpenStreetMap] %{commenter} прокоментував набір змін, до якого ви залишали свій коментар' - your_changeset: '%{commenter} залишив коментар до одного з ваших наборів змін, - створених %{time}' - commented_changeset: '%{commenter} залишив коментар до набору змін, що ви - переглядаєте, створений %{changeset_author} – %{time}' + your_changeset: '%{commenter} залишив коментар у %{time} до одного з ваших + наборів змін' + commented_changeset: '%{commenter} залишив коментар у %{time} до набору змін, + що ви переглядаєте, створений %{changeset_author}' partial_changeset_with_comment: з коментарем '%{changeset_comment}' partial_changeset_without_comment: без коментарів details: |2- diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index 8be63f091..416dda744 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -42,6 +42,7 @@ # Author: 予弦 # Author: 夢蝶葬花 # Author: 水獭很懒 +# Author: 沈澄心 # Author: 神樂坂秀吉 # Author: 阿pp # Author: 아라 @@ -323,6 +324,7 @@ zh-CN: tag: '%{key}=%{value} 标签的 wiki 说明页面' wikidata_link: 维基数据上的%{page}项 wikipedia_link: 维基百科上的 %{page} 条目 + wikimedia_commons_link: 在维基共享资源上的%{page}项目 telephone_link: 请拨打 %{phone_number} colour_preview: '%{colour_value}的颜色预览' note: @@ -1296,8 +1298,8 @@ zh-CN: commented: subject_own: '[OpenStreetMap] %{commenter}在您的一个修改集合中做出了评论' subject_other: '[OpenStreetMap] %{commenter} 评论了您感兴趣的一个修改集合' - your_changeset: '%{commenter} 在您于 %{time} 创建的一个修改集合留了言' - commented_changeset: '%{commenter} 在您监视的由 %{changeset_author} 于 %{time} 创建的一个地图修改集合中留了言' + your_changeset: '%{commenter} 于 %{time} 在您创建的一个修改集合留了言' + commented_changeset: '%{commenter} 于 %{time} 在您监视的由 %{changeset_author} 创建的一个地图修改集合中留了言' partial_changeset_with_comment: 带评论“%{changeset_comment}” partial_changeset_without_comment: 没有评论 details: 更多关于修改集合的详细信息可以在 %{url} 找到。 @@ -1784,7 +1786,9 @@ zh-CN: newer: 较新轨迹 trace: pending: 挂起 - count_points: '%{count} 个点' + count_points: + one: 1个点 + other: '%{count}个点' more: 更多 trace_details: 查看轨迹详情 view_map: 查看地图 @@ -2019,7 +2023,7 @@ zh-CN: read_ct: 我已了解并同意贡献者条款 tou_explain_html: 这些%{tou_link}适用于网站方面的使用,与其它由OSMF提供的基础内容。请点击链接,阅读并同意该条款。 read_tou: 我已阅读并同意使用条款 - consider_pd: 除了上述协议,我同意将我的贡献授权为公共领域 + consider_pd: 除了上述协议,我同意将我的贡献释于公有领域 consider_pd_why: 这是什么? consider_pd_why_url: http://www.osmfoundation.org/wiki/License/Why_would_I_want_my_contributions_to_be_public_domain guidance: 帮助理解这些条款的信息:一个可读的摘要和一些非正式翻译 @@ -2131,7 +2135,7 @@ zh-CN: agreed: 您已同意新的贡献者条款。 not yet agreed: 您还没有同意新的贡献者条款。 review link text: 请跟随此链接,方便您查看并接受新的贡献者条款。 - agreed_with_pd: 您也将您的编辑释于公共领域。 + agreed_with_pd: 您也将您的编辑释于公有领域。 link: https://www.osmfoundation.org/wiki/License/Contributor_Terms link text: 这是什么? profile description: 基本信息说明: diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index 64170d513..51f459da4 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -9,6 +9,7 @@ # Author: Cwlin0416 # Author: EagerLin # Author: Foothsu +# Author: HTan (WMF) # Author: Hlaw # Author: Impersonator 1 # Author: Jiazheng0609 @@ -135,7 +136,7 @@ zh-TW: body: 內文 recipient: 收件者 user: - email: Email + email: 電子郵件 active: 開啟中 display_name: 顯示名稱 description: 說明 @@ -155,7 +156,7 @@ zh-TW: almost_x_years: one: 近1å¹´ other: 近%{count}年前 - half_a_minute: 30秒前 + half_a_minute: 半分鐘前 less_than_x_seconds: one: 小於 1 秒前 other: 小於 %{count} 秒前 @@ -315,6 +316,7 @@ zh-TW: tag: '%{key}=%{value} 標籤的 Wiki 說明頁面' wikidata_link: 維基數據上的 %{page} 項目 wikipedia_link: 維基百科上的 %{page} 條目 + wikimedia_commons_link: 在維基共享資源上的%{page}項目 telephone_link: 致電 %{phone_number} colour_preview: 色彩%{colour_value}預覽 note: @@ -1290,8 +1292,8 @@ zh-TW: commented: subject_own: '[OpenStreetMap] %{commenter}% 在您的變更集評論' subject_other: '[OpenStreetMap] %{commenter} 就您感興趣的變更集評論' - your_changeset: '%{commenter} 在您於 %{time} 建立的變更集評論' - commented_changeset: '%{commenter} 在您監視,由 %{changeset_author} 於 %{time} 建立的變更集評論' + your_changeset: '%{commenter}於 %{time} 在您的變更集之一裡留下了評論' + commented_changeset: '%{commenter}於 %{time} 在您監視的由%{changeset_author}所建立變更集裡留下了評論' partial_changeset_with_comment: 評論 "%{changeset_comment}" partial_changeset_without_comment: 沒有評論 details: 關於變更集的詳情可在 %{url} 找到。 diff --git a/config/puma.rb b/config/puma.rb index a5eccf816..5ed443774 100644 --- a/config/puma.rb +++ b/config/puma.rb @@ -4,8 +4,9 @@ # the maximum value specified for Puma. Default is set to 5 threads for minimum # and maximum; this matches the default thread size of Active Record. # -threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 } -threads threads_count, threads_count +max_threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 } +min_threads_count = ENV.fetch("RAILS_MIN_THREADS") { max_threads_count } +threads min_threads_count, max_threads_count # Specifies the `port` that Puma will listen on to receive requests; default is 3000. # @@ -15,8 +16,11 @@ port ENV.fetch("PORT") { 3000 } # environment ENV.fetch("RAILS_ENV") { "development" } +# Specifies the `pidfile` that Puma will use. +pidfile ENV.fetch("PIDFILE") { "tmp/pids/server.pid" } + # Specifies the number of `workers` to boot in clustered mode. -# Workers are forked webserver processes. If using threads and workers together +# Workers are forked web server processes. If using threads and workers together # the concurrency of the application would be max `threads` * `workers`. # Workers do not work on JRuby or Windows (both of which do not support # processes). diff --git a/config/routes.rb b/config/routes.rb index d8d91f47e..992197814 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -66,11 +66,11 @@ OpenStreetMap::Application.routes.draw do get "user/gpx_files" => "api/users#gpx_files" get "users" => "api/users#index", :as => :api_users - get "user/preferences" => "api/user_preferences#read" - get "user/preferences/:preference_key" => "api/user_preferences#read_one" - put "user/preferences" => "api/user_preferences#update" - put "user/preferences/:preference_key" => "api/user_preferences#update_one" - delete "user/preferences/:preference_key" => "api/user_preferences#delete_one" + get "user/preferences" => "api/user_preferences#index" + get "user/preferences/:preference_key" => "api/user_preferences#show" + put "user/preferences" => "api/user_preferences#update_all" + put "user/preferences/:preference_key" => "api/user_preferences#update" + delete "user/preferences/:preference_key" => "api/user_preferences#destroy" post "gpx/create" => "api/traces#create" get "gpx/:id" => "api/traces#show", :id => /\d+/ @@ -207,7 +207,6 @@ OpenStreetMap::Application.routes.draw do get "/trace/create", :to => redirect(:path => "/traces/new") get "/trace/:id/data" => "traces#data", :id => /\d+/, :as => "trace_data" get "/trace/:id/edit", :to => redirect(:path => "/traces/%{id}/edit") - post "/trace/:id/delete" => "traces#delete", :id => /\d+/ # diary pages resources :diary_entries, :path => "diary", :only => [:new, :create, :index] do diff --git a/db/migrate/005_tile_tracepoints.rb b/db/migrate/005_tile_tracepoints.rb index 7c3bb8d1c..b46fdf25f 100644 --- a/db/migrate/005_tile_tracepoints.rb +++ b/db/migrate/005_tile_tracepoints.rb @@ -1,7 +1,7 @@ require "migrate" class TileTracepoints < ActiveRecord::Migration[4.2] - class Tracepoint < ActiveRecord::Base + class Tracepoint < ApplicationRecord self.table_name = "gps_points" end diff --git a/db/migrate/006_tile_nodes.rb b/db/migrate/006_tile_nodes.rb index 848dc9724..ca898cb37 100644 --- a/db/migrate/006_tile_nodes.rb +++ b/db/migrate/006_tile_nodes.rb @@ -1,11 +1,11 @@ require "migrate" class TileNodes < ActiveRecord::Migration[4.2] - class Node < ActiveRecord::Base + class Node < ApplicationRecord self.table_name = "current_nodes" end - class OldNode < ActiveRecord::Base + class OldNode < ApplicationRecord self.table_name = "nodes" end diff --git a/db/migrate/008_remove_segments.rb b/db/migrate/008_remove_segments.rb index 985a85820..f8a3085c6 100644 --- a/db/migrate/008_remove_segments.rb +++ b/db/migrate/008_remove_segments.rb @@ -14,8 +14,8 @@ class RemoveSegments < ActiveRecord::Migration[4.2] "#{src} -o #{cmd}") || raise end - conn_opts = ActiveRecord::Base.connection - .instance_eval { @connection_options } + conn_opts = ApplicationRecord.connection + .instance_eval { @connection_options } args = conn_opts.map(&:to_s) + [prefix] raise "#{cmd} failed" unless system cmd, *args diff --git a/db/migrate/013_add_email_valid.rb b/db/migrate/013_add_email_valid.rb index b6899f330..e4725b643 100644 --- a/db/migrate/013_add_email_valid.rb +++ b/db/migrate/013_add_email_valid.rb @@ -1,5 +1,5 @@ class AddEmailValid < ActiveRecord::Migration[4.2] - class User < ActiveRecord::Base + class User < ApplicationRecord end def self.up diff --git a/db/migrate/020_populate_node_tags_and_remove.rb b/db/migrate/020_populate_node_tags_and_remove.rb index caa355419..fbb5d1af4 100644 --- a/db/migrate/020_populate_node_tags_and_remove.rb +++ b/db/migrate/020_populate_node_tags_and_remove.rb @@ -14,7 +14,7 @@ class PopulateNodeTagsAndRemove < ActiveRecord::Migration[4.2] "#{src} -o #{cmd}") || raise end - conn_opts = ActiveRecord::Base.connection.instance_eval { @connection_options } + conn_opts = ApplicationRecord.connection.instance_eval { @connection_options } args = conn_opts.map(&:to_s) + [prefix] raise "#{cmd} failed" unless system cmd, *args diff --git a/db/migrate/039_add_more_controls_to_gpx_files.rb b/db/migrate/039_add_more_controls_to_gpx_files.rb index 6ce26588e..2c3fee5be 100644 --- a/db/migrate/039_add_more_controls_to_gpx_files.rb +++ b/db/migrate/039_add_more_controls_to_gpx_files.rb @@ -1,7 +1,7 @@ require "migrate" class AddMoreControlsToGpxFiles < ActiveRecord::Migration[4.2] - class Trace < ActiveRecord::Base + class Trace < ApplicationRecord self.table_name = "gpx_files" end diff --git a/db/migrate/044_create_user_roles.rb b/db/migrate/044_create_user_roles.rb index 0098a0086..0039859bf 100644 --- a/db/migrate/044_create_user_roles.rb +++ b/db/migrate/044_create_user_roles.rb @@ -1,10 +1,10 @@ require "migrate" class CreateUserRoles < ActiveRecord::Migration[4.2] - class User < ActiveRecord::Base + class User < ApplicationRecord end - class UserRole < ActiveRecord::Base + class UserRole < ApplicationRecord end def self.up diff --git a/db/migrate/046_alter_user_roles_and_blocks.rb b/db/migrate/046_alter_user_roles_and_blocks.rb index cbd95018d..b10fcf144 100644 --- a/db/migrate/046_alter_user_roles_and_blocks.rb +++ b/db/migrate/046_alter_user_roles_and_blocks.rb @@ -1,7 +1,7 @@ require "migrate" class AlterUserRolesAndBlocks < ActiveRecord::Migration[4.2] - class UserRole < ActiveRecord::Base + class UserRole < ApplicationRecord end def self.up diff --git a/db/migrate/051_add_status_to_user.rb b/db/migrate/051_add_status_to_user.rb index 5cf8a920f..23761f248 100644 --- a/db/migrate/051_add_status_to_user.rb +++ b/db/migrate/051_add_status_to_user.rb @@ -1,7 +1,7 @@ require "migrate" class AddStatusToUser < ActiveRecord::Migration[4.2] - class User < ActiveRecord::Base + class User < ApplicationRecord end def self.up diff --git a/db/migrate/20110322001319_add_terms_seen_to_user.rb b/db/migrate/20110322001319_add_terms_seen_to_user.rb index f41782d37..824eaceb0 100644 --- a/db/migrate/20110322001319_add_terms_seen_to_user.rb +++ b/db/migrate/20110322001319_add_terms_seen_to_user.rb @@ -1,5 +1,5 @@ class AddTermsSeenToUser < ActiveRecord::Migration[4.2] - class User < ActiveRecord::Base + class User < ApplicationRecord end def self.up diff --git a/db/migrate/20120208122334_merge_acl_address_and_mask.rb b/db/migrate/20120208122334_merge_acl_address_and_mask.rb index f05cb4f21..09b0ae3b0 100644 --- a/db/migrate/20120208122334_merge_acl_address_and_mask.rb +++ b/db/migrate/20120208122334_merge_acl_address_and_mask.rb @@ -11,7 +11,7 @@ class IPAddr end class MergeAclAddressAndMask < ActiveRecord::Migration[4.2] - class Acl < ActiveRecord::Base + class Acl < ApplicationRecord end def up diff --git a/db/migrate/20120808231205_add_counter_caches.rb b/db/migrate/20120808231205_add_counter_caches.rb index 330e2cea3..f29bfbb0e 100644 --- a/db/migrate/20120808231205_add_counter_caches.rb +++ b/db/migrate/20120808231205_add_counter_caches.rb @@ -1,8 +1,8 @@ class AddCounterCaches < ActiveRecord::Migration[4.2] - class Changeset < ActiveRecord::Base + class Changeset < ApplicationRecord end - class Trace < ActiveRecord::Base + class Trace < ApplicationRecord self.table_name = "gpx_files" end diff --git a/db/migrate/20121005195010_add_diary_entry_counter_caches.rb b/db/migrate/20121005195010_add_diary_entry_counter_caches.rb index b5e445400..ec05f3464 100644 --- a/db/migrate/20121005195010_add_diary_entry_counter_caches.rb +++ b/db/migrate/20121005195010_add_diary_entry_counter_caches.rb @@ -1,8 +1,8 @@ class AddDiaryEntryCounterCaches < ActiveRecord::Migration[4.2] - class DiaryEntry < ActiveRecord::Base + class DiaryEntry < ApplicationRecord end - class User < ActiveRecord::Base + class User < ApplicationRecord end def self.up diff --git a/db/migrate/20121012044047_add_image_use_gravatar_to_users.rb b/db/migrate/20121012044047_add_image_use_gravatar_to_users.rb index 9e9151a84..dd18b068d 100644 --- a/db/migrate/20121012044047_add_image_use_gravatar_to_users.rb +++ b/db/migrate/20121012044047_add_image_use_gravatar_to_users.rb @@ -1,5 +1,5 @@ class AddImageUseGravatarToUsers < ActiveRecord::Migration[4.2] - class User < ActiveRecord::Base + class User < ApplicationRecord end def self.up diff --git a/db/migrate/20150222101847_rename_openid_url.rb b/db/migrate/20150222101847_rename_openid_url.rb index a12303812..06b399615 100644 --- a/db/migrate/20150222101847_rename_openid_url.rb +++ b/db/migrate/20150222101847_rename_openid_url.rb @@ -1,5 +1,5 @@ class RenameOpenidUrl < ActiveRecord::Migration[4.2] - class User < ActiveRecord::Base + class User < ApplicationRecord end def change diff --git a/db/migrate/20180204153242_tile_users.rb b/db/migrate/20180204153242_tile_users.rb index 61dbcb4ea..917948d43 100644 --- a/db/migrate/20180204153242_tile_users.rb +++ b/db/migrate/20180204153242_tile_users.rb @@ -1,5 +1,5 @@ class TileUsers < ActiveRecord::Migration[5.1] - class User < ActiveRecord::Base + class User < ApplicationRecord end def up diff --git a/db/migrate/20191120140058_remove_nearby_from_users.rb b/db/migrate/20191120140058_remove_nearby_from_users.rb new file mode 100644 index 000000000..7d9383dc6 --- /dev/null +++ b/db/migrate/20191120140058_remove_nearby_from_users.rb @@ -0,0 +1,6 @@ +class RemoveNearbyFromUsers < ActiveRecord::Migration[5.2] + def change + # We've already ignored this column in the model, so it is safe to remove + safety_assured { remove_column :users, :nearby, :integer, :default => 50 } + end +end diff --git a/db/structure.sql b/db/structure.sql index 6370eb95a..d0e8c21e3 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -320,8 +320,8 @@ ALTER SEQUENCE public.active_storage_blobs_id_seq OWNED BY public.active_storage CREATE TABLE public.ar_internal_metadata ( key character varying NOT NULL, value character varying, - created_at timestamp without time zone NOT NULL, - updated_at timestamp without time zone NOT NULL + created_at timestamp(6) without time zone NOT NULL, + updated_at timestamp(6) without time zone NOT NULL ); @@ -1394,7 +1394,6 @@ CREATE TABLE public.users ( home_lat double precision, home_lon double precision, home_zoom smallint DEFAULT 3, - nearby integer DEFAULT 50, pass_salt character varying, email_valid boolean DEFAULT false NOT NULL, new_email character varying, @@ -3137,6 +3136,7 @@ INSERT INTO "schema_migrations" (version) VALUES ('20190623093642'), ('20190702193519'), ('20190716173946'), +('20191120140058'), ('21'), ('22'), ('23'), diff --git a/lib/redactable.rb b/lib/redactable.rb index d827cfd74..6efdae0ef 100644 --- a/lib/redactable.rb +++ b/lib/redactable.rb @@ -4,7 +4,7 @@ module Redactable def self.included(base) # this is used to extend activerecord bases, as these aren't # in scope for the module itself. - base.scope :unredacted, -> { base.where(:redaction_id => nil) } + base.scope :unredacted, -> { where(:redaction_id => nil) } end def redacted? diff --git a/test/abilities/api_capability_test.rb b/test/abilities/api_capability_test.rb index 8d0e682f6..8a98f29e0 100644 --- a/test/abilities/api_capability_test.rb +++ b/test/abilities/api_capability_test.rb @@ -100,33 +100,33 @@ class UserApiCapabilityTest < ApiCapabilityTest test "user preferences" do # a user with no tokens capability = ApiCapability.new nil - [:read, :read_one, :update, :update_one, :delete_one].each do |act| + [:index, :show, :update_all, :update, :destroy].each do |act| assert capability.cannot? act, UserPreference end # A user with empty tokens capability = ApiCapability.new tokens - [:read, :read_one, :update, :update_one, :delete_one].each do |act| + [:index, :show, :update_all, :update, :destroy].each do |act| assert capability.cannot? act, UserPreference end capability = ApiCapability.new tokens(:allow_read_prefs) - [:update, :update_one, :delete_one].each do |act| + [:update_all, :update, :destroy].each do |act| assert capability.cannot? act, UserPreference end - [:read, :read_one].each do |act| + [:index, :show].each do |act| assert capability.can? act, UserPreference end capability = ApiCapability.new tokens(:allow_write_prefs) - [:read, :read_one].each do |act| + [:index, :show].each do |act| assert capability.cannot? act, UserPreference end - [:update, :update_one, :delete_one].each do |act| + [:update_all, :update, :destroy].each do |act| assert capability.can? act, UserPreference end end diff --git a/test/controllers/api/changesets_controller_test.rb b/test/controllers/api/changesets_controller_test.rb index e8dda0ba1..be6b84b47 100644 --- a/test/controllers/api/changesets_controller_test.rb +++ b/test/controllers/api/changesets_controller_test.rb @@ -454,10 +454,10 @@ CHANGESET diff.root = XML::Node.new "osmChange" delete = XML::Node.new "delete" diff.root << delete - delete << super_relation.to_xml_node - delete << used_relation.to_xml_node - delete << used_way.to_xml_node - delete << used_node.to_xml_node + delete << xml_node_for_relation(super_relation) + delete << xml_node_for_relation(used_relation) + delete << xml_node_for_way(used_way) + delete << xml_node_for_node(used_node) # update the changeset to one that this user owns %w[node way relation].each do |type| @@ -586,9 +586,9 @@ CHANGESET diff.root = XML::Node.new "osmChange" delete = XML::Node.new "delete" diff.root << delete - delete << other_relation.to_xml_node - delete << used_way.to_xml_node - delete << used_node.to_xml_node + delete << xml_node_for_relation(other_relation) + delete << xml_node_for_way(used_way) + delete << xml_node_for_node(used_node) # update the changeset to one that this user owns %w[node way relation].each do |type| @@ -629,9 +629,9 @@ CHANGESET delete = XML::Node.new "delete" diff.root << delete delete["if-unused"] = "" - delete << used_relation.to_xml_node - delete << used_way.to_xml_node - delete << used_node.to_xml_node + delete << xml_node_for_relation(used_relation) + delete << xml_node_for_way(used_way) + delete << xml_node_for_node(used_node) # update the changeset to one that this user owns %w[node way relation].each do |type| @@ -1133,7 +1133,7 @@ CHANGESET diff = XML::Document.new diff.root = XML::Node.new "osmChange" modify = XML::Node.new "modify" - xml_old_node = old_node.to_xml_node + xml_old_node = xml_node_for_node(old_node) xml_old_node["lat"] = 2.0.to_s xml_old_node["lon"] = 2.0.to_s xml_old_node["changeset"] = changeset_id.to_s @@ -1171,7 +1171,7 @@ CHANGESET diff = XML::Document.new diff.root = XML::Node.new "osmChange" modify = XML::Node.new "modify" - xml_old_way = old_way.to_xml_node + xml_old_way = xml_node_for_way(old_way) nd_ref = XML::Node.new "nd" nd_ref["ref"] = create(:node, :lat => 3, :lon => 3).id.to_s xml_old_way << nd_ref @@ -1224,7 +1224,7 @@ CHANGESET diff.root = XML::Node.new "osmChange" delete = XML::Node.new "delete" diff.root << delete - delete << node.to_xml_node + delete << xml_node_for_node(node) # upload it error_format "xml" @@ -1483,7 +1483,7 @@ CHANGESET # add (delete) a way to it, which contains a point at (3,3) with_controller(WaysController.new) do - xml = update_changeset(way.to_xml, changeset_id) + xml = update_changeset(xml_for_way(way), changeset_id) put :delete, :params => { :id => way.id }, :body => xml.to_s assert_response :success, "Couldn't delete a way." end diff --git a/test/controllers/api/nodes_controller_test.rb b/test/controllers/api/nodes_controller_test.rb index 6d990a84c..aee41d515 100644 --- a/test/controllers/api/nodes_controller_test.rb +++ b/test/controllers/api/nodes_controller_test.rb @@ -147,6 +147,15 @@ module Api assert_response :not_found end + # Ensure the lat/lon is formatted as a decimal e.g. not 4.0e-05 + def test_lat_lon_xml_format + node = create(:node, :latitude => (0.00004 * OldNode::SCALE).to_i, :longitude => (0.00008 * OldNode::SCALE).to_i) + + get :show, :params => { :id => node.id } + assert_match(/lat="0.0000400"/, response.body) + assert_match(/lon="0.0000800"/, response.body) + end + # this tests deletion restrictions - basic deletion is tested in the unit # tests for node! def test_delete @@ -164,22 +173,22 @@ module Api basic_authorization private_user.email, "test" # try to delete with an invalid (closed) changeset - xml = update_changeset(private_node.to_xml, private_user_closed_changeset.id) + xml = update_changeset(xml_for_node(private_node), private_user_closed_changeset.id) delete :delete, :params => { :id => private_node.id }, :body => xml.to_s assert_require_public_data("non-public user shouldn't be able to delete node") # try to delete with an invalid (non-existent) changeset - xml = update_changeset(private_node.to_xml, 0) + xml = update_changeset(xml_for_node(private_node), 0) delete :delete, :params => { :id => private_node.id }, :body => xml.to_s assert_require_public_data("shouldn't be able to delete node, when user's data is private") # valid delete now takes a payload - xml = private_node.to_xml + xml = xml_for_node(private_node) delete :delete, :params => { :id => private_node.id }, :body => xml.to_s assert_require_public_data("shouldn't be able to delete node when user's data isn't public'") # this won't work since the node is already deleted - xml = private_deleted_node.to_xml + xml = xml_for_node(private_deleted_node) delete :delete, :params => { :id => private_deleted_node.id }, :body => xml.to_s assert_require_public_data @@ -192,7 +201,7 @@ module Api private_used_node = create(:node, :changeset => private_user_changeset) create(:way_node, :node => private_used_node) - xml = private_used_node.to_xml + xml = xml_for_node(private_used_node) delete :delete, :params => { :id => private_used_node.id }, :body => xml.to_s assert_require_public_data "shouldn't be able to delete a node used in a way (#{@response.body})" @@ -200,7 +209,7 @@ module Api private_used_node2 = create(:node, :changeset => private_user_changeset) create(:relation_member, :member => private_used_node2) - xml = private_used_node2.to_xml + xml = xml_for_node(private_used_node2) delete :delete, :params => { :id => private_used_node2.id }, :body => xml.to_s assert_require_public_data "shouldn't be able to delete a node used in a relation (#{@response.body})" @@ -212,18 +221,18 @@ module Api basic_authorization user.email, "test" # try to delete with an invalid (closed) changeset - xml = update_changeset(node.to_xml, closed_changeset.id) + xml = update_changeset(xml_for_node(node), closed_changeset.id) delete :delete, :params => { :id => node.id }, :body => xml.to_s assert_response :conflict # try to delete with an invalid (non-existent) changeset - xml = update_changeset(node.to_xml, 0) + xml = update_changeset(xml_for_node(node), 0) delete :delete, :params => { :id => node.id }, :body => xml.to_s assert_response :conflict # try to delete a node with a different ID other_node = create(:node) - xml = other_node.to_xml + xml = xml_for_node(other_node) delete :delete, :params => { :id => node.id }, :body => xml.to_s assert_response :bad_request, "should not be able to delete a node with a different ID from the XML" @@ -235,7 +244,7 @@ module Api "should not be able to delete a node without a valid XML payload" # valid delete now takes a payload - xml = node.to_xml + xml = xml_for_node(node) delete :delete, :params => { :id => node.id }, :body => xml.to_s assert_response :success @@ -245,7 +254,7 @@ module Api "delete request should return a new version number for node" # deleting the same node twice doesn't work - xml = node.to_xml + xml = xml_for_node(node) delete :delete, :params => { :id => node.id }, :body => xml.to_s assert_response :gone @@ -259,7 +268,7 @@ module Api way_node = create(:way_node, :node => used_node) way_node2 = create(:way_node, :node => used_node) - xml = used_node.to_xml + xml = xml_for_node(used_node) delete :delete, :params => { :id => used_node.id }, :body => xml.to_s assert_response :precondition_failed, "shouldn't be able to delete a node used in a way (#{@response.body})" @@ -270,7 +279,7 @@ module Api relation_member = create(:relation_member, :member => used_node2) relation_member2 = create(:relation_member, :member => used_node2) - xml = used_node2.to_xml + xml = xml_for_node(used_node2) delete :delete, :params => { :id => used_node2.id }, :body => xml.to_s assert_response :precondition_failed, "shouldn't be able to delete a node used in a relation (#{@response.body})" @@ -289,7 +298,7 @@ module Api user = create(:user) node = create(:node, :changeset => create(:changeset, :user => user)) - xml = node.to_xml + xml = xml_for_node(node) put :update, :params => { :id => node.id }, :body => xml.to_s assert_response :unauthorized @@ -301,41 +310,41 @@ module Api ## trying to break changesets # try and update in someone else's changeset - xml = update_changeset(private_node.to_xml, + xml = update_changeset(xml_for_node(private_node), create(:changeset).id) put :update, :params => { :id => private_node.id }, :body => xml.to_s assert_require_public_data "update with other user's changeset should be forbidden when data isn't public" # try and update in a closed changeset - xml = update_changeset(private_node.to_xml, + xml = update_changeset(xml_for_node(private_node), create(:changeset, :closed, :user => private_user).id) put :update, :params => { :id => private_node.id }, :body => xml.to_s assert_require_public_data "update with closed changeset should be forbidden, when data isn't public" # try and update in a non-existant changeset - xml = update_changeset(private_node.to_xml, 0) + xml = update_changeset(xml_for_node(private_node), 0) put :update, :params => { :id => private_node.id }, :body => xml.to_s assert_require_public_data "update with changeset=0 should be forbidden, when data isn't public" ## try and submit invalid updates - xml = xml_attr_rewrite(private_node.to_xml, "lat", 91.0) + xml = xml_attr_rewrite(xml_for_node(private_node), "lat", 91.0) put :update, :params => { :id => private_node.id }, :body => xml.to_s assert_require_public_data "node at lat=91 should be forbidden, when data isn't public" - xml = xml_attr_rewrite(private_node.to_xml, "lat", -91.0) + xml = xml_attr_rewrite(xml_for_node(private_node), "lat", -91.0) put :update, :params => { :id => private_node.id }, :body => xml.to_s assert_require_public_data "node at lat=-91 should be forbidden, when data isn't public" - xml = xml_attr_rewrite(private_node.to_xml, "lon", 181.0) + xml = xml_attr_rewrite(xml_for_node(private_node), "lon", 181.0) put :update, :params => { :id => private_node.id }, :body => xml.to_s assert_require_public_data "node at lon=181 should be forbidden, when data isn't public" - xml = xml_attr_rewrite(private_node.to_xml, "lon", -181.0) + xml = xml_attr_rewrite(xml_for_node(private_node), "lon", -181.0) put :update, :params => { :id => private_node.id }, :body => xml.to_s assert_require_public_data "node at lon=-181 should be forbidden, when data isn't public" ## finally, produce a good request which still won't work - xml = private_node.to_xml + xml = xml_for_node(private_node) put :update, :params => { :id => private_node.id }, :body => xml.to_s assert_require_public_data "should have failed with a forbidden when data isn't public" @@ -343,7 +352,7 @@ module Api # try and update a node without authorisation # first try to update node without auth - xml = node.to_xml + xml = xml_for_node(node) put :update, :params => { :id => node.id }, :body => xml.to_s assert_response :forbidden @@ -353,36 +362,36 @@ module Api ## trying to break changesets # try and update in someone else's changeset - xml = update_changeset(node.to_xml, + xml = update_changeset(xml_for_node(node), create(:changeset).id) put :update, :params => { :id => node.id }, :body => xml.to_s assert_response :conflict, "update with other user's changeset should be rejected" # try and update in a closed changeset - xml = update_changeset(node.to_xml, + xml = update_changeset(xml_for_node(node), create(:changeset, :closed, :user => user).id) put :update, :params => { :id => node.id }, :body => xml.to_s assert_response :conflict, "update with closed changeset should be rejected" # try and update in a non-existant changeset - xml = update_changeset(node.to_xml, 0) + xml = update_changeset(xml_for_node(node), 0) put :update, :params => { :id => node.id }, :body => xml.to_s assert_response :conflict, "update with changeset=0 should be rejected" ## try and submit invalid updates - xml = xml_attr_rewrite(node.to_xml, "lat", 91.0) + xml = xml_attr_rewrite(xml_for_node(node), "lat", 91.0) put :update, :params => { :id => node.id }, :body => xml.to_s assert_response :bad_request, "node at lat=91 should be rejected" - xml = xml_attr_rewrite(node.to_xml, "lat", -91.0) + xml = xml_attr_rewrite(xml_for_node(node), "lat", -91.0) put :update, :params => { :id => node.id }, :body => xml.to_s assert_response :bad_request, "node at lat=-91 should be rejected" - xml = xml_attr_rewrite(node.to_xml, "lon", 181.0) + xml = xml_attr_rewrite(xml_for_node(node), "lon", 181.0) put :update, :params => { :id => node.id }, :body => xml.to_s assert_response :bad_request, "node at lon=181 should be rejected" - xml = xml_attr_rewrite(node.to_xml, "lon", -181.0) + xml = xml_attr_rewrite(xml_for_node(node), "lon", -181.0) put :update, :params => { :id => node.id }, :body => xml.to_s assert_response :bad_request, "node at lon=-181 should be rejected" @@ -390,26 +399,26 @@ module Api current_node_version = node.version # try and submit a version behind - xml = xml_attr_rewrite(node.to_xml, + xml = xml_attr_rewrite(xml_for_node(node), "version", current_node_version - 1) put :update, :params => { :id => node.id }, :body => xml.to_s assert_response :conflict, "should have failed on old version number" # try and submit a version ahead - xml = xml_attr_rewrite(node.to_xml, + xml = xml_attr_rewrite(xml_for_node(node), "version", current_node_version + 1) put :update, :params => { :id => node.id }, :body => xml.to_s assert_response :conflict, "should have failed on skipped version number" # try and submit total crap in the version field - xml = xml_attr_rewrite(node.to_xml, + xml = xml_attr_rewrite(xml_for_node(node), "version", "p1r4t3s!") put :update, :params => { :id => node.id }, :body => xml.to_s assert_response :conflict, "should not be able to put 'p1r4at3s!' in the version field" ## try an update with the wrong ID - xml = create(:node).to_xml + xml = xml_for_node(create(:node)) put :update, :params => { :id => node.id }, :body => xml.to_s assert_response :bad_request, "should not be able to update a node with a different ID from the XML" @@ -421,7 +430,7 @@ module Api "should not be able to update a node with non-OSM XML doc." ## finally, produce a good request which should work - xml = node.to_xml + xml = xml_for_node(node) put :update, :params => { :id => node.id }, :body => xml.to_s assert_response :success, "a valid update request failed" end @@ -474,7 +483,7 @@ module Api tag_xml["v"] = existing_tag.v # add the tag into the existing xml - node_xml = existing_tag.node.to_xml + node_xml = xml_for_node(existing_tag.node) node_xml.find("//osm/node").first << tag_xml # try and upload it diff --git a/test/controllers/api/notes_controller_test.rb b/test/controllers/api/notes_controller_test.rb index 54a20028d..0e4a6f357 100644 --- a/test/controllers/api/notes_controller_test.rb +++ b/test/controllers/api/notes_controller_test.rb @@ -479,7 +479,7 @@ module Api get :show, :params => { :id => open_note.id, :format => "xml" } assert_response :success - assert_equal "application/xml", @response.content_type + assert_equal "application/xml", @response.media_type assert_select "osm", :count => 1 do assert_select "note[lat='#{open_note.lat}'][lon='#{open_note.lon}']", :count => 1 do assert_select "id", open_note.id.to_s @@ -496,7 +496,7 @@ module Api get :show, :params => { :id => open_note.id, :format => "rss" } assert_response :success - assert_equal "application/rss+xml", @response.content_type + assert_equal "application/rss+xml", @response.media_type assert_select "rss", :count => 1 do assert_select "channel", :count => 1 do assert_select "item", :count => 1 do @@ -512,7 +512,7 @@ module Api get :show, :params => { :id => open_note.id, :format => "json" } assert_response :success - assert_equal "application/json", @response.content_type + assert_equal "application/json", @response.media_type js = ActiveSupport::JSON.decode(@response.body) assert_not_nil js assert_equal "Feature", js["type"] @@ -528,7 +528,7 @@ module Api get :show, :params => { :id => open_note.id, :format => "gpx" } assert_response :success - assert_equal "application/gpx+xml", @response.content_type + assert_equal "application/gpx+xml", @response.media_type assert_select "gpx", :count => 1 do assert_select "wpt[lat='#{open_note.lat}'][lon='#{open_note.lon}']", :count => 1 do assert_select "time", :count => 1 @@ -636,7 +636,7 @@ module Api get :index, :params => { :bbox => "1,1,1.2,1.2", :format => "rss" } assert_response :success - assert_equal "application/rss+xml", @response.content_type + assert_equal "application/rss+xml", @response.media_type assert_select "rss", :count => 1 do assert_select "channel", :count => 1 do assert_select "item", :count => 2 @@ -645,7 +645,7 @@ module Api get :index, :params => { :bbox => "1,1,1.2,1.2", :format => "json" } assert_response :success - assert_equal "application/json", @response.content_type + assert_equal "application/json", @response.media_type js = ActiveSupport::JSON.decode(@response.body) assert_not_nil js assert_equal "FeatureCollection", js["type"] @@ -653,14 +653,14 @@ module Api get :index, :params => { :bbox => "1,1,1.2,1.2", :format => "xml" } assert_response :success - assert_equal "application/xml", @response.content_type + assert_equal "application/xml", @response.media_type assert_select "osm", :count => 1 do assert_select "note", :count => 2 end get :index, :params => { :bbox => "1,1,1.2,1.2", :format => "gpx" } assert_response :success - assert_equal "application/gpx+xml", @response.content_type + assert_equal "application/gpx+xml", @response.media_type assert_select "gpx", :count => 1 do assert_select "wpt", :count => 2 end @@ -673,7 +673,7 @@ module Api get :index, :params => { :bbox => "1,1,1.2,1.2", :limit => 1, :format => "rss" } assert_response :success - assert_equal "application/rss+xml", @response.content_type + assert_equal "application/rss+xml", @response.media_type assert_select "rss", :count => 1 do assert_select "channel", :count => 1 do assert_select "item", :count => 1 @@ -682,7 +682,7 @@ module Api get :index, :params => { :bbox => "1,1,1.2,1.2", :limit => 1, :format => "json" } assert_response :success - assert_equal "application/json", @response.content_type + assert_equal "application/json", @response.media_type js = ActiveSupport::JSON.decode(@response.body) assert_not_nil js assert_equal "FeatureCollection", js["type"] @@ -690,14 +690,14 @@ module Api get :index, :params => { :bbox => "1,1,1.2,1.2", :limit => 1, :format => "xml" } assert_response :success - assert_equal "application/xml", @response.content_type + assert_equal "application/xml", @response.media_type assert_select "osm", :count => 1 do assert_select "note", :count => 1 end get :index, :params => { :bbox => "1,1,1.2,1.2", :limit => 1, :format => "gpx" } assert_response :success - assert_equal "application/gpx+xml", @response.content_type + assert_equal "application/gpx+xml", @response.media_type assert_select "gpx", :count => 1 do assert_select "wpt", :count => 1 end @@ -706,7 +706,7 @@ module Api def test_index_empty_area get :index, :params => { :bbox => "5,5,5.1,5.1", :format => "rss" } assert_response :success - assert_equal "application/rss+xml", @response.content_type + assert_equal "application/rss+xml", @response.media_type assert_select "rss", :count => 1 do assert_select "channel", :count => 1 do assert_select "item", :count => 0 @@ -715,7 +715,7 @@ module Api get :index, :params => { :bbox => "5,5,5.1,5.1", :format => "json" } assert_response :success - assert_equal "application/json", @response.content_type + assert_equal "application/json", @response.media_type js = ActiveSupport::JSON.decode(@response.body) assert_not_nil js assert_equal "FeatureCollection", js["type"] @@ -723,14 +723,14 @@ module Api get :index, :params => { :bbox => "5,5,5.1,5.1", :format => "xml" } assert_response :success - assert_equal "application/xml", @response.content_type + assert_equal "application/xml", @response.media_type assert_select "osm", :count => 1 do assert_select "note", :count => 0 end get :index, :params => { :bbox => "5,5,5.1,5.1", :format => "gpx" } assert_response :success - assert_equal "application/gpx+xml", @response.content_type + assert_equal "application/gpx+xml", @response.media_type assert_select "gpx", :count => 1 do assert_select "wpt", :count => 0 end @@ -739,19 +739,19 @@ module Api def test_index_large_area get :index, :params => { :bbox => "-2.5,-2.5,2.5,2.5", :format => :json } assert_response :success - assert_equal "application/json", @response.content_type + assert_equal "application/json", @response.media_type get :index, :params => { :l => "-2.5", :b => "-2.5", :r => "2.5", :t => "2.5", :format => :json } assert_response :success - assert_equal "application/json", @response.content_type + assert_equal "application/json", @response.media_type get :index, :params => { :bbox => "-10,-10,12,12", :format => :json } assert_response :bad_request - assert_equal "application/json", @response.content_type + assert_equal "text/plain", @response.media_type get :index, :params => { :l => "-10", :b => "-10", :r => "12", :t => "12", :format => :json } assert_response :bad_request - assert_equal "application/json", @response.content_type + assert_equal "text/plain", @response.media_type end def test_index_closed @@ -763,7 +763,7 @@ module Api # Open notes + closed in last 7 days get :index, :params => { :bbox => "1,1,1.7,1.7", :closed => "7", :format => "json" } assert_response :success - assert_equal "application/json", @response.content_type + assert_equal "application/json", @response.media_type js = ActiveSupport::JSON.decode(@response.body) assert_not_nil js assert_equal "FeatureCollection", js["type"] @@ -772,7 +772,7 @@ module Api # Only open notes get :index, :params => { :bbox => "1,1,1.7,1.7", :closed => "0", :format => "json" } assert_response :success - assert_equal "application/json", @response.content_type + assert_equal "application/json", @response.media_type js = ActiveSupport::JSON.decode(@response.body) assert_not_nil js assert_equal "FeatureCollection", js["type"] @@ -781,7 +781,7 @@ module Api # Open notes + all closed notes get :index, :params => { :bbox => "1,1,1.7,1.7", :closed => "-1", :format => "json" } assert_response :success - assert_equal "application/json", @response.content_type + assert_equal "application/json", @response.media_type js = ActiveSupport::JSON.decode(@response.body) assert_not_nil js assert_equal "FeatureCollection", js["type"] @@ -819,14 +819,14 @@ module Api get :search, :params => { :q => "note comment", :format => "xml" } assert_response :success - assert_equal "application/xml", @response.content_type + assert_equal "application/xml", @response.media_type assert_select "osm", :count => 1 do assert_select "note", :count => 1 end get :search, :params => { :q => "note comment", :format => "json" } assert_response :success - assert_equal "application/json", @response.content_type + assert_equal "application/json", @response.media_type js = ActiveSupport::JSON.decode(@response.body) assert_not_nil js assert_equal "FeatureCollection", js["type"] @@ -834,7 +834,7 @@ module Api get :search, :params => { :q => "note comment", :format => "rss" } assert_response :success - assert_equal "application/rss+xml", @response.content_type + assert_equal "application/rss+xml", @response.media_type assert_select "rss", :count => 1 do assert_select "channel", :count => 1 do assert_select "item", :count => 1 @@ -843,7 +843,7 @@ module Api get :search, :params => { :q => "note comment", :format => "gpx" } assert_response :success - assert_equal "application/gpx+xml", @response.content_type + assert_equal "application/gpx+xml", @response.media_type assert_select "gpx", :count => 1 do assert_select "wpt", :count => 1 end @@ -858,14 +858,14 @@ module Api get :search, :params => { :display_name => user.display_name, :format => "xml" } assert_response :success - assert_equal "application/xml", @response.content_type + assert_equal "application/xml", @response.media_type assert_select "osm", :count => 1 do assert_select "note", :count => 1 end get :search, :params => { :display_name => user.display_name, :format => "json" } assert_response :success - assert_equal "application/json", @response.content_type + assert_equal "application/json", @response.media_type js = ActiveSupport::JSON.decode(@response.body) assert_not_nil js assert_equal "FeatureCollection", js["type"] @@ -873,7 +873,7 @@ module Api get :search, :params => { :display_name => user.display_name, :format => "rss" } assert_response :success - assert_equal "application/rss+xml", @response.content_type + assert_equal "application/rss+xml", @response.media_type assert_select "rss", :count => 1 do assert_select "channel", :count => 1 do assert_select "item", :count => 1 @@ -882,7 +882,7 @@ module Api get :search, :params => { :display_name => user.display_name, :format => "gpx" } assert_response :success - assert_equal "application/gpx+xml", @response.content_type + assert_equal "application/gpx+xml", @response.media_type assert_select "gpx", :count => 1 do assert_select "wpt", :count => 1 end @@ -897,14 +897,14 @@ module Api get :search, :params => { :user => user.id, :format => "xml" } assert_response :success - assert_equal "application/xml", @response.content_type + assert_equal "application/xml", @response.media_type assert_select "osm", :count => 1 do assert_select "note", :count => 1 end get :search, :params => { :user => user.id, :format => "json" } assert_response :success - assert_equal "application/json", @response.content_type + assert_equal "application/json", @response.media_type js = ActiveSupport::JSON.decode(@response.body) assert_not_nil js assert_equal "FeatureCollection", js["type"] @@ -912,7 +912,7 @@ module Api get :search, :params => { :user => user.id, :format => "rss" } assert_response :success - assert_equal "application/rss+xml", @response.content_type + assert_equal "application/rss+xml", @response.media_type assert_select "rss", :count => 1 do assert_select "channel", :count => 1 do assert_select "item", :count => 1 @@ -921,7 +921,7 @@ module Api get :search, :params => { :user => user.id, :format => "gpx" } assert_response :success - assert_equal "application/gpx+xml", @response.content_type + assert_equal "application/gpx+xml", @response.media_type assert_select "gpx", :count => 1 do assert_select "wpt", :count => 1 end @@ -932,14 +932,14 @@ module Api get :search, :params => { :q => "no match", :format => "xml" } assert_response :success - assert_equal "application/xml", @response.content_type + assert_equal "application/xml", @response.media_type assert_select "osm", :count => 1 do assert_select "note", :count => 0 end get :search, :params => { :q => "no match", :format => "json" } assert_response :success - assert_equal "application/json", @response.content_type + assert_equal "application/json", @response.media_type js = ActiveSupport::JSON.decode(@response.body) assert_not_nil js assert_equal "FeatureCollection", js["type"] @@ -947,7 +947,7 @@ module Api get :search, :params => { :q => "no match", :format => "rss" } assert_response :success - assert_equal "application/rss+xml", @response.content_type + assert_equal "application/rss+xml", @response.media_type assert_select "rss", :count => 1 do assert_select "channel", :count => 1 do assert_select "item", :count => 0 @@ -956,7 +956,7 @@ module Api get :search, :params => { :q => "no match", :format => "gpx" } assert_response :success - assert_equal "application/gpx+xml", @response.content_type + assert_equal "application/gpx+xml", @response.media_type assert_select "gpx", :count => 1 do assert_select "wpt", :count => 0 end @@ -967,14 +967,14 @@ module Api get :search, :params => { :from => "01.01.2010", :to => "01.10.2010", :format => "xml" } assert_response :success - assert_equal "application/xml", @response.content_type + assert_equal "application/xml", @response.media_type assert_select "osm", :count => 1 do assert_select "note", :count => 0 end get :search, :params => { :from => "01.01.2010", :to => "01.10.2010", :format => "json" } assert_response :success - assert_equal "application/json", @response.content_type + assert_equal "application/json", @response.media_type js = ActiveSupport::JSON.decode(@response.body) assert_not_nil js assert_equal "FeatureCollection", js["type"] @@ -982,7 +982,7 @@ module Api get :search, :params => { :from => "01.01.2010", :to => "01.10.2010", :format => "rss" } assert_response :success - assert_equal "application/rss+xml", @response.content_type + assert_equal "application/rss+xml", @response.media_type assert_select "rss", :count => 1 do assert_select "channel", :count => 1 do assert_select "item", :count => 0 @@ -991,7 +991,7 @@ module Api get :search, :params => { :from => "01.01.2010", :to => "01.10.2010", :format => "gpx" } assert_response :success - assert_equal "application/gpx+xml", @response.content_type + assert_equal "application/gpx+xml", @response.media_type assert_select "gpx", :count => 1 do assert_select "wpt", :count => 0 end @@ -1027,7 +1027,7 @@ module Api get :feed, :params => { :format => "rss" } assert_response :success - assert_equal "application/rss+xml", @response.content_type + assert_equal "application/rss+xml", @response.media_type assert_select "rss", :count => 1 do assert_select "channel", :count => 1 do assert_select "item", :count => 4 @@ -1036,7 +1036,7 @@ module Api get :feed, :params => { :bbox => "1,1,1.2,1.2", :format => "rss" } assert_response :success - assert_equal "application/rss+xml", @response.content_type + assert_equal "application/rss+xml", @response.media_type assert_select "rss", :count => 1 do assert_select "channel", :count => 1 do assert_select "item", :count => 2 diff --git a/test/controllers/api/old_nodes_controller_test.rb b/test/controllers/api/old_nodes_controller_test.rb index 0f8954541..941787d0a 100644 --- a/test/controllers/api/old_nodes_controller_test.rb +++ b/test/controllers/api/old_nodes_controller_test.rb @@ -43,7 +43,7 @@ module Api basic_authorization private_user.email, "test" # setup a simple XML node - xml_doc = private_node.to_xml + xml_doc = xml_for_node(private_node) xml_node = xml_doc.find("//osm/node").first nodeid = private_node.id @@ -91,7 +91,7 @@ module Api # setup a simple XML node - xml_doc = node.to_xml + xml_doc = xml_for_node(node) xml_node = xml_doc.find("//osm/node").first nodeid = node.id diff --git a/test/controllers/api/relations_controller_test.rb b/test/controllers/api/relations_controller_test.rb index 4d2969026..1b54e4863 100644 --- a/test/controllers/api/relations_controller_test.rb +++ b/test/controllers/api/relations_controller_test.rb @@ -525,28 +525,28 @@ module Api assert_response :forbidden # try to delete with an invalid (closed) changeset - xml = update_changeset(relation.to_xml, + xml = update_changeset(xml_for_relation(relation), private_user_closed_changeset.id) delete :delete, :params => { :id => relation.id }, :body => xml.to_s assert_response :forbidden # try to delete with an invalid (non-existent) changeset - xml = update_changeset(relation.to_xml, 0) + xml = update_changeset(xml_for_relation(relation), 0) delete :delete, :params => { :id => relation.id }, :body => xml.to_s assert_response :forbidden # this won't work because the relation is in-use by another relation - xml = used_relation.to_xml + xml = xml_for_relation(used_relation) delete :delete, :params => { :id => used_relation.id }, :body => xml.to_s assert_response :forbidden # this should work when we provide the appropriate payload... - xml = relation.to_xml + xml = xml_for_relation(relation) delete :delete, :params => { :id => relation.id }, :body => xml.to_s assert_response :forbidden # this won't work since the relation is already deleted - xml = deleted_relation.to_xml + xml = xml_for_relation(deleted_relation) delete :delete, :params => { :id => deleted_relation.id }, :body => xml.to_s assert_response :forbidden @@ -568,36 +568,36 @@ module Api assert_match(/Changeset id is missing/, @response.body) # try to delete with an invalid (closed) changeset - xml = update_changeset(relation.to_xml, + xml = update_changeset(xml_for_relation(relation), closed_changeset.id) delete :delete, :params => { :id => relation.id }, :body => xml.to_s assert_response :conflict # try to delete with an invalid (non-existent) changeset - xml = update_changeset(relation.to_xml, 0) + xml = update_changeset(xml_for_relation(relation), 0) delete :delete, :params => { :id => relation.id }, :body => xml.to_s assert_response :conflict # this won't work because the relation is in a changeset owned by someone else - xml = update_changeset(relation.to_xml, create(:changeset).id) + xml = update_changeset(xml_for_relation(relation), create(:changeset).id) delete :delete, :params => { :id => relation.id }, :body => xml.to_s assert_response :conflict, "shouldn't be able to delete a relation in a changeset owned by someone else (#{@response.body})" # this won't work because the relation in the payload is different to that passed - xml = update_changeset(relation.to_xml, changeset.id) + xml = update_changeset(xml_for_relation(relation), changeset.id) delete :delete, :params => { :id => create(:relation).id }, :body => xml.to_s assert_response :bad_request, "shouldn't be able to delete a relation when payload is different to the url" # this won't work because the relation is in-use by another relation - xml = update_changeset(used_relation.to_xml, changeset.id) + xml = update_changeset(xml_for_relation(used_relation), changeset.id) delete :delete, :params => { :id => used_relation.id }, :body => xml.to_s assert_response :precondition_failed, "shouldn't be able to delete a relation used in a relation (#{@response.body})" assert_equal "Precondition failed: The relation #{used_relation.id} is used in relation #{super_relation.id}.", @response.body # this should work when we provide the appropriate payload... - xml = update_changeset(multi_tag_relation.to_xml, changeset.id) + xml = update_changeset(xml_for_relation(multi_tag_relation), changeset.id) delete :delete, :params => { :id => multi_tag_relation.id }, :body => xml.to_s assert_response :success @@ -607,18 +607,18 @@ module Api "delete request should return a new version number for relation" # this won't work since the relation is already deleted - xml = update_changeset(deleted_relation.to_xml, changeset.id) + xml = update_changeset(xml_for_relation(deleted_relation), changeset.id) delete :delete, :params => { :id => deleted_relation.id }, :body => xml.to_s assert_response :gone # Public visible relation needs to be deleted - xml = update_changeset(super_relation.to_xml, changeset.id) + xml = update_changeset(xml_for_relation(super_relation), changeset.id) delete :delete, :params => { :id => super_relation.id }, :body => xml.to_s assert_response :success # this works now because the relation which was using this one # has been deleted. - xml = update_changeset(used_relation.to_xml, changeset.id) + xml = update_changeset(xml_for_relation(used_relation), changeset.id) delete :delete, :params => { :id => used_relation.id }, :body => xml.to_s assert_response :success, "should be able to delete a relation used in an old relation (#{@response.body})" @@ -643,7 +643,7 @@ module Api # indirectly via the way), so the bbox should be [3,3,5,5]. check_changeset_modify(BoundingBox.new(3, 3, 5, 5)) do |changeset_id| # add a tag to an existing relation - relation_xml = relation.to_xml + relation_xml = xml_for_relation(relation) relation_element = relation_xml.find("//osm/relation").first new_tag = XML::Node.new("tag") new_tag["k"] = "some_new_tag" @@ -675,7 +675,7 @@ module Api [node1, node2, way1, way2].each do |element| bbox = element.bbox.to_unscaled check_changeset_modify(bbox) do |changeset_id| - relation_xml = Relation.find(relation.id).to_xml + relation_xml = xml_for_relation(Relation.find(relation.id)) relation_element = relation_xml.find("//osm/relation").first new_member = XML::Node.new("member") new_member["ref"] = element.id.to_s @@ -710,7 +710,7 @@ module Api check_changeset_modify(BoundingBox.new(5, 5, 5, 5)) do |changeset_id| # remove node 5 (5,5) from an existing relation - relation_xml = relation.to_xml + relation_xml = xml_for_relation(relation) relation_xml .find("//osm/relation/member[@type='node'][@ref='#{node2.id}']") .first.remove! @@ -879,7 +879,7 @@ OSM create(:relation_member, :relation => relation, :member => node2) check_changeset_modify(BoundingBox.new(3, 3, 5, 5)) do |changeset_id| - relation_xml = relation.to_xml + relation_xml = xml_for_relation(relation) relation_xml .find("//osm/relation/member") .each(&:remove!) diff --git a/test/controllers/api/traces_controller_test.rb b/test/controllers/api/traces_controller_test.rb index 820829aad..80b9d1a84 100644 --- a/test/controllers/api/traces_controller_test.rb +++ b/test/controllers/api/traces_controller_test.rb @@ -336,8 +336,8 @@ module Api def check_trace_data(trace, digest, content_type = "application/gpx+xml", extension = "gpx") assert_response :success assert_equal digest, Digest::MD5.hexdigest(response.body) - assert_equal content_type, response.content_type - assert_equal "attachment; filename=\"#{trace.id}.#{extension}\"", @response.header["Content-Disposition"] + assert_equal content_type, response.media_type + assert_equal "attachment; filename=\"#{trace.id}.#{extension}\"; filename*=UTF-8''#{trace.id}.#{extension}", @response.header["Content-Disposition"] end ## diff --git a/test/controllers/api/user_preferences_controller_test.rb b/test/controllers/api/user_preferences_controller_test.rb index 99dad9597..3223eb5dd 100644 --- a/test/controllers/api/user_preferences_controller_test.rb +++ b/test/controllers/api/user_preferences_controller_test.rb @@ -7,38 +7,38 @@ module Api def test_routes assert_routing( { :path => "/api/0.6/user/preferences", :method => :get }, - { :controller => "api/user_preferences", :action => "read" } + { :controller => "api/user_preferences", :action => "index" } ) assert_routing( { :path => "/api/0.6/user/preferences", :method => :put }, - { :controller => "api/user_preferences", :action => "update" } + { :controller => "api/user_preferences", :action => "update_all" } ) assert_routing( { :path => "/api/0.6/user/preferences/key", :method => :get }, - { :controller => "api/user_preferences", :action => "read_one", :preference_key => "key" } + { :controller => "api/user_preferences", :action => "show", :preference_key => "key" } ) assert_routing( { :path => "/api/0.6/user/preferences/key", :method => :put }, - { :controller => "api/user_preferences", :action => "update_one", :preference_key => "key" } + { :controller => "api/user_preferences", :action => "update", :preference_key => "key" } ) assert_routing( { :path => "/api/0.6/user/preferences/key", :method => :delete }, - { :controller => "api/user_preferences", :action => "delete_one", :preference_key => "key" } + { :controller => "api/user_preferences", :action => "destroy", :preference_key => "key" } ) end ## - # test read action - def test_read + # test showing all preferences + def test_index # first try without auth - get :read + get :index assert_response :unauthorized, "should be authenticated" # authenticate as a user with no preferences basic_authorization create(:user).email, "test" # try the read again - get :read + get :index assert_select "osm" do assert_select "preferences", :count => 1 do assert_select "preference", :count => 0 @@ -52,9 +52,9 @@ module Api basic_authorization user.email, "test" # try the read again - get :read + get :index assert_response :success - assert_equal "application/xml", @response.content_type + assert_equal "application/xml", @response.media_type assert_select "osm" do assert_select "preferences", :count => 1 do assert_select "preference", :count => 2 @@ -65,39 +65,39 @@ module Api end ## - # test read_one action - def test_read_one + # test showing one preference + def test_show user = create(:user) create(:user_preference, :user => user, :k => "key", :v => "value") # try a read without auth - get :read_one, :params => { :preference_key => "key" } + get :show, :params => { :preference_key => "key" } assert_response :unauthorized, "should be authenticated" # authenticate as a user with preferences basic_authorization user.email, "test" # try the read again - get :read_one, :params => { :preference_key => "key" } + get :show, :params => { :preference_key => "key" } assert_response :success - assert_equal "text/plain", @response.content_type + assert_equal "text/plain", @response.media_type assert_equal "value", @response.body # try the read again for a non-existent key - get :read_one, :params => { :preference_key => "unknown_key" } + get :show, :params => { :preference_key => "unknown_key" } assert_response :not_found end ## - # test update action - def test_update + # test bulk update action + def test_update_all user = create(:user) create(:user_preference, :user => user, :k => "key", :v => "value") create(:user_preference, :user => user, :k => "some_key", :v => "some_value") # try a put without auth assert_no_difference "UserPreference.count" do - put :update, :body => "" + put :update_all, :body => "" end assert_response :unauthorized, "should be authenticated" assert_equal "value", UserPreference.find([user.id, "key"]).v @@ -111,10 +111,10 @@ module Api # try the put again assert_no_difference "UserPreference.count" do - put :update, :body => "" + put :update_all, :body => "" end assert_response :success - assert_equal "text/plain", @response.content_type + assert_equal "text/plain", @response.media_type assert_equal "", @response.body assert_equal "new_value", UserPreference.find([user.id, "key"]).v assert_equal "value", UserPreference.find([user.id, "new_key"]).v @@ -124,29 +124,29 @@ module Api # try a put with duplicate keys assert_no_difference "UserPreference.count" do - put :update, :body => "" + put :update_all, :body => "" end assert_response :bad_request - assert_equal "text/plain", @response.content_type + assert_equal "text/plain", @response.media_type assert_equal "Duplicate preferences with key key", @response.body assert_equal "new_value", UserPreference.find([user.id, "key"]).v # try a put with invalid content assert_no_difference "UserPreference.count" do - put :update, :body => "nonsense" + put :update_all, :body => "nonsense" end assert_response :bad_request end ## - # test update_one action - def test_update_one + # test update action + def test_update user = create(:user) create(:user_preference, :user => user) # try a put without auth assert_no_difference "UserPreference.count" do - put :update_one, :params => { :preference_key => "new_key" }, :body => "new_value" + put :update, :params => { :preference_key => "new_key" }, :body => "new_value" end assert_response :unauthorized, "should be authenticated" assert_raises ActiveRecord::RecordNotFound do @@ -158,32 +158,32 @@ module Api # try adding a new preference assert_difference "UserPreference.count", 1 do - put :update_one, :params => { :preference_key => "new_key" }, :body => "new_value" + put :update, :params => { :preference_key => "new_key" }, :body => "new_value" end assert_response :success - assert_equal "text/plain", @response.content_type + assert_equal "text/plain", @response.media_type assert_equal "", @response.body assert_equal "new_value", UserPreference.find([user.id, "new_key"]).v # try changing the value of a preference assert_no_difference "UserPreference.count" do - put :update_one, :params => { :preference_key => "new_key" }, :body => "newer_value" + put :update, :params => { :preference_key => "new_key" }, :body => "newer_value" end assert_response :success - assert_equal "text/plain", @response.content_type + assert_equal "text/plain", @response.media_type assert_equal "", @response.body assert_equal "newer_value", UserPreference.find([user.id, "new_key"]).v end ## - # test delete_one action - def test_delete_one + # test destroy action + def test_destroy user = create(:user) create(:user_preference, :user => user, :k => "key", :v => "value") # try a delete without auth assert_no_difference "UserPreference.count" do - delete :delete_one, :params => { :preference_key => "key" } + delete :destroy, :params => { :preference_key => "key" } end assert_response :unauthorized, "should be authenticated" assert_equal "value", UserPreference.find([user.id, "key"]).v @@ -193,10 +193,10 @@ module Api # try the delete again assert_difference "UserPreference.count", -1 do - get :delete_one, :params => { :preference_key => "key" } + get :destroy, :params => { :preference_key => "key" } end assert_response :success - assert_equal "text/plain", @response.content_type + assert_equal "text/plain", @response.media_type assert_equal "", @response.body assert_raises ActiveRecord::RecordNotFound do UserPreference.find([user.id, "key"]) @@ -204,7 +204,7 @@ module Api # try the delete again for the same key assert_no_difference "UserPreference.count" do - get :delete_one, :params => { :preference_key => "key" } + get :destroy, :params => { :preference_key => "key" } end assert_response :not_found assert_raises ActiveRecord::RecordNotFound do @@ -214,7 +214,7 @@ module Api # Ensure that a valid access token with correct capabilities can be used to # read preferences - def test_read_one_using_token + def test_show_using_token user = create(:user) token = create(:access_token, :user => user, :allow_read_prefs => true) create(:user_preference, :user => user, :k => "key", :v => "value") @@ -224,14 +224,14 @@ module Api @request.env["oauth.strategies"] = [:token] @request.env["oauth.token"] = token - get :read_one, :params => { :preference_key => "key" } + get :show, :params => { :preference_key => "key" } assert_response :success end # Ensure that a valid access token with incorrect capabilities can't be used # to read preferences even, though the owner of that token could read them # by other methods. - def test_read_one_using_token_fail + def test_show_using_token_fail user = create(:user) token = create(:access_token, :user => user, :allow_read_prefs => false) create(:user_preference, :user => user, :k => "key", :v => "value") @@ -239,7 +239,7 @@ module Api @request.env["oauth.strategies"] = [:token] @request.env["oauth.token"] = token - get :read_one, :params => { :preference_key => "key" } + get :show, :params => { :preference_key => "key" } assert_response :forbidden end end diff --git a/test/controllers/api/users_controller_test.rb b/test/controllers/api/users_controller_test.rb index de402ebf8..cc9d932bc 100644 --- a/test/controllers/api/users_controller_test.rb +++ b/test/controllers/api/users_controller_test.rb @@ -34,7 +34,7 @@ module Api # check that a visible user is returned properly get :show, :params => { :id => user.id } assert_response :success - assert_equal "text/xml", response.content_type + assert_equal "text/xml", response.media_type # check the data that is returned assert_select "description", :count => 1, :text => "test" @@ -90,7 +90,7 @@ module Api basic_authorization user.email, "test" get :details assert_response :success - assert_equal "text/xml", response.content_type + assert_equal "text/xml", response.media_type # check the data that is returned assert_select "description", :count => 1, :text => "test" @@ -136,7 +136,7 @@ module Api get :index, :params => { :users => user1.id } assert_response :success - assert_equal "text/xml", response.content_type + assert_equal "text/xml", response.media_type assert_select "user", :count => 1 do assert_select "user[id='#{user1.id}']", :count => 1 assert_select "user[id='#{user2.id}']", :count => 0 @@ -145,7 +145,7 @@ module Api get :index, :params => { :users => user2.id } assert_response :success - assert_equal "text/xml", response.content_type + assert_equal "text/xml", response.media_type assert_select "user", :count => 1 do assert_select "user[id='#{user1.id}']", :count => 0 assert_select "user[id='#{user2.id}']", :count => 1 @@ -154,7 +154,7 @@ module Api get :index, :params => { :users => "#{user1.id},#{user3.id}" } assert_response :success - assert_equal "text/xml", response.content_type + assert_equal "text/xml", response.media_type assert_select "user", :count => 2 do assert_select "user[id='#{user1.id}']", :count => 1 assert_select "user[id='#{user2.id}']", :count => 0 @@ -187,7 +187,7 @@ module Api basic_authorization user.email, "test" get :gpx_files assert_response :success - assert_equal "application/xml", response.content_type + assert_equal "application/xml", response.media_type # check the data that is returned assert_select "gpx_file[id='#{trace1.id}']", 1 do diff --git a/test/controllers/api/ways_controller_test.rb b/test/controllers/api/ways_controller_test.rb index c390e8bc2..433b43f27 100644 --- a/test/controllers/api/ways_controller_test.rb +++ b/test/controllers/api/ways_controller_test.rb @@ -290,17 +290,17 @@ module Api assert_response :forbidden # try to delete with an invalid (closed) changeset - xml = update_changeset(private_way.to_xml, private_closed_changeset.id) + xml = update_changeset(xml_for_way(private_way), private_closed_changeset.id) delete :delete, :params => { :id => private_way.id }, :body => xml.to_s assert_response :forbidden # try to delete with an invalid (non-existent) changeset - xml = update_changeset(private_way.to_xml, 0) + xml = update_changeset(xml_for_way(private_way), 0) delete :delete, :params => { :id => private_way.id }, :body => xml.to_s assert_response :forbidden # Now try with a valid changeset - xml = private_way.to_xml + xml = xml_for_way(private_way) delete :delete, :params => { :id => private_way.id }, :body => xml.to_s assert_response :forbidden @@ -311,12 +311,12 @@ module Api # "delete request should return a new version number for way" # this won't work since the way is already deleted - xml = private_deleted_way.to_xml + xml = xml_for_way(private_deleted_way) delete :delete, :params => { :id => private_deleted_way.id }, :body => xml.to_s assert_response :forbidden # this shouldn't work as the way is used in a relation - xml = private_used_way.to_xml + xml = xml_for_way(private_used_way) delete :delete, :params => { :id => private_used_way.id }, :body => xml.to_s assert_response :forbidden, "shouldn't be able to delete a way used in a relation (#{@response.body}), when done by a private user" @@ -339,17 +339,17 @@ module Api assert_response :bad_request # try to delete with an invalid (closed) changeset - xml = update_changeset(way.to_xml, closed_changeset.id) + xml = update_changeset(xml_for_way(way), closed_changeset.id) delete :delete, :params => { :id => way.id }, :body => xml.to_s assert_response :conflict # try to delete with an invalid (non-existent) changeset - xml = update_changeset(way.to_xml, 0) + xml = update_changeset(xml_for_way(way), 0) delete :delete, :params => { :id => way.id }, :body => xml.to_s assert_response :conflict # Now try with a valid changeset - xml = way.to_xml + xml = xml_for_way(way) delete :delete, :params => { :id => way.id }, :body => xml.to_s assert_response :success @@ -360,12 +360,12 @@ module Api "delete request should return a new version number for way" # this won't work since the way is already deleted - xml = deleted_way.to_xml + xml = xml_for_way(deleted_way) delete :delete, :params => { :id => deleted_way.id }, :body => xml.to_s assert_response :gone # this shouldn't work as the way is used in a relation - xml = used_way.to_xml + xml = xml_for_way(used_way) delete :delete, :params => { :id => used_way.id }, :body => xml.to_s assert_response :precondition_failed, "shouldn't be able to delete a way used in a relation (#{@response.body})" @@ -390,7 +390,7 @@ module Api ## First test with no user credentials # try and update a way without authorisation - xml = way.to_xml + xml = xml_for_way(way) put :update, :params => { :id => way.id }, :body => xml.to_s assert_response :unauthorized @@ -402,33 +402,33 @@ module Api ## trying to break changesets # try and update in someone else's changeset - xml = update_changeset(private_way.to_xml, + xml = update_changeset(xml_for_way(private_way), create(:changeset).id) put :update, :params => { :id => private_way.id }, :body => xml.to_s assert_require_public_data "update with other user's changeset should be forbidden when date isn't public" # try and update in a closed changeset - xml = update_changeset(private_way.to_xml, + xml = update_changeset(xml_for_way(private_way), create(:changeset, :closed, :user => private_user).id) put :update, :params => { :id => private_way.id }, :body => xml.to_s assert_require_public_data "update with closed changeset should be forbidden, when data isn't public" # try and update in a non-existant changeset - xml = update_changeset(private_way.to_xml, 0) + xml = update_changeset(xml_for_way(private_way), 0) put :update, :params => { :id => private_way.id }, :body => xml.to_s assert_require_public_data("update with changeset=0 should be forbidden, when data isn't public") ## try and submit invalid updates - xml = xml_replace_node(private_way.to_xml, node.id, 9999) + xml = xml_replace_node(xml_for_way(private_way), node.id, 9999) put :update, :params => { :id => private_way.id }, :body => xml.to_s assert_require_public_data "way with non-existent node should be forbidden, when data isn't public" - xml = xml_replace_node(private_way.to_xml, node.id, create(:node, :deleted).id) + xml = xml_replace_node(xml_for_way(private_way), node.id, create(:node, :deleted).id) put :update, :params => { :id => private_way.id }, :body => xml.to_s assert_require_public_data "way with deleted node should be forbidden, when data isn't public" ## finally, produce a good request which will still not work - xml = private_way.to_xml + xml = xml_for_way(private_way) put :update, :params => { :id => private_way.id }, :body => xml.to_s assert_require_public_data "should have failed with a forbidden when data isn't public" @@ -440,28 +440,28 @@ module Api ## trying to break changesets # try and update in someone else's changeset - xml = update_changeset(way.to_xml, + xml = update_changeset(xml_for_way(way), create(:changeset).id) put :update, :params => { :id => way.id }, :body => xml.to_s assert_response :conflict, "update with other user's changeset should be rejected" # try and update in a closed changeset - xml = update_changeset(way.to_xml, + xml = update_changeset(xml_for_way(way), create(:changeset, :closed, :user => user).id) put :update, :params => { :id => way.id }, :body => xml.to_s assert_response :conflict, "update with closed changeset should be rejected" # try and update in a non-existant changeset - xml = update_changeset(way.to_xml, 0) + xml = update_changeset(xml_for_way(way), 0) put :update, :params => { :id => way.id }, :body => xml.to_s assert_response :conflict, "update with changeset=0 should be rejected" ## try and submit invalid updates - xml = xml_replace_node(way.to_xml, node.id, 9999) + xml = xml_replace_node(xml_for_way(way), node.id, 9999) put :update, :params => { :id => way.id }, :body => xml.to_s assert_response :precondition_failed, "way with non-existent node should be rejected" - xml = xml_replace_node(way.to_xml, node.id, create(:node, :deleted).id) + xml = xml_replace_node(xml_for_way(way), node.id, create(:node, :deleted).id) put :update, :params => { :id => way.id }, :body => xml.to_s assert_response :precondition_failed, "way with deleted node should be rejected" @@ -469,26 +469,26 @@ module Api current_way_version = way.version # try and submit a version behind - xml = xml_attr_rewrite(way.to_xml, + xml = xml_attr_rewrite(xml_for_way(way), "version", current_way_version - 1) put :update, :params => { :id => way.id }, :body => xml.to_s assert_response :conflict, "should have failed on old version number" # try and submit a version ahead - xml = xml_attr_rewrite(way.to_xml, + xml = xml_attr_rewrite(xml_for_way(way), "version", current_way_version + 1) put :update, :params => { :id => way.id }, :body => xml.to_s assert_response :conflict, "should have failed on skipped version number" # try and submit total crap in the version field - xml = xml_attr_rewrite(way.to_xml, + xml = xml_attr_rewrite(xml_for_way(way), "version", "p1r4t3s!") put :update, :params => { :id => way.id }, :body => xml.to_s assert_response :conflict, "should not be able to put 'p1r4at3s!' in the version field" ## try an update with the wrong ID - xml = create(:way).to_xml + xml = xml_for_way(create(:way)) put :update, :params => { :id => way.id }, :body => xml.to_s assert_response :bad_request, "should not be able to update a way with a different ID from the XML" @@ -500,7 +500,7 @@ module Api "should not be able to update a way with non-OSM XML doc." ## finally, produce a good request which should work - xml = way.to_xml + xml = xml_for_way(way) put :update, :params => { :id => way.id }, :body => xml.to_s assert_response :success, "a valid update request failed" end @@ -527,7 +527,7 @@ module Api tag_xml["v"] = "yes" # add the tag into the existing xml - way_xml = private_way.to_xml + way_xml = xml_for_way(private_way) way_xml.find("//osm/way").first << tag_xml # try and upload it @@ -545,7 +545,7 @@ module Api tag_xml["v"] = "yes" # add the tag into the existing xml - way_xml = way.to_xml + way_xml = xml_for_way(way) way_xml.find("//osm/way").first << tag_xml # try and upload it @@ -575,7 +575,7 @@ module Api tag_xml["v"] = private_existing_tag.v # add the tag into the existing xml - way_xml = private_way.to_xml + way_xml = xml_for_way(private_way) way_xml.find("//osm/way").first << tag_xml # try and upload it @@ -593,7 +593,7 @@ module Api tag_xml["v"] = existing_tag.v # add the tag into the existing xml - way_xml = way.to_xml + way_xml = xml_for_way(way) way_xml.find("//osm/way").first << tag_xml # try and upload it @@ -621,7 +621,7 @@ module Api tag_xml["v"] = "foobar" # add the tag into the existing xml - way_xml = private_way.to_xml + way_xml = xml_for_way(private_way) # add two copies of the tag way_xml.find("//osm/way").first << tag_xml.copy(true) << tag_xml @@ -641,7 +641,7 @@ module Api tag_xml["v"] = "foobar" # add the tag into the existing xml - way_xml = way.to_xml + way_xml = xml_for_way(way) # add two copies of the tag way_xml.find("//osm/way").first << tag_xml.copy(true) << tag_xml diff --git a/test/controllers/changeset_comments_controller_test.rb b/test/controllers/changeset_comments_controller_test.rb index 2d13bd92b..a1a00c5dc 100644 --- a/test/controllers/changeset_comments_controller_test.rb +++ b/test/controllers/changeset_comments_controller_test.rb @@ -22,7 +22,7 @@ class ChangesetCommentsControllerTest < ActionController::TestCase get :index, :params => { :format => "rss" } assert_response :success - assert_equal "application/rss+xml", @response.content_type + assert_equal "application/rss+xml", @response.media_type assert_select "rss", :count => 1 do assert_select "channel", :count => 1 do assert_select "item", :count => 3 @@ -31,7 +31,7 @@ class ChangesetCommentsControllerTest < ActionController::TestCase get :index, :params => { :format => "rss", :limit => 2 } assert_response :success - assert_equal "application/rss+xml", @response.content_type + assert_equal "application/rss+xml", @response.media_type assert_select "rss", :count => 1 do assert_select "channel", :count => 1 do assert_select "item", :count => 2 @@ -40,7 +40,7 @@ class ChangesetCommentsControllerTest < ActionController::TestCase get :index, :params => { :id => changeset.id, :format => "rss" } assert_response :success - assert_equal "application/rss+xml", @response.content_type + assert_equal "application/rss+xml", @response.media_type assert_select "rss", :count => 1 do assert_select "channel", :count => 1 do assert_select "item", :count => 3 diff --git a/test/controllers/changesets_controller_test.rb b/test/controllers/changesets_controller_test.rb index caf7721cd..e754e32b7 100644 --- a/test/controllers/changesets_controller_test.rb +++ b/test/controllers/changesets_controller_test.rb @@ -214,7 +214,7 @@ class ChangesetsControllerTest < ActionController::TestCase get :feed, :params => { :format => :atom } assert_response :success assert_template "index" - assert_equal "application/atom+xml", response.content_type + assert_equal "application/atom+xml", response.media_type check_feed_result([changeset, closed_changeset]) end @@ -232,7 +232,7 @@ class ChangesetsControllerTest < ActionController::TestCase get :feed, :params => { :format => :atom, :bbox => "4.5,4.5,5.5,5.5" } assert_response :success assert_template "index" - assert_equal "application/atom+xml", response.content_type + assert_equal "application/atom+xml", response.media_type check_feed_result([changeset, closed_changeset]) end @@ -250,7 +250,7 @@ class ChangesetsControllerTest < ActionController::TestCase assert_response :success assert_template "index" - assert_equal "application/atom+xml", response.content_type + assert_equal "application/atom+xml", response.media_type check_feed_result(changesets) end diff --git a/test/controllers/oauth_clients_controller_test.rb b/test/controllers/oauth_clients_controller_test.rb index 81ab290b9..7a963a8e2 100644 --- a/test/controllers/oauth_clients_controller_test.rb +++ b/test/controllers/oauth_clients_controller_test.rb @@ -37,6 +37,7 @@ class OauthClientsControllerTest < ActionController::TestCase def test_index user = create(:user) create_list(:client_application, 2, :user => user) + create_list(:access_token, 2, :user => user) get :index, :params => { :display_name => user.display_name } diff --git a/test/controllers/traces_controller_test.rb b/test/controllers/traces_controller_test.rb index 84a655794..059242af9 100644 --- a/test/controllers/traces_controller_test.rb +++ b/test/controllers/traces_controller_test.rb @@ -115,8 +115,8 @@ class TracesControllerTest < ActionController::TestCase { :controller => "traces", :action => "update", :id => "1" } ) assert_routing( - { :path => "/trace/1/delete", :method => :post }, - { :controller => "traces", :action => "delete", :id => "1" } + { :path => "/traces/1", :method => :delete }, + { :controller => "traces", :action => "destroy", :id => "1" } ) end @@ -637,39 +637,39 @@ class TracesControllerTest < ActionController::TestCase assert_equal new_details[:visibility], trace.visibility end - # Test deleting a trace - def test_delete + # Test destroying a trace + def test_destroy public_trace_file = create(:trace, :visibility => "public") deleted_trace_file = create(:trace, :deleted) # First with no auth - post :delete, :params => { :display_name => public_trace_file.user.display_name, :id => public_trace_file.id } + delete :destroy, :params => { :display_name => public_trace_file.user.display_name, :id => public_trace_file.id } assert_response :forbidden # Now with some other user, which should fail - post :delete, :params => { :display_name => public_trace_file.user.display_name, :id => public_trace_file.id }, :session => { :user => create(:user) } + delete :destroy, :params => { :display_name => public_trace_file.user.display_name, :id => public_trace_file.id }, :session => { :user => create(:user) } assert_response :forbidden # Now with a trace which doesn't exist - post :delete, :params => { :display_name => create(:user).display_name, :id => 0 }, :session => { :user => create(:user) } + delete :destroy, :params => { :display_name => create(:user).display_name, :id => 0 }, :session => { :user => create(:user) } assert_response :not_found # Now with a trace has already been deleted - post :delete, :params => { :display_name => deleted_trace_file.user.display_name, :id => deleted_trace_file.id }, :session => { :user => deleted_trace_file.user } + delete :destroy, :params => { :display_name => deleted_trace_file.user.display_name, :id => deleted_trace_file.id }, :session => { :user => deleted_trace_file.user } assert_response :not_found # Now with a trace that we are allowed to delete - post :delete, :params => { :display_name => public_trace_file.user.display_name, :id => public_trace_file.id }, :session => { :user => public_trace_file.user } + delete :destroy, :params => { :display_name => public_trace_file.user.display_name, :id => public_trace_file.id }, :session => { :user => public_trace_file.user } assert_response :redirect assert_redirected_to :action => :index, :display_name => public_trace_file.user.display_name trace = Trace.find(public_trace_file.id) assert_equal false, trace.visible - # Finally with a trace that is deleted by an admin + # Finally with a trace that is destroyed by an admin public_trace_file = create(:trace, :visibility => "public") admin = create(:administrator_user) - post :delete, :params => { :display_name => public_trace_file.user.display_name, :id => public_trace_file.id }, :session => { :user => admin } + delete :destroy, :params => { :display_name => public_trace_file.user.display_name, :id => public_trace_file.id }, :session => { :user => admin } assert_response :redirect assert_redirected_to :action => :index, :display_name => public_trace_file.user.display_name trace = Trace.find(public_trace_file.id) @@ -681,7 +681,7 @@ class TracesControllerTest < ActionController::TestCase def check_trace_feed(traces) assert_response :success assert_template "georss" - assert_equal "application/rss+xml", @response.content_type + assert_equal "application/rss+xml", @response.media_type assert_select "rss", :count => 1 do assert_select "channel", :count => 1 do assert_select "title" @@ -736,19 +736,19 @@ class TracesControllerTest < ActionController::TestCase def check_trace_data(trace, digest, content_type = "application/gpx+xml", extension = "gpx") assert_response :success assert_equal digest, Digest::MD5.hexdigest(response.body) - assert_equal content_type, response.content_type - assert_equal "attachment; filename=\"#{trace.id}.#{extension}\"", @response.header["Content-Disposition"] + assert_equal content_type, response.media_type + assert_equal "attachment; filename=\"#{trace.id}.#{extension}\"; filename*=UTF-8''#{trace.id}.#{extension}", @response.header["Content-Disposition"] end def check_trace_picture(trace) assert_response :success - assert_equal "image/gif", response.content_type + assert_equal "image/gif", response.media_type assert_equal trace.large_picture, response.body end def check_trace_icon(trace) assert_response :success - assert_equal "image/gif", response.content_type + assert_equal "image/gif", response.media_type assert_equal trace.icon_picture, response.body end end diff --git a/test/integration/cors_test.rb b/test/integration/cors_test.rb index 82e834646..c35f73d34 100644 --- a/test/integration/cors_test.rb +++ b/test/integration/cors_test.rb @@ -9,7 +9,7 @@ class CORSTest < ActionDispatch::IntegrationTest assert_response :success assert_equal "*", response.headers["Access-Control-Allow-Origin"] - assert_nil response.content_type + assert_nil response.media_type assert_equal "", response.body end @@ -21,7 +21,7 @@ class CORSTest < ActionDispatch::IntegrationTest assert_response :success assert_nil response.headers["Access-Control-Allow-Origin"] - assert_nil response.content_type + assert_nil response.media_type assert_equal "", response.body end end diff --git a/test/models/node_test.rb b/test/models/node_test.rb index d6fa1cd8f..e8a572fd8 100644 --- a/test/models/node_test.rb +++ b/test/models/node_test.rb @@ -68,14 +68,6 @@ class NodeTest < ActiveSupport::TestCase assert_in_delta 76.543 * OldNode::SCALE, node.longitude, 0.000001 end - # Ensure the lat/lon is formatted as a decimal e.g. not 4.0e-05 - def test_lat_lon_xml_format - node = build(:node, :latitude => 0.00004 * OldNode::SCALE, :longitude => 0.00008 * OldNode::SCALE) - - assert_match(/lat="0.0000400"/, node.to_xml.to_s) - assert_match(/lon="0.0000800"/, node.to_xml.to_s) - end - # Check that you can create a node and store it def test_create changeset = create(:changeset) diff --git a/test/test_helper.rb b/test/test_helper.rb index e66d782ff..05385b4f9 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -170,5 +170,87 @@ module ActiveSupport fill_in "password", :with => "test" click_on "Login", :match => :first end + + def xml_for_node(node) + doc = OSM::API.new.get_xml_doc + doc.root << xml_node_for_node(node) + doc + end + + def xml_node_for_node(node) + el = XML::Node.new "node" + el["id"] = node.id.to_s + + OMHelper.add_metadata_to_xml_node(el, node, {}, {}) + + if node.visible? + el["lat"] = node.lat.to_s + el["lon"] = node.lon.to_s + end + + OMHelper.add_tags_to_xml_node(el, node.node_tags) + + el + end + + def xml_for_way(way) + doc = OSM::API.new.get_xml_doc + doc.root << xml_node_for_way(way) + doc + end + + def xml_node_for_way(way) + el = XML::Node.new "way" + el["id"] = way.id.to_s + + OMHelper.add_metadata_to_xml_node(el, way, {}, {}) + + # make sure nodes are output in sequence_id order + ordered_nodes = [] + way.way_nodes.each do |nd| + ordered_nodes[nd.sequence_id] = nd.node_id.to_s if nd.node&.visible? + end + + ordered_nodes.each do |nd_id| + next unless nd_id && nd_id != "0" + + node_el = XML::Node.new "nd" + node_el["ref"] = nd_id + el << node_el + end + + OMHelper.add_tags_to_xml_node(el, way.way_tags) + + el + end + + def xml_for_relation(relation) + doc = OSM::API.new.get_xml_doc + doc.root << xml_node_for_relation(relation) + doc + end + + def xml_node_for_relation(relation) + el = XML::Node.new "relation" + el["id"] = relation.id.to_s + + OMHelper.add_metadata_to_xml_node(el, relation, {}, {}) + + relation.relation_members.each do |member| + member_el = XML::Node.new "member" + member_el["type"] = member.member_type.downcase + member_el["ref"] = member.member_id.to_s + member_el["role"] = member.member_role + el << member_el + end + + OMHelper.add_tags_to_xml_node(el, relation.relation_tags) + + el + end + + class OMHelper + extend ObjectMetadata + end end end diff --git a/vendor/assets/javascripts/bowser.js b/vendor/assets/javascripts/bowser.js deleted file mode 100644 index a06971f89..000000000 --- a/vendor/assets/javascripts/bowser.js +++ /dev/null @@ -1,644 +0,0 @@ -/*! - * Bowser - a browser detector - * https://github.com/ded/bowser - * MIT License | (c) Dustin Diaz 2015 - */ - -!function (root, name, definition) { - if (typeof module != 'undefined' && module.exports) module.exports = definition() - else if (typeof define == 'function' && define.amd) define(name, definition) - else root[name] = definition() -}(this, 'bowser', function () { - /** - * See useragents.js for examples of navigator.userAgent - */ - - var t = true - - function detect(ua) { - - function getFirstMatch(regex) { - var match = ua.match(regex); - return (match && match.length > 1 && match[1]) || ''; - } - - function getSecondMatch(regex) { - var match = ua.match(regex); - return (match && match.length > 1 && match[2]) || ''; - } - - var iosdevice = getFirstMatch(/(ipod|iphone|ipad)/i).toLowerCase() - , likeAndroid = /like android/i.test(ua) - , android = !likeAndroid && /android/i.test(ua) - , nexusMobile = /nexus\s*[0-6]\s*/i.test(ua) - , nexusTablet = !nexusMobile && /nexus\s*[0-9]+/i.test(ua) - , chromeos = /CrOS/.test(ua) - , silk = /silk/i.test(ua) - , sailfish = /sailfish/i.test(ua) - , tizen = /tizen/i.test(ua) - , webos = /(web|hpw)(o|0)s/i.test(ua) - , windowsphone = /windows phone/i.test(ua) - , samsungBrowser = /SamsungBrowser/i.test(ua) - , windows = !windowsphone && /windows/i.test(ua) - , mac = !iosdevice && !silk && /macintosh/i.test(ua) - , linux = !android && !sailfish && !tizen && !webos && /linux/i.test(ua) - , edgeVersion = getSecondMatch(/edg([ea]|ios)\/(\d+(\.\d+)?)/i) - , versionIdentifier = getFirstMatch(/version\/(\d+(\.\d+)?)/i) - , tablet = /tablet/i.test(ua) && !/tablet pc/i.test(ua) - , mobile = !tablet && /[^-]mobi/i.test(ua) - , xbox = /xbox/i.test(ua) - , result - - if (/opera/i.test(ua)) { - // an old Opera - result = { - name: 'Opera' - , opera: t - , version: versionIdentifier || getFirstMatch(/(?:opera|opr|opios)[\s\/](\d+(\.\d+)?)/i) - } - } else if (/opr\/|opios/i.test(ua)) { - // a new Opera - result = { - name: 'Opera' - , opera: t - , version: getFirstMatch(/(?:opr|opios)[\s\/](\d+(\.\d+)?)/i) || versionIdentifier - } - } - else if (/SamsungBrowser/i.test(ua)) { - result = { - name: 'Samsung Internet for Android' - , samsungBrowser: t - , version: versionIdentifier || getFirstMatch(/(?:SamsungBrowser)[\s\/](\d+(\.\d+)?)/i) - } - } - else if (/Whale/i.test(ua)) { - result = { - name: 'NAVER Whale browser' - , whale: t - , version: getFirstMatch(/(?:whale)[\s\/](\d+(?:\.\d+)+)/i) - } - } - else if (/MZBrowser/i.test(ua)) { - result = { - name: 'MZ Browser' - , mzbrowser: t - , version: getFirstMatch(/(?:MZBrowser)[\s\/](\d+(?:\.\d+)+)/i) - } - } - else if (/coast/i.test(ua)) { - result = { - name: 'Opera Coast' - , coast: t - , version: versionIdentifier || getFirstMatch(/(?:coast)[\s\/](\d+(\.\d+)?)/i) - } - } - else if (/focus/i.test(ua)) { - result = { - name: 'Focus' - , focus: t - , version: getFirstMatch(/(?:focus)[\s\/](\d+(?:\.\d+)+)/i) - } - } - else if (/yabrowser/i.test(ua)) { - result = { - name: 'Yandex Browser' - , yandexbrowser: t - , version: versionIdentifier || getFirstMatch(/(?:yabrowser)[\s\/](\d+(\.\d+)?)/i) - } - } - else if (/ucbrowser/i.test(ua)) { - result = { - name: 'UC Browser' - , ucbrowser: t - , version: getFirstMatch(/(?:ucbrowser)[\s\/](\d+(?:\.\d+)+)/i) - } - } - else if (/mxios/i.test(ua)) { - result = { - name: 'Maxthon' - , maxthon: t - , version: getFirstMatch(/(?:mxios)[\s\/](\d+(?:\.\d+)+)/i) - } - } - else if (/epiphany/i.test(ua)) { - result = { - name: 'Epiphany' - , epiphany: t - , version: getFirstMatch(/(?:epiphany)[\s\/](\d+(?:\.\d+)+)/i) - } - } - else if (/puffin/i.test(ua)) { - result = { - name: 'Puffin' - , puffin: t - , version: getFirstMatch(/(?:puffin)[\s\/](\d+(?:\.\d+)?)/i) - } - } - else if (/sleipnir/i.test(ua)) { - result = { - name: 'Sleipnir' - , sleipnir: t - , version: getFirstMatch(/(?:sleipnir)[\s\/](\d+(?:\.\d+)+)/i) - } - } - else if (/k-meleon/i.test(ua)) { - result = { - name: 'K-Meleon' - , kMeleon: t - , version: getFirstMatch(/(?:k-meleon)[\s\/](\d+(?:\.\d+)+)/i) - } - } - else if (windowsphone) { - result = { - name: 'Windows Phone' - , osname: 'Windows Phone' - , windowsphone: t - } - if (edgeVersion) { - result.msedge = t - result.version = edgeVersion - } - else { - result.msie = t - result.version = getFirstMatch(/iemobile\/(\d+(\.\d+)?)/i) - } - } - else if (/msie|trident/i.test(ua)) { - result = { - name: 'Internet Explorer' - , msie: t - , version: getFirstMatch(/(?:msie |rv:)(\d+(\.\d+)?)/i) - } - } else if (chromeos) { - result = { - name: 'Chrome' - , osname: 'Chrome OS' - , chromeos: t - , chromeBook: t - , chrome: t - , version: getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.\d+)?)/i) - } - } else if (/edg([ea]|ios)/i.test(ua)) { - result = { - name: 'Microsoft Edge' - , msedge: t - , version: edgeVersion - } - } - else if (/vivaldi/i.test(ua)) { - result = { - name: 'Vivaldi' - , vivaldi: t - , version: getFirstMatch(/vivaldi\/(\d+(\.\d+)?)/i) || versionIdentifier - } - } - else if (sailfish) { - result = { - name: 'Sailfish' - , osname: 'Sailfish OS' - , sailfish: t - , version: getFirstMatch(/sailfish\s?browser\/(\d+(\.\d+)?)/i) - } - } - else if (/seamonkey\//i.test(ua)) { - result = { - name: 'SeaMonkey' - , seamonkey: t - , version: getFirstMatch(/seamonkey\/(\d+(\.\d+)?)/i) - } - } - else if (/firefox|iceweasel|fxios/i.test(ua)) { - result = { - name: 'Firefox' - , firefox: t - , version: getFirstMatch(/(?:firefox|iceweasel|fxios)[ \/](\d+(\.\d+)?)/i) - } - if (/\((mobile|tablet);[^\)]*rv:[\d\.]+\)/i.test(ua)) { - result.firefoxos = t - result.osname = 'Firefox OS' - } - } - else if (silk) { - result = { - name: 'Amazon Silk' - , silk: t - , version : getFirstMatch(/silk\/(\d+(\.\d+)?)/i) - } - } - else if (/phantom/i.test(ua)) { - result = { - name: 'PhantomJS' - , phantom: t - , version: getFirstMatch(/phantomjs\/(\d+(\.\d+)?)/i) - } - } - else if (/slimerjs/i.test(ua)) { - result = { - name: 'SlimerJS' - , slimer: t - , version: getFirstMatch(/slimerjs\/(\d+(\.\d+)?)/i) - } - } - else if (/blackberry|\bbb\d+/i.test(ua) || /rim\stablet/i.test(ua)) { - result = { - name: 'BlackBerry' - , osname: 'BlackBerry OS' - , blackberry: t - , version: versionIdentifier || getFirstMatch(/blackberry[\d]+\/(\d+(\.\d+)?)/i) - } - } - else if (webos) { - result = { - name: 'WebOS' - , osname: 'WebOS' - , webos: t - , version: versionIdentifier || getFirstMatch(/w(?:eb)?osbrowser\/(\d+(\.\d+)?)/i) - }; - /touchpad\//i.test(ua) && (result.touchpad = t) - } - else if (/bada/i.test(ua)) { - result = { - name: 'Bada' - , osname: 'Bada' - , bada: t - , version: getFirstMatch(/dolfin\/(\d+(\.\d+)?)/i) - }; - } - else if (tizen) { - result = { - name: 'Tizen' - , osname: 'Tizen' - , tizen: t - , version: getFirstMatch(/(?:tizen\s?)?browser\/(\d+(\.\d+)?)/i) || versionIdentifier - }; - } - else if (/qupzilla/i.test(ua)) { - result = { - name: 'QupZilla' - , qupzilla: t - , version: getFirstMatch(/(?:qupzilla)[\s\/](\d+(?:\.\d+)+)/i) || versionIdentifier - } - } - else if (/chromium/i.test(ua)) { - result = { - name: 'Chromium' - , chromium: t - , version: getFirstMatch(/(?:chromium)[\s\/](\d+(?:\.\d+)?)/i) || versionIdentifier - } - } - else if (/chrome|crios|crmo/i.test(ua)) { - result = { - name: 'Chrome' - , chrome: t - , version: getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.\d+)?)/i) - } - } - else if (android) { - result = { - name: 'Android' - , version: versionIdentifier - } - } - else if (/safari|applewebkit/i.test(ua)) { - result = { - name: 'Safari' - , safari: t - } - if (versionIdentifier) { - result.version = versionIdentifier - } - } - else if (iosdevice) { - result = { - name : iosdevice == 'iphone' ? 'iPhone' : iosdevice == 'ipad' ? 'iPad' : 'iPod' - } - // WTF: version is not part of user agent in web apps - if (versionIdentifier) { - result.version = versionIdentifier - } - } - else if(/googlebot/i.test(ua)) { - result = { - name: 'Googlebot' - , googlebot: t - , version: getFirstMatch(/googlebot\/(\d+(\.\d+))/i) || versionIdentifier - } - } - else { - result = { - name: getFirstMatch(/^(.*)\/(.*) /), - version: getSecondMatch(/^(.*)\/(.*) /) - }; - } - - // set webkit or gecko flag for browsers based on these engines - if (!result.msedge && /(apple)?webkit/i.test(ua)) { - if (/(apple)?webkit\/537\.36/i.test(ua)) { - result.name = result.name || "Blink" - result.blink = t - } else { - result.name = result.name || "Webkit" - result.webkit = t - } - if (!result.version && versionIdentifier) { - result.version = versionIdentifier - } - } else if (!result.opera && /gecko\//i.test(ua)) { - result.name = result.name || "Gecko" - result.gecko = t - result.version = result.version || getFirstMatch(/gecko\/(\d+(\.\d+)?)/i) - } - - // set OS flags for platforms that have multiple browsers - if (!result.windowsphone && (android || result.silk)) { - result.android = t - result.osname = 'Android' - } else if (!result.windowsphone && iosdevice) { - result[iosdevice] = t - result.ios = t - result.osname = 'iOS' - } else if (mac) { - result.mac = t - result.osname = 'macOS' - } else if (xbox) { - result.xbox = t - result.osname = 'Xbox' - } else if (windows) { - result.windows = t - result.osname = 'Windows' - } else if (linux) { - result.linux = t - result.osname = 'Linux' - } - - function getWindowsVersion (s) { - switch (s) { - case 'NT': return 'NT' - case 'XP': return 'XP' - case 'NT 5.0': return '2000' - case 'NT 5.1': return 'XP' - case 'NT 5.2': return '2003' - case 'NT 6.0': return 'Vista' - case 'NT 6.1': return '7' - case 'NT 6.2': return '8' - case 'NT 6.3': return '8.1' - case 'NT 10.0': return '10' - default: return undefined - } - } - - // OS version extraction - var osVersion = ''; - if (result.windows) { - osVersion = getWindowsVersion(getFirstMatch(/Windows ((NT|XP)( \d\d?.\d)?)/i)) - } else if (result.windowsphone) { - osVersion = getFirstMatch(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i); - } else if (result.mac) { - osVersion = getFirstMatch(/Mac OS X (\d+([_\.\s]\d+)*)/i); - osVersion = osVersion.replace(/[_\s]/g, '.'); - } else if (iosdevice) { - osVersion = getFirstMatch(/os (\d+([_\s]\d+)*) like mac os x/i); - osVersion = osVersion.replace(/[_\s]/g, '.'); - } else if (android) { - osVersion = getFirstMatch(/android[ \/-](\d+(\.\d+)*)/i); - } else if (result.webos) { - osVersion = getFirstMatch(/(?:web|hpw)os\/(\d+(\.\d+)*)/i); - } else if (result.blackberry) { - osVersion = getFirstMatch(/rim\stablet\sos\s(\d+(\.\d+)*)/i); - } else if (result.bada) { - osVersion = getFirstMatch(/bada\/(\d+(\.\d+)*)/i); - } else if (result.tizen) { - osVersion = getFirstMatch(/tizen[\/\s](\d+(\.\d+)*)/i); - } - if (osVersion) { - result.osversion = osVersion; - } - - // device type extraction - var osMajorVersion = !result.windows && osVersion.split('.')[0]; - if ( - tablet - || nexusTablet - || iosdevice == 'ipad' - || (android && (osMajorVersion == 3 || (osMajorVersion >= 4 && !mobile))) - || result.silk - ) { - result.tablet = t - } else if ( - mobile - || iosdevice == 'iphone' - || iosdevice == 'ipod' - || android - || nexusMobile - || result.blackberry - || result.webos - || result.bada - ) { - result.mobile = t - } - - // Graded Browser Support - // http://developer.yahoo.com/yui/articles/gbs - if (result.msedge || - (result.msie && result.version >= 10) || - (result.yandexbrowser && result.version >= 15) || - (result.vivaldi && result.version >= 1.0) || - (result.chrome && result.version >= 20) || - (result.samsungBrowser && result.version >= 4) || - (result.whale && compareVersions([result.version, '1.0']) === 1) || - (result.mzbrowser && compareVersions([result.version, '6.0']) === 1) || - (result.focus && compareVersions([result.version, '1.0']) === 1) || - (result.firefox && result.version >= 20.0) || - (result.safari && result.version >= 6) || - (result.opera && result.version >= 10.0) || - (result.ios && result.osversion && result.osversion.split(".")[0] >= 6) || - (result.blackberry && result.version >= 10.1) - || (result.chromium && result.version >= 20) - ) { - result.a = t; - } - else if ((result.msie && result.version < 10) || - (result.chrome && result.version < 20) || - (result.firefox && result.version < 20.0) || - (result.safari && result.version < 6) || - (result.opera && result.version < 10.0) || - (result.ios && result.osversion && result.osversion.split(".")[0] < 6) - || (result.chromium && result.version < 20) - ) { - result.c = t - } else result.x = t - - return result - } - - var bowser = detect(typeof navigator !== 'undefined' ? navigator.userAgent || '' : '') - - bowser.test = function (browserList) { - for (var i = 0; i < browserList.length; ++i) { - var browserItem = browserList[i]; - if (typeof browserItem=== 'string') { - if (browserItem in bowser) { - return true; - } - } - } - return false; - } - - /** - * Get version precisions count - * - * @example - * getVersionPrecision("1.10.3") // 3 - * - * @param {string} version - * @return {number} - */ - function getVersionPrecision(version) { - return version.split(".").length; - } - - /** - * Array::map polyfill - * - * @param {Array} arr - * @param {Function} iterator - * @return {Array} - */ - function map(arr, iterator) { - var result = [], i; - if (Array.prototype.map) { - return Array.prototype.map.call(arr, iterator); - } - for (i = 0; i < arr.length; i++) { - result.push(iterator(arr[i])); - } - return result; - } - - /** - * Calculate browser version weight - * - * @example - * compareVersions(['1.10.2.1', '1.8.2.1.90']) // 1 - * compareVersions(['1.010.2.1', '1.09.2.1.90']); // 1 - * compareVersions(['1.10.2.1', '1.10.2.1']); // 0 - * compareVersions(['1.10.2.1', '1.0800.2']); // -1 - * - * @param {Array} versions versions to compare - * @return {Number} comparison result - */ - function compareVersions(versions) { - // 1) get common precision for both versions, for example for "10.0" and "9" it should be 2 - var precision = Math.max(getVersionPrecision(versions[0]), getVersionPrecision(versions[1])); - var chunks = map(versions, function (version) { - var delta = precision - getVersionPrecision(version); - - // 2) "9" -> "9.0" (for precision = 2) - version = version + new Array(delta + 1).join(".0"); - - // 3) "9.0" -> ["000000000"", "000000009"] - return map(version.split("."), function (chunk) { - return new Array(20 - chunk.length).join("0") + chunk; - }).reverse(); - }); - - // iterate in reverse order by reversed chunks array - while (--precision >= 0) { - // 4) compare: "000000009" > "000000010" = false (but "9" > "10" = true) - if (chunks[0][precision] > chunks[1][precision]) { - return 1; - } - else if (chunks[0][precision] === chunks[1][precision]) { - if (precision === 0) { - // all version chunks are same - return 0; - } - } - else { - return -1; - } - } - } - - /** - * Check if browser is unsupported - * - * @example - * bowser.isUnsupportedBrowser({ - * msie: "10", - * firefox: "23", - * chrome: "29", - * safari: "5.1", - * opera: "16", - * phantom: "534" - * }); - * - * @param {Object} minVersions map of minimal version to browser - * @param {Boolean} [strictMode = false] flag to return false if browser wasn't found in map - * @param {String} [ua] user agent string - * @return {Boolean} - */ - function isUnsupportedBrowser(minVersions, strictMode, ua) { - var _bowser = bowser; - - // make strictMode param optional with ua param usage - if (typeof strictMode === 'string') { - ua = strictMode; - strictMode = void(0); - } - - if (strictMode === void(0)) { - strictMode = false; - } - if (ua) { - _bowser = detect(ua); - } - - var version = "" + _bowser.version; - for (var browser in minVersions) { - if (minVersions.hasOwnProperty(browser)) { - if (_bowser[browser]) { - if (typeof minVersions[browser] !== 'string') { - throw new Error('Browser version in the minVersion map should be a string: ' + browser + ': ' + String(minVersions)); - } - - // browser version and min supported version. - return compareVersions([version, minVersions[browser]]) < 0; - } - } - } - - return strictMode; // not found - } - - /** - * Check if browser is supported - * - * @param {Object} minVersions map of minimal version to browser - * @param {Boolean} [strictMode = false] flag to return false if browser wasn't found in map - * @param {String} [ua] user agent string - * @return {Boolean} - */ - function check(minVersions, strictMode, ua) { - return !isUnsupportedBrowser(minVersions, strictMode, ua); - } - - bowser.isUnsupportedBrowser = isUnsupportedBrowser; - bowser.compareVersions = compareVersions; - bowser.check = check; - - /* - * Set our detect method to the main bowser object so we can - * reuse it to test other user agents. - * This is needed to implement future tests. - */ - bowser._detect = detect; - - /* - * Set our detect public method to the main bowser object - * This is needed to implement bowser in server side - */ - bowser.detect = detect; - return bowser -});