]> git.openstreetmap.org Git - rails.git/commitdiff
Merge pull request #2427 from mmd-osm/patch/remove_expand_bbox
authorAndy Allan <git@gravitystorm.co.uk>
Wed, 4 Dec 2019 11:48:34 +0000 (12:48 +0100)
committerGitHub <noreply@github.com>
Wed, 4 Dec 2019 11:48:34 +0000 (12:48 +0100)
Remove expand_bbox endpoint

175 files changed:
.rubocop.yml
Gemfile
Gemfile.lock
Vendorfile
app/abilities/ability.rb
app/abilities/api_ability.rb
app/abilities/api_capability.rb
app/assets/images/banners/sotm_africa_2019.png [new file with mode: 0644]
app/assets/images/banners/sotm_asia_2019.png [deleted file]
app/assets/images/browse/alpinehut.p.16.png [deleted file]
app/assets/images/browse/brownfield.png
app/assets/images/browse/building.png
app/assets/images/browse/cemetery.png
app/assets/images/browse/commercial.png
app/assets/images/browse/farmland.png
app/assets/images/browse/farmyard.png
app/assets/images/browse/forest.png
app/assets/images/browse/golf.png
app/assets/images/browse/grass.png
app/assets/images/browse/grassland.png
app/assets/images/browse/heathland.png
app/assets/images/browse/industrial.png
app/assets/images/browse/lake.png
app/assets/images/browse/meadow.png
app/assets/images/browse/park.png
app/assets/images/browse/pitch.png
app/assets/images/browse/residential.png
app/assets/images/browse/retail.png
app/assets/images/browse/school.png [deleted file]
app/assets/images/browse/scrub.png [new file with mode: 0644]
app/assets/images/browse/tourism_alpine_hut.16.png [new file with mode: 0644]
app/assets/images/browse/tourism_wilderness_hut.16.png [new file with mode: 0644]
app/assets/images/browse/wood.png
app/assets/javascripts/index.js
app/assets/stylesheets/browse.scss
app/controllers/api/user_preferences_controller.rb
app/controllers/traces_controller.rb
app/mailers/notifier.rb
app/models/acl.rb
app/models/application_record.rb [new file with mode: 0644]
app/models/changeset.rb
app/models/changeset_comment.rb
app/models/changeset_tag.rb
app/models/client_application.rb
app/models/diary_comment.rb
app/models/diary_entry.rb
app/models/diary_entry_subscription.rb
app/models/friendship.rb
app/models/issue.rb
app/models/issue_comment.rb
app/models/language.rb
app/models/message.rb
app/models/node.rb
app/models/node_tag.rb
app/models/note.rb
app/models/note_comment.rb
app/models/oauth_nonce.rb
app/models/oauth_token.rb
app/models/old_node.rb
app/models/old_node_tag.rb
app/models/old_relation.rb
app/models/old_relation_member.rb
app/models/old_relation_tag.rb
app/models/old_way.rb
app/models/old_way_node.rb
app/models/old_way_tag.rb
app/models/redaction.rb
app/models/relation.rb
app/models/relation_member.rb
app/models/relation_tag.rb
app/models/report.rb
app/models/trace.rb
app/models/tracepoint.rb
app/models/tracetag.rb
app/models/user.rb
app/models/user_block.rb
app/models/user_preference.rb
app/models/user_role.rb
app/models/user_token.rb
app/models/way.rb
app/models/way_node.rb
app/models/way_tag.rb
app/views/api/notes/_note.json.jbuilder [moved from app/views/api/notes/_note.json.jsonify with 81% similarity]
app/views/api/notes/index.json.jbuilder [moved from app/views/api/notes/index.json.jsonify with 70% similarity]
app/views/api/notes/show.json.jbuilder [new file with mode: 0644]
app/views/api/notes/show.json.jsonify [deleted file]
app/views/api/user_preferences/_user_preference.xml.builder [new file with mode: 0644]
app/views/api/user_preferences/index.xml.builder [new file with mode: 0644]
app/views/messages/destroy.json.jbuilder [moved from app/views/messages/destroy.json.jsonify with 100% similarity]
app/views/messages/mark.json.jbuilder [moved from app/views/messages/mark.json.jsonify with 100% similarity]
app/views/oauth_clients/index.html.erb
app/views/traces/show.html.erb
bin/setup
config/banners.yml
config/environments/development.rb
config/environments/production.rb
config/environments/test.rb
config/eslint.json
config/initializers/active_storage.rb
config/initializers/assets.rb
config/initializers/content_security_policy.rb
config/initializers/cors.rb
config/initializers/field_error.rb
config/initializers/new_framework_defaults_5_2.rb [new file with mode: 0644]
config/initializers/new_framework_defaults_6_0.rb [new file with mode: 0644]
config/initializers/wrap_parameters.rb
config/locales/ar.yml
config/locales/ast.yml
config/locales/be-Tarask.yml
config/locales/bg.yml
config/locales/ca.yml
config/locales/de.yml
config/locales/el.yml
config/locales/en-GB.yml
config/locales/eo.yml
config/locales/fa.yml
config/locales/fit.yml
config/locales/fr.yml
config/locales/gl.yml
config/locales/he.yml
config/locales/hu.yml
config/locales/ia.yml
config/locales/is.yml
config/locales/it.yml
config/locales/ja.yml
config/locales/mk.yml
config/locales/nb.yml
config/locales/pl.yml
config/locales/pt-BR.yml
config/locales/pt-PT.yml
config/locales/sv.yml
config/locales/tr.yml
config/locales/tt.yml
config/locales/uk.yml
config/locales/zh-CN.yml
config/locales/zh-TW.yml
config/puma.rb
config/routes.rb
db/migrate/005_tile_tracepoints.rb
db/migrate/006_tile_nodes.rb
db/migrate/008_remove_segments.rb
db/migrate/013_add_email_valid.rb
db/migrate/020_populate_node_tags_and_remove.rb
db/migrate/039_add_more_controls_to_gpx_files.rb
db/migrate/044_create_user_roles.rb
db/migrate/046_alter_user_roles_and_blocks.rb
db/migrate/051_add_status_to_user.rb
db/migrate/20110322001319_add_terms_seen_to_user.rb
db/migrate/20120208122334_merge_acl_address_and_mask.rb
db/migrate/20120808231205_add_counter_caches.rb
db/migrate/20121005195010_add_diary_entry_counter_caches.rb
db/migrate/20121012044047_add_image_use_gravatar_to_users.rb
db/migrate/20150222101847_rename_openid_url.rb
db/migrate/20180204153242_tile_users.rb
db/migrate/20191120140058_remove_nearby_from_users.rb [new file with mode: 0644]
db/structure.sql
lib/redactable.rb
test/abilities/api_capability_test.rb
test/controllers/api/changesets_controller_test.rb
test/controllers/api/nodes_controller_test.rb
test/controllers/api/notes_controller_test.rb
test/controllers/api/old_nodes_controller_test.rb
test/controllers/api/relations_controller_test.rb
test/controllers/api/traces_controller_test.rb
test/controllers/api/user_preferences_controller_test.rb
test/controllers/api/users_controller_test.rb
test/controllers/api/ways_controller_test.rb
test/controllers/changeset_comments_controller_test.rb
test/controllers/changesets_controller_test.rb
test/controllers/oauth_clients_controller_test.rb
test/controllers/traces_controller_test.rb
test/integration/cors_test.rb
test/models/node_test.rb
test/test_helper.rb
vendor/assets/javascripts/bowser.js [deleted file]

index cbd62a052512bc82c9b6858a965391f206fb5327..18bf69b9b85be093b8e2f81147cd08180a7d869a 100644 (file)
@@ -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 c2bb066b7c9c291bd8854f27dc73844a5cd9cf4a..8ccc5026b4ecb1b15a74eca2bd1a7a2de5a7840a 100644 (file)
--- 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
index 7fe5ac89fff8c18cd19bac62e87969917eb19dc8..e9dd8af4b1443787d343840ce90d4d1b26050b34 100644 (file)
@@ -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)
index ad59f91ebea6aef14b73f8295c84aeeb14993c05..1d41ad3489756e4800bdb42395106a5c6f180ee4 100644 (file)
@@ -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
index c34f357a97a41b2febfbdb7fa1b0a505ded8e3aa..f0cebb380a46ba2ee2572fc54884e0eb8bd93353 100644 (file)
@@ -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?
index 7aef15f114e017b7748cd2fa0185f918c209f4c4..62cd2b17ebbd41ad9408ebcfc5730134991b3506 100644 (file)
@@ -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
index a4ca252045aebae3bba2e559e71e4a2bbe3963d9..beb4d39bf3fa62ba20641899a89220cb91594b71 100644 (file)
@@ -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 (file)
index 0000000..aefd488
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 (file)
index ef2f1c2..0000000
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 (file)
index 0499c58..0000000
Binary files a/app/assets/images/browse/alpinehut.p.16.png and /dev/null differ
index 1b1603399f7d8a3c2622d98f92623ce841ba7a89..c245020ceb572cdf5f9736d108e93fea392a0fde 100644 (file)
Binary files a/app/assets/images/browse/brownfield.png and b/app/assets/images/browse/brownfield.png differ
index fd37114c97bf20ffd593aaaf28a6ef4acb1183a7..e83961d81a5b88a0dc3db7e013f517f58f3d1b16 100644 (file)
Binary files a/app/assets/images/browse/building.png and b/app/assets/images/browse/building.png differ
index f89cf18e2beca208c76352bea43f0107e2f321bf..53ae8536f878176805631b994cb7d96452ad042f 100644 (file)
Binary files a/app/assets/images/browse/cemetery.png and b/app/assets/images/browse/cemetery.png differ
index 3008f1809a613f8b184c02a69c63ec6bd48ced86..a18dc4114613d6cfdeda79b3c7bea93aad5e1bbd 100644 (file)
Binary files a/app/assets/images/browse/commercial.png and b/app/assets/images/browse/commercial.png differ
index c894c845537fe8dc6534120ba87cd4f2de6177b5..bfd959150c17baf9cae8f51e78387f74f04c1e2c 100644 (file)
Binary files a/app/assets/images/browse/farmland.png and b/app/assets/images/browse/farmland.png differ
index ca41410a8c22ba26abdd2ed9878352925de074ec..6be69f2f05becc41e18d6fcda6b9706be90862ef 100644 (file)
Binary files a/app/assets/images/browse/farmyard.png and b/app/assets/images/browse/farmyard.png differ
index da748f81d25d6a3ec54f7f01f703faa29e95545a..6bd4403fa2d38ae5cfe886ef6ee2987582ed5a76 100644 (file)
Binary files a/app/assets/images/browse/forest.png and b/app/assets/images/browse/forest.png differ
index 4f7afc4fa627be76753e70beaa8fb572d847fa77..a485580d5baa63023da64f360bfb3b982282a6b5 100644 (file)
Binary files a/app/assets/images/browse/golf.png and b/app/assets/images/browse/golf.png differ
index 79baac3ee54f2972add6fcf62661abe80cf6421b..c909bfa8791f18e60727f14236a50ac9efedaca8 100644 (file)
Binary files a/app/assets/images/browse/grass.png and b/app/assets/images/browse/grass.png differ
index 79baac3ee54f2972add6fcf62661abe80cf6421b..c909bfa8791f18e60727f14236a50ac9efedaca8 100644 (file)
Binary files a/app/assets/images/browse/grassland.png and b/app/assets/images/browse/grassland.png differ
index cb2fc225df09ffbe98cc7e0a97f7099717e4bf5c..c35d96fee8bd6f08f7433450823ad7bded7dccf0 100644 (file)
Binary files a/app/assets/images/browse/heathland.png and b/app/assets/images/browse/heathland.png differ
index 4ad4e51934e53cdc4b76232f34cc1f5abe6a11ed..3b3be37f9e8591f06a40065db79d7ebc2ed0edaa 100644 (file)
Binary files a/app/assets/images/browse/industrial.png and b/app/assets/images/browse/industrial.png differ
index c838303f6e3c7cccd3290d118883b9084ee52d0e..2fee498ed7cb6cb3717117a1686d0e8812bf5c2d 100644 (file)
Binary files a/app/assets/images/browse/lake.png and b/app/assets/images/browse/lake.png differ
index 79baac3ee54f2972add6fcf62661abe80cf6421b..c909bfa8791f18e60727f14236a50ac9efedaca8 100644 (file)
Binary files a/app/assets/images/browse/meadow.png and b/app/assets/images/browse/meadow.png differ
index a60755dd068dae9d0c0aec4c5c7ff887adc69e54..0922b56f990d49d81f86e51eb21afe6fb3c2d397 100644 (file)
Binary files a/app/assets/images/browse/park.png and b/app/assets/images/browse/park.png differ
index a49af3010c6c247c37ce4ffea26e1c05b4b61aa3..7d18def41ae91e0b67007b23152744b4319ca052 100644 (file)
Binary files a/app/assets/images/browse/pitch.png and b/app/assets/images/browse/pitch.png differ
index e3b850e465fbf8fe881704fecb5cac1cc6ab57f9..429fcd0d14983190e9d57c4186824985eed814fc 100644 (file)
Binary files a/app/assets/images/browse/residential.png and b/app/assets/images/browse/residential.png differ
index 23b097ba4e86c5dcca02b81bc353ffd8921a42f9..62309746fb64041d7f169aea872232ba3d7d86a1 100644 (file)
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 (file)
index 9361041..0000000
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 (file)
index 0000000..ca85ab8
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 (file)
index 0000000..adeb457
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 (file)
index 0000000..33ccbfb
Binary files /dev/null and b/app/assets/images/browse/tourism_wilderness_hut.16.png differ
index 329bfa483b1d90e4c1e30a01fc6df1fb6b3bb0d7..6bd4403fa2d38ae5cfe886ef6ee2987582ed5a76 100644 (file)
Binary files a/app/assets/images/browse/wood.png and b/app/assets/images/browse/wood.png differ
index 039cc0ef66b5ccb4c6da47ec98ae0c21dcd0e1d8..704016c6673daf233963580cc2676a035205bfe9 100644 (file)
@@ -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;
 
index 2db397a07f8ce1332c50dbe45334bd8d12402dfb..7c6f4b36507dbf0eb7e4dca1c44592d2a3a74738 100644 (file)
   .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'); }
   .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 */
 
 
   .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'); }
 
index 39e0dff300d83078e3fffcb54b5b4d04d29a74cf..83e28bc4e0047ef4e3a9a880a08406813f654693 100644 (file)
@@ -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 => ""
index a0852d2ce2665959714c02c35c5cdc4c03504425..b800d305e03fc495f9bc9a7bdf5752a2ebd83bcf 100644 (file)
@@ -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?
index 4509f10114bec03308da57e7744426389caf1a1b..6e0c81a39177337b6f6ad57ddeb6b2d11e36644a 100644 (file)
@@ -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"
index 895ed61e4de8883db9940f25c056222f4d2b6965..06f754c2274ad801fe34fc6e7369867d56e4397c 100644 (file)
@@ -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 (file)
index 0000000..10a4cba
--- /dev/null
@@ -0,0 +1,3 @@
+class ApplicationRecord < ActiveRecord::Base
+  self.abstract_class = true
+end
index 47f03c79544111eff476896c076d2cae2b6c31fb..990eae4077ae33b7b8968a9bd8542504432226c2 100644 (file)
@@ -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
index 75b1a055b23dd1306a4469e4819d2cf531c2923d..ceb7d35597f75e816811214fbfa252eddd7470d0 100644 (file)
@@ -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"
 
index 751029e03995c60835dc1d7eb0ab79a21fb48b3e..600ace4a6e498affc37cce96160289753fbd880e 100644 (file)
@@ -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
index ae95e2908a286793565915fd8f70577387df39c2..67ff075f1adb5bd1d8d6109077cdefd08233c26d 100644 (file)
@@ -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
index 4ae21be8881922e49c799ba0868e93ba0f5e77f5..05f5044c5db779b232da81bd6e3bbdf0ba31d5b5 100644 (file)
@@ -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
 
index 4affe8b597f1269e92839fa201ba9bc683ee93e7..4ff1eeb35e57b0e8e3890dee62e2804761634215 100644 (file)
@@ -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"
 
index 6e9a103adafac0d1315ecd1e956ff32cfc0abc2e..ed6de79e45de20ff7fcbc648b845a9c0f12fe652 100644 (file)
@@ -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
index 27b25aee1b31313674db1d1578701873c921f160..476821b47ccdb221b31b603cfa97352611425c86 100644 (file)
@@ -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
index f18581b5f059670f01a52836aca272b2d77265fb..14c5f8231d56b95761cea9010cdb434230974e5e 100644 (file)
@@ -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
index 0841295e1760120335d2e16ed79f57b20a9a67c2..69aa8bde931b398ff18e134412ba3886a259849f 100644 (file)
@@ -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
 
index bb1aa4bd26016758ad3d8b66d09a7527a72b8ad8..cdf85a52bc3530cb11dc0eb3e0a05ed29d7f7a56 100644 (file)
@@ -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"
index 4ab129e9184f6593012bacd98c3de504ca06662c..44b1d8745e6fdf8600b6ff307c789599f08c7262 100644 (file)
@@ -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
 
index c5df1f79e5959c3c3826b0685bf4fd0b2a71d2bd..4d48112fc6fa9361fcd268f0e17b92b2a3d14776 100644 (file)
@@ -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
index 86404599b266de54e2896473cbb4abfdb0b10697..fa21b1ff6fdd60b2c813e7bd7979ee6b5a140837 100644 (file)
@@ -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"
 
index fa9d0b1ae6a5da75a25b02ddd6d204fe63267df8..ec57b770bbc008c923b2394e71f02e4d24549521 100644 (file)
@@ -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
index 448703ffa5f8d38471a7ecc2767f4ca41771af7b..9611cfe3af375861b865ec17582b0d278fae6c1f 100644 (file)
@@ -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
 
index 9d2773e8f346c5b8e6789c8a314020c7a39edd41..5f0920a96f1fd537456ff79ea0dd243a4883acda 100644 (file)
@@ -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 }
 
index 5eeda48ba87ae7e13bb5ef923435f925c03bca6d..affdcdeb815b45b3c6d6ad32bf9c6526064ee45b 100644 (file)
@@ -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
 
index bdf8cb47ee32438ab875f7c5bc17d5b431fabef5..12099498e2de71edd681634fcbc64827a5e24390 100644 (file)
@@ -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
index a3e1c3aaf4a49d4a22d291ab942c7cc84b4e0f32..f2cba896cf031c7b8efbc14742e83977b197137c 100644 (file)
@@ -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"
 
index 109f7d968da1eba835f1fbcd557048ce7cd8207b..c0025653fcaff9624279c37d13aa5abffc7ec0c5 100644 (file)
@@ -20,7 +20,7 @@
 #  relations_redaction_id_fkey  (redaction_id => redactions.id)
 #
 
-class OldRelation < ActiveRecord::Base
+class OldRelation < ApplicationRecord
   include ConsistencyValidations
   include ObjectMetadata
 
index f8d4a359f920cfca74818bb20c935b69deaf8af6..1714f3c859bc0df5d2af1d6f06bcd1151558db37 100644 (file)
@@ -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"
 
index c674f708bc0214a097ccc27172a7bea0d7a2e488..d6e6e19c2dfb921a4f4621e22f9d83b08b5f86c1 100644 (file)
@@ -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"
 
index 31e230c3869e2ee197f46a8de823834319536c5f..b515322e325cc1aed3face1f1f44166fa2f9b171 100644 (file)
@@ -20,7 +20,7 @@
 #  ways_redaction_id_fkey  (redaction_id => redactions.id)
 #
 
-class OldWay < ActiveRecord::Base
+class OldWay < ApplicationRecord
   include ConsistencyValidations
   include ObjectMetadata
 
index 836e76e47eb112e2764e6fc4c8876ab30cbdff17..d89227936aaf431b336f207b3aebcfe22538349a 100644 (file)
@@ -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"
 
index ae4ad605e70b1365f27d64c714b3085ec8f16603..90bf704b6af2c1a5be5eb7c4ea4107d488a16a85 100644 (file)
@@ -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"
 
index d9b2a5579c5bf3b72831649b5d4d04cc5ca41326..f4eedde0a2daddb172843d910507494261c1b4ae 100644 (file)
@@ -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
index dc2b71ac4193f292ea6febf9e9df8176cc606647..3f812d1b1a80c2c02e3a337524fb1cbce626650e 100644 (file)
@@ -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|
index 7c399c3a88936b1769bb1657cf23c3db232d9e92..7f07dda9b82987226086f7d054e0a568d922f756 100644 (file)
@@ -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"
 
index b186f505d13142bc751f28428f2f29ce8fc7b53f..ad9a932661bddc63e75eeb428fe00330c327e47b 100644 (file)
@@ -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"
 
index 9bbf221df75c3cc0237044957321b6b372ed2da3..9afedb04ee29a68a0cabf434b549a22ff6dbd1f8 100644 (file)
@@ -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
 
index f1cd72acd600f0ba2278b201c9427c8addaa91ae..d500784af882892ab065d8134fcfdf236c9be353 100644 (file)
@@ -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
index 6473c943031134e87a1a9d99189a07614a9066ff..6352824fd7f08c3c50f781c95c80837c10302aab 100644 (file)
@@ -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"
index 8d2f4ffface4d307c0d1013ec212781010c8879d..f13f7269fbb73625c712bcd7804a254b59661c63 100644 (file)
@@ -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"
index 1095dc6eaccbf9e4466d4b80bc6764d81f76371b..6099823897473a04ab83a12e6ff90ef4fcb1e40f 100644 (file)
 #  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) }
index 92cee16cd6e96bcc57e4718042c00a9cc7d57d59..60f680ac3016e02b2d4b6acf4437658b26f01f5d 100644 (file)
@@ -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
 
index 583ced3c56d19ed15de8dd2a4ff6922b37312de8..d5cad3978c81f087cacee2b13f3e152aa87df506 100644 (file)
 #  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 <osm> wrapper.
-  def to_xml_node
-    el1 = XML::Node.new "preference"
-    el1["k"] = k
-    el1["v"] = v
-
-    el1
-  end
 end
index f3d48cade4bcfeb53df717b509cc0ab90ac45d39..a081361a76cb6db41fe03737c313db6fc08ddc45 100644 (file)
@@ -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"
 
index 844357d8d0242000db462047ea6be54bd01342c1..8c9bf4aeb36de68479d11533e406f9106877da4b 100644 (file)
@@ -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
index b3466213c34de289b325718bcbdbed8c37a4a744..d0d1e2a2e43836a52018a93213a2cc463850e4a8 100644 (file)
@@ -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
index 0788a631c8c9c3969ea79dc84988d81fd61f58b6..0626fb2403df19b013700617421c5accfd12c296 100644 (file)
@@ -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"
 
index 6637c158535694aa017e2719f79b067913cf9527..0d32d8c41631402f7b104b6b60b881308a9ab6c5 100644 (file)
@@ -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"
 
similarity index 81%
rename from app/views/api/notes/_note.json.jsonify
rename to app/views/api/notes/_note.json.jbuilder
index b964399225350d30cf48aa7786e0c4eda41d9fb7..34f79688073249d00b7edf78cff1b05198ab77de 100644 (file)
@@ -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
similarity index 70%
rename from app/views/api/notes/index.json.jsonify
rename to app/views/api/notes/index.json.jbuilder
index bfc8ffcf854f3ed87c9569d05168462c8d52a725..7909391f5ae939f231121b01c958134ad0afce72 100644 (file)
@@ -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 (file)
index 0000000..71d9408
--- /dev/null
@@ -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 (file)
index 10d1272..0000000
+++ /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 (file)
index 0000000..ae830be
--- /dev/null
@@ -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 (file)
index 0000000..0a852b2
--- /dev/null
@@ -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
index 80cae9a6d3439135d9701ec4c2dd3d245e53eff3..f1dc4afcd67e829e5c75ca8a5d37010d695ff995 100644 (file)
@@ -6,19 +6,22 @@
 <h3><%= t ".my_tokens" %></h3>
 <p><%= t ".list_tokens" %></p>
 <table>
-  <tr><th><%= t ".application" %></th>
-    <th><%= t ".issued_at" %></th><th>&nbsp;</th></tr>
+  <tr>
+    <th><%= t ".application" %></th>
+    <th><%= t ".issued_at" %></th>
+    <th>&nbsp;</th>
+  </tr>
   <% @tokens.each do |token| %>
-    <%= content_tag_for :tr, token do %>
+    <tr>
       <td><%= link_to token.client_application.name, token.client_application.url %></td>
       <td><%= token.authorized_at %></td>
       <td>
-  <%= 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 %>
       </td>
-    <% end %>
+    </tr>
   <% end %>
 </table>
 <% end %>
@@ -28,9 +31,9 @@
 <% else %>
 <p><%= t ".registered_apps" %></p>
 <% @client_applications.each do |client| %>
-  <%= div_for client do %>
+  <div class="client_application">
     <%= link_to client.name, :action => :show, :id => client.id %>
-  <% end %>
+  </div>
 <% end %>
 <% end %>
 <h3><%= link_to t(".register_new"), :action => :new %></h3>
index 0ebbd827fc53c75166f64a107b612fdc3eaf8856..b25ecad5376345b0475d2e4fee1efc80c2b730a3 100644 (file)
@@ -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") } } %>
   </div>
 <% end %>
index ebdfd0277c784e92604855de13adda30c32203f5..9944e82a33e1e1b5e4739905632d745da75b3ab1 100755 (executable)
--- 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"
index d8b8ecb495afabd225cdf0799ab1e6b4a7f9c35a..75e95d7416f8f667c69134ddb5fc843b53d60248 100644 (file)
@@ -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
index 9a3976f76dd83f20c6754a8f2334b108a008f5da..14bf9b54d800e89624e9f062212d7bd6c11f2c45 100644 (file)
@@ -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
index ba781e5af68ef5d91d8b26faa328634e4dbb06e7..4016be615f300a88036e6266e3cf6864da5ac6d3 100644 (file)
@@ -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
 
index 38975deef664b54cb6332be608fb142fa7c3fe8a..fad06fe51cd83e9510843b365d39fcd6bd0c8422 100644 (file)
@@ -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
index cd235e678694cd8a3979055eb32a04006d30190c..7a9e7d4e4676e8fd8b047d9fd96ed81ab84019fb 100644 (file)
@@ -7,7 +7,6 @@
     "eslint:recommended"
   ],
   "globals": {
-    "bowser": "readonly",
     "I18n": "readonly",
     "L": "readonly",
     "OSM": "writable",
index bc909108058cf927dc623dab7b515aead9aedd8d..361e2edee8a8bfd2820c2e6ce1f1d2f0340d9150 100644 (file)
@@ -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
index 255ae108e2a96b5eade11fcbb11d041dd608f5bf..15644963510fff77f0782ad83745b64362a8f937 100644 (file)
@@ -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")
 
index d3bcaa5ec84ac0761911dcdc0a7bf1c67f44a392..35d0f26fcdc9416ca1e1ae6501393c7154853250 100644 (file)
@@ -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
index 2bd558d2f3f24ec4f4f9884cb9b1cf4c815505dc..7992ecdce015631749f425209dd83802b54ede21 100644 (file)
@@ -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]
index a3e3d3aaceb3a25845a8763bfbee8d4630e9d636..34b224296cce6506a9f4240fc33083867a2fc404 100644 (file)
@@ -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 (file)
index 0000000..c383d07
--- /dev/null
@@ -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 (file)
index 0000000..92240ef
--- /dev/null
@@ -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
index cf733efd119893abd444b9d75c53b3f09e77d4a4..bbfc3961bffef15dabb35fe0de4c409d6efb58c5 100644 (file)
@@ -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
index 8c7ee56e07bc545fe210a04a6862b893579a79c6..ae4e7c05d62a5fa2b744112d1e2a836ccc896f92 100644 (file)
@@ -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:
index 3cc37c646c07592ef87a623b741e699fe366e7c1..757b8682b47250473d9c81baf4f43b83b3ca5258 100644 (file)
@@ -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
index 68c7c5a5022b44587cbce942c54af6bd06b17dc2..646655b268f8baef788674eecd8c3934dc4ca41d 100644 (file)
@@ -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:
index be785a2ba57cfeef8c4eb09e3405600fb78ecce4..f524045434a34206c939e7025376c6e7e3aefef8 100644 (file)
@@ -1339,7 +1339,9 @@ bg:
       newer: По-нови следи
     trace:
       pending: Обработва се
-      count_points: '%{count} точки'
+      count_points:
+        one: 1 точка
+        other: '%{count} точки'
       view_map: Вижте на картата
       edit: променяне
       edit_map: Редактиране на картата
index f4f1992834f2c8865da6263028f54cd938ce8c6a..3b2351e05b112ffae214dc39302b47c971745129 100644 (file)
@@ -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<br><span>&copy;</span>OpenStreetMap
+      copyright_html: <span>&copy;</span>Col·laboradors d'<br>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 <a href='%{diary_path}'>diaris d'usuari</a>, els <a href='http://blogs.openstreetmap.org/'>blogs de la comunitat</a>, i la pàgina web de la <a href='http://www.osmfoundation.org/'>Fundació OSM</a>.
       open_data_title: Dades obertes
       open_data_html: 'OpenStreetMap són <i>dades lliures</i>: 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 <a href=''%{copyright_path}''>pàgina de copyright i llicència</a> 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<sup><a href="#trademarks">&reg;</a></sup> estan publicades sota la <a
+          Les <i>open data</i> d'OpenStreetMap<sup><a href="#trademarks">&reg;</a></sup> estan publicades sota la <a
           href="http://opendatacommons.org/licenses/odbl/">llicència de base de dades oberta</a> (ODbL) per la <a
           href="http://osmfoundation.org/">Fundació OpenStreetMap</a> (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 \n<a href=\"http://opendatacommons.org/licenses/odbl/1.0/\">text
-          legal\ncode</a> 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 <a href="http://creativecommons.org/licenses/by-sa/2.0/">Text de la llicència de Creative Commons Reconeixement-Compartir Igual 2.0</a>(CC-BY-SA).
-        credit_title_html: Com a crèdit OpenStreetMap
-        credit_1_html: |-
-          Exigim que l'atribució de drets d'autor sigui &ldquo;&copy; Col·laboradors d'OpenStreetMap
-          &rdquo;.
+        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\n<a href=\"http://opendatacommons.org/licenses/odbl/1.0/\">codi legal</a>
+          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 <a href="http://creativecommons.org/licenses/by-sa/2.0/">Text
+          de la llicència de Creative Commons Reconeixement-Compartir Igual 2.0</a>(CC-BY-SA).
+        credit_title_html: Com atribuir autoria a OpenStreetMap
+        credit_1_html: Demanem que es reconegui &ldquo;&copy; Col·laboradors d'OpenStreetMap&rdquo;
+          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 <a
-          href="http://www.openstreetmap.org/copyright">aquest pàgina de copyright</a>.
-          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 <a href="http://www.openstreetmap.org/copyright">aquesta
+          pàgina de copyright</a>. 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 <a
-          href="http://osmfoundation.org/Licence">pàgina de llicència OSMF</a> i a les <a
-          href="http://wiki.openstreetmap.org/wiki/Legal_FAQ">Preguntes
-          Freqüents sobre legalitat</a>.
+          Per a més informació sobre com utilitzar les nostres dades i com atribuir-ne l'autorita, visiteu la <a
+          href="http://osmfoundation.org/Licence">pàgina de llicència de la OSMF</a>.
         more_2_html: Encara que les dades d'OpenStreetMap són dades obertes, no podem
-          oferir una API gratuïta per als desenvolupadors de terceres parts. Vegeu
-          la <a href="https://operations.osmfoundation.org/policies/api/">política
+          oferir una API gratuïta a tercers. Vegeu la <a href="https://operations.osmfoundation.org/policies/api/">política
           d'ús de l'API</a>, la <a href="https://operations.osmfoundation.org/policies/tiles/">política
           d'ús de les tessel·les</a> i la <a href="https://operations.osmfoundation.org/policies/nominatim/">política
           d'ús de Nominatim</a>.
@@ -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: |-
-          <strong>Àustria</strong>: conté dades de
-              <a href="http://data.wien.gv.at/">Stadt Wien</a> sota
-              <a href="http://creativecommons.org/licenses/by/3.0/at/deed.de">CC BY</a>.
-        contributors_au_html: |-
-          <strong>Austràlia</strong>: conté dades suburbi basats
-              en les dades d'Austràlia Oficina d'estadístiques.
-        contributors_ca_html: |-
-          <strong>Canadà</strong>: 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: '<strong>Àustria</strong>: conté dades de <a href="http://data.wien.gv.at/">Stadt
+          Wien</a> (sota <a href="http://creativecommons.org/licenses/by/3.0/at/deed.de">CC
+          BY</a>), el <a href="https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm">Land
+          Voralberg</a> i el Land Tirol (sota <a href="https://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/">CC
+          BY AT amb correccions</a>.'
+        contributors_au_html: '<strong>Austràlia</strong>: Conté dades de <a href="https://www.psma.com.au/psma-data-copyright-and-disclaimer">PSMA
+          Autralia Limited</a> publicades per Commonwealth of Australia sota els termes
+          de <a href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a>.'
+        contributors_ca_html: '<strong>Canadà</strong>: 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: '<strong>Finlàndia</strong>: Conté dades de la base
           de dades topogràfica del National Land Survey of Finland i d''altres bases
-          de dades, sota la <a href="http://www.maanmittauslaitos.fi/en/NLS_open_data_licence_version1_20120501">llicència
+          de dades sota la <a href="http://www.maanmittauslaitos.fi/en/NLS_open_data_licence_version1_20120501">llicència
           NLSFI</a>.'
         contributors_fr_html: |-
-          <strong>França</strong>: conté dades d'origen de
-              Direcció Générale des Impôts.
+          <strong>França</strong>: conté dades de la
+              Direction Générale des Impôts.
         contributors_nl_html: '<strong>Països Baixos</strong>: Conté &copy; dades
           d''Automotive Navigation Data (AND), 2007 (<a href="http://www.and.com">www.and.com</a>)'
         contributors_nz_html: '<strong>Nova Zelanda</strong>: Conté dades de <a href="https://data.linz.govt.nz/">
           LINZ Data Service</a> amb permís per a reutilització sota <a href="https://creativecommons.org/licenses/by/4.0/"></a>.'
         contributors_si_html: '<strong>Eslovènia</strong>: Conté dades de l''<a href="http://www.gu.gov.si/en/">Autoritat
-          de Topografia i Cartografia</a> i el <a href="http://www.mkgp.gov.si/en/">Ministeri
+          de Topografia i Cartografia</a> i del <a href="http://www.mkgp.gov.si/en/">Ministeri
           d''Agricultura, Silvicultura i Alimentació</a> (informació pública d''Eslovènia).'
         contributors_es_html: |-
           <strong>Spain</strong>: Conté dades de l'Institut Geogràfic Nacional espanyol(<a href="http://www.ign.es/">IGN</a>) i del Sistema Cartgràfic Nacional (<a href="http://www.scne.es/">SCNE</a>)
@@ -1533,16 +1528,15 @@ ca:
         contributors_za_html: |-
           <strong>Sud-àfrica</strong>: conté dades del
           <a href="http://www.ngi.gov.za/">Chief Directorate:
-          National Geo-Spatial Information</a>, drets d'autor reservat per l'estat.
+          National Geo-Spatial Information</a>, drets d'autor reservats per l'estat.
         contributors_gb_html: '<strong>Regne Unit</strong>: Conté dades del Ordnance
           Survey &copy; 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 <a
           href="http://wiki.openstreetmap.org/wiki/Contributors">Col·laboradors</a> 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 <a href="https://wiki.osmfoundation.org/wiki/Trademark_Policy">política
           de marques registrades</a>.
     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 <a href="https://get.adobe.com/flashplayer/"></a>baixar
         el reproductor Flash Player des del web Adobe.com</a>. També hi ha <a href="http://wiki.openstreetmap.org/wiki/Editing">altres
         opcions</a> 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
-        <a href="http://creativecommons.org/licenses/by-sa/2.0/">llicència Creative
-        Commons Attribution-ShareAlike 2.0</a>.
+        <a href="https://opendatacommons.org/licenses/odbl/1.0/">Open Data Commons
+        Open Database License</a> (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 <a class='icon note'></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 <a href='/copyright'>pàgina de drets
-          d'autor</a> per a més informació, o bé contacteu el <a href='http://wiki.osmfoundation.org/wiki/Working_Groups'>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 <a href='/copyright'>pàgina de drets d'autor</a>
+          per a més informació, o bé contacteu amb el <a href='http://wiki.osmfoundation.org/wiki/Working_Groups'>grup
           de treball d'OSMF</a> 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
+          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 <a href="https://kramdown.gettalong.org/quickref.html">kramdown</a>
       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 <em>reals
-          i normals</em>- 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 <em>reals i actuals</em>-
+          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 <em>no</em> 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 <strong>editor</strong> és un programa o pàgina web que pots
           utilitzar per editar el mapa.
         node_html: Un <strong>node</strong> és un punt al mapa, com ara un restaurant
           o un arbre.
         way_html: Una <strong>via</strong> é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 <strong>etiqueta</strong> és un recull de dades sobre un node
           o una via, com ara el nom d'un restaurant o la velocitat màxima d'una carretera.
       rules:
         title: Regles
-        paragraph_1_html: "OpenStreetMap té poques les regles formals, pel que esperem
+        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' \n<a href=\"http://wiki.openstreetmap.org/wiki/Import/Guidelines\">Importació</a>
+          Si voler dur a terme\naltres activitats que no siguin l'edició manual, llegiu
+          i seguiu les directrius d' \n<a href=\"http://wiki.openstreetmap.org/wiki/Import/Guidelines\">Importació</a>
           i \n<a href=\"http://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct\">Edició
           Automàtica</a>."
       questions:
-        title: Alguna pregunta més?
+        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. \n<a href='%{help_url}'>Ajuda</a>.
@@ -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 al<a href=''%{map_url}''>mapa</a>
-          i cliqueu l''icona de la nota: <span class=''icon note''></span>. Això afegirà
+          i cliqueu licona de la nota: <span class=''icon note''></span>. 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. <a href='%{upload_link}'>Pujeu un nou
-        track</a> o apreneu més sobre els tracks GPS a la <a href='http://wiki.openstreetmap.org/wiki/Beginners_Guide_1.2'>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. <a href='%{upload_link}'>Pugeu una nova
+        traça</a> o apreneu més sobre les traces GPS a la <a href='https://wiki.openstreetmap.org/wiki/Beginners_Guide_1.2'>pàgina
         wiki</a>.
       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.<br>Utilitzeu
-        l'enllaç al correu de confirmació per activar el vostre compte, o <a href="%{reconfirm}">demanar
+      account not active: El vostre compte encara no és actiu.<br />Utilitzeu l'enllaç
+        al correu de confirmació per activar el vostre compte o <a href="%{reconfirm}">demaneu
         un nou correu electrònic de confirmació</a>.
-      account is suspended: Ho sentim, s'ha suspès el vostre compte per presentar
-        una activitat sospitosa.<br />Contacteu amb el <a href="%{webmaster}">webmestre</a>
-        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.<br
+        />Contacteu amb el <a href="%{webmaster}">l'administrador del web</a> 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 %{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 <a href="%{webmaster}">webmestre</a> per
         gestionar la creació d'un compte - intentarem tractar la sol·licitud tan aviat
         com sigui possible.
index 188469dd85c7216da0690888305a8bf7698e524d..ed36779ae523407256c6212752208f16c2220cc1 100644 (file)
@@ -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: AlteKnoten-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:
index 88f7dfb818836c1a2748972b02c4354f0fa56e9b..f45f376950e8d2897678ebb3c54de245ccca8aaf 100644 (file)
@@ -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:
index 2a87a59b726a9790b2ca7e694b6c01f59d51eafa..a5157a12dea3cded9a91edef7d11b2d0269852ad 100644 (file)
@@ -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.
index bb143a1a0f5c5e28fb69e50f52d2edfd5abb448e..22a4584c788621cbdfa6f603c07f0919093404b5 100644 (file)
@@ -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:
index 7c55655bf5f9cbc6314fb706d035845bff7c4304..7fcd4acc73e749aa96765af9412b72d63e2cb952 100644 (file)
@@ -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: Ø®Ù\84اصÙ\87 هایی برای شهرهای بزرگ جهان و مناطق اطرافشان
+          description: Ø§Ø³ØªØ®Ø±Ø§Ø¬â\80\8cهایی برای شهرهای بزرگ جهان و مناطق اطرافشان
         other:
           title: سایر منابع
           description: منابع بیشتر در ویکی OpenStreetMap ذکر شده است
index 884d4de8a8ea10efe82c2b6f4d6abc39b7b0dfc9..563ec8122d61f7a396199cd9f5d0a925db4b5c9f 100644 (file)
@@ -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 <a href="http://www.geonames.org/">GeoNamesista</a>
     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: <span>&copy;</span>OpenStreetMapin<br>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 <a href='https://blog.openstreetmap.org'>OpenStreetMap-blogia</a>, <a href='%{diary_path}'>käyttäjien päiväkirjoja</a>,
+        <a href='https://blogs.openstreetmap.org/'>yhteisöblogeja</a> ja
+        <a href='https://www.osmfoundation.org/'>OSM-säätiön</a> verkkosivua.
       open_data_title: Avoin taatta
+      open_data_html: 'OpenStreetMap on <i>avointa taattaa</i>: 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 <a href=''%{copyright_path}''>Tekijänoikeus ja lisensi</a>
+        -sivula.'
+      legal_title: Lakitekninen jako
+      legal_html: "Tämä ja monet muut OSM-sivustot ovat muodollisesti <a href='https://osmfoundation.org/'>OpenStreetMap-säätiön</a>
+        (OSMF) hallinnoimia OSM-yhteisön puolesta. Kaikkien näiden sivustojen käyttöön
+        sovelletaan <a href=\"https://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy\">\nsallitun
+        käytön käytäntöjä</a>, <a href=\"https://wiki.osmfoundation.org/wiki/Terms_of_Use\">käyttöehtoja</a>
+        ja <a href=\"https://wiki.osmfoundation.org/wiki/Privacy_Policy\">tietosuojakäytäntöä</a>
+        (molemmat sisällöt saatavilla vain englanniksi).\n<br> \n<a href='https://osmfoundation.org/Contact'>Ota
+        yhteys OSMF:ään</a> lisensointi-, tekijänoikeus- ja muissa lakiteknisissä
+        kysymyksissä.\n<br>\nNimi OpenStreetMap, suurennuslasilogo ja slogan State
+        of the Map ovat <a href=\"https://wiki.osmfoundation.org/wiki/Trademark_Policy\">säätiön
+        rekisteröimiä tavaramerkkejä</a>."
+      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 <a href="https://creativecommons.org/licenses/by-sa/2.0/deed.fi">Creative
           Commons Nimeä-Jaa samoin 2.0</a> -lisensillä (CC-BY-SA).
         credit_title_html: OpenStreetMapin mainitseminen
+        credit_1_html: OpenStreetMapin sisältöä levitettäessä on mainittava teksti
+          &quot;&copy; OpenStreetMapin tekijät&quot; tai sen englantinkielinen vastine
+          &quot;&copy; OpenStreetMap contributors&quot;.
+        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\n<a href=\"https://www.openstreetmap.org/copyright\">tälle
+          tekijänoikeussivulle</a>. \nJos linkkien käyttö ei ole mahdollista (esimerkiksi
+          paperille tulostettu aineisto),\nsuosittelemme ohjaamaan lukijat osoitteisiin
+          www.openstreetmap.org, opendatacommons.org ja tarvittaessa myös creativecommons.org."
+        credit_3_html: '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ä
index abd5b7aa4ed7fe9b336f5716cea09cb146fc014a..4ad3a0a8707d7cee9580e564cd59236cfcfd3ba9 100644 (file)
@@ -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 â\80\94 la discussion s’ouvrira
+      still_open: Ensemble de modifications toujours ouvert â\80\93 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}, <abbr title="%{exact_time}">%{when}</abbr>
       open_by_anonymous: Créée par un utilisateur anonyme, <abbr title="%{exact_time}">%{when}</abbr>
-      commented_by: Commenté par %{user} <abbr title='%{exact_time}'>%{when}</abbr>
-      commented_by_anonymous: Commenté par un utilisateur anonyme <abbr title='%{exact_time}'>%{when}</abbr>
-      closed_by: Résolu par %{user} <abbr title='%{exact_time}'>%{when}</abbr>
-      closed_by_anonymous: Résolu par un utilisateur anonyme le <abbr title='%{exact_time}'>%{when}</abbr>
+      commented_by: Commenté par %{user} <abbr title="%{exact_time}">%{when}</abbr>
+      commented_by_anonymous: Commenté par un utilisateur anonyme <abbr title="%{exact_time}">%{when}</abbr>
+      closed_by: Résolu par %{user} <abbr title="%{exact_time}">%{when}</abbr>
+      closed_by_anonymous: Résolu par un utilisateur anonyme le <abbr title="%{exact_time}">%{when}</abbr>
       reopened_by: Réactivée par %{user}, <abbr title="%{exact_time}">%{when}</abbr>
-      reopened_by_anonymous: Réactivé par un utilisateur anonyme <abbr title='%{exact_time}'>%{when}</abbr>
-      hidden_by: Masqué par %{user} <abbr title='%{exact_time}'>%{when}</abbr>
+      reopened_by_anonymous: Réactivé par un utilisateur anonyme <abbr title="%{exact_time}">%{when}</abbr>
+      hidden_by: Masqué par %{user} <abbr title="%{exact_time}">%{when}</abbr>
       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ºâ\80¯%{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 <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>
         geonames: Résultats depuis <a href="http://www.geonames.org/">GeoNames</a>
-        osm_nominatim_reverse: Résultats de <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
-          Nominatim</a>
+        osm_nominatim_reverse: Résultats de <a href="https://nominatim.openstreetmap.org/">Nominatim
+          sur OpenStreetMap</a>
         geonames_reverse: Résultats de <a href="http://www.geonames.org/">GeoNames</a>
     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 dactivité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 <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
-          Nominatim</a>
+        osm_nominatim: Localisation depuis <a href="https://nominatim.openstreetmap.org/">Nominatim
+          sur OpenStreetMap</a>
         geonames: Localisation depuis <a href="http://www.geonames.org/">GeoNames</a>
       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: <abbr title='%{title}'>%{time}</abbr>
-      last_updated_time_user_html: à <abbr title='%{title}'>%{time}</abbr> par %{user}
+      last_updated_time_html: <abbr title="%{title}">%{time}</abbr>
+      last_updated_time_user_html: à <abbr title="%{title}">%{time}</abbr> 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: <span>&copy;</span>Contributeurs<br /> d’OpenStreetMap
+      copyright_html: © Contributeurs<br /> 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 \n<a
-        href='https://blog.openstreetmap.org'>le blogue OpenStreetMap</a>,\n<a href='%{diary_path}'>les
-        annuaires d’utilisateurs</a>, \n<a href='https://blogs.openstreetmap.org/'>les
-        blogues communautaires</a> et \nle site web de la <a href='https://www.osmfoundation.org/'>Fondation
+        et beaucoup d’autres.\nPour en savoir plus sur la communauté, consultez \nle
+        <a href=\"https://blog.openstreetmap.org/\">blogue OpenStreetMap</a>,\nles
+        <a href=\"%{diary_path}\">journaux d’utilisateurs</a>, \nles <a href=\"https://blogs.openstreetmap.org/\">blogues
+        communautaires</a> et \nle site web de la <a href=\"https://www.osmfoundation.org/\">Fondation
         OSM</a>."
-      open_data_title: Données libres
-      open_data_html: 'OpenStreetMap est en <i>données ouvertes</i> : 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 <i>données ouvertes</i>: 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 <a href=''%{copyright_path}''>droits
+        même licence. Consultez la page sur les <a href="%{copyright_path}">droits
         d’auteur et licence</a> pour plus de détails.'
-      legal_title: Juridique
-      legal_html: "Ce site et de nombreux autres services connexes sont formellement
-        exploités par la \n<a href=\"https://osmfoundation.org/\">Fondation OpenStreetMap</a>
-        (OSMF) \nau nom de la communauté. L’utilisation de tous les services offerts
-        par l’OSMF est sujette\nà nos <a href=\"https://wiki.osmfoundation.org/wiki/Terms_of_Use\">Conditions
-        d’utilisation</a>, à notre <a href=\"https://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy\">\nPolitique
-        des usages acceptés</a> et à notre <a href=\"http://wiki.osmfoundation.org/wiki/Privacy_Policy\">Politique
-        de confidentialité</a>.\n<br> \nVeuillez <a href=\"https://osmfoundation.org/Contact\">contacter
-        l’OSMF</a> \nsi vous avez des questions ou problèmes concernant les licences,
-        les droits d’auteur ou d’autres aspects juridiques.\n<br>\nOpenStreetMap,
-        le logo avec la loupe et ''State of the Map'' sont <a href=\"https://wiki.osmfoundation.org/wiki/Trademark_Policy\">des
-        marques déposées de OSMF</a>."
+      legal_title: Informations juridiques
+      legal_html: |-
+        Ce site et de nombreux autres services connexes sont formellement exploités par la
+        <a href="https://osmfoundation.org/">Fondation OpenStreetMap</a> (OSMF) au nom de la communauté. L’utilisation de tous les services offerts par l’OSMF est sujette
+        à nos <a href="https://wiki.osmfoundation.org/wiki/Terms_of_Use">Conditions d’utilisation</a>, à notre <a href="https://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy">Politique des usages acceptés</a> et à notre <a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy">Politique de confidentialité</a>.
+        <br />
+        Veuillez <a href="https://osmfoundation.org/Contact">contacter l’OSMF</a>
+        si vous avez des questions ou problèmes concernant les licences, les droits d’auteur ou d’autres aspects juridiques.
+        <br />
+        OpenStreetMap, le logo avec la loupe et ''State of the Map'' sont <a href="https://wiki.osmfoundation.org/wiki/Trademark_Policy">des marques déposées de l’OSMF</a>.
       partners_title: Partenaires
     copyright:
       foreign:
@@ -1501,58 +1502,61 @@ fr:
       legal_babble:
         title_html: Droits d’auteur et licence
         intro_1_html: |-
-          OpenStreetMap<sup><a href="#trademarks">&reg;</a></sup> est un ensemble de <i>données ouvertes</i>, disponibles sous licence libre <a
-          href="https://opendatacommons.org/licenses/odbl/">Open Data Commons Open Database License</a> (ODbL) auprès de la <a
+          OpenStreetMap<sup><a href="#trademarks">®</a></sup> est un ensemble de <i>données ouvertes</i>, disponibles sous la licence libre <a
+          href="https://opendatacommons.org/licenses/odbl/">Open Data Commons Open Database License</a> (ODbL) accordée par la <a
           href="https://osmfoundation.org/">Fondation OpenStreetMap</a> (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 <a href="https://opendatacommons.org/licenses/odbl/1.0/">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 <a href="https://opendatacommons.org/licenses/odbl/1.0/">texte
           légal</a> 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 <a href="https://creativecommons.org/licenses/by-sa/2.0/">Creative
+        intro_3_html: |-
+          Nos carreaux de rendu cartographiques, ainsi que notre documentation, sont disponibles sous
+          la licence <a href="https://creativecommons.org/licenses/by-sa/2.0/">Creative
           Commons paternité – partage à l’identique 2.0</a> (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
           <a href="https://www.openstreetmap.org/copyright">cette page de mentions légales</a>.
-          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 <a
           href="https://osmfoundation.org/Licence"> Licence OSMF</a> et le <a
           href="https://wiki.openstreetmap.org/wiki/Legal_FAQ">FAQ Légal</a>.
-        more_2_html: "Bien qu’OpenStreetMap soit un jeu de données libres et ouvertes,
-          nous ne pouvons pas fournir une API gratuite et en libre accès pour les
-          tierces personnes.\nVeuillez vous référer à notre <a href=\"https://operations.osmfoundation.org/policies/api/\">politique
-          d’utilisation de l’API</a>,  \n à notre <a href=\"https://operations.osmfoundation.org/policies/tiles/\">politique
-          d’utilisation des tuiles</a>, \net à la <a href=\"https://operations.osmfoundation.org/policies/nominatim/\">politique
-          d’utilisation de Nominatim</a>."
+        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 <a href="https://operations.osmfoundation.org/policies/api/">politique d’utilisation de l’API</a>,
+          à notre <a href="https://operations.osmfoundation.org/policies/tiles/">politique d’utilisation des tuiles</a>
+          et à la <a href="https://operations.osmfoundation.org/policies/nominatim/">politique d’utilisation de Nominatim</a>.
         contributors_title_html: Nos contributeurs
         contributors_intro_html: 'Nos contributeurs sont des milliers de personnes.
           Nous incluons également des données publiées sous licence ouverte par des
           agences nationales de cartographie et par d’autres sources, notamment :'
-        contributors_at_html: '<strong>Autriche</strong> : contient des données sur
-          la <a href="https://data.wien.gv.at/">ville de Vienne</a> (sous licence
-          <a href="https://creativecommons.org/licenses/by/3.0/at/deed.de">CC BY</a>),
-          la <a href="https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm">région
-          du Vorarlberg</a> et la région du Tyrol (sous licence <a href="https://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/">CC
-          BY AT avec amendements</a>).'
-        contributors_au_html: "<strong>Australie</strong> : contient des données source
-          de \n<a href=\"https://www.psma.com.au/psma-data-copyright-and-disclaimer\">PSMA
-          Australia Limited</a>\ndont la licence appartient au Commonwealth d'Australie
-          sous \n<a href=\"https://creativecommons.org/licenses/by/4.0/\">CC BY 4.0</a>."
+        contributors_at_html: |-
+          <strong>Autriche</strong> : contient des données sur la <a href="https://data.wien.gv.at/">ville de Vienne</a> (sous
+          licence <a href="https://creativecommons.org/licenses/by/3.0/at/deed.de">CC BY</a>), la
+          <a href="https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm">région du Vorarlberg</a> et la
+          région du Tyrol (sous licence <a href="https://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/">CC BY AT avec amendements</a>).
+        contributors_au_html: |-
+          <strong>Australie</strong> : contient des données sourcées de
+          <a href="https://www.psma.com.au/psma-data-copyright-and-disclaimer">PSMA Australia Limited</a> publiées sous la licence
+          <a href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a> accordée par le Commonwealth d’Australie.
         contributors_ca_html: '<strong>Canada</strong> : contient des données de <em>GeoBase</em>®,
-          <em>GeoGratis</em> (© Département des Ressources naturelles du Canada),
-          <em>CanVec</em> (© Département des Ressources naturelles du Canada) et <em>StatCan</em>
+          <em>GeoGratis</em> (© Département des Ressources naturelles du Canada),
+          <em>CanVec</em> (© Département des Ressources naturelles du Canada) et <em>StatCan</em>
           (Division Géographie, Statistiques du Canada).'
         contributors_fi_html: '<strong>Finlande</strong> : 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: '<strong>France</strong> : contient des données de la
           <em>Direction générale des finances publiques</em> (anciennement la <em>Direction
           générale des impôts</em>).'
-        contributors_nl_html: '<strong>Pays-Bas</strong> : contient des données ©
-          <abbr title="Automotive Navigation Data">AND</abbr>, 2007 (<a href="https://www.and.com">www.and.com</a>).'
+        contributors_nl_html: '<strong>Pays-Bas</strong> : contient des données © <abbr
+          title="Automotive Navigation Data">AND</abbr>, 2007 (<a href="https://www.and.com/">www.and.com</a>).'
         contributors_nz_html: "<strong>Nouvelle-Zélande</strong> : contient des données
           provenant du <a href=\"https://data.linz.govt.nz/\">service de données LINZ</a>
           et pour la réutilisation, sous licence  \n<a href=\"https://creativecommons.org/licenses/by/4.0/\">CC
@@ -1579,9 +1583,10 @@ fr:
         contributors_za_html: |-
           <strong>Afrique du Sud</strong> : contient des données issues de la <a href="http://www.ngi.gov.za/">Direction principale des
           Informations Géospatiales Nationales</a>, copyright de l’État réservé.
-        contributors_gb_html: '<strong>Royaume-Uni</strong> : contient des données
-          issues de l’<em>Ordnance Survey</em> &copy; 2010-2019 Droits d’auteurs et
-          de la base de données de la Couronne.'
+        contributors_gb_html: |-
+          <strong>Royaume-Uni</strong> : contient des données issues de
+          l’<em>Ordnance Survey</em> © 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 <a href="https://wiki.openstreetmap.org/wiki/Contributors">contributeurs</a>
@@ -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
index 56e793f40c2d5a12f75bc848d3fab9cb5f4b968d..151ed88ecb8b0898c307df85dd4f57f8960ca48a 100644 (file)
@@ -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
index 930026422047f2f41da7618d072ebdf0cedce475..b52b8bcaea5530a6f68434863bdd981d5beafc67 100644 (file)
@@ -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:
index 57d02de709dc32beea4f1a2c9e1a22f68a77cb30..831abb84691e8b3be35a925fd5b7627ddf59c301 100644 (file)
@@ -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</a> ismerteti a jogaidat és kötelezettségeidet.
         intro_3_html: |2-
-             Az OpenStreetMap <i>térképeire</i> a <a
+             Az OpenStreetMap <i>térképeire</i> és dokumentumaira a <a
              href="https://creativecommons.org/licenses/by-sa/2.0/">Creative
              Commons Nevezd meg! - Így add tovább! 2.0</a> 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 &ldquo;&copy; OpenStreetMap közreműködők&rdquo;
           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 <a href="https://www.openstreetmap.org/copyright">copyright
           oldalra</a> való hivatkozással. Alternatívaként, ha az OSM-et adatokként
@@ -1479,7 +1479,7 @@ hu:
 
           Lásd az <a href="https://operations.osmfoundation.org/policies/tiles/">API Felhasználási Irányelveinket</a>, a <a href="http://wiki.openstreetmap.org/wiki/Tile_usage_policy">Csempe Felhasználási Irányelveinket</a> és a <a href="https://operations.osmfoundation.org/policies/nominatim/">Nominatim Felhasználási Irányelveinket</a>.
         contributors_title_html: Közreműködőink
-        contributors_intro_html: 'Többszáz egyéni közreműködőnk van. További, szabadon
+        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
index 4d7b0090da47d57838ced2361d5eb51d0679cc69..9dbba8edb96ead5a466a9472a358ed887ba1ade3 100644 (file)
@@ -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
index 8aaad60d9a79f8957bdef2d68447ed75de57b9f8..9aa60d33cf0b6813f9c59a3137f957e323027561 100644 (file)
@@ -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 <abbr title='%{title}'>%{time} síðan</abbr>
-    closed_html: Lokað <abbr title='%{title}'> fyrir %{time} síðan</abbr>
-    created_by_html: Búið til <abbr title='%{title}'> fyrir %{time} síðan</abbr> af
-      %{user}
-    deleted_by_html: Eytt <abbr title='%{title}'> fyrir %{time} síðan</abbr> af %{user}
-    edited_by_html: Breytt <abbr title='%{title}'> fyrir %{time} síðan</abbr> af %{user}
-    closed_by_html: Lokað <abbr title='%{title}'> fyrir %{time} síðan</abbr> af %{user}
+    created_html: Bjó til <abbr title='%{title}'>%{time}</abbr>
+    closed_html: Lokaði <abbr title='%{title}'> %{time}</abbr>
+    created_by_html: '%{user} bjó til <abbr title=''%{title}''> %{time}</abbr>'
+    deleted_by_html: '%{user} eyddi <abbr title=''%{title}''> %{time}</abbr>'
+    edited_by_html: '%{user} breytti <abbr title=''%{title}''> %{time}</abbr>'
+    closed_by_html: '%{user} lokaði <abbr title=''%{title}''> %{time}</abbr>'
     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} <abbr title='%{exact_time}'>%{when}
-        síðan</abbr>
-      commented_by: Umsögn frá %{user} <abbr title='%{exact_time}'>%{when} síðan</abbr>
+      hidden_commented_by: Falin umsögn frá %{user} <abbr title='%{exact_time}'>%{when}</abbr>
+      commented_by: Umsögn frá %{user} <abbr title='%{exact_time}'>%{when}</abbr>
       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</a>.
       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
index f76d2dbf206d8c788599dcc4bc412bbd3b5d73e7..0f66be34f6d1123e9f3f40d78823e63d672b047e 100644 (file)
@@ -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
index f520cc1b2936d63fa39e82e3004a12cacc349abc..02e7e7840466c6d2317a017f7d600bde8970bdbe 100644 (file)
@@ -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: 地図で表示
index cb625873f13aea539b5f79b8a38f28fc5223d99d..9acddb2e9170501e7f2dda1ba3a150ea07236e17 100644 (file)
@@ -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:
index bb5d48691fcc26ac2959810edbf5e896214cdb11..eb84a96ff7faf972b49ce592b08ab9c56ea92016 100644 (file)
@@ -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: © <a href='%{copyright_url}'>OpenStreetMap bidragsytere</a>
+      copyright: © <a href='%{copyright_url}'>OpenStreetMaps bidragsytere</a>
       donate_link_text: <a class='donate-attr' href='%{donate_url}'>Gi en donasjon</a>
     site:
       edit_tooltip: Rediger kartet
index b525a170ca986508512e9fc4b71df2f9ed569846..8358a874f8729cad60a873613e5f3786835aaa3d 100644 (file)
@@ -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:
index dbca5e248fa8131d134772e1f961121306cebb3e..001af78c1a6a16203f095ca48845b9c83d7532d5 100644 (file)
@@ -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:
index 5888fa03b6653d8f0e660ed7e78c328662d363af..5b63a830c2ab8907d50f838992a241346da81b8b 100644 (file)
@@ -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:
index 63da09a85df60ad9c8f62519e4aec3b39a050fbd..648d3d85e722f1700b04197b33dfb3ebad074f7b 100644 (file)
@@ -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}'
index 1a6cef6606ec0d4cb2dda36a0712c8b90722bd39..bfa9c9110834e567601d1e7daa7833443a0facde 100644 (file)
@@ -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:
index f7e1bc50c21e62e4d685b9de9c48dc548bd6ca99..24cb0968da103f35a822947575116317686171ae 100644 (file)
@@ -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: Сурәт
index 6653739d2f62df64e49591647dc6056b834fe9db..1281e0ae1d81e0c251d617bd1cfb946e6d059a2e 100644 (file)
@@ -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-
index 8be63f091e4b42fc12200f0961b7ab11b7052fa8..416dda744e9c6579e266cfaa2058ada6eca98323 100644 (file)
@@ -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: 帮助理解这些条款的信息:一个<a href="%{summary}">可读的摘要</a>和一些<a href="%{translations}">非正式翻译</a>
@@ -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: 基本信息说明:
index 64170d513b31cd634f82cb57c5d61e53ecacc3b7..51f459da4c63de81203c1f53df9440c5b3b1d2f5 100644 (file)
@@ -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} å\9c¨æ\82¨æ\96¼ %{time} å»ºç«\8bç\9a\84è®\8aæ\9b´é\9b\86è©\95è«\96'
-        commented_changeset: '%{commenter} å\9c¨æ\82¨ç\9b£è¦\96ï¼\8cç\94± %{changeset_author} æ\96¼ %{time} å»ºç«\8bç\9a\84è®\8aæ\9b´é\9b\86è©\95è«\96'
+        your_changeset: '%{commenter}æ\96¼ %{time} å\9c¨æ\82¨ç\9a\84è®\8aæ\9b´é\9b\86ä¹\8bä¸\80裡ç\95\99ä¸\8bäº\86è©\95è«\96'
+        commented_changeset: '%{commenter}æ\96¼ %{time} å\9c¨æ\82¨ç\9b£è¦\96ç\9a\84ç\94±%{changeset_author}æ\89\80建ç«\8bè®\8aæ\9b´é\9b\86裡ç\95\99ä¸\8bäº\86è©\95è«\96'
         partial_changeset_with_comment: 評論 "%{changeset_comment}"
         partial_changeset_without_comment: 沒有評論
       details: 關於變更集的詳情可在 %{url} 找到。
index a5eccf816b2f63b7022c72adeeb2fa79b6f6f1c3..5ed44377449e9c5102f0ac5ab01c646097886a70 100644 (file)
@@ -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).
index d8d91f47ebcabdbf4e7589bb4e579c5b5f0b58d5..992197814ee15b2dad1c7a8bb07e9f14216f4ac7 100644 (file)
@@ -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
index 7c3bb8d1cbb1e0ef4c362f9b0fbec52b53b268a8..b46fdf25f4e7de0fcce8e7eff0f2ed78a355228e 100644 (file)
@@ -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
 
index 848dc972418c5c762c6e97707abed2bcba4b44b4..ca898cb37b197f6f9c77ae386dc277a56d744973 100644 (file)
@@ -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
 
index 985a85820a1202a7a74d14165f2482fe915672af..f8a3085c6047b15b5cb06f24bf01115c1d03b7e7 100644 (file)
@@ -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
 
index b6899f3300451de83e084101f0e349b4ab221d22..e4725b64345e9e56d3c01e2554ea86bb5ea224aa 100644 (file)
@@ -1,5 +1,5 @@
 class AddEmailValid < ActiveRecord::Migration[4.2]
-  class User < ActiveRecord::Base
+  class User < ApplicationRecord
   end
 
   def self.up
index caa3554191490ebfa33a14b6d6ac88269e380a20..fbb5d1af40f73c715ddd3d9a129ad37b6fc62c52 100644 (file)
@@ -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
 
index 6ce26588ea818337aa2fef5d9faa8d5a86102c84..2c3fee5be92ab9cb20d8a6496e529134c6dfa611 100644 (file)
@@ -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
 
index 0098a0086a60d64c77c5bddcfd0149a0339199ca..0039859bfc2e27f4adb8ad50af7be2fefeae8329 100644 (file)
@@ -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
index cbd95018d97765100d758697d6023552fc024ce5..b10fcf144ea8ff7285423f2d99a6f63eda199b3b 100644 (file)
@@ -1,7 +1,7 @@
 require "migrate"
 
 class AlterUserRolesAndBlocks < ActiveRecord::Migration[4.2]
-  class UserRole < ActiveRecord::Base
+  class UserRole < ApplicationRecord
   end
 
   def self.up
index 5cf8a920f50e0f2e0d290bc32e91e85de4f1f1da..23761f24847c11dd970fa91c2cb6579cb7c2f57f 100644 (file)
@@ -1,7 +1,7 @@
 require "migrate"
 
 class AddStatusToUser < ActiveRecord::Migration[4.2]
-  class User < ActiveRecord::Base
+  class User < ApplicationRecord
   end
 
   def self.up
index f41782d37041e7ba562edd5f7c60ed97b457d09d..824eaceb06f346415473654fddf4a75ae56a113d 100644 (file)
@@ -1,5 +1,5 @@
 class AddTermsSeenToUser < ActiveRecord::Migration[4.2]
-  class User < ActiveRecord::Base
+  class User < ApplicationRecord
   end
 
   def self.up
index f05cb4f21416216a1d9f2af7a617dd323d3d43b7..09b0ae3b07c90f9869e04a418fb66897575ffbbb 100644 (file)
@@ -11,7 +11,7 @@ class IPAddr
 end
 
 class MergeAclAddressAndMask < ActiveRecord::Migration[4.2]
-  class Acl < ActiveRecord::Base
+  class Acl < ApplicationRecord
   end
 
   def up
index 330e2cea379586d93ea44ec26de1103058d90ea7..f29bfbb0e6e771900673e17edbf5fc9bc9257527 100644 (file)
@@ -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
 
index b5e445400dc6a8b02d4b259fbb1d2d070dc0ccda..ec05f34646a4032bd5a77edee45e6716e3369721 100644 (file)
@@ -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
index 9e9151a849a8430ca518122dc62a867c1fbbbea2..dd18b068d36fb9a6f3f75dc90b2a540abce6a241 100644 (file)
@@ -1,5 +1,5 @@
 class AddImageUseGravatarToUsers < ActiveRecord::Migration[4.2]
-  class User < ActiveRecord::Base
+  class User < ApplicationRecord
   end
 
   def self.up
index a12303812f65b8d5b1ad6de711d2afed3f00b658..06b399615124e8f535f0db3f8d3cfaf9c9bb4ef1 100644 (file)
@@ -1,5 +1,5 @@
 class RenameOpenidUrl < ActiveRecord::Migration[4.2]
-  class User < ActiveRecord::Base
+  class User < ApplicationRecord
   end
 
   def change
index 61dbcb4ea59fd63a69d0eaf6691a9462ad5328f7..917948d4317d942777d132b367adb4cab1601652 100644 (file)
@@ -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 (file)
index 0000000..7d9383d
--- /dev/null
@@ -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
index 6370eb95a0904a8b63b978b7d9abb1f5972822e6..d0e8c21e3ba32f4213835b506e57efb9b523608a 100644 (file)
@@ -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'),
index d827cfd7462aa318a11c4754434ccd311dab4a7f..6efdae0efd4b2dfeb8bf91c3969c88af54df8594 100644 (file)
@@ -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?
index 8d0e682f62b4a3ac91b5b875e43c8d311f82c483..8a98f29e0e6274c6c871e57bbc9b697a1aa6666a 100644 (file)
@@ -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
index e8dda0ba16407f1dedc234eedd2488d848a342cc..be6b84b47aa76e52b3fcbd3c0ff327d628797d14 100644 (file)
@@ -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
index 6d990a84c6b25a5954983242381966acf8854e00..aee41d51548e788bc6d6f389750f891025f8510f 100644 (file)
@@ -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
index 54a20028de33846cfee627ca23769708d280e9b0..0e4a6f35747ee0b93a2df68a2529b7c9f85388d5 100644 (file)
@@ -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
index 0f8954541034c726d68c15b71462d9146fbeaf71..941787d0a2872ddd39d31693cadfb2f40c67c580 100644 (file)
@@ -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
 
index 4d2969026aa3621dea4936c2abf674425880553d..1b54e4863c52fe6024bd6a0eb1079012b40e1c24 100644 (file)
@@ -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!)
index 820829aadc6f21a79e230bd3207867834262a53e..80b9d1a8458a445e2719c2059a8c2eefe72d49d9 100644 (file)
@@ -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
 
     ##
index 99dad959732343dfff6e467b4e5059bd9d68806f..3223eb5ddf29fa3b725195af64930d02ae481d81 100644 (file)
@@ -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 => "<osm><preferences><preference k='key' v='new_value'/><preference k='new_key' v='value'/></preferences></osm>"
+        put :update_all, :body => "<osm><preferences><preference k='key' v='new_value'/><preference k='new_key' v='value'/></preferences></osm>"
       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 => "<osm><preferences><preference k='key' v='new_value'/><preference k='new_key' v='value'/></preferences></osm>"
+        put :update_all, :body => "<osm><preferences><preference k='key' v='new_value'/><preference k='new_key' v='value'/></preferences></osm>"
       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 => "<osm><preferences><preference k='key' v='value'/><preference k='key' v='newer_value'/></preferences></osm>"
+        put :update_all, :body => "<osm><preferences><preference k='key' v='value'/><preference k='key' v='newer_value'/></preferences></osm>"
       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
index de402ebf8ea80080c6c1fe8bdbcbd44d98fb5b0b..cc9d932bcb3e705b726a19e1a5a276bd572cdf1e 100644 (file)
@@ -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
index c390e8bc29d32e61290fdf03ed6b8756c9076fe2..433b43f27cbea7d63e10306f03573ab54dfe31cf 100644 (file)
@@ -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
index 2d13bd92bbbc614d1ecd6d9d267569d234c0167d..a1a00c5dc7d70f09314cbe2998668a9fc71d17c4 100644 (file)
@@ -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
index caf7721cd4ab425e483e7720f9147fc62cc41450..e754e32b71dac1ed67829c099b98596cf0f61c3f 100644 (file)
@@ -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
index 81ab290b94a8e7938021962e3e42931f27aedb58..7a963a8e242907f2965f3d562427a2feeb8a025f 100644 (file)
@@ -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 }
index 84a6557946eb598d6be0e1a1d2de212bfbd32148..059242af9957357f460078dd9981a9d6765d4c4d 100644 (file)
@@ -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
index 82e8346469cff7828e221fff90faada2164a8e12..c35f73d349d7c90f415d73c6e7935feabafeb8c2 100644 (file)
@@ -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
index d6fa1cd8f32d35d4fca07636a9373dffadc8897b..e8a572fd8fd4f64da2fa31bdad3d431fa6101b68 100644 (file)
@@ -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)
index e66d782ff06bf0b2c2e5eb8417aca58a617ebeea..05385b4f9c8678b85b207e352fe047e52bb9956c 100644 (file)
@@ -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 (file)
index a06971f..0000000
+++ /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<String>} 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
-});