Merge remote-tracking branch 'openstreetmap/pull/1120'
authorTom Hughes <tom@compton.nu>
Wed, 9 Mar 2016 22:27:40 +0000 (22:27 +0000)
committerTom Hughes <tom@compton.nu>
Wed, 9 Mar 2016 22:27:40 +0000 (22:27 +0000)
316 files changed:
.rubocop.yml
.rubocop_todo.yml
.travis.yml
Gemfile
Gemfile.lock
INSTALL.md
Vendorfile
app/assets/javascripts/embed.js.erb
app/assets/javascripts/index.js
app/assets/javascripts/index/directions/graphhopper.js
app/assets/javascripts/index/directions/mapquest.js
app/assets/javascripts/index/directions/mapzen.js
app/assets/javascripts/index/directions/osrm.js
app/assets/javascripts/index/query.js
app/assets/javascripts/osm.js.erb
app/assets/stylesheets/common.scss
app/controllers/amf_controller.rb
app/controllers/api_controller.rb
app/controllers/application_controller.rb
app/controllers/browse_controller.rb
app/controllers/changeset_controller.rb
app/controllers/geocoder_controller.rb
app/controllers/node_controller.rb
app/controllers/notes_controller.rb
app/controllers/oauth_controller.rb
app/controllers/old_controller.rb
app/controllers/relation_controller.rb
app/controllers/trace_controller.rb
app/controllers/user_controller.rb
app/controllers/user_preference_controller.rb
app/controllers/way_controller.rb
app/helpers/asset_helper.rb
app/helpers/browse_helper.rb
app/helpers/changeset_helper.rb
app/helpers/geocoder_helper.rb
app/helpers/note_helper.rb
app/models/changeset.rb
app/models/changeset_comment.rb
app/models/client_application.rb
app/models/node.rb
app/models/note.rb
app/models/notifier.rb
app/models/old_node.rb
app/models/relation.rb
app/models/request_token.rb
app/models/trace.rb
app/models/user.rb
app/models/user_role.rb
app/models/way.rb
app/views/site/_potlatch2.html.erb
app/views/site/export.html.erb
app/views/site/id.html.erb
app/views/user/blocked.html.erb
app/views/user/login.html.erb
config/example.application.yml
config/initializers/abstract_adapter.rb
config/initializers/assets.rb
config/initializers/http_accept_language.rb [deleted file]
config/initializers/i18n.rb
config/initializers/libxml.rb
config/initializers/omniauth.rb
config/initializers/r2.rb
config/initializers/streaming.rb
config/locales/af.yml
config/locales/ar.yml
config/locales/ast.yml
config/locales/az.yml
config/locales/be.yml
config/locales/br.yml
config/locales/bs.yml
config/locales/ca.yml
config/locales/cs.yml
config/locales/cy.yml
config/locales/da.yml
config/locales/de.yml
config/locales/diq.yml
config/locales/el.yml
config/locales/en-GB.yml
config/locales/en.yml
config/locales/es.yml
config/locales/et.yml
config/locales/eu.yml
config/locales/fi.yml
config/locales/fr.yml
config/locales/fur.yml
config/locales/gd.yml
config/locales/gl.yml
config/locales/he.yml
config/locales/hsb.yml
config/locales/hu.yml
config/locales/ia.yml
config/locales/id.yml
config/locales/is.yml
config/locales/it.yml
config/locales/ja.yml
config/locales/ka.yml
config/locales/ko.yml
config/locales/lb.yml
config/locales/lt.yml
config/locales/mk.yml
config/locales/mr.yml
config/locales/ms.yml
config/locales/nb.yml
config/locales/nl.yml
config/locales/oc.yml
config/locales/pl.yml
config/locales/pt-BR.yml
config/locales/pt-PT.yml
config/locales/ru.yml
config/locales/scn.yml
config/locales/sk.yml
config/locales/sr.yml
config/locales/sv.yml
config/locales/tl.yml
config/locales/tr.yml
config/locales/uk.yml
config/locales/vi.yml
config/locales/zh-CN.yml
config/locales/zh-TW.yml
config/preinitializer.rb
db/migrate/008_remove_segments.rb
db/migrate/020_populate_node_tags_and_remove.rb
db/migrate/021_move_to_innodb.rb
db/migrate/022_key_constraints.rb
db/migrate/023_add_changesets.rb
db/migrate/030_add_foreign_keys.rb
db/migrate/041_add_fine_o_auth_permissions.rb
lib/auth.rb
lib/bounding_box.rb
lib/classic_pagination/pagination.rb
lib/classic_pagination/pagination_helper.rb
lib/consistency_validations.rb
lib/diff_reader.rb
lib/editors.rb
lib/gpx.rb
lib/id.rb
lib/locale.rb [new file with mode: 0644]
lib/not_redactable.rb
lib/password_hash.rb
lib/potlatch.rb
lib/potlatch2.rb
lib/quad_tile.rb
lib/quova.rb
lib/redactable.rb
lib/rich_text.rb
lib/session_persistence.rb
lib/short_link.rb
lib/tasks/add_version_to_nodes.rake
public/robots.txt
script/vagrant/setup/provision.sh
test/controllers/changeset_controller_test.rb
test/controllers/node_controller_test.rb
test/controllers/relation_controller_test.rb
test/controllers/trace_controller_test.rb
test/controllers/user_controller_test.rb
test/controllers/way_controller_test.rb
test/fixtures/changesets.yml
test/fixtures/current_node_tags.yml
test/fixtures/current_nodes.yml
test/helpers/browse_helper_test.rb
test/helpers/changeset_helper_test.rb
test/helpers/note_helper_test.rb
test/integration/oauth_test.rb
test/integration/page_locale_test.rb [moved from test/integration/locale_test.rb with 94% similarity]
test/integration/user_creation_test.rb
test/integration/user_login_test.rb
test/lib/locale_test.rb [new file with mode: 0644]
test/models/changeset_comment_test.rb
test/models/changeset_test.rb
test/models/message_test.rb
test/models/node_tag_test.rb
test/models/node_test.rb
test/models/note_comment_test.rb
test/models/request_token_test.rb [new file with mode: 0644]
test/models/trace_test.rb
test/models/user_preference_test.rb
test/models/user_test.rb
test/models/way_test.rb
vendor/assets/iD/iD.css.erb
vendor/assets/iD/iD.js
vendor/assets/iD/iD/img/iD-sprite.svg
vendor/assets/iD/iD/img/maki-sprite.svg
vendor/assets/iD/iD/locales/af.json
vendor/assets/iD/iD/locales/ar.json
vendor/assets/iD/iD/locales/ast.json
vendor/assets/iD/iD/locales/bg-BG.json
vendor/assets/iD/iD/locales/bn.json
vendor/assets/iD/iD/locales/bs.json
vendor/assets/iD/iD/locales/ca.json
vendor/assets/iD/iD/locales/cs.json
vendor/assets/iD/iD/locales/da.json
vendor/assets/iD/iD/locales/de.json
vendor/assets/iD/iD/locales/el.json
vendor/assets/iD/iD/locales/en-GB.json
vendor/assets/iD/iD/locales/en.json
vendor/assets/iD/iD/locales/eo.json
vendor/assets/iD/iD/locales/es.json
vendor/assets/iD/iD/locales/et.json
vendor/assets/iD/iD/locales/fa.json
vendor/assets/iD/iD/locales/fi.json
vendor/assets/iD/iD/locales/fr.json
vendor/assets/iD/iD/locales/gl.json
vendor/assets/iD/iD/locales/hi.json [new file with mode: 0644]
vendor/assets/iD/iD/locales/hr.json
vendor/assets/iD/iD/locales/hu.json
vendor/assets/iD/iD/locales/hy.json
vendor/assets/iD/iD/locales/id.json
vendor/assets/iD/iD/locales/is.json
vendor/assets/iD/iD/locales/it.json
vendor/assets/iD/iD/locales/ja.json
vendor/assets/iD/iD/locales/kn.json
vendor/assets/iD/iD/locales/ko.json
vendor/assets/iD/iD/locales/lij.json [new file with mode: 0644]
vendor/assets/iD/iD/locales/lt.json
vendor/assets/iD/iD/locales/lv.json
vendor/assets/iD/iD/locales/nl.json
vendor/assets/iD/iD/locales/no.json
vendor/assets/iD/iD/locales/pl.json
vendor/assets/iD/iD/locales/pt-BR.json
vendor/assets/iD/iD/locales/pt.json
vendor/assets/iD/iD/locales/ro.json
vendor/assets/iD/iD/locales/ru.json
vendor/assets/iD/iD/locales/si.json
vendor/assets/iD/iD/locales/sk.json
vendor/assets/iD/iD/locales/sl.json
vendor/assets/iD/iD/locales/sq.json
vendor/assets/iD/iD/locales/sr.json
vendor/assets/iD/iD/locales/sv.json
vendor/assets/iD/iD/locales/ta.json
vendor/assets/iD/iD/locales/te.json
vendor/assets/iD/iD/locales/th.json [new file with mode: 0644]
vendor/assets/iD/iD/locales/tl.json
vendor/assets/iD/iD/locales/tr.json
vendor/assets/iD/iD/locales/uk.json
vendor/assets/iD/iD/locales/vi.json
vendor/assets/iD/iD/locales/yue.json
vendor/assets/iD/iD/locales/zh-CN.json
vendor/assets/iD/iD/locales/zh-HK.json
vendor/assets/iD/iD/locales/zh-TW.json
vendor/assets/iD/iD/locales/zh.json
vendor/assets/iD/iD/traffico/LICENSE [new file with mode: 0644]
vendor/assets/iD/iD/traffico/README.md [new file with mode: 0644]
vendor/assets/iD/iD/traffico/bower.json [new file with mode: 0644]
vendor/assets/iD/iD/traffico/fonts/traffico-preview.html [new file with mode: 0644]
vendor/assets/iD/iD/traffico/fonts/traffico_d596ae6150aa5c55ac14b1e060efc523.eot [new file with mode: 0644]
vendor/assets/iD/iD/traffico/fonts/traffico_d596ae6150aa5c55ac14b1e060efc523.svg [new file with mode: 0644]
vendor/assets/iD/iD/traffico/fonts/traffico_d596ae6150aa5c55ac14b1e060efc523.ttf [new file with mode: 0644]
vendor/assets/iD/iD/traffico/fonts/traffico_d596ae6150aa5c55ac14b1e060efc523.woff [new file with mode: 0644]
vendor/assets/iD/iD/traffico/global.json [new file with mode: 0644]
vendor/assets/iD/iD/traffico/glyphs.json [new file with mode: 0644]
vendor/assets/iD/iD/traffico/mapillary-mappings/au.json [new file with mode: 0644]
vendor/assets/iD/iD/traffico/mapillary-mappings/br.json [new file with mode: 0644]
vendor/assets/iD/iD/traffico/mapillary-mappings/ca.json [new file with mode: 0644]
vendor/assets/iD/iD/traffico/mapillary-mappings/eu.json [new file with mode: 0644]
vendor/assets/iD/iD/traffico/mapillary-mappings/us.json [new file with mode: 0644]
vendor/assets/iD/iD/traffico/signs/at.json [new file with mode: 0644]
vendor/assets/iD/iD/traffico/signs/au.json [new file with mode: 0644]
vendor/assets/iD/iD/traffico/signs/be.json [new file with mode: 0644]
vendor/assets/iD/iD/traffico/signs/br.json [new file with mode: 0644]
vendor/assets/iD/iD/traffico/signs/ca.json [new file with mode: 0644]
vendor/assets/iD/iD/traffico/signs/ch.json [new file with mode: 0644]
vendor/assets/iD/iD/traffico/signs/cz.json [new file with mode: 0644]
vendor/assets/iD/iD/traffico/signs/de.json [new file with mode: 0644]
vendor/assets/iD/iD/traffico/signs/dk.json [new file with mode: 0644]
vendor/assets/iD/iD/traffico/signs/ee.json [new file with mode: 0644]
vendor/assets/iD/iD/traffico/signs/es.json [new file with mode: 0644]
vendor/assets/iD/iD/traffico/signs/fi.json [new file with mode: 0644]
vendor/assets/iD/iD/traffico/signs/fr.json [new file with mode: 0644]
vendor/assets/iD/iD/traffico/signs/gr.json [new file with mode: 0644]
vendor/assets/iD/iD/traffico/signs/hu.json [new file with mode: 0644]
vendor/assets/iD/iD/traffico/signs/it.json [new file with mode: 0644]
vendor/assets/iD/iD/traffico/signs/lt.json [new file with mode: 0644]
vendor/assets/iD/iD/traffico/signs/lu.json [new file with mode: 0644]
vendor/assets/iD/iD/traffico/signs/lv.json [new file with mode: 0644]
vendor/assets/iD/iD/traffico/signs/nl.json [new file with mode: 0644]
vendor/assets/iD/iD/traffico/signs/no.json [new file with mode: 0644]
vendor/assets/iD/iD/traffico/signs/pl.json [new file with mode: 0644]
vendor/assets/iD/iD/traffico/signs/se.json [new file with mode: 0644]
vendor/assets/iD/iD/traffico/signs/si.json [new file with mode: 0644]
vendor/assets/iD/iD/traffico/signs/sk.json [new file with mode: 0644]
vendor/assets/iD/iD/traffico/signs/uk.json [new file with mode: 0644]
vendor/assets/iD/iD/traffico/signs/us.json [new file with mode: 0644]
vendor/assets/iD/iD/traffico/string-maps/at-map.json [new file with mode: 0644]
vendor/assets/iD/iD/traffico/string-maps/au-map.json [new file with mode: 0644]
vendor/assets/iD/iD/traffico/string-maps/be-map.json [new file with mode: 0644]
vendor/assets/iD/iD/traffico/string-maps/br-map.json [new file with mode: 0644]
vendor/assets/iD/iD/traffico/string-maps/ca-map.json [new file with mode: 0644]
vendor/assets/iD/iD/traffico/string-maps/ch-map.json [new file with mode: 0644]
vendor/assets/iD/iD/traffico/string-maps/cz-map.json [new file with mode: 0644]
vendor/assets/iD/iD/traffico/string-maps/de-map.json [new file with mode: 0644]
vendor/assets/iD/iD/traffico/string-maps/dk-map.json [new file with mode: 0644]
vendor/assets/iD/iD/traffico/string-maps/ee-map.json [new file with mode: 0644]
vendor/assets/iD/iD/traffico/string-maps/es-map.json [new file with mode: 0644]
vendor/assets/iD/iD/traffico/string-maps/fi-map.json [new file with mode: 0644]
vendor/assets/iD/iD/traffico/string-maps/fr-map.json [new file with mode: 0644]
vendor/assets/iD/iD/traffico/string-maps/gr-map.json [new file with mode: 0644]
vendor/assets/iD/iD/traffico/string-maps/hu-map.json [new file with mode: 0644]
vendor/assets/iD/iD/traffico/string-maps/it-map.json [new file with mode: 0644]
vendor/assets/iD/iD/traffico/string-maps/lt-map.json [new file with mode: 0644]
vendor/assets/iD/iD/traffico/string-maps/lu-map.json [new file with mode: 0644]
vendor/assets/iD/iD/traffico/string-maps/lv-map.json [new file with mode: 0644]
vendor/assets/iD/iD/traffico/string-maps/nl-map.json [new file with mode: 0644]
vendor/assets/iD/iD/traffico/string-maps/no-map.json [new file with mode: 0644]
vendor/assets/iD/iD/traffico/string-maps/pl-map.json [new file with mode: 0644]
vendor/assets/iD/iD/traffico/string-maps/se-map.json [new file with mode: 0644]
vendor/assets/iD/iD/traffico/string-maps/si-map.json [new file with mode: 0644]
vendor/assets/iD/iD/traffico/string-maps/sk-map.json [new file with mode: 0644]
vendor/assets/iD/iD/traffico/string-maps/uk-map.json [new file with mode: 0644]
vendor/assets/iD/iD/traffico/string-maps/us-map.json [new file with mode: 0644]
vendor/assets/iD/iD/traffico/stylesheets/examples.css [new file with mode: 0644]
vendor/assets/iD/iD/traffico/stylesheets/traffico.css.erb [new file with mode: 0644]
vendor/assets/iD/iD/traffico/transformations.json [new file with mode: 0644]
vendor/assets/iD/imagery.js
vendor/assets/iD/presets.js
vendor/assets/potlatch2/potlatch2.swf
vendor/assets/potlatch2/potlatch2/assets.zip

index 213eb27..f12f24a 100644 (file)
@@ -1,7 +1,7 @@
 inherit_from: .rubocop_todo.yml
 
-AllCops:
-   RunRailsCops: true
+Rails:
+  Enabled: true
 
 Style/BracesAroundHashParameters:
   EnforcedStyle: context_dependent
@@ -15,10 +15,16 @@ Style/FileName:
     - 'script/locale/reload-languages'
     - 'script/update-spam-blocks'
 
+Style/IfInsideElse:
+  Enabled: false
+
 Style/GlobalVars:
   Exclude:
     - 'lib/quad_tile/extconf.rb'
-    
+
+Style/GuardClause:
+  Enabled: false
+
 Style/HashSyntax:
   EnforcedStyle: hash_rockets
   Exclude:
index b317054..651691b 100644 (file)
@@ -85,7 +85,7 @@ Metrics/MethodLength:
 # Offense count: 1
 # Configuration parameters: CountComments.
 Metrics/ModuleLength:
-  Max: 129
+  Max: 131
 
 # Offense count: 4
 # Configuration parameters: CountKeywordArgs.
index 441bdf6..6c41bc8 100644 (file)
@@ -1,7 +1,7 @@
 sudo: false
 language: ruby
 rvm:
-  - 2.1.7
+  - 2.1.8
 cache: bundler
 addons:
   postgresql: 9.1
diff --git a/Gemfile b/Gemfile
index 3789c9f..dfd87eb 100644 (file)
--- a/Gemfile
+++ b/Gemfile
@@ -1,7 +1,7 @@
 source "https://rubygems.org"
 
 # Require rails
-gem "rails", "4.2.5"
+gem "rails", "4.2.6"
 
 # Require things which have moved to gems in ruby 1.9
 gem "bigdecimal", "~> 1.1.0", :platforms => :ruby_19
index 83d9ae4..ca4df46 100644 (file)
@@ -2,38 +2,38 @@ GEM
   remote: https://rubygems.org/
   specs:
     SystemTimer (1.2.3)
-    actionmailer (4.2.5)
-      actionpack (= 4.2.5)
-      actionview (= 4.2.5)
-      activejob (= 4.2.5)
+    actionmailer (4.2.6)
+      actionpack (= 4.2.6)
+      actionview (= 4.2.6)
+      activejob (= 4.2.6)
       mail (~> 2.5, >= 2.5.4)
       rails-dom-testing (~> 1.0, >= 1.0.5)
-    actionpack (4.2.5)
-      actionview (= 4.2.5)
-      activesupport (= 4.2.5)
+    actionpack (4.2.6)
+      actionview (= 4.2.6)
+      activesupport (= 4.2.6)
       rack (~> 1.6)
       rack-test (~> 0.6.2)
       rails-dom-testing (~> 1.0, >= 1.0.5)
       rails-html-sanitizer (~> 1.0, >= 1.0.2)
     actionpack-page_caching (1.0.2)
       actionpack (>= 4.0.0, < 5)
-    actionview (4.2.5)
-      activesupport (= 4.2.5)
+    actionview (4.2.6)
+      activesupport (= 4.2.6)
       builder (~> 3.1)
       erubis (~> 2.7.0)
       rails-dom-testing (~> 1.0, >= 1.0.5)
       rails-html-sanitizer (~> 1.0, >= 1.0.2)
-    activejob (4.2.5)
-      activesupport (= 4.2.5)
+    activejob (4.2.6)
+      activesupport (= 4.2.6)
       globalid (>= 0.3.0)
-    activemodel (4.2.5)
-      activesupport (= 4.2.5)
+    activemodel (4.2.6)
+      activesupport (= 4.2.6)
       builder (~> 3.1)
-    activerecord (4.2.5)
-      activemodel (= 4.2.5)
-      activesupport (= 4.2.5)
+    activerecord (4.2.6)
+      activemodel (= 4.2.6)
+      activesupport (= 4.2.6)
       arel (~> 6.0)
-    activesupport (4.2.5)
+    activesupport (4.2.6)
       i18n (~> 0.7)
       json (~> 1.7, >= 1.7.7)
       minitest (~> 5.1)
@@ -41,15 +41,13 @@ GEM
       tzinfo (~> 1.1)
     addressable (2.4.0)
     arel (6.0.3)
-    ast (2.1.0)
-    astrolabe (1.3.1)
-      parser (~> 2.2)
-    autoprefixer-rails (6.1.2)
+    ast (2.2.0)
+    autoprefixer-rails (6.3.3.1)
       execjs
-      json
     bigdecimal (1.1.0)
     builder (3.2.2)
-    capybara (2.5.0)
+    capybara (2.6.2)
+      addressable
       mime-types (>= 1.16)
       nokogiri (>= 1.3.3)
       rack (>= 1.0.0)
@@ -60,34 +58,31 @@ GEM
     cliver (0.3.2)
     cocaine (0.5.8)
       climate_control (>= 0.0.3, < 1.0)
-    coffee-rails (4.1.0)
+    coffee-rails (4.1.1)
       coffee-script (>= 2.2.0)
-      railties (>= 4.0.0, < 5.0)
+      railties (>= 4.0.0, < 5.1.x)
     coffee-script (2.4.1)
       coffee-script-source
       execjs
     coffee-script-source (1.10.0)
     colorize (0.7.7)
-    composite_primary_keys (8.1.1)
+    composite_primary_keys (8.1.2)
       activerecord (~> 4.2.0)
-    concurrent-ruby (1.0.0)
-    coveralls (0.8.10)
+    concurrent-ruby (1.0.1)
+    coveralls (0.8.13)
       json (~> 1.8)
-      rest-client (>= 1.6.8, < 2)
       simplecov (~> 0.11.0)
       term-ansicolor (~> 1.3)
       thor (~> 0.19.1)
       tins (~> 1.6.0)
     crass (1.0.2)
-    dalli (2.7.4)
+    dalli (2.7.6)
     deadlock_retry (1.2.0)
     docile (1.1.5)
-    domain_name (0.5.25)
-      unf (>= 0.0.5, < 1.0.0)
     dynamic_form (1.1.4)
     erubis (2.7.0)
     execjs (2.6.0)
-    exifr (1.2.3.1)
+    exifr (1.2.4)
     faraday (0.9.2)
       multipart-post (>= 1.2, < 3)
     fspath (2.1.1)
@@ -95,22 +90,20 @@ GEM
       activesupport (>= 4.1.0)
     hashie (3.4.3)
     htmlentities (4.3.4)
-    http-cookie (1.0.2)
-      domain_name (~> 0.5)
     http_accept_language (2.0.5)
-    httpclient (2.7.0.1)
+    httpclient (2.7.1)
     i18n (0.7.0)
-    i18n-js (3.0.0.rc11)
-      i18n (~> 0.6)
-    image_optim (0.22.0)
+    i18n-js (3.0.0.rc12)
+      i18n (~> 0.6, >= 0.6.6)
+    image_optim (0.22.1)
       exifr (~> 1.2, >= 1.2.2)
       fspath (~> 2.1)
       image_size (~> 1.3)
       in_threads (~> 1.3)
       progress (~> 3.0, >= 3.0.1)
-    image_size (1.4.1)
+    image_size (1.4.2)
     in_threads (1.3.1)
-    jquery-rails (4.0.5)
+    jquery-rails (4.1.0)
       rails-dom-testing (~> 1.0)
       railties (>= 4.2.0)
       thor (>= 0.14, < 2.0)
@@ -124,19 +117,20 @@ GEM
     jsonify-rails (0.3.2)
       actionpack
       jsonify (< 0.4.0)
-    jwt (1.5.2)
+    jwt (1.5.1)
     kgio (2.10.0)
-    konacha (3.7.0)
-      actionpack (>= 3.1, < 5)
+    konacha (4.0.0)
+      actionpack (>= 4.1, < 5)
       capybara
       colorize
-      railties (>= 3.1, < 5)
+      railties (>= 4.1, < 5)
       sprockets (>= 2, < 4)
+      sprockets-rails (>= 2, < 4)
       tilt
     libv8 (3.16.14.13)
     libxml-ruby (2.8.0)
     logstash-event (1.2.02)
-    logstasher (0.8.6)
+    logstasher (0.9.0)
       activerecord (>= 3.0)
       activesupport (>= 3.0)
       logstash-event (~> 1.2.0)
@@ -145,17 +139,16 @@ GEM
       nokogiri (>= 1.5.9)
     mail (2.6.3)
       mime-types (>= 1.16, < 3)
-    mime-types (2.99)
+    mime-types (2.99.1)
     mimemagic (0.3.0)
     mini_portile2 (2.0.0)
-    minitest (5.8.3)
+    minitest (5.8.4)
     multi_json (1.11.2)
     multi_xml (0.5.5)
     multipart-post (2.0.0)
-    netrc (0.11.0)
-    nokogiri (1.6.7)
+    nokogiri (1.6.7.2)
       mini_portile2 (~> 2.0.0.rc2)
-    nokogumbo (1.4.1)
+    nokogumbo (1.4.7)
       nokogiri
     oauth (0.4.7)
     oauth-plugin (0.5.1)
@@ -163,24 +156,23 @@ GEM
       oauth (~> 0.4.4)
       oauth2 (>= 0.5.0)
       rack
-    oauth2 (1.0.0)
+    oauth2 (1.1.0)
       faraday (>= 0.8, < 0.10)
-      jwt (~> 1.0)
+      jwt (~> 1.0, < 1.5.2)
       multi_json (~> 1.3)
       multi_xml (~> 0.5)
-      rack (~> 1.2)
-    omniauth (1.2.2)
+      rack (>= 1.2, < 3)
+    omniauth (1.3.1)
       hashie (>= 1.2, < 4)
-      rack (~> 1.0)
+      rack (>= 1.0, < 3)
     omniauth-facebook (3.0.0)
       omniauth-oauth2 (~> 1.2)
-    omniauth-google-oauth2 (0.2.10)
-      addressable (~> 2.3)
+    omniauth-google-oauth2 (0.3.1)
       jwt (~> 1.0)
       multi_json (~> 1.3)
       omniauth (>= 1.1.1)
-      omniauth-oauth2 (~> 1.3.1)
-    omniauth-oauth2 (1.3.1)
+      omniauth-oauth2 (>= 1.3.1)
+    omniauth-oauth2 (1.4.0)
       oauth2 (~> 1.0)
       omniauth (~> 1.2)
     omniauth-openid (1.0.1)
@@ -189,23 +181,23 @@ GEM
     omniauth-windowslive (0.0.9.1)
       multi_json (>= 1.0.3)
       omniauth-oauth2 (~> 1.0)
-    paperclip (4.3.2)
+    paperclip (4.3.5)
       activemodel (>= 3.2.0)
       activesupport (>= 3.2.0)
       cocaine (~> 0.5.5)
       mime-types
       mimemagic (= 0.3.0)
-    parser (2.2.3.0)
-      ast (>= 1.1, < 3.0)
+    parser (2.3.0.6)
+      ast (~> 2.2)
     pg (0.18.4)
-    poltergeist (1.8.1)
+    poltergeist (1.9.0)
       capybara (~> 2.1)
       cliver (~> 0.3.1)
       multi_json (~> 1.0)
       websocket-driver (>= 0.2.0)
     powerpack (0.1.1)
-    progress (3.1.0)
-    psych (2.0.15)
+    progress (3.1.1)
+    psych (2.0.17)
     r2 (0.2.6)
     rack (1.6.4)
     rack-cors (0.4.0)
@@ -215,16 +207,16 @@ GEM
     rack-test (0.6.3)
       rack (>= 1.0)
     rack-uri_sanitizer (0.0.2)
-    rails (4.2.5)
-      actionmailer (= 4.2.5)
-      actionpack (= 4.2.5)
-      actionview (= 4.2.5)
-      activejob (= 4.2.5)
-      activemodel (= 4.2.5)
-      activerecord (= 4.2.5)
-      activesupport (= 4.2.5)
+    rails (4.2.6)
+      actionmailer (= 4.2.6)
+      actionpack (= 4.2.6)
+      actionview (= 4.2.6)
+      activejob (= 4.2.6)
+      activemodel (= 4.2.6)
+      activerecord (= 4.2.6)
+      activesupport (= 4.2.6)
       bundler (>= 1.3.0, < 2.0)
-      railties (= 4.2.5)
+      railties (= 4.2.6)
       sprockets-rails
     rails-deprecated_sanitizer (1.0.3)
       activesupport (>= 4.2.0.alpha)
@@ -232,59 +224,54 @@ GEM
       activesupport (>= 4.2.0.beta, < 5.0)
       nokogiri (~> 1.6.0)
       rails-deprecated_sanitizer (>= 1.0.1)
-    rails-html-sanitizer (1.0.2)
+    rails-html-sanitizer (1.0.3)
       loofah (~> 2.0)
-    rails-i18n (4.0.7)
+    rails-i18n (4.0.8)
       i18n (~> 0.7)
       railties (~> 4.0)
-    railties (4.2.5)
-      actionpack (= 4.2.5)
-      activesupport (= 4.2.5)
+    railties (4.2.6)
+      actionpack (= 4.2.6)
+      activesupport (= 4.2.6)
       rake (>= 0.8.7)
       thor (>= 0.18.1, < 2.0)
-    rainbow (2.0.0)
-    rake (10.4.2)
-    redcarpet (3.3.3)
+    rainbow (2.1.0)
+    rake (10.5.0)
+    redcarpet (3.3.4)
     ref (2.0.0)
-    request_store (1.2.1)
-    rest-client (1.8.0)
-      http-cookie (>= 1.0.2, < 2.0)
-      mime-types (>= 1.16, < 3.0)
-      netrc (~> 0.7)
+    request_store (1.3.0)
     rinku (1.7.3)
-    rubocop (0.35.1)
-      astrolabe (~> 1.3)
-      parser (>= 2.2.3.0, < 3.0)
+    rubocop (0.37.2)
+      parser (>= 2.3.0.4, < 3.0)
       powerpack (~> 0.1)
       rainbow (>= 1.99.1, < 3.0)
       ruby-progressbar (~> 1.7)
-      tins (<= 1.6.0)
+      unicode-display_width (~> 0.3)
     ruby-openid (2.7.0)
     ruby-progressbar (1.7.5)
-    sanitize (4.0.0)
+    sanitize (4.0.1)
       crass (~> 1.0.2)
       nokogiri (>= 1.4.4)
-      nokogumbo (= 1.4.1)
-    sass (3.4.19)
+      nokogumbo (~> 1.4.1)
+    sass (3.4.21)
     sass-rails (5.0.4)
       railties (>= 4.0.0, < 5.0)
       sass (~> 3.1)
       sprockets (>= 2.8, < 4.0)
       sprockets-rails (>= 2.0, < 4.0)
       tilt (>= 1.1, < 3)
-    simplecov (0.11.1)
+    simplecov (0.11.2)
       docile (~> 1.1.0)
       json (~> 1.8)
       simplecov-html (~> 0.10.0)
     simplecov-html (0.10.0)
     soap4r-ruby1.9 (2.0.5)
-    sprockets (3.5.1)
+    sprockets (3.5.2)
       concurrent-ruby (~> 1.0)
       rack (> 1, < 3)
-    sprockets-rails (2.3.3)
-      actionpack (>= 3.0)
-      activesupport (>= 3.0)
-      sprockets (>= 2.8, < 4.0)
+    sprockets-rails (3.0.4)
+      actionpack (>= 4.0)
+      activesupport (>= 4.0)
+      sprockets (>= 3.0.0)
     term-ansicolor (1.3.2)
       tins (~> 1.0)
     therubyracer (0.12.2)
@@ -292,7 +279,7 @@ GEM
       ref
     thor (0.19.1)
     thread_safe (0.3.5)
-    tilt (2.0.1)
+    tilt (2.0.2)
     timecop (0.8.0)
     tins (1.6.0)
     tzinfo (1.2.2)
@@ -300,9 +287,7 @@ GEM
     uglifier (2.7.2)
       execjs (>= 0.3.0)
       json (>= 1.8.0)
-    unf (0.1.4)
-      unf_ext
-    unf_ext (0.0.7.1)
+    unicode-display_width (0.3.1)
     validates_email_format_of (1.6.3)
       i18n
     vendorer (0.1.16)
@@ -354,7 +339,7 @@ DEPENDENCIES
   r2
   rack-cors
   rack-uri_sanitizer
-  rails (= 4.2.5)
+  rails (= 4.2.6)
   rails-i18n (~> 4.0.0)
   redcarpet
   rinku (>= 1.2.2)
index 61dcbd7..0343629 100644 (file)
@@ -193,7 +193,7 @@ bundle exec rake db:migrate
 To ensure that everything is set up properly, you should now run:
 
 ```
-bundle exec rake test
+bundle exec rake test:db
 ```
 
 This test will take a few minutes, reporting tests run, assertions, and any errors. If you receive no errors, then your installation is successful.
index a9ec0a6..30ccee4 100644 (file)
@@ -49,9 +49,22 @@ folder 'vendor/assets' do
     from 'git://github.com/openstreetmap/iD', :branch => 'release' do
       folder 'iD/img', 'dist/img'
       folder 'iD/locales', 'dist/locales'
+      folder 'iD/traffico', 'dist/traffico'
+
       file 'iD.css.erb', 'dist/iD.css' do |path|
-        rewrite(path) { |content| content.gsub(/url\('?(img\/[^')]+)'?\)/, 'url(<%= asset_path("iD/\1") %>)') }
+        rewrite(path) do |content|
+          content.gsub(/url\('?(img\/[^')]+)'?\)/, 'url(<%= asset_path("iD/\1") %>)')
+        end
+      end
+
+      file 'iD/traffico/stylesheets/traffico.css.erb', 'dist/traffico/stylesheets/traffico.css' do |path|
+        rewrite(path) do |content|
+          content.gsub(/url\("?\.\.\/([^#?")]+)([^"]*)"?\)/, 'url(<%= asset_path("iD/traffico/\1") %>\2)')
+        end
       end
+
+      File.delete('vendor/assets/iD/iD/traffico/stylesheets/traffico.css')
+
       file 'iD.js', 'dist/iD.js'
       file 'presets.js', 'dist/presets.js'
       file 'imagery.js', 'dist/imagery.js'
index ca55944..a8fe29f 100644 (file)
@@ -1,7 +1,14 @@
 //= require leaflet
 //= require leaflet.osm
+//= require i18n/translations
 
 window.onload = function () {
+  if (navigator.languages) {
+    I18n.locale = navigator.languages[0];
+  } else if (navigator.language) {
+    I18n.locale = navigator.language;
+  }
+
   var query = (window.location.search || '?').substr(1),
       args  = {};
 
@@ -51,7 +58,7 @@ window.onload = function () {
 L.Control.OSMReportAProblem = L.Control.Attribution.extend({
   options: {
     position: 'bottomright',
-    prefix: '<a href="http://www.openstreetmap.org/fixthemap?lat={x}&lon={y}&zoom={z}">Report a problem</a>'
+    prefix: '<a href="http://www.openstreetmap.org/fixthemap?lat={x}&lon={y}&zoom={z}" target="_blank">'+I18n.t('javascripts.embed.report_problem')+'</a>'
   },
 
   onAdd: function (map) {
index 085b615..fdbeaba 100644 (file)
@@ -192,10 +192,8 @@ $(document).ready(function () {
     map.setView([params.lat, params.lon], params.zoom);
   }
 
-  var marker = L.marker([0, 0], {icon: OSM.getUserIcon()});
-
   if (params.marker) {
-    marker.setLatLng([params.mlat, params.mlon]).addTo(map);
+    L.marker([params.mlat, params.mlon]).addTo(map);
   }
 
   $("#homeanchor").on("click", function(e) {
@@ -205,7 +203,7 @@ $(document).ready(function () {
       center = L.latLng(data.lat, data.lon);
 
     map.setView(center, data.zoom);
-    marker.setLatLng(center).addTo(map);
+    L.marker(center, {icon: OSM.getUserIcon()}).addTo(map);
   });
 
   function remoteEditHandler(bbox, object) {
index 2d3455e..c35085b 100644 (file)
@@ -21,7 +21,7 @@ function GraphHopperEngine(id, vehicleType) {
       // GraphHopper Directions API documentation
       // https://github.com/graphhopper/directions-api/blob/master/docs-routing.md
       return $.ajax({
-        url: document.location.protocol + "//graphhopper.com/api/1/route",
+        url: document.location.protocol + OSM.GRAPHHOPPER_URL,
         data: {
           vehicle: vehicleType,
           locale: I18n.currentLocale(),
index f46d94d..0f645ce 100644 (file)
@@ -36,7 +36,7 @@ function MapQuestEngine(id, routeType) {
       var to = points[points.length - 1];
 
       return $.ajax({
-        url: document.location.protocol + "//open.mapquestapi.com/directions/v2/route",
+        url: document.location.protocol + OSM.MAPQUEST_DIRECTIONS_URL,
         data: {
           key: OSM.MAPQUEST_KEY,
           from: from.lat + "," + from.lng,
index 73643ba..348cb99 100644 (file)
@@ -39,7 +39,7 @@ function MapzenEngine(id, costing) {
 
     getRoute: function (points, callback) {
       return $.ajax({
-        url: document.location.protocol + "//valhalla.mapzen.com/route",
+        url: document.location.protocol + OSM.MAPZEN_VALHALLA_URL,
         data: {
           api_key: OSM.MAPZEN_VALHALLA_KEY,
           json: JSON.stringify({
index d9ce0a6..2ee9da1 100644 (file)
@@ -51,7 +51,7 @@ function OSRMEngine() {
       }
 
       return $.ajax({
-        url: document.location.protocol + "//router.project-osrm.org/viaroute",
+        url: document.location.protocol + OSM.OSRM_URL,
         data: params,
         dataType: "json",
         success: function (data) {
index 333fce5..86f24e0 100644 (file)
@@ -161,7 +161,7 @@ OSM.Query = function(map) {
     return geometry;
   }
 
-  function runQuery(latlng, radius, query, $section, compare) {
+  function runQuery(latlng, radius, query, $section, merge, compare) {
     var $ul = $section.find("ul");
 
     $ul.empty();
@@ -186,12 +186,27 @@ OSM.Query = function(map) {
 
         $section.find(".loader").stopTime("loading").hide();
 
-        if (compare) {
-          elements = results.elements.sort(compare);
+        if (merge) {
+          elements = results.elements.reduce(function (hash, element) {
+            var key = element.type + element.id;
+            if ("geometry" in element) {
+              delete element.bounds;
+            }
+            hash[key] = $.extend({}, hash[key], element);
+            return hash;
+          }, {});
+
+          elements = Object.keys(elements).map(function (key) {
+            return elements[key];
+          });
         } else {
           elements = results.elements;
         }
 
+        if (compare) {
+          elements = elements.sort(compare);
+        }
+
         for (var i = 0; i < elements.length; i++) {
           var element = elements[i];
 
@@ -268,7 +283,7 @@ OSM.Query = function(map) {
       ways = "way(" + around + ")",
       relations = "relation(" + around + ")",
       nearby = "(" + nodes + ";" + ways + ");out tags geom(" + bbox + ");" + relations + ";out geom(" + bbox + ");",
-      isin = "is_in(" + lat + "," + lng + ")->.a;way(pivot.a);out tags geom(" + bbox + ");relation(pivot.a);out tags bb;";
+      isin = "is_in(" + lat + "," + lng + ")->.a;way(pivot.a);out tags bb;out ids geom(" + bbox + ");relation(pivot.a);out tags bb;";
 
     $("#sidebar_content .query-intro")
       .hide();
@@ -287,8 +302,8 @@ OSM.Query = function(map) {
       }
     }, 10);
 
-    runQuery(latlng, radius, nearby, $("#query-nearby"));
-    runQuery(latlng, radius, isin, $("#query-isin"), compareSize);
+    runQuery(latlng, radius, nearby, $("#query-nearby"), false);
+    runQuery(latlng, radius, isin, $("#query-isin"), true, compareSize);
   }
 
   function clickHandler(e) {
index 6a8b856..138416b 100644 (file)
@@ -2,34 +2,38 @@
 
 OSM = {
 <% if defined?(PIWIK) %>
-  PIWIK:                 <%= PIWIK.to_json %>,
+  PIWIK:                   <%= PIWIK.to_json %>,
 <% end %>
 
-  MAX_REQUEST_AREA:      <%= MAX_REQUEST_AREA.to_json %>,
-  SERVER_URL:            <%= SERVER_URL.to_json %>,
-  API_VERSION:           <%= API_VERSION.to_json %>,
-  STATUS:                <%= STATUS.to_json %>,
-  MAX_NOTE_REQUEST_AREA: <%= MAX_NOTE_REQUEST_AREA.to_json %>,
-  OVERPASS_URL:          <%= OVERPASS_URL.to_json %>,
-  NOMINATIM_URL:         <%= NOMINATIM_URL.to_json %>,
+  MAX_REQUEST_AREA:        <%= MAX_REQUEST_AREA.to_json %>,
+  SERVER_URL:              <%= SERVER_URL.to_json %>,
+  API_VERSION:             <%= API_VERSION.to_json %>,
+  STATUS:                  <%= STATUS.to_json %>,
+  MAX_NOTE_REQUEST_AREA:   <%= MAX_NOTE_REQUEST_AREA.to_json %>,
+  OVERPASS_URL:            <%= OVERPASS_URL.to_json %>,
+  NOMINATIM_URL:           <%= NOMINATIM_URL.to_json %>,
+  GRAPHHOPPER_URL:         <%= GRAPHHOPPER_URL.to_json %>,
+  MAPQUEST_DIRECTIONS_URL: <%= MAPQUEST_DIRECTIONS_URL.to_json %>,
+  MAPZEN_VALHALLA_URL:     <%= MAPZEN_VALHALLA_URL.to_json %>,
+  OSRM_URL:                <%= OSRM_URL.to_json %>,
 
 <% if defined?(MAPQUEST_KEY) %>
-  MAPQUEST_KEY:          <%= MAPQUEST_KEY.to_json %>,
+  MAPQUEST_KEY:            <%= MAPQUEST_KEY.to_json %>,
 <% end %>
 <% if defined?(MAPZEN_VALHALLA_KEY) %>
-  MAPZEN_VALHALLA_KEY:   <%= MAPZEN_VALHALLA_KEY.to_json %>,
+  MAPZEN_VALHALLA_KEY:     <%= MAPZEN_VALHALLA_KEY.to_json %>,
 <% end %>
 
-  MARKER_GREEN:          <%= image_path("marker-green.png").to_json %>,
-  MARKER_RED:            <%= image_path("marker-red.png").to_json %>,
+  MARKER_GREEN:            <%= image_path("marker-green.png").to_json %>,
+  MARKER_RED:              <%= image_path("marker-red.png").to_json %>,
 
-  MARKER_ICON:           <%= image_path("images/marker-icon.png").to_json %>,
-  MARKER_ICON_2X:        <%= image_path("images/marker-icon-2x.png").to_json %>,
-  MARKER_SHADOW:         <%= image_path("images/marker-shadow.png").to_json %>,
+  MARKER_ICON:             <%= image_path("images/marker-icon.png").to_json %>,
+  MARKER_ICON_2X:          <%= image_path("images/marker-icon-2x.png").to_json %>,
+  MARKER_SHADOW:           <%= image_path("images/marker-shadow.png").to_json %>,
 
-  NEW_NOTE_MARKER:       <%= image_path("new_note_marker.png").to_json %>,
-  OPEN_NOTE_MARKER:      <%= image_path("open_note_marker.png").to_json %>,
-  CLOSED_NOTE_MARKER:    <%= image_path("closed_note_marker.png").to_json %>,
+  NEW_NOTE_MARKER:         <%= image_path("new_note_marker.png").to_json %>,
+  OPEN_NOTE_MARKER:        <%= image_path("open_note_marker.png").to_json %>,
+  CLOSED_NOTE_MARKER:      <%= image_path("closed_note_marker.png").to_json %>,
 
   apiUrl: function (object) {
     var url = "/api/" + OSM.API_VERSION + "/" + object.type + "/" + object.id;
index 83ae356..cf68765 100644 (file)
@@ -1335,6 +1335,11 @@ tr.turn:hover {
 .user-terms {
   .content-body .content-inner {
     padding: 0;
+
+    .message {
+      margin-top: 80px;
+      padding: 20px;
+    }
   }
 }
 
index f6ae7f2..9cd6857 100644 (file)
@@ -151,7 +151,7 @@ class AmfController < ApplicationController
         cs = Changeset.find(closeid.to_i)
         cs.set_closed_time_now
         if cs.user_id != user.id
-          fail OSM::APIUserChangesetMismatchError.new
+          raise OSM::APIUserChangesetMismatchError.new
         elsif closecomment.empty?
           cs.save!
         else
@@ -189,12 +189,14 @@ class AmfController < ApplicationController
   def getpresets(usertoken, lang) #:doc:
     user = getuser(usertoken)
 
-    if user && !user.languages.empty?
-      http_accept_language.user_preferred_languages = user.languages
-    end
+    langs = if user && !user.languages.empty?
+              Locale.list(user.languages)
+            else
+              Locale.list(http_accept_language.user_preferred_languages)
+            end
 
-    lang = http_accept_language.compatible_language_from(getlocales)
-    (real_lang, localised) = getlocalized(lang)
+    lang = getlocales.preferred(langs)
+    (real_lang, localised) = getlocalized(lang.to_s)
 
     # Tell Potlatch what language it's using
     localised["__potlatch_locale"] = real_lang
@@ -469,11 +471,11 @@ class AmfController < ApplicationController
       return -1, t("application.setup_user_auth.blocked") if user.blocks.active.exists?
 
       query = Trace.visible_to(user)
-      if searchterm.to_i > 0
-        query = query.where(:id => searchterm.to_i)
-      else
-        query = query.where("MATCH(name) AGAINST (?)", searchterm).limit(21)
-      end
+      query = if searchterm.to_i > 0
+                query.where(:id => searchterm.to_i)
+              else
+                query.where("MATCH(name) AGAINST (?)", searchterm).limit(21)
+              end
       gpxs = query.collect do |gpx|
         [gpx.id, gpx.name, gpx.description]
       end
@@ -675,7 +677,7 @@ class AmfController < ApplicationController
 
         # -- Save revised way
 
-        pointlist.collect! do|a|
+        pointlist.collect! do |a|
           renumberednodes[a] ? renumberednodes[a] : a
         end # renumber nodes
         new_way = Way.new
@@ -866,15 +868,14 @@ class AmfController < ApplicationController
 
   def getuser(token) #:doc:
     if token =~ /^(.+)\:(.+)$/
-      user = User.authenticate(:username => $1, :password => $2)
+      User.authenticate(:username => $1, :password => $2)
     else
-      user = User.authenticate(:token => token)
+      User.authenticate(:token => token)
     end
-    user
   end
 
   def getlocales
-    Dir.glob("#{Rails.root}/config/potlatch/locales/*").collect { |f| File.basename(f, ".yml") }
+    @locales ||= Locale.list(Dir.glob("#{Rails.root}/config/potlatch/locales/*").collect { |f| File.basename(f, ".yml") })
   end
 
   ##
index 379bb7e..25e1e3b 100644 (file)
@@ -136,12 +136,14 @@ class ApiController < ApplicationController
     doc = OSM::API.new.get_xml_doc
 
     # add bounds
-    doc.root << bbox.add_bounds_to(XML::Node.new "bounds")
+    doc.root << bbox.add_bounds_to(XML::Node.new("bounds"))
 
     # get ways
     # find which ways are needed
     ways = []
-    if node_ids.length > 0
+    if node_ids.empty?
+      list_of_way_nodes = []
+    else
       way_nodes = WayNode.where(:node_id => node_ids)
       way_ids = way_nodes.collect { |way_node| way_node.id[0] }
       ways = Way.preload(:way_nodes, :way_tags).find(way_ids)
@@ -150,15 +152,12 @@ class ApiController < ApplicationController
         way.way_nodes.collect(&:node_id)
       end
       list_of_way_nodes.flatten!
-
-    else
-      list_of_way_nodes = []
     end
 
     # - [0] in case some thing links to node 0 which doesn't exist. Shouldn't actually ever happen but it does. FIXME: file a ticket for this
     nodes_to_fetch = (list_of_way_nodes.uniq - node_ids) - [0]
 
-    if nodes_to_fetch.length > 0
+    unless nodes_to_fetch.empty?
       nodes += Node.includes(:node_tags).find(nodes_to_fetch)
     end
 
@@ -258,8 +257,8 @@ class ApiController < ApplicationController
 
     api = XML::Node.new "api"
     version = XML::Node.new "version"
-    version["minimum"] = "#{API_VERSION}"
-    version["maximum"] = "#{API_VERSION}"
+    version["minimum"] = API_VERSION.to_s
+    version["maximum"] = API_VERSION.to_s
     api << version
     area = XML::Node.new "area"
     area["maximum"] = MAX_REQUEST_AREA.to_s
index 2ee701e..f3b77f8 100644 (file)
@@ -140,13 +140,13 @@ class ApplicationController < ActionController::Base
     unless Authenticator.new(self, [:token]).allow?
       username, passwd = get_auth_data # parse from headers
       # authenticate per-scheme
-      if username.nil?
-        @user = nil # no authentication provided - perhaps first connect (client should retry after 401)
-      elsif username == "token"
-        @user = User.authenticate(:token => passwd) # preferred - random token for user from db, passed in basic auth
-      else
-        @user = User.authenticate(:username => username, :password => passwd) # basic auth
-      end
+      @user = if username.nil?
+                nil # no authentication provided - perhaps first connect (client should retry after 401)
+              elsif username == "token"
+                User.authenticate(:token => passwd) # preferred - random token for user from db, passed in basic auth
+              else
+                User.authenticate(:username => username, :password => passwd) # basic auth
+              end
     end
 
     # have we identified the user?
@@ -276,7 +276,7 @@ class ApplicationController < ActionController::Base
     response.headers["Error"] = message
 
     if request.headers["X-Error-Format"] &&
-       request.headers["X-Error-Format"].downcase == "xml"
+       request.headers["X-Error-Format"].casecmp("xml").zero?
       result = OSM::API.new.get_xml_doc
       result.root.name = "osmError"
       result.root << (XML::Node.new("status") << "#{Rack::Utils.status_code(status)} #{Rack::Utils::HTTP_STATUS_CODES[status]}")
@@ -288,47 +288,30 @@ class ApplicationController < ActionController::Base
     end
   end
 
-  def set_locale
-    response.header["Vary"] = "Accept-Language"
-
-    if @user && !@user.languages.empty?
-      http_accept_language.user_preferred_languages = @user.languages
-      response.header["Vary"] = "*"
-    end
+  def preferred_languages
+    @languages ||= if params[:locale]
+                     Locale.list(params[:locale])
+                   elsif @user
+                     @user.preferred_languages
+                   else
+                     Locale.list(http_accept_language.user_preferred_languages)
+                   end
+  end
 
-    I18n.locale = select_locale
+  helper_method :preferred_languages
 
+  def set_locale
     if @user && @user.languages.empty? && !http_accept_language.user_preferred_languages.empty?
       @user.languages = http_accept_language.user_preferred_languages
       @user.save
     end
 
-    response.headers["Content-Language"] = I18n.locale.to_s
-  end
-
-  def select_locale(locales = I18n.available_locales)
-    if params[:locale]
-      http_accept_language.user_preferred_languages = [params[:locale]]
-    end
-
-    if http_accept_language.compatible_language_from(locales).nil?
-      http_accept_language.user_preferred_languages = http_accept_language.user_preferred_languages.collect do |pl|
-        pls = [pl]
-
-        while pl.match(/^(.*)-[^-]+$/)
-          pls.push($1) if locales.include?($1) || locales.include?($1.to_sym)
-          pl = $1
-        end
+    I18n.locale = Locale.available.preferred(preferred_languages)
 
-        pls
-      end.flatten
-    end
-
-    http_accept_language.compatible_language_from(locales) || I18n.default_locale
+    response.headers["Vary"] = "Accept-Language"
+    response.headers["Content-Language"] = I18n.locale.to_s
   end
 
-  helper_method :select_locale
-
   def api_call_handle_error
     yield
   rescue ActiveRecord::RecordNotFound => ex
@@ -354,7 +337,7 @@ class ApplicationController < ActionController::Base
   # or raises a suitable error. +method+ should be a symbol, e.g: :put or :get.
   def assert_method(method)
     ok = request.send((method.to_s.downcase + "?").to_sym)
-    fail OSM::APIBadMethodError.new(method) unless ok
+    raise OSM::APIBadMethodError.new(method) unless ok
   end
 
   ##
index 0ac45b9..7d2f80e 100644 (file)
@@ -58,11 +58,11 @@ class BrowseController < ApplicationController
   def changeset
     @type = "changeset"
     @changeset = Changeset.find(params[:id])
-    if @user && @user.moderator?
-      @comments = @changeset.comments.unscope(:where => :visible).includes(:author)
-    else
-      @comments = @changeset.comments.includes(:author)
-    end
+    @comments = if @user && @user.moderator?
+                  @changeset.comments.unscope(:where => :visible).includes(:author)
+                else
+                  @changeset.comments.includes(:author)
+                end
     @node_pages, @nodes = paginate(:old_nodes, :conditions => { :changeset_id => @changeset.id }, :per_page => 20, :parameter => "node_page")
     @way_pages, @ways = paginate(:old_ways, :conditions => { :changeset_id => @changeset.id }, :per_page => 20, :parameter => "way_page")
     @relation_pages, @relations = paginate(:old_relations, :conditions => { :changeset_id => @changeset.id }, :per_page => 20, :parameter => "relation_page")
index 733c209..89ba5d1 100644 (file)
@@ -186,16 +186,14 @@ class ChangesetController < ApplicationController
           # first version, so it must be newly-created.
           created = XML::Node.new "create"
           created << elt.to_xml_node(changeset_cache, user_display_name_cache)
+        elsif elt.visible
+          # must be a modify
+          modified = XML::Node.new "modify"
+          modified << elt.to_xml_node(changeset_cache, user_display_name_cache)
         else
-          if elt.visible
-            # must be a modify
-            modified = XML::Node.new "modify"
-            modified << elt.to_xml_node(changeset_cache, user_display_name_cache)
-          else
-            # if the element isn't visible then it must have been deleted
-            deleted = XML::Node.new "delete"
-            deleted << elt.to_xml_node(changeset_cache, user_display_name_cache)
-          end
+          # if the element isn't visible then it must have been deleted
+          deleted = XML::Node.new "delete"
+          deleted << elt.to_xml_node(changeset_cache, user_display_name_cache)
         end
     end
 
@@ -277,11 +275,11 @@ class ChangesetController < ApplicationController
       changesets = conditions_nonempty(Changeset.all)
 
       if params[:display_name]
-        if user.data_public? || user == @user
-          changesets = changesets.where(:user_id => user.id)
-        else
-          changesets = changesets.where("false")
-        end
+        changesets = if user.data_public? || user == @user
+                       changesets.where(:user_id => user.id)
+                     else
+                       changesets.where("false")
+                     end
       elsif params[:bbox]
         changesets = conditions_bbox(changesets, BoundingBox.from_bbox_params(params))
       elsif params[:friends] && @user
@@ -310,8 +308,8 @@ class ChangesetController < ApplicationController
   # Add a comment to a changeset
   def comment
     # Check the arguments are sane
-    fail OSM::APIBadUserInput.new("No id was given") unless params[:id]
-    fail OSM::APIBadUserInput.new("No text was given") if params[:text].blank?
+    raise OSM::APIBadUserInput.new("No id was given") unless params[:id]
+    raise OSM::APIBadUserInput.new("No text was given") if params[:text].blank?
 
     # Extract the arguments
     id = params[:id].to_i
@@ -319,7 +317,7 @@ class ChangesetController < ApplicationController
 
     # Find the changeset and check it is valid
     changeset = Changeset.find(id)
-    fail OSM::APIChangesetNotYetClosedError.new(changeset) if changeset.is_open?
+    raise OSM::APIChangesetNotYetClosedError.new(changeset) if changeset.is_open?
 
     # Add a comment to the changeset
     comment = changeset.comments.create(:changeset => changeset,
@@ -344,15 +342,15 @@ class ChangesetController < ApplicationController
   # Adds a subscriber to the changeset
   def subscribe
     # Check the arguments are sane
-    fail OSM::APIBadUserInput.new("No id was given") unless params[:id]
+    raise OSM::APIBadUserInput.new("No id was given") unless params[:id]
 
     # Extract the arguments
     id = params[:id].to_i
 
     # Find the changeset and check it is valid
     changeset = Changeset.find(id)
-    fail OSM::APIChangesetNotYetClosedError.new(changeset) if changeset.is_open?
-    fail OSM::APIChangesetAlreadySubscribedError.new(changeset) if changeset.subscribers.exists?(@user.id)
+    raise OSM::APIChangesetNotYetClosedError.new(changeset) if changeset.is_open?
+    raise OSM::APIChangesetAlreadySubscribedError.new(changeset) if changeset.subscribers.exists?(@user.id)
 
     # Add the subscriber
     changeset.subscribers << @user
@@ -365,15 +363,15 @@ class ChangesetController < ApplicationController
   # Removes a subscriber from the changeset
   def unsubscribe
     # Check the arguments are sane
-    fail OSM::APIBadUserInput.new("No id was given") unless params[:id]
+    raise OSM::APIBadUserInput.new("No id was given") unless params[:id]
 
     # Extract the arguments
     id = params[:id].to_i
 
     # Find the changeset and check it is valid
     changeset = Changeset.find(id)
-    fail OSM::APIChangesetNotYetClosedError.new(changeset) if changeset.is_open?
-    fail OSM::APIChangesetNotSubscribedError.new(changeset) unless changeset.subscribers.exists?(@user.id)
+    raise OSM::APIChangesetNotYetClosedError.new(changeset) if changeset.is_open?
+    raise OSM::APIChangesetNotSubscribedError.new(changeset) unless changeset.subscribers.exists?(@user.id)
 
     # Remove the subscriber
     changeset.subscribers.delete(@user)
@@ -386,7 +384,7 @@ class ChangesetController < ApplicationController
   # Sets visible flag on comment to false
   def hide_comment
     # Check the arguments are sane
-    fail OSM::APIBadUserInput.new("No id was given") unless params[:id]
+    raise OSM::APIBadUserInput.new("No id was given") unless params[:id]
 
     # Extract the arguments
     id = params[:id].to_i
@@ -405,7 +403,7 @@ class ChangesetController < ApplicationController
   # Sets visible flag on comment to true
   def unhide_comment
     # Check the arguments are sane
-    fail OSM::APIBadUserInput.new("No id was given") unless params[:id]
+    raise OSM::APIBadUserInput.new("No id was given") unless params[:id]
 
     # Extract the arguments
     id = params[:id].to_i
@@ -459,11 +457,12 @@ class ChangesetController < ApplicationController
     if bbox
       bbox.check_boundaries
       bbox = bbox.to_scaled
-      return changesets.where("min_lon < ? and max_lon > ? and min_lat < ? and max_lat > ?",
-                              bbox.max_lon.to_i, bbox.min_lon.to_i,
-                              bbox.max_lat.to_i, bbox.min_lat.to_i)
+
+      changesets.where("min_lon < ? and max_lon > ? and min_lat < ? and max_lat > ?",
+                       bbox.max_lon.to_i, bbox.min_lon.to_i,
+                       bbox.max_lat.to_i, bbox.min_lat.to_i)
     else
-      return changesets
+      changesets
     end
   end
 
@@ -471,22 +470,22 @@ class ChangesetController < ApplicationController
   # restrict changesets to those by a particular user
   def conditions_user(changesets, user, name)
     if user.nil? && name.nil?
-      return changesets
+      changesets
     else
       # shouldn't provide both name and UID
-      fail OSM::APIBadUserInput.new("provide either the user ID or display name, but not both") if user && name
+      raise OSM::APIBadUserInput.new("provide either the user ID or display name, but not both") if user && name
 
       # use either the name or the UID to find the user which we're selecting on.
       u = if name.nil?
             # user input checking, we don't have any UIDs < 1
-            fail OSM::APIBadUserInput.new("invalid user ID") if user.to_i < 1
+            raise OSM::APIBadUserInput.new("invalid user ID") if user.to_i < 1
             u = User.find(user.to_i)
           else
             u = User.find_by_display_name(name)
           end
 
       # make sure we found a user
-      fail OSM::APINotFoundError.new if u.nil?
+      raise OSM::APINotFoundError.new if u.nil?
 
       # should be able to get changesets of public users only, or
       # our own changesets regardless of public-ness.
@@ -495,9 +494,10 @@ class ChangesetController < ApplicationController
         # changesets if they're non-public
         setup_user_auth
 
-        fail OSM::APINotFoundError if @user.nil? || @user.id != u.id
+        raise OSM::APINotFoundError if @user.nil? || @user.id != u.id
       end
-      return changesets.where(:user_id => u.id)
+
+      changesets.where(:user_id => u.id)
     end
   end
 
@@ -506,20 +506,19 @@ class ChangesetController < ApplicationController
   def conditions_time(changesets, time)
     if time.nil?
       return changesets
-    else
+    elsif time.count(",") == 1
       # if there is a range, i.e: comma separated, then the first is
       # low, second is high - same as with bounding boxes.
-      if time.count(",") == 1
-        # check that we actually have 2 elements in the array
-        times = time.split(/,/)
-        fail OSM::APIBadUserInput.new("bad time range") if times.size != 2
 
-        from, to = times.collect { |t| DateTime.parse(t) }
-        return changesets.where("closed_at >= ? and created_at <= ?", from, to)
-      else
-        # if there is no comma, assume its a lower limit on time
-        return changesets.where("closed_at >= ?", DateTime.parse(time))
-      end
+      # check that we actually have 2 elements in the array
+      times = time.split(/,/)
+      raise OSM::APIBadUserInput.new("bad time range") if times.size != 2
+
+      from, to = times.collect { |t| DateTime.parse(t) }
+      return changesets.where("closed_at >= ? and created_at <= ?", from, to)
+    else
+      # if there is no comma, assume its a lower limit on time
+      return changesets.where("closed_at >= ?", DateTime.parse(time))
     end
     # stupid DateTime seems to throw both of these for bad parsing, so
     # we have to catch both and ensure the correct code path is taken.
@@ -562,7 +561,7 @@ class ChangesetController < ApplicationController
     if ids.nil?
       return changesets
     elsif ids.empty?
-      fail OSM::APIBadUserInput.new("No changesets were given to search for")
+      raise OSM::APIBadUserInput.new("No changesets were given to search for")
     else
       ids = ids.split(",").collect(&:to_i)
       return changesets.where(:id => ids)
@@ -583,7 +582,7 @@ class ChangesetController < ApplicationController
       if params[:limit].to_i > 0 && params[:limit].to_i <= 10000
         params[:limit].to_i
       else
-        fail OSM::APIBadUserInput.new("Comments limit must be between 1 and 10000")
+        raise OSM::APIBadUserInput.new("Comments limit must be between 1 and 10000")
       end
     else
       100
index b6fb455..8afa80d 100644 (file)
@@ -19,13 +19,13 @@ class GeocoderController < ApplicationController
       @sources.push "osm_nominatim_reverse"
       @sources.push "geonames_reverse" if defined?(GEONAMES_USERNAME)
     elsif params[:query]
-      if params[:query].match(/^\d{5}(-\d{4})?$/)
+      if params[:query] =~ /^\d{5}(-\d{4})?$/
         @sources.push "us_postcode"
         @sources.push "osm_nominatim"
-      elsif params[:query].match(/^(GIR 0AA|[A-PR-UWYZ]([0-9]{1,2}|([A-HK-Y][0-9]|[A-HK-Y][0-9]([0-9]|[ABEHMNPRV-Y]))|[0-9][A-HJKS-UW])\s*[0-9][ABD-HJLNP-UW-Z]{2})$/i)
+      elsif params[:query] =~ /^(GIR 0AA|[A-PR-UWYZ]([0-9]{1,2}|([A-HK-Y][0-9]|[A-HK-Y][0-9]([0-9]|[ABEHMNPRV-Y]))|[0-9][A-HJKS-UW])\s*[0-9][ABD-HJLNP-UW-Z]{2})$/i
         @sources.push "uk_postcode"
         @sources.push "osm_nominatim"
-      elsif params[:query].match(/^[A-Z]\d[A-Z]\s*\d[A-Z]\d$/i)
+      elsif params[:query] =~ /^[A-Z]\d[A-Z]\s*\d[A-Z]\d$/i
         @sources.push "ca_postcode"
         @sources.push "osm_nominatim"
       else
@@ -70,7 +70,7 @@ class GeocoderController < ApplicationController
     response = fetch_text("http://rpc.geocoder.us/service/csv?zip=#{escape_query(query)}")
 
     # parse the response
-    unless response.match(/couldn't find this zip/)
+    unless response =~ /couldn't find this zip/
       data = response.split(/\s*,\s+/) # lat,long,town,state,zip
       @results.push(:lat => data[0], :lon => data[1],
                     :zoom => POSTCODE_ZOOM,
@@ -95,7 +95,7 @@ class GeocoderController < ApplicationController
     response = fetch_text("http://www.npemap.org.uk/cgi/geocoder.fcgi?format=text&postcode=#{escape_query(query)}")
 
     # parse the response
-    unless response.match(/Error/)
+    unless response =~ /Error/
       dataline = response.split(/\n/)[1]
       data = dataline.split(/,/) # easting,northing,postcode,lat,long
       postcode = data[2].delete("'")
@@ -171,11 +171,11 @@ class GeocoderController < ApplicationController
       type = place.attributes["type"].to_s
       name = place.attributes["display_name"].to_s
       min_lat, max_lat, min_lon, max_lon = place.attributes["boundingbox"].to_s.split(",")
-      if type.empty?
-        prefix_name = ""
-      else
-        prefix_name = t "geocoder.search_osm_nominatim.prefix.#{klass}.#{type}", :default => type.tr("_", " ").capitalize
-      end
+      prefix_name = if type.empty?
+                      ""
+                    else
+                      t "geocoder.search_osm_nominatim.prefix.#{klass}.#{type}", :default => type.tr("_", " ").capitalize
+                    end
       if klass == "boundary" && type == "administrative"
         rank = (place.attributes["place_rank"].to_i + 1) / 2
         prefix_name = t "geocoder.search_osm_nominatim.admin_levels.level#{rank}", :default => prefix_name
@@ -298,7 +298,7 @@ class GeocoderController < ApplicationController
     if response.success?
       response.body
     else
-      fail response.status.to_s
+      raise response.status.to_s
     end
   end
 
@@ -339,11 +339,11 @@ class GeocoderController < ApplicationController
   def nsew_to_decdeg(captures)
     begin
       Float(captures[0])
-      captures[2].downcase != "s" ? lat = captures[0].to_f : lat = -(captures[0].to_f)
-      captures[5].downcase != "w" ? lon = captures[3].to_f : lon = -(captures[3].to_f)
+      lat = !captures[2].casecmp("s").zero? ? captures[0].to_f : -captures[0].to_f
+      lon = !captures[5].casecmp("w").zero? ? captures[3].to_f : -captures[3].to_f
     rescue
-      captures[0].downcase != "s" ? lat = captures[1].to_f : lat = -(captures[1].to_f)
-      captures[3].downcase != "w" ? lon = captures[4].to_f : lon = -(captures[4].to_f)
+      lat = !captures[0].casecmp("s").zero? ? captures[1].to_f : -captures[1].to_f
+      lon = !captures[3].casecmp("w").zero? ? captures[4].to_f : -captures[4].to_f
     end
     { :lat => lat, :lon => lon }
   end
@@ -351,11 +351,11 @@ class GeocoderController < ApplicationController
   def ddm_to_decdeg(captures)
     begin
       Float(captures[0])
-      captures[3].downcase != "s" ? lat = captures[0].to_f + captures[1].to_f / 60 : lat = -(captures[0].to_f + captures[1].to_f / 60)
-      captures[7].downcase != "w" ? lon = captures[4].to_f + captures[5].to_f / 60 : lon = -(captures[4].to_f + captures[5].to_f / 60)
+      lat = !captures[3].casecmp("s").zero? ? captures[0].to_f + captures[1].to_f / 60 : -(captures[0].to_f + captures[1].to_f / 60)
+      lon = !captures[7].casecmp("w").zero? ? captures[4].to_f + captures[5].to_f / 60 : -(captures[4].to_f + captures[5].to_f / 60)
     rescue
-      captures[0].downcase != "s" ? lat = captures[1].to_f + captures[2].to_f / 60 : lat = -(captures[1].to_f + captures[2].to_f / 60)
-      captures[4].downcase != "w" ? lon = captures[5].to_f + captures[6].to_f / 60 : lon = -(captures[5].to_f + captures[6].to_f / 60)
+      lat = !captures[0].casecmp("s").zero? ? captures[1].to_f + captures[2].to_f / 60 : -(captures[1].to_f + captures[2].to_f / 60)
+      lon = !captures[4].casecmp("w").zero? ? captures[5].to_f + captures[6].to_f / 60 : -(captures[5].to_f + captures[6].to_f / 60)
     end
     { :lat => lat, :lon => lon }
   end
@@ -363,11 +363,11 @@ class GeocoderController < ApplicationController
   def dms_to_decdeg(captures)
     begin
       Float(captures[0])
-      captures[4].downcase != "s" ? lat = captures[0].to_f + (captures[1].to_f + captures[2].to_f / 60) / 60 : lat = -(captures[0].to_f + (captures[1].to_f + captures[2].to_f / 60) / 60)
-      captures[9].downcase != "w" ? lon = captures[5].to_f + (captures[6].to_f + captures[7].to_f / 60) / 60 : lon = -(captures[5].to_f + (captures[6].to_f + captures[7].to_f / 60) / 60)
+      lat = !captures[4].casecmp("s").zero? ? captures[0].to_f + (captures[1].to_f + captures[2].to_f / 60) / 60 : -(captures[0].to_f + (captures[1].to_f + captures[2].to_f / 60) / 60)
+      lon = !captures[9].casecmp("w").zero? ? captures[5].to_f + (captures[6].to_f + captures[7].to_f / 60) / 60 : -(captures[5].to_f + (captures[6].to_f + captures[7].to_f / 60) / 60)
     rescue
-      captures[0].downcase != "s" ? lat = captures[1].to_f + (captures[2].to_f + captures[3].to_f / 60) / 60 : lat = -(captures[1].to_f + (captures[2].to_f + captures[3].to_f / 60) / 60)
-      captures[5].downcase != "w" ? lon = captures[6].to_f + (captures[7].to_f + captures[8].to_f / 60) / 60 : lon = -(captures[6].to_f + (captures[7].to_f + captures[8].to_f / 60) / 60)
+      lat = !captures[0].casecmp("s").zero? ? captures[1].to_f + (captures[2].to_f + captures[3].to_f / 60) / 60 : -(captures[1].to_f + (captures[2].to_f + captures[3].to_f / 60) / 60)
+      lon = !captures[5].casecmp("w").zero? ? captures[6].to_f + (captures[7].to_f + captures[8].to_f / 60) / 60 : -(captures[6].to_f + (captures[7].to_f + captures[8].to_f / 60) / 60)
     end
     { :lat => lat, :lon => lon }
   end
index a077916..8d29fd0 100644 (file)
@@ -41,7 +41,7 @@ class NodeController < ApplicationController
     new_node = Node.from_xml(request.raw_post)
 
     unless new_node && new_node.id == node.id
-      fail OSM::APIBadUserInput.new("The id in the url (#{node.id}) is not the same as provided in the xml (#{new_node.id})")
+      raise OSM::APIBadUserInput.new("The id in the url (#{node.id}) is not the same as provided in the xml (#{new_node.id})")
     end
 
     node.update_from(new_node, @user)
@@ -56,7 +56,7 @@ class NodeController < ApplicationController
     new_node = Node.from_xml(request.raw_post)
 
     unless new_node && new_node.id == node.id
-      fail OSM::APIBadUserInput.new("The id in the url (#{node.id}) is not the same as provided in the xml (#{new_node.id})")
+      raise OSM::APIBadUserInput.new("The id in the url (#{node.id}) is not the same as provided in the xml (#{new_node.id})")
     end
     node.delete_with_history!(new_node, @user)
     render :text => node.version.to_s, :content_type => "text/plain"
@@ -65,13 +65,13 @@ class NodeController < ApplicationController
   # Dump the details on many nodes whose ids are given in the "nodes" parameter.
   def nodes
     unless params["nodes"]
-      fail OSM::APIBadUserInput.new("The parameter nodes is required, and must be of the form nodes=id[,id[,id...]]")
+      raise OSM::APIBadUserInput.new("The parameter nodes is required, and must be of the form nodes=id[,id[,id...]]")
     end
 
     ids = params["nodes"].split(",").collect(&:to_i)
 
-    if ids.length == 0
-      fail OSM::APIBadUserInput.new("No nodes were given to search for")
+    if ids.empty?
+      raise OSM::APIBadUserInput.new("No nodes were given to search for")
     end
     doc = OSM::API.new.get_xml_doc
 
index e73b2ba..51ef449 100644 (file)
@@ -19,10 +19,10 @@ class NotesController < ApplicationController
     if params[:bbox]
       bbox = BoundingBox.from_bbox_params(params)
     else
-      fail OSM::APIBadUserInput.new("No l was given") unless params[:l]
-      fail OSM::APIBadUserInput.new("No r was given") unless params[:r]
-      fail OSM::APIBadUserInput.new("No b was given") unless params[:b]
-      fail OSM::APIBadUserInput.new("No t was given") unless params[:t]
+      raise OSM::APIBadUserInput.new("No l was given") unless params[:l]
+      raise OSM::APIBadUserInput.new("No r was given") unless params[:r]
+      raise OSM::APIBadUserInput.new("No b was given") unless params[:b]
+      raise OSM::APIBadUserInput.new("No t was given") unless params[:t]
 
       bbox = BoundingBox.from_lrbt_params(params)
     end
@@ -52,12 +52,12 @@ class NotesController < ApplicationController
   # Create a new note
   def create
     # Check the ACLs
-    fail OSM::APIAccessDenied if Acl.no_note_comment(request.remote_ip)
+    raise OSM::APIAccessDenied if Acl.no_note_comment(request.remote_ip)
 
     # Check the arguments are sane
-    fail OSM::APIBadUserInput.new("No lat was given") unless params[:lat]
-    fail OSM::APIBadUserInput.new("No lon was given") unless params[:lon]
-    fail OSM::APIBadUserInput.new("No text was given") if params[:text].blank?
+    raise OSM::APIBadUserInput.new("No lat was given") unless params[:lat]
+    raise OSM::APIBadUserInput.new("No lon was given") unless params[:lon]
+    raise OSM::APIBadUserInput.new("No text was given") if params[:text].blank?
 
     # Extract the arguments
     lon = OSM.parse_float(params[:lon], OSM::APIBadUserInput, "lon was not a number")
@@ -68,7 +68,7 @@ class NotesController < ApplicationController
     Note.transaction do
       # Create the note
       @note = Note.create(:lat => lat, :lon => lon)
-      fail OSM::APIBadUserInput.new("The note is outside this world") unless @note.in_world?
+      raise OSM::APIBadUserInput.new("The note is outside this world") unless @note.in_world?
 
       # Save the note
       @note.save!
@@ -88,11 +88,11 @@ class NotesController < ApplicationController
   # Add a comment to an existing note
   def comment
     # Check the ACLs
-    fail OSM::APIAccessDenied if Acl.no_note_comment(request.remote_ip)
+    raise OSM::APIAccessDenied if Acl.no_note_comment(request.remote_ip)
 
     # Check the arguments are sane
-    fail OSM::APIBadUserInput.new("No id was given") unless params[:id]
-    fail OSM::APIBadUserInput.new("No text was given") if params[:text].blank?
+    raise OSM::APIBadUserInput.new("No id was given") unless params[:id]
+    raise OSM::APIBadUserInput.new("No text was given") if params[:text].blank?
 
     # Extract the arguments
     id = params[:id].to_i
@@ -100,9 +100,9 @@ class NotesController < ApplicationController
 
     # Find the note and check it is valid
     @note = Note.find(id)
-    fail OSM::APINotFoundError unless @note
-    fail OSM::APIAlreadyDeletedError.new("note", @note.id) unless @note.visible?
-    fail OSM::APINoteAlreadyClosedError.new(@note) if @note.closed?
+    raise OSM::APINotFoundError unless @note
+    raise OSM::APIAlreadyDeletedError.new("note", @note.id) unless @note.visible?
+    raise OSM::APINoteAlreadyClosedError.new(@note) if @note.closed?
 
     # Add a comment to the note
     Note.transaction do
@@ -120,7 +120,7 @@ class NotesController < ApplicationController
   # Close a note
   def close
     # Check the arguments are sane
-    fail OSM::APIBadUserInput.new("No id was given") unless params[:id]
+    raise OSM::APIBadUserInput.new("No id was given") unless params[:id]
 
     # Extract the arguments
     id = params[:id].to_i
@@ -128,9 +128,9 @@ class NotesController < ApplicationController
 
     # Find the note and check it is valid
     @note = Note.find_by_id(id)
-    fail OSM::APINotFoundError unless @note
-    fail OSM::APIAlreadyDeletedError.new("note", @note.id) unless @note.visible?
-    fail OSM::APINoteAlreadyClosedError.new(@note) if @note.closed?
+    raise OSM::APINotFoundError unless @note
+    raise OSM::APIAlreadyDeletedError.new("note", @note.id) unless @note.visible?
+    raise OSM::APINoteAlreadyClosedError.new(@note) if @note.closed?
 
     # Close the note and add a comment
     Note.transaction do
@@ -150,7 +150,7 @@ class NotesController < ApplicationController
   # Reopen a note
   def reopen
     # Check the arguments are sane
-    fail OSM::APIBadUserInput.new("No id was given") unless params[:id]
+    raise OSM::APIBadUserInput.new("No id was given") unless params[:id]
 
     # Extract the arguments
     id = params[:id].to_i
@@ -158,9 +158,9 @@ class NotesController < ApplicationController
 
     # Find the note and check it is valid
     @note = Note.find_by_id(id)
-    fail OSM::APINotFoundError unless @note
-    fail OSM::APIAlreadyDeletedError.new("note", @note.id) unless @note.visible? || @user.moderator?
-    fail OSM::APINoteAlreadyOpenError.new(@note) unless @note.closed? || !@note.visible?
+    raise OSM::APINotFoundError unless @note
+    raise OSM::APIAlreadyDeletedError.new("note", @note.id) unless @note.visible? || @user.moderator?
+    raise OSM::APINoteAlreadyOpenError.new(@note) unless @note.closed? || !@note.visible?
 
     # Reopen the note and add a comment
     Note.transaction do
@@ -205,12 +205,12 @@ class NotesController < ApplicationController
   # Read a note
   def show
     # Check the arguments are sane
-    fail OSM::APIBadUserInput.new("No id was given") unless params[:id]
+    raise OSM::APIBadUserInput.new("No id was given") unless params[:id]
 
     # Find the note and check it is valid
     @note = Note.find(params[:id])
-    fail OSM::APINotFoundError unless @note
-    fail OSM::APIAlreadyDeletedError.new("note", @note.id) unless @note.visible?
+    raise OSM::APINotFoundError unless @note
+    raise OSM::APIAlreadyDeletedError.new("note", @note.id) unless @note.visible?
 
     # Render the result
     respond_to do |format|
@@ -225,7 +225,7 @@ class NotesController < ApplicationController
   # Delete (hide) a note
   def destroy
     # Check the arguments are sane
-    fail OSM::APIBadUserInput.new("No id was given") unless params[:id]
+    raise OSM::APIBadUserInput.new("No id was given") unless params[:id]
 
     # Extract the arguments
     id = params[:id].to_i
@@ -233,8 +233,8 @@ class NotesController < ApplicationController
 
     # Find the note and check it is valid
     @note = Note.find(id)
-    fail OSM::APINotFoundError unless @note
-    fail OSM::APIAlreadyDeletedError.new("note", @note.id) unless @note.visible?
+    raise OSM::APINotFoundError unless @note
+    raise OSM::APIAlreadyDeletedError.new("note", @note.id) unless @note.visible?
 
     # Mark the note as hidden
     Note.transaction do
@@ -255,7 +255,7 @@ class NotesController < ApplicationController
   # Return a list of notes matching a given string
   def search
     # Check the arguments are sane
-    fail OSM::APIBadUserInput.new("No query string was given") unless params[:q]
+    raise OSM::APIBadUserInput.new("No query string was given") unless params[:q]
 
     # Get any conditions that need to be applied
     @notes = closed_condition(Note.all)
@@ -308,7 +308,7 @@ class NotesController < ApplicationController
       if params[:limit].to_i > 0 && params[:limit].to_i <= 10000
         params[:limit].to_i
       else
-        fail OSM::APIBadUserInput.new("Note limit must be between 1 and 10000")
+        raise OSM::APIBadUserInput.new("Note limit must be between 1 and 10000")
       end
     else
       100
@@ -319,21 +319,19 @@ class NotesController < ApplicationController
   # Generate a condition to choose which bugs we want based
   # on their status and the user's request parameters
   def closed_condition(notes)
-    if params[:closed]
-      closed_since = params[:closed].to_i
-    else
-      closed_since = 7
-    end
+    closed_since = if params[:closed]
+                     params[:closed].to_i
+                   else
+                     7
+                   end
 
     if closed_since < 0
-      notes = notes.where("status != 'hidden'")
+      notes.where("status != 'hidden'")
     elsif closed_since > 0
-      notes = notes.where("(status = 'open' OR (status = 'closed' AND closed_at > '#{Time.now - closed_since.days}'))")
+      notes.where("(status = 'open' OR (status = 'closed' AND closed_at > '#{Time.now - closed_since.days}'))")
     else
-      notes = notes.where("status = 'open'")
+      notes.where("status = 'open'")
     end
-
-    notes
   end
 
   ##
index 88691f8..59ebfd6 100644 (file)
@@ -41,38 +41,36 @@ class OauthController < ApplicationController
     if @token.invalidated?
       @message = t "oauth.oauthorize_failure.invalid"
       render :action => "authorize_failure"
-    else
-      if request.post?
-        if user_authorizes_token?
-          @token.authorize!(current_user)
-          if @token.oauth10?
-            callback_url = params[:oauth_callback] || @token.client_application.callback_url
-          else
-            callback_url = @token.oob? ? @token.client_application.callback_url : @token.callback_url
-          end
-          @redirect_url = URI.parse(callback_url) unless callback_url.blank?
+    elsif request.post?
+      if user_authorizes_token?
+        @token.authorize!(current_user)
+        callback_url = if @token.oauth10?
+                         params[:oauth_callback] || @token.client_application.callback_url
+                       else
+                         @token.oob? ? @token.client_application.callback_url : @token.callback_url
+                       end
+        @redirect_url = URI.parse(callback_url) unless callback_url.blank?
 
-          if @redirect_url.to_s.blank?
-            render :action => "authorize_success"
-          else
-            @redirect_url.query = if @redirect_url.query.blank?
-                                    "oauth_token=#{@token.token}"
-                                  else
-                                    @redirect_url.query +
+        if @redirect_url.to_s.blank?
+          render :action => "authorize_success"
+        else
+          @redirect_url.query = if @redirect_url.query.blank?
+                                  "oauth_token=#{@token.token}"
+                                else
+                                  @redirect_url.query +
                                     "&oauth_token=#{@token.token}"
-                                  end
-
-            unless @token.oauth10?
-              @redirect_url.query += "&oauth_verifier=#{@token.verifier}"
-            end
+                                end
 
-            redirect_to @redirect_url.to_s
+          unless @token.oauth10?
+            @redirect_url.query += "&oauth_verifier=#{@token.verifier}"
           end
-        else
-          @token.invalidate!
-          @message = t("oauth.oauthorize_failure.denied", :app_name => @token.client_application.name)
-          render :action => "authorize_failure"
+
+          redirect_to @redirect_url.to_s
         end
+      else
+        @token.invalidate!
+        @message = t("oauth.oauthorize_failure.denied", :app_name => @token.client_application.name)
+        render :action => "authorize_failure"
       end
     end
   end
index 9e1137f..4869ae3 100644 (file)
@@ -19,7 +19,7 @@ class OldController < ApplicationController
     # the .where() method used in the lookup_old_element_versions
     # call won't throw an error if no records are found, so we have
     # to do that ourselves.
-    fail OSM::APINotFoundError.new if @elements.empty?
+    raise OSM::APINotFoundError.new if @elements.empty?
 
     doc = OSM::API.new.get_xml_doc
 
index 2f8a477..587cfce 100644 (file)
@@ -36,7 +36,7 @@ class RelationController < ApplicationController
     new_relation = Relation.from_xml(request.raw_post)
 
     unless new_relation && new_relation.id == relation.id
-      fail OSM::APIBadUserInput.new("The id in the url (#{relation.id}) is not the same as provided in the xml (#{new_relation.id})")
+      raise OSM::APIBadUserInput.new("The id in the url (#{relation.id}) is not the same as provided in the xml (#{new_relation.id})")
     end
 
     relation.update_from new_relation, @user
@@ -128,13 +128,13 @@ class RelationController < ApplicationController
 
   def relations
     unless params["relations"]
-      fail OSM::APIBadUserInput.new("The parameter relations is required, and must be of the form relations=id[,id[,id...]]")
+      raise OSM::APIBadUserInput.new("The parameter relations is required, and must be of the form relations=id[,id[,id...]]")
     end
 
     ids = params["relations"].split(",").collect(&:to_i)
 
-    if ids.length == 0
-      fail OSM::APIBadUserInput.new("No relations were given to search for")
+    if ids.empty?
+      raise OSM::APIBadUserInput.new("No relations were given to search for")
     end
 
     doc = OSM::API.new.get_xml_doc
index bda0a79..60b5a45 100644 (file)
@@ -30,13 +30,13 @@ class TraceController < ApplicationController
     end
 
     # set title
-    if target_user.nil?
-      @title = t "trace.list.public_traces"
-    elsif @user && @user == target_user
-      @title = t "trace.list.your_traces"
-    else
-      @title = t "trace.list.public_traces_from", :user => target_user.display_name
-    end
+    @title = if target_user.nil?
+               t "trace.list.public_traces"
+             elsif @user && @user == target_user
+               t "trace.list.your_traces"
+             else
+               t "trace.list.public_traces_from", :user => target_user.display_name
+             end
 
     @title += t "trace.list.tagged_with", :tags => params[:tag] if params[:tag]
 
@@ -45,19 +45,17 @@ class TraceController < ApplicationController
     # 2 - all traces, not logged in = all public traces
     # 3 - user's traces, logged in as same user = all user's traces
     # 4 - user's traces, not logged in as that user = all user's public traces
-    if target_user.nil? # all traces
-      if @user
-        @traces = Trace.visible_to(@user) # 1
-      else
-        @traces = Trace.visible_to_all # 2
-      end
-    else
-      if @user && @user == target_user
-        @traces = @user.traces # 3 (check vs user id, so no join + can't pick up non-public traces by changing name)
-      else
-        @traces = target_user.traces.visible_to_all # 4
-      end
-    end
+    @traces = if target_user.nil? # all traces
+                if @user
+                  Trace.visible_to(@user) # 1
+                else
+                  Trace.visible_to_all # 2
+                end
+              elsif @user && @user == target_user
+                @user.traces # 3 (check vs user id, so no join + can't pick up non-public traces by changing name)
+              else
+                target_user.traces.visible_to_all # 4
+              end
 
     @traces = @traces.tagged(params[:tag]) if params[:tag]
 
@@ -266,7 +264,7 @@ class TraceController < ApplicationController
       new_trace = Trace.from_xml(request.raw_post)
 
       unless new_trace && new_trace.id == trace.id
-        fail OSM::APIBadUserInput.new("The id in the url (#{trace.id}) is not the same as provided in the xml (#{new_trace.id})")
+        raise OSM::APIBadUserInput.new("The id in the url (#{trace.id}) is not the same as provided in the xml (#{new_trace.id})")
       end
 
       trace.description = new_trace.description
@@ -315,11 +313,11 @@ class TraceController < ApplicationController
     visibility = params[:visibility]
 
     if visibility.nil?
-      if params[:public] && params[:public].to_i.nonzero?
-        visibility = "public"
-      else
-        visibility = "private"
-      end
+      visibility = if params[:public] && params[:public].to_i.nonzero?
+                     "public"
+                   else
+                     "private"
+                   end
     end
 
     if params[:file].respond_to?(:read)
index 14e8c94..766ab37 100644 (file)
@@ -182,7 +182,7 @@ class UserController < ApplicationController
           if @user.save
             token.destroy
             flash[:notice] = t "user.reset_password.flash changed"
-            redirect_to :action => "login"
+            successful_login(@user)
           end
         end
       else
@@ -403,13 +403,11 @@ class UserController < ApplicationController
         friend.friend_user_id = @new_friend.id
         if @user.is_friends_with?(@new_friend)
           flash[:warning] = t "user.make_friend.already_a_friend", :name => @new_friend.display_name
+        elsif friend.save
+          flash[:notice] = t "user.make_friend.success", :name => @new_friend.display_name
+          Notifier.friend_notification(friend).deliver_now
         else
-          if friend.save
-            flash[:notice] = t "user.make_friend.success", :name => @new_friend.display_name
-            Notifier.friend_notification(friend).deliver_now
-          else
-            friend.add_error(t("user.make_friend.failed", :name => @new_friend.display_name))
-          end
+          friend.add_error(t("user.make_friend.failed", :name => @new_friend.display_name))
         end
 
         if params[:referer]
@@ -561,9 +559,9 @@ class UserController < ApplicationController
     elsif user = User.authenticate(:username => username, :password => password, :pending => true)
       unconfirmed_login(user)
     elsif User.authenticate(:username => username, :password => password, :suspended => true)
-      failed_login t("user.login.account is suspended", :webmaster => "mailto:webmaster@openstreetmap.org")
+      failed_login t("user.login.account is suspended", :webmaster => "mailto:webmaster@openstreetmap.org"), username
     else
-      failed_login t("user.login.auth failure")
+      failed_login t("user.login.auth failure"), username
     end
   end
 
@@ -629,10 +627,11 @@ class UserController < ApplicationController
 
   ##
   # process a failed login
-  def failed_login(message)
+  def failed_login(message, username = nil)
     flash[:error] = message
 
-    redirect_to :action => "login", :referer => session[:referer]
+    redirect_to :action => "login", :referer => session[:referer],
+                :username => username, :remember_me => session[:remember_me]
 
     session.delete(:remember_me)
     session.delete(:referer)
@@ -655,7 +654,7 @@ class UserController < ApplicationController
     user.display_name = params[:user][:display_name]
     user.new_email = params[:user][:new_email]
 
-    if params[:user][:pass_crypt].length > 0 || params[:user][:pass_crypt_confirmation].length > 0
+    unless params[:user][:pass_crypt].empty? && params[:user][:pass_crypt_confirmation].empty?
       user.pass_crypt = params[:user][:pass_crypt]
       user.pass_crypt_confirmation = params[:user][:pass_crypt_confirmation]
     end
@@ -682,11 +681,11 @@ class UserController < ApplicationController
     user.home_lat = params[:user][:home_lat]
     user.home_lon = params[:user][:home_lon]
 
-    if params[:user][:preferred_editor] == "default"
-      user.preferred_editor = nil
-    else
-      user.preferred_editor = params[:user][:preferred_editor]
-    end
+    user.preferred_editor = if params[:user][:preferred_editor] == "default"
+                              nil
+                            else
+                              params[:user][:preferred_editor]
+                            end
 
     if params[:user][:auth_provider].nil? || params[:user][:auth_provider].blank?
       user.auth_provider = nil
@@ -778,11 +777,11 @@ class UserController < ApplicationController
   ##
   # check signup acls
   def check_signup_allowed(email = nil)
-    if email.nil?
-      domain = nil
-    else
-      domain = email.split("@").last
-    end
+    domain = if email.nil?
+               nil
+             else
+               email.split("@").last
+             end
 
     if blocked = Acl.no_account_creation(request.remote_ip, domain)
       logger.info "Blocked signup from #{request.remote_ip} for #{email}"
index 2b6df65..78ab453 100644 (file)
@@ -45,7 +45,7 @@ class UserPreferenceController < ApplicationController
       if preference = old_preferences.delete(pt["k"])
         preference.v = pt["v"]
       elsif new_preferences.include?(pt["k"])
-        fail OSM::APIDuplicatePreferenceError.new(pt["k"])
+        raise OSM::APIDuplicatePreferenceError.new(pt["k"])
       else
         preference = @user.preferences.build(:k => pt["k"], :v => pt["v"])
       end
index e7a968a..c988545 100644 (file)
@@ -36,7 +36,7 @@ class WayController < ApplicationController
     new_way = Way.from_xml(request.raw_post)
 
     unless new_way && new_way.id == way.id
-      fail OSM::APIBadUserInput.new("The id in the url (#{way.id}) is not the same as provided in the xml (#{new_way.id})")
+      raise OSM::APIBadUserInput.new("The id in the url (#{way.id}) is not the same as provided in the xml (#{new_way.id})")
     end
 
     way.update_from(new_way, @user)
@@ -81,13 +81,13 @@ class WayController < ApplicationController
 
   def ways
     unless params["ways"]
-      fail OSM::APIBadUserInput.new("The parameter ways is required, and must be of the form ways=id[,id[,id...]]")
+      raise OSM::APIBadUserInput.new("The parameter ways is required, and must be of the form ways=id[,id[,id...]]")
     end
 
     ids = params["ways"].split(",").collect(&:to_i)
 
-    if ids.length == 0
-      fail OSM::APIBadUserInput.new("No ways were given to search for")
+    if ids.empty?
+      raise OSM::APIBadUserInput.new("No ways were given to search for")
     end
 
     doc = OSM::API.new.get_xml_doc
index 5b07407..40782fb 100644 (file)
@@ -1,11 +1,7 @@
 module AssetHelper
   def assets(directory)
-    assets = {}
-
-    Rails.application.assets.index.each_logical_path("#{directory}/*") do |path|
-      assets[path.sub(%r{^#{directory}/}, "")] = asset_path(path)
+    Rails.application.assets_manifest.assets.keys.each_with_object({}) do |asset, assets|
+      assets[asset] = asset_path(asset) if asset.start_with?("#{directory}/")
     end
-
-    assets
   end
 end
index 6c9e108..4942327 100644 (file)
@@ -2,11 +2,11 @@ require "uri"
 
 module BrowseHelper
   def printable_name(object, version = false)
-    if object.id.is_a?(Array)
-      id = object.id[0]
-    else
-      id = object.id
-    end
+    id = if object.id.is_a?(Array)
+           object.id[0]
+         else
+           object.id
+         end
     name = t "printable_name.with_id", :id => id.to_s
     if version
       name = t "printable_name.with_version", :id => name, :version => object.version.to_s
@@ -25,6 +25,8 @@ module BrowseHelper
         name = t "printable_name.with_name_html", :name => content_tag(:bdi, object.tags["name:#{locale}"].to_s), :id => content_tag(:bdi, name)
       elsif object.tags.include? "name"
         name = t "printable_name.with_name_html", :name => content_tag(:bdi, object.tags["name"].to_s), :id => content_tag(:bdi, name)
+      elsif object.tags.include? "ref"
+        name = t "printable_name.with_name_html", :name => content_tag(:bdi, object.tags["ref"].to_s), :id => content_tag(:bdi, name)
       end
     end
 
@@ -92,7 +94,7 @@ module BrowseHelper
 
   private
 
-  ICON_TAGS = %w(aeroway amenity barrier building highway historic landuse leisure man_made natural railway shop tourism waterway)
+  ICON_TAGS = %w(aeroway amenity barrier building highway historic landuse leisure man_made natural railway shop tourism waterway).freeze
 
   def icon_tags(object)
     object.tags.find_all { |k, _v| ICON_TAGS.include? k }.sort
@@ -123,14 +125,14 @@ module BrowseHelper
     if key == "wikipedia"
       # This regex should match Wikipedia language codes, everything
       # from de to zh-classical
-      if value =~ /^([a-z-]{2,12}):(.+)$/i
-        # Value is <lang>:<title> so split it up
-        # Note that value is always left as-is, see: https://trac.openstreetmap.org/ticket/4315
-        lang = $1
-      else
-        # Value is <title> so default to English Wikipedia
-        lang = "en"
-      end
+      lang = if value =~ /^([a-z-]{2,12}):(.+)$/i
+               # Value is <lang>:<title> so split it up
+               # Note that value is always left as-is, see: https://trac.openstreetmap.org/ticket/4315
+               $1
+             else
+               # Value is <title> so default to English Wikipedia
+               "en"
+             end
     elsif key =~ /^wikipedia:(\S+)$/
       # Language is in the key, so assume value is the title
       lang = $1
index c314129..45c8be6 100644 (file)
@@ -1,6 +1,8 @@
 module ChangesetHelper
   def changeset_user_link(changeset)
-    if changeset.user.data_public?
+    if changeset.user.status == "deleted"
+      t("user.no_such_user.deleted")
+    elsif changeset.user.data_public?
       link_to(changeset.user.display_name, user_path(changeset.user.display_name))
     else
       t("browse.anonymous")
index e135917..161bb2d 100644 (file)
@@ -2,13 +2,13 @@ module GeocoderHelper
   def result_to_html(result)
     html_options = { :class => "set_position", :data => {} }
 
-    if result[:type] && result[:id]
-      url = url_for(:controller => :browse, :action => result[:type], :id => result[:id])
-    elsif result[:min_lon] && result[:min_lat] && result[:max_lon] && result[:max_lat]
-      url = "/?bbox=#{result[:min_lon]},#{result[:min_lat]},#{result[:max_lon]},#{result[:max_lat]}"
-    else
-      url = "/#map=#{result[:zoom]}/#{result[:lat]}/#{result[:lon]}"
-    end
+    url = if result[:type] && result[:id]
+            url_for(:controller => :browse, :action => result[:type], :id => result[:id])
+          elsif result[:min_lon] && result[:min_lat] && result[:max_lon] && result[:max_lat]
+            "/?bbox=#{result[:min_lon]},#{result[:min_lat]},#{result[:max_lon]},#{result[:max_lat]}"
+          else
+            "/#map=#{result[:zoom]}/#{result[:lat]}/#{result[:lon]}"
+          end
 
     result.each do |key, value|
       html_options[:data][key.to_s.tr("_", "-")] = value
index 87bd86f..2a10161 100644 (file)
@@ -17,6 +17,8 @@ module NoteHelper
   def note_author(author, link_options = {})
     if author.nil?
       ""
+    elsif author.status == "deleted"
+      t("user.no_such_user.deleted")
     else
       link_to h(author.display_name), link_options.merge(:controller => "user", :action => "view", :display_name => author.display_name)
     end
index bf939e4..6909ba9 100644 (file)
@@ -63,7 +63,7 @@ class Changeset < ActiveRecord::Base
     doc.find("//osm/changeset").each do |pt|
       return Changeset.from_xml_node(pt, create)
     end
-    fail OSM::APIBadXMLError.new("changeset", xml, "XML doesn't contain an osm/changeset element.")
+    raise OSM::APIBadXMLError.new("changeset", xml, "XML doesn't contain an osm/changeset element.")
   rescue LibXML::XML::Error, ArgumentError => ex
     raise OSM::APIBadXMLError.new("changeset", xml, ex.message)
   end
@@ -80,8 +80,8 @@ class Changeset < ActiveRecord::Base
     end
 
     pt.find("tag").each do |tag|
-      fail OSM::APIBadXMLError.new("changeset", pt, "tag is missing key") if tag["k"].nil?
-      fail OSM::APIBadXMLError.new("changeset", pt, "tag is missing value") if tag["v"].nil?
+      raise OSM::APIBadXMLError.new("changeset", pt, "tag is missing key") if tag["k"].nil?
+      raise OSM::APIBadXMLError.new("changeset", pt, "tag is missing value") if tag["v"].nil?
       cs.add_tag_keyval(tag["k"], tag["v"])
     end
 
@@ -137,7 +137,7 @@ class Changeset < ActiveRecord::Base
 
     # duplicate tags are now forbidden, so we can't allow values
     # in the hash to be overwritten.
-    fail OSM::APIDuplicateTagsError.new("changeset", id, k) if @tags.include? k
+    raise OSM::APIDuplicateTagsError.new("changeset", id, k) if @tags.include? k
 
     @tags[k] = v
   end
@@ -146,7 +146,7 @@ class Changeset < ActiveRecord::Base
     # do the changeset update and the changeset tags update in the
     # same transaction to ensure consistency.
     Changeset.transaction do
-      self.save!
+      save!
 
       tags = self.tags
       ChangesetTag.delete_all(:changeset_id => id)
@@ -166,12 +166,12 @@ class Changeset < ActiveRecord::Base
   # that would make it more than 24h long, in which case clip to
   # 24h, as this has been decided is a reasonable time limit.
   def update_closed_at
-    if self.is_open?
-      if (closed_at - created_at) > (MAX_TIME_OPEN - IDLE_TIMEOUT)
-        self.closed_at = created_at + MAX_TIME_OPEN
-      else
-        self.closed_at = Time.now.getutc + IDLE_TIMEOUT
-      end
+    if is_open?
+      self.closed_at = if (closed_at - created_at) > (MAX_TIME_OPEN - IDLE_TIMEOUT)
+                         created_at + MAX_TIME_OPEN
+                       else
+                         Time.now.getutc + IDLE_TIMEOUT
+                       end
     end
   end
 
@@ -241,10 +241,10 @@ class Changeset < ActiveRecord::Base
   # bounding box, only the tags of the changeset.
   def update_from(other, user)
     # ensure that only the user who opened the changeset may modify it.
-    fail OSM::APIUserChangesetMismatchError.new unless user.id == user_id
+    raise OSM::APIUserChangesetMismatchError.new unless user.id == user_id
 
     # can't change a closed changeset
-    fail OSM::APIChangesetAlreadyClosedError.new(self) unless is_open?
+    raise OSM::APIChangesetAlreadyClosedError.new(self) unless is_open?
 
     # copy the other's tags
     self.tags = other.tags
index ec563d6..2fedadf 100644 (file)
@@ -7,6 +7,7 @@ class ChangesetComment < ActiveRecord::Base
   validates :changeset, :presence => true, :associated => true
   validates :author, :presence => true, :associated => true
   validates :visible, :inclusion => [true, false]
+  validates :body, :format => /\A[^\x00-\x08\x0b-\x0c\x0e-\x1f\x7f\ufffe\uffff]*\z/
 
   # Return the comment text
   def body
index aa7cb1c..156eeaf 100644 (file)
@@ -77,7 +77,7 @@ class ClientApplication < ActiveRecord::Base
   # can agree or not agree to each of them.
   PERMISSIONS = [:allow_read_prefs, :allow_write_prefs, :allow_write_diary,
                  :allow_write_api, :allow_read_gpx, :allow_write_gpx,
-                 :allow_write_notes]
+                 :allow_write_notes].freeze
 
   def generate_keys
     self.key = OAuth::Helper.generate_key(40)[0, 40]
index f1a89e0..a681440 100644 (file)
@@ -55,7 +55,7 @@ class Node < ActiveRecord::Base
     doc.find("//osm/node").each do |pt|
       return Node.from_xml_node(pt, create)
     end
-    fail OSM::APIBadXMLError.new("node", xml, "XML doesn't contain an osm/node element.")
+    raise OSM::APIBadXMLError.new("node", xml, "XML doesn't contain an osm/node element.")
   rescue LibXML::XML::Error, ArgumentError => ex
     raise OSM::APIBadXMLError.new("node", xml, ex.message)
   end
@@ -63,25 +63,25 @@ class Node < ActiveRecord::Base
   def self.from_xml_node(pt, create = false)
     node = Node.new
 
-    fail OSM::APIBadXMLError.new("node", pt, "lat missing") if pt["lat"].nil?
-    fail OSM::APIBadXMLError.new("node", pt, "lon missing") if pt["lon"].nil?
+    raise OSM::APIBadXMLError.new("node", pt, "lat missing") if pt["lat"].nil?
+    raise OSM::APIBadXMLError.new("node", pt, "lon missing") if pt["lon"].nil?
     node.lat = OSM.parse_float(pt["lat"], OSM::APIBadXMLError, "node", pt, "lat not a number")
     node.lon = OSM.parse_float(pt["lon"], OSM::APIBadXMLError, "node", pt, "lon not a number")
-    fail OSM::APIBadXMLError.new("node", pt, "Changeset id is missing") if pt["changeset"].nil?
+    raise OSM::APIBadXMLError.new("node", pt, "Changeset id is missing") if pt["changeset"].nil?
     node.changeset_id = pt["changeset"].to_i
 
-    fail OSM::APIBadUserInput.new("The node is outside this world") unless node.in_world?
+    raise OSM::APIBadUserInput.new("The node is outside this world") unless node.in_world?
 
     # version must be present unless creating
-    fail OSM::APIBadXMLError.new("node", pt, "Version is required when updating") unless create || !pt["version"].nil?
+    raise OSM::APIBadXMLError.new("node", pt, "Version is required when updating") unless create || !pt["version"].nil?
     node.version = create ? 0 : pt["version"].to_i
 
     unless create
-      fail OSM::APIBadXMLError.new("node", pt, "ID is required when updating.") if pt["id"].nil?
+      raise OSM::APIBadXMLError.new("node", pt, "ID is required when updating.") if pt["id"].nil?
       node.id = pt["id"].to_i
       # .to_i will return 0 if there is no number that can be parsed.
       # We want to make sure that there is no id with zero anyway
-      fail OSM::APIBadUserInput.new("ID of node cannot be zero when updating.") if node.id == 0
+      raise OSM::APIBadUserInput.new("ID of node cannot be zero when updating.") if node.id == 0
     end
 
     # We don't care about the time, as it is explicitly set on create/update/delete
@@ -94,8 +94,8 @@ class Node < ActiveRecord::Base
 
     # Add in any tags from the XML
     pt.find("tag").each do |tag|
-      fail OSM::APIBadXMLError.new("node", pt, "tag is missing key") if tag["k"].nil?
-      fail OSM::APIBadXMLError.new("node", pt, "tag is missing value") if tag["v"].nil?
+      raise OSM::APIBadXMLError.new("node", pt, "tag is missing key") if tag["k"].nil?
+      raise OSM::APIBadXMLError.new("node", pt, "tag is missing value") if tag["v"].nil?
       node.add_tag_key_val(tag["k"], tag["v"])
     end
 
@@ -111,19 +111,19 @@ class Node < ActiveRecord::Base
 
   # Should probably be renamed delete_from to come in line with update
   def delete_with_history!(new_node, user)
-    fail OSM::APIAlreadyDeletedError.new("node", new_node.id) unless visible
+    raise OSM::APIAlreadyDeletedError.new("node", new_node.id) unless visible
 
     # need to start the transaction here, so that the database can
     # provide repeatable reads for the used-by checks. this means it
     # shouldn't be possible to get race conditions.
     Node.transaction do
-      self.lock!
+      lock!
       check_consistency(self, new_node, user)
       ways = Way.joins(:way_nodes).where(:visible => true, :current_way_nodes => { :node_id => id }).order(:id)
-      fail OSM::APIPreconditionFailedError.new("Node #{id} is still used by ways #{ways.collect(&:id).join(",")}.") unless ways.empty?
+      raise OSM::APIPreconditionFailedError.new("Node #{id} is still used by ways #{ways.collect(&:id).join(",")}.") unless ways.empty?
 
       rels = Relation.joins(:relation_members).where(:visible => true, :current_relation_members => { :member_type => "Node", :member_id => id }).order(:id)
-      fail OSM::APIPreconditionFailedError.new("Node #{id} is still used by relations #{rels.collect(&:id).join(",")}.") unless rels.empty?
+      raise OSM::APIPreconditionFailedError.new("Node #{id} is still used by relations #{rels.collect(&:id).join(",")}.") unless rels.empty?
 
       self.changeset_id = new_node.changeset_id
       self.tags = {}
@@ -138,7 +138,7 @@ class Node < ActiveRecord::Base
 
   def update_from(new_node, user)
     Node.transaction do
-      self.lock!
+      lock!
       check_consistency(self, new_node, user)
 
       # update changeset first
@@ -184,7 +184,7 @@ class Node < ActiveRecord::Base
 
     add_metadata_to_xml_node(el, self, changeset_cache, user_display_name_cache)
 
-    if self.visible?
+    if visible?
       el["lat"] = lat.to_s
       el["lon"] = lon.to_s
     end
@@ -209,7 +209,7 @@ class Node < ActiveRecord::Base
 
     # duplicate tags are now forbidden, so we can't allow values
     # in the hash to be overwritten.
-    fail OSM::APIDuplicateTagsError.new("node", id, k) if @tags.include? k
+    raise OSM::APIDuplicateTagsError.new("node", id, k) if @tags.include? k
 
     @tags[k] = v
   end
@@ -235,7 +235,7 @@ class Node < ActiveRecord::Base
     Node.transaction do
       self.version += 1
       self.timestamp = t
-      self.save!
+      save!
 
       # Create a NodeTag
       tags = self.tags
index 31056be..73207af 100644 (file)
@@ -59,6 +59,6 @@ class Note < ActiveRecord::Base
 
   # Fill in default values for new notes
   def set_defaults
-    self.status = "open" unless self.attribute_present?(:status)
+    self.status = "open" unless attribute_present?(:status)
   end
 end
index 0182265..23f7b99 100644 (file)
@@ -136,17 +136,17 @@ class Notifier < ActionMailer::Base
       @owner = recipient == comment.note.author
       @event = comment.event
 
-      if comment.author
-        @commenter = comment.author.display_name
-      else
-        @commenter = I18n.t("notifier.note_comment_notification.anonymous")
-      end
-
-      if @owner
-        subject = I18n.t("notifier.note_comment_notification.#{@event}.subject_own", :commenter => @commenter)
-      else
-        subject = I18n.t("notifier.note_comment_notification.#{@event}.subject_other", :commenter => @commenter)
-      end
+      @commenter = if comment.author
+                     comment.author.display_name
+                   else
+                     I18n.t("notifier.note_comment_notification.anonymous")
+                   end
+
+      subject = if @owner
+                  I18n.t("notifier.note_comment_notification.#{@event}.subject_own", :commenter => @commenter)
+                else
+                  I18n.t("notifier.note_comment_notification.#{@event}.subject_other", :commenter => @commenter)
+                end
 
       mail :to => recipient.email, :subject => subject
     end
@@ -162,11 +162,11 @@ class Notifier < ActionMailer::Base
       @time = comment.created_at
       @changeset_author = comment.changeset.user.display_name
 
-      if @owner
-        subject = I18n.t("notifier.changeset_comment_notification.commented.subject_own", :commenter => @commenter)
-      else
-        subject = I18n.t("notifier.changeset_comment_notification.commented.subject_other", :commenter => @commenter)
-      end
+      subject = if @owner
+                  I18n.t("notifier.changeset_comment_notification.commented.subject_own", :commenter => @commenter)
+                else
+                  I18n.t("notifier.changeset_comment_notification.commented.subject_other", :commenter => @commenter)
+                end
 
       mail :to => recipient.email, :subject => subject
     end
@@ -175,14 +175,8 @@ class Notifier < ActionMailer::Base
   private
 
   def with_recipient_locale(recipient)
-    old_locale = I18n.locale
-
-    begin
-      I18n.locale = recipient.preferred_language_from(I18n.available_locales)
-
+    I18n.with_locale Locale.available.preferred(recipient.preferred_languages) do
       yield
-    ensure
-      I18n.locale = old_locale
     end
   end
 
index 84899d7..b103e5c 100644 (file)
@@ -55,7 +55,7 @@ class OldNode < ActiveRecord::Base
 
     add_metadata_to_xml_node(el, self, changeset_cache, user_display_name_cache)
 
-    if self.visible?
+    if visible?
       el["lat"] = lat.to_s
       el["lon"] = lon.to_s
     end
index cb96218..062f0ed 100644 (file)
@@ -33,7 +33,7 @@ class Relation < ActiveRecord::Base
   scope :ways, ->(*ids) { joins(:relation_members).where(:current_relation_members => { :member_type => "Way", :member_id => ids.flatten }) }
   scope :relations, ->(*ids) { joins(:relation_members).where(:current_relation_members => { :member_type => "Relation", :member_id => ids.flatten }) }
 
-  TYPES = %w(node way relation)
+  TYPES = %w(node way relation).freeze
 
   def self.from_xml(xml, create = false)
     p = XML::Parser.string(xml)
@@ -42,7 +42,7 @@ class Relation < ActiveRecord::Base
     doc.find("//osm/relation").each do |pt|
       return Relation.from_xml_node(pt, create)
     end
-    fail OSM::APIBadXMLError.new("node", xml, "XML doesn't contain an osm/relation element.")
+    raise OSM::APIBadXMLError.new("node", xml, "XML doesn't contain an osm/relation element.")
   rescue LibXML::XML::Error, ArgumentError => ex
     raise OSM::APIBadXMLError.new("relation", xml, ex.message)
   end
@@ -50,17 +50,17 @@ class Relation < ActiveRecord::Base
   def self.from_xml_node(pt, create = false)
     relation = Relation.new
 
-    fail OSM::APIBadXMLError.new("relation", pt, "Version is required when updating") unless create || !pt["version"].nil?
+    raise OSM::APIBadXMLError.new("relation", pt, "Version is required when updating") unless create || !pt["version"].nil?
     relation.version = pt["version"]
-    fail OSM::APIBadXMLError.new("relation", pt, "Changeset id is missing") if pt["changeset"].nil?
+    raise OSM::APIBadXMLError.new("relation", pt, "Changeset id is missing") if pt["changeset"].nil?
     relation.changeset_id = pt["changeset"]
 
     unless create
-      fail OSM::APIBadXMLError.new("relation", pt, "ID is required when updating") if pt["id"].nil?
+      raise OSM::APIBadXMLError.new("relation", pt, "ID is required when updating") if pt["id"].nil?
       relation.id = pt["id"].to_i
       # .to_i will return 0 if there is no number that can be parsed.
       # We want to make sure that there is no id with zero anyway
-      fail OSM::APIBadUserInput.new("ID of relation cannot be zero when updating.") if relation.id == 0
+      raise OSM::APIBadUserInput.new("ID of relation cannot be zero when updating.") if relation.id == 0
     end
 
     # We don't care about the timestamp nor the visibility as these are either
@@ -73,8 +73,8 @@ class Relation < ActiveRecord::Base
 
     # Add in any tags from the XML
     pt.find("tag").each do |tag|
-      fail OSM::APIBadXMLError.new("relation", pt, "tag is missing key") if tag["k"].nil?
-      fail OSM::APIBadXMLError.new("relation", pt, "tag is missing value") if tag["v"].nil?
+      raise OSM::APIBadXMLError.new("relation", pt, "tag is missing key") if tag["k"].nil?
+      raise OSM::APIBadXMLError.new("relation", pt, "tag is missing value") if tag["v"].nil?
       relation.add_tag_keyval(tag["k"], tag["v"])
     end
 
@@ -86,13 +86,13 @@ class Relation < ActiveRecord::Base
 
     pt.find("member").each do |member|
       # member_type =
-      fail OSM::APIBadXMLError.new("relation", pt, "The #{member['type']} is not allowed only, #{TYPES.inspect} allowed") unless TYPES.include? member["type"]
+      raise OSM::APIBadXMLError.new("relation", pt, "The #{member['type']} is not allowed only, #{TYPES.inspect} allowed") unless TYPES.include? member["type"]
       # member_ref = member['ref']
       # member_role
       member["role"] ||= "" # Allow  the upload to not include this, in which case we default to an empty string.
       relation.add_member(member["type"].classify, member["ref"], member["role"])
     end
-    fail OSM::APIBadUserInput.new("Some bad xml in relation") if relation.nil?
+    raise OSM::APIBadUserInput.new("Some bad xml in relation") if relation.nil?
 
     relation
   end
@@ -159,7 +159,7 @@ class Relation < ActiveRecord::Base
 
     # duplicate tags are now forbidden, so we can't allow values
     # in the hash to be overwritten.
-    fail OSM::APIDuplicateTagsError.new("relation", id, k) if @tags.include? k
+    raise OSM::APIDuplicateTagsError.new("relation", id, k) if @tags.include? k
 
     @tags[k] = v
   end
@@ -176,18 +176,18 @@ class Relation < ActiveRecord::Base
 
   def delete_with_history!(new_relation, user)
     unless visible
-      fail OSM::APIAlreadyDeletedError.new("relation", new_relation.id)
+      raise OSM::APIAlreadyDeletedError.new("relation", new_relation.id)
     end
 
     # need to start the transaction here, so that the database can
     # provide repeatable reads for the used-by checks. this means it
     # shouldn't be possible to get race conditions.
     Relation.transaction do
-      self.lock!
+      lock!
       check_consistency(self, new_relation, user)
       # This will check to see if this relation is used by another relation
       rel = RelationMember.joins(:relation).find_by("visible = ? AND member_type = 'Relation' and member_id = ? ", true, id)
-      fail OSM::APIPreconditionFailedError.new("The relation #{new_relation.id} is used in relation #{rel.relation.id}.") unless rel.nil?
+      raise OSM::APIPreconditionFailedError.new("The relation #{new_relation.id} is used in relation #{rel.relation.id}.") unless rel.nil?
 
       self.changeset_id = new_relation.changeset_id
       self.tags = {}
@@ -199,10 +199,10 @@ class Relation < ActiveRecord::Base
 
   def update_from(new_relation, user)
     Relation.transaction do
-      self.lock!
+      lock!
       check_consistency(self, new_relation, user)
       unless new_relation.preconditions_ok?(members)
-        fail OSM::APIPreconditionFailedError.new("Cannot update relation #{id}: data or member data is invalid.")
+        raise OSM::APIPreconditionFailedError.new("Cannot update relation #{id}: data or member data is invalid.")
       end
       self.changeset_id = new_relation.changeset_id
       self.changeset = new_relation.changeset
@@ -215,8 +215,8 @@ class Relation < ActiveRecord::Base
 
   def create_with_history(user)
     check_create_consistency(self, user)
-    unless self.preconditions_ok?
-      fail OSM::APIPreconditionFailedError.new("Cannot create relation: data or member data is invalid.")
+    unless preconditions_ok?
+      raise OSM::APIPreconditionFailedError.new("Cannot create relation: data or member data is invalid.")
     end
     self.version = 0
     self.visible = true
@@ -253,7 +253,7 @@ class Relation < ActiveRecord::Base
 
       # and check that it is OK to use.
       unless element && element.visible? && element.preconditions_ok?
-        fail OSM::APIPreconditionFailedError.new("Relation with id #{id} cannot be saved due to #{m[0]} with id #{m[1]}")
+        raise OSM::APIPreconditionFailedError.new("Relation with id #{id} cannot be saved due to #{m[0]} with id #{m[1]}")
       end
       hash[m[1]] = true
     end
@@ -270,7 +270,7 @@ class Relation < ActiveRecord::Base
       old_id = id.to_i
       if old_id < 0
         new_id = id_map[type.downcase.to_sym][old_id]
-        fail OSM::APIBadUserInput.new("Placeholder #{type} not found for reference #{old_id} in relation #{self.id.nil? ? placeholder_id : self.id}.") if new_id.nil?
+        raise OSM::APIBadUserInput.new("Placeholder #{type} not found for reference #{old_id} in relation #{self.id.nil? ? placeholder_id : self.id}.") if new_id.nil?
         [type, new_id, role]
       else
         [type, id, role]
@@ -289,7 +289,7 @@ class Relation < ActiveRecord::Base
       t = Time.now.getutc
       self.version += 1
       self.timestamp = t
-      self.save!
+      save!
 
       tags = self.tags.clone
       relation_tags.each do |old_tag|
@@ -312,7 +312,7 @@ class Relation < ActiveRecord::Base
       end
       # if there are left-over tags then they are new and will have to
       # be added.
-      tags_changed |= (!tags.empty?)
+      tags_changed |= !tags.empty?
       RelationTag.delete_all(:relation_id => id)
       self.tags.each do |k, v|
         tag = RelationTag.new
@@ -370,7 +370,7 @@ class Relation < ActiveRecord::Base
       # materially change the rest of the relation.
       any_relations =
         changed_members.collect { |_id, type| type == "relation" }
-        .inject(false) { |a, e| a || e }
+                       .inject(false) { |a, e| a || e }
 
       update_members = if tags_changed || any_relations
                          # add all non-relation bounding boxes to the changeset
index a1b30ab..c0f0194 100644 (file)
@@ -35,7 +35,7 @@ class RequestToken < OauthToken
   end
 
   def oob?
-    callback_url.nil? || callback_url.downcase == "oob"
+    callback_url.nil? || callback_url.casecmp("oob").zero?
   end
 
   def oauth10?
index b13ce84..a1e9846 100644 (file)
@@ -28,20 +28,20 @@ class Trace < ActiveRecord::Base
   end
 
   def tagstring=(s)
-    if s.include? ","
-      self.tags = s.split(/\s*,\s*/).select { |tag| tag !~ /^\s*$/ }.collect {|tag|
-        tt = Tracetag.new
-        tt.tag = tag
-        tt
-      }
-    else
-      # do as before for backwards compatibility:
-      self.tags = s.split.collect {|tag|
-        tt = Tracetag.new
-        tt.tag = tag
-        tt
-      }
-    end
+    self.tags = if s.include? ","
+                  s.split(/\s*,\s*/).select { |tag| tag !~ /^\s*$/ }.collect do |tag|
+                    tt = Tracetag.new
+                    tt.tag = tag
+                    tt
+                  end
+                else
+                  # do as before for backwards compatibility:
+                  s.split.collect do |tag|
+                    tt = Tracetag.new
+                    tt.tag = tag
+                    tt
+                  end
+                end
   end
 
   def public?
@@ -101,17 +101,17 @@ class Trace < ActiveRecord::Base
     zipped = filetype =~ /Zip archive/
     tarred = filetype =~ /tar archive/
 
-    if gzipped
-      mimetype = "application/x-gzip"
-    elsif bzipped
-      mimetype = "application/x-bzip2"
-    elsif zipped
-      mimetype = "application/x-zip"
-    elsif tarred
-      mimetype = "application/x-tar"
-    else
-      mimetype = "application/gpx+xml"
-    end
+    mimetype = if gzipped
+                 "application/x-gzip"
+               elsif bzipped
+                 "application/x-bzip2"
+               elsif zipped
+                 "application/x-zip"
+               elsif tarred
+                 "application/x-tar"
+               else
+                 "application/gpx+xml"
+               end
 
     mimetype
   end
@@ -123,21 +123,21 @@ class Trace < ActiveRecord::Base
     zipped = filetype =~ /Zip archive/
     tarred = filetype =~ /tar archive/
 
-    if tarred && gzipped
-      extension = ".tar.gz"
-    elsif tarred && bzipped
-      extension = ".tar.bz2"
-    elsif tarred
-      extension = ".tar"
-    elsif gzipped
-      extension = ".gpx.gz"
-    elsif bzipped
-      extension = ".gpx.bz2"
-    elsif zipped
-      extension = ".zip"
-    else
-      extension = ".gpx"
-    end
+    extension = if tarred && gzipped
+                  ".tar.gz"
+                elsif tarred && bzipped
+                  ".tar.bz2"
+                elsif tarred
+                  ".tar"
+                elsif gzipped
+                  ".gpx.gz"
+                elsif bzipped
+                  ".gpx.bz2"
+                elsif zipped
+                  ".zip"
+                else
+                  ".gpx"
+                end
 
     extension
   end
@@ -156,7 +156,7 @@ class Trace < ActiveRecord::Base
     el1["lon"] = longitude.to_s if inserted
     el1["user"] = user.display_name
     el1["visibility"] = visibility
-    el1["pending"] = (!inserted).to_s
+    el1["pending"] = inserted ? "false" : "true"
     el1["timestamp"] = timestamp.xmlschema
 
     el2 = XML::Node.new "description"
@@ -181,7 +181,7 @@ class Trace < ActiveRecord::Base
       return Trace.from_xml_node(pt, create)
     end
 
-    fail OSM::APIBadXMLError.new("trace", xml, "XML doesn't contain an osm/gpx_file element.")
+    raise OSM::APIBadXMLError.new("trace", xml, "XML doesn't contain an osm/gpx_file element.")
   rescue LibXML::XML::Error, ArgumentError => ex
     raise OSM::APIBadXMLError.new("trace", xml, ex.message)
   end
@@ -189,15 +189,15 @@ class Trace < ActiveRecord::Base
   def self.from_xml_node(pt, create = false)
     trace = Trace.new
 
-    fail OSM::APIBadXMLError.new("trace", pt, "visibility missing") if pt["visibility"].nil?
+    raise OSM::APIBadXMLError.new("trace", pt, "visibility missing") if pt["visibility"].nil?
     trace.visibility = pt["visibility"]
 
     unless create
-      fail OSM::APIBadXMLError.new("trace", pt, "ID is required when updating.") if pt["id"].nil?
+      raise OSM::APIBadXMLError.new("trace", pt, "ID is required when updating.") if pt["id"].nil?
       trace.id = pt["id"].to_i
       # .to_i will return 0 if there is no number that can be parsed.
       # We want to make sure that there is no id with zero anyway
-      fail OSM::APIBadUserInput.new("ID of trace cannot be zero when updating.") if trace.id == 0
+      raise OSM::APIBadUserInput.new("ID of trace cannot be zero when updating.") if trace.id == 0
     end
 
     # We don't care about the time, as it is explicitly set on create/update/delete
@@ -206,7 +206,7 @@ class Trace < ActiveRecord::Base
     trace.visible = true
 
     description = pt.find("description").first
-    fail OSM::APIBadXMLError.new("trace", pt, "description missing") if description.nil?
+    raise OSM::APIBadXMLError.new("trace", pt, "description missing") if description.nil?
     trace.description = description.content
 
     pt.find("tag").each do |tag|
@@ -297,7 +297,7 @@ class Trace < ActiveRecord::Base
       self.icon_picture = gpx.icon(min_lat, min_lon, max_lat, max_lon)
       self.size = gpx.actual_points
       self.inserted = true
-      self.save!
+      save!
     end
 
     logger.info "done trace #{id}"
index 0053333..e255dc2 100644 (file)
@@ -131,8 +131,8 @@ class User < ActiveRecord::Base
     languages.find { |l| Language.exists?(:code => l) }
   end
 
-  def preferred_language_from(array)
-    (languages & array.collect(&:to_s)).first
+  def preferred_languages
+    @locales ||= Locale.list(languages)
   end
 
   def nearby(radius = NEARBY_RADIUS, num = NEARBY_USERS)
@@ -217,8 +217,8 @@ class User < ActiveRecord::Base
 
     score = description.spam_score / 4.0
     score += diary_entries.where("created_at > ?", 1.day.ago).count * 10
-    score += diary_entry_score / diary_entries.length if diary_entries.length > 0
-    score += diary_comment_score / diary_comments.length if diary_comments.length > 0
+    score += diary_entry_score / diary_entries.length unless diary_entries.empty?
+    score += diary_comment_score / diary_comments.length unless diary_comments.empty?
     score -= changeset_score
     score -= trace_score
 
@@ -242,7 +242,7 @@ class User < ActiveRecord::Base
   private
 
   def set_defaults
-    self.creation_time = Time.now.getutc unless self.attribute_present?(:creation_time)
+    self.creation_time = Time.now.getutc unless attribute_present?(:creation_time)
   end
 
   def encrypt_password
index 9686f72..6bc7435 100644 (file)
@@ -1,7 +1,7 @@
 class UserRole < ActiveRecord::Base
   belongs_to :user
 
-  ALL_ROLES = %w(administrator moderator)
+  ALL_ROLES = %w(administrator moderator).freeze
 
   validates :role, :inclusion => ALL_ROLES, :uniqueness => { :scope => :user_id }
 end
index 6d49735..d0a2528 100644 (file)
@@ -40,7 +40,7 @@ class Way < ActiveRecord::Base
     doc.find("//osm/way").each do |pt|
       return Way.from_xml_node(pt, create)
     end
-    fail OSM::APIBadXMLError.new("node", xml, "XML doesn't contain an osm/way element.")
+    raise OSM::APIBadXMLError.new("node", xml, "XML doesn't contain an osm/way element.")
   rescue LibXML::XML::Error, ArgumentError => ex
     raise OSM::APIBadXMLError.new("way", xml, ex.message)
   end
@@ -48,17 +48,17 @@ class Way < ActiveRecord::Base
   def self.from_xml_node(pt, create = false)
     way = Way.new
 
-    fail OSM::APIBadXMLError.new("way", pt, "Version is required when updating") unless create || !pt["version"].nil?
+    raise OSM::APIBadXMLError.new("way", pt, "Version is required when updating") unless create || !pt["version"].nil?
     way.version = pt["version"]
-    fail OSM::APIBadXMLError.new("way", pt, "Changeset id is missing") if pt["changeset"].nil?
+    raise OSM::APIBadXMLError.new("way", pt, "Changeset id is missing") if pt["changeset"].nil?
     way.changeset_id = pt["changeset"]
 
     unless create
-      fail OSM::APIBadXMLError.new("way", pt, "ID is required when updating") if pt["id"].nil?
+      raise OSM::APIBadXMLError.new("way", pt, "ID is required when updating") if pt["id"].nil?
       way.id = pt["id"].to_i
       # .to_i will return 0 if there is no number that can be parsed.
       # We want to make sure that there is no id with zero anyway
-      fail OSM::APIBadUserInput.new("ID of way cannot be zero when updating.") if way.id == 0
+      raise OSM::APIBadUserInput.new("ID of way cannot be zero when updating.") if way.id == 0
     end
 
     # We don't care about the timestamp nor the visibility as these are either
@@ -71,8 +71,8 @@ class Way < ActiveRecord::Base
 
     # Add in any tags from the XML
     pt.find("tag").each do |tag|
-      fail OSM::APIBadXMLError.new("way", pt, "tag is missing key") if tag["k"].nil?
-      fail OSM::APIBadXMLError.new("way", pt, "tag is missing value") if tag["v"].nil?
+      raise OSM::APIBadXMLError.new("way", pt, "tag is missing key") if tag["k"].nil?
+      raise OSM::APIBadXMLError.new("way", pt, "tag is missing value") if tag["v"].nil?
       way.add_tag_keyval(tag["k"], tag["v"])
     end
 
@@ -147,7 +147,7 @@ class Way < ActiveRecord::Base
 
     # duplicate tags are now forbidden, so we can't allow values
     # in the hash to be overwritten.
-    fail OSM::APIDuplicateTagsError.new("way", id, k) if @tags.include? k
+    raise OSM::APIDuplicateTagsError.new("way", id, k) if @tags.include? k
 
     @tags[k] = v
   end
@@ -163,10 +163,10 @@ class Way < ActiveRecord::Base
 
   def update_from(new_way, user)
     Way.transaction do
-      self.lock!
+      lock!
       check_consistency(self, new_way, user)
       unless new_way.preconditions_ok?(nds)
-        fail OSM::APIPreconditionFailedError.new("Cannot update way #{id}: data is invalid.")
+        raise OSM::APIPreconditionFailedError.new("Cannot update way #{id}: data is invalid.")
       end
 
       self.changeset_id = new_way.changeset_id
@@ -180,8 +180,8 @@ class Way < ActiveRecord::Base
 
   def create_with_history(user)
     check_create_consistency(self, user)
-    unless self.preconditions_ok?
-      fail OSM::APIPreconditionFailedError.new("Cannot create way: data is invalid.")
+    unless preconditions_ok?
+      raise OSM::APIPreconditionFailedError.new("Cannot create way: data is invalid.")
     end
     self.version = 0
     self.visible = true
@@ -191,7 +191,7 @@ class Way < ActiveRecord::Base
   def preconditions_ok?(old_nodes = [])
     return false if nds.empty?
     if nds.length > MAX_NUMBER_OF_WAY_NODES
-      fail OSM::APITooManyWayNodesError.new(id, nds.length, MAX_NUMBER_OF_WAY_NODES)
+      raise OSM::APITooManyWayNodesError.new(id, nds.length, MAX_NUMBER_OF_WAY_NODES)
     end
 
     # check only the new nodes, for efficiency - old nodes having been checked last time and can't
@@ -205,7 +205,7 @@ class Way < ActiveRecord::Base
 
       if db_nds.length < new_nds.length
         missing = new_nds - db_nds.collect(&:id)
-        fail OSM::APIPreconditionFailedError.new("Way #{id} requires the nodes with id in (#{missing.join(',')}), which either do not exist, or are not visible.")
+        raise OSM::APIPreconditionFailedError.new("Way #{id} requires the nodes with id in (#{missing.join(',')}), which either do not exist, or are not visible.")
       end
     end
 
@@ -213,16 +213,16 @@ class Way < ActiveRecord::Base
   end
 
   def delete_with_history!(new_way, user)
-    fail OSM::APIAlreadyDeletedError.new("way", new_way.id) unless visible
+    raise OSM::APIAlreadyDeletedError.new("way", new_way.id) unless visible
 
     # need to start the transaction here, so that the database can
     # provide repeatable reads for the used-by checks. this means it
     # shouldn't be possible to get race conditions.
     Way.transaction do
-      self.lock!
+      lock!
       check_consistency(self, new_way, user)
       rels = Relation.joins(:relation_members).where(:visible => true, :current_relation_members => { :member_type => "Way", :member_id => id }).order(:id)
-      fail OSM::APIPreconditionFailedError.new("Way #{id} is still used by relations #{rels.collect(&:id).join(",")}.") unless rels.empty?
+      raise OSM::APIPreconditionFailedError.new("Way #{id} is still used by relations #{rels.collect(&:id).join(",")}.") unless rels.empty?
 
       self.changeset_id = new_way.changeset_id
       self.changeset = new_way.changeset
@@ -242,7 +242,7 @@ class Way < ActiveRecord::Base
     nds.map! do |node_id|
       if node_id < 0
         new_id = id_map[:node][node_id]
-        fail OSM::APIBadUserInput.new("Placeholder node not found for reference #{node_id} in way #{id.nil? ? placeholder_id : id}") if new_id.nil?
+        raise OSM::APIBadUserInput.new("Placeholder node not found for reference #{node_id} in way #{id.nil? ? placeholder_id : id}") if new_id.nil?
         new_id
       else
         node_id
@@ -265,7 +265,7 @@ class Way < ActiveRecord::Base
     Way.transaction do
       self.version += 1
       self.timestamp = t
-      self.save!
+      save!
 
       tags = self.tags
       WayTag.delete_all(:way_id => id)
index 3aeafa9..1c203b2 100644 (file)
@@ -10,7 +10,7 @@
 <script type="text/javascript">alert("<%= t 'site.edit.potlatch2_not_configured' %>")</script>
 <% end %>
 
-<% locale = select_locale(Potlatch2::LOCALES.keys).to_s %>
+<% locale = Locale.list(Potlatch2::LOCALES.keys).preferred(preferred_languages).to_s %>
 
 <script type="text/javascript" defer="defer">
   var changesaved=true;
index 6bf3365..9ac03e7 100644 (file)
@@ -47,7 +47,7 @@
     <dt><a href="http://download.geofabrik.de/"><%= t'export.start.too_large.geofabrik.title' %></a></dt>
     <dd><%= t'export.start.too_large.geofabrik.description' %></dd>
 
-    <dt><a href="https://mapzen.com/metro-extracts/"><%= t'export.start.too_large.metro.title' %></a></dt>
+    <dt><a href="https://mapzen.com/data/metro-extracts/"><%= t'export.start.too_large.metro.title' %></a></dt>
     <dd><%= t'export.start.too_large.metro.description' %></dd>
 
     <dt><a href="http://wiki.openstreetmap.org/wiki/Download"><%= t'export.start.too_large.other.title' %></a></dt>
index 27a3e83..ba8f7da 100644 (file)
       'Please upgrade your browser or use Potlatch 2 to edit the map.';
     document.getElementById('id-container').className = 'unsupported';
   } else {
-    <% locale = select_locale(ID::LOCALES).to_s %>
+    <% locale = ID::LOCALES.preferred(preferred_languages).to_s %>
 
     var id = iD()
       .presets(iD.data.presets)
       .imagery(iD.data.imagery)
-      .taginfo(iD.taginfo())
+      .taginfo(iD.services.taginfo())
       .embed(true)
-      .assetPath("/iD/") <%# Cant use asset_path('iD/') in production. %>
+      .assetPath("iD/")
       .assetMap(<%= assets("iD").to_json.html_safe %>)
       .locale("<%= locale %>", "<%= asset_path("iD/locales/#{locale}.json") %>")
       .preauth({
index f175fe1..5f6e2b7 100644 (file)
@@ -1,7 +1,10 @@
 <% content_for :heading do %>
-  <h1><%= t 'user.new.heading' %></h1>
+  <h1><%= t 'user.new.title' %></h1>
+  <div class='header-illustration new-user-main'></div>
+  <div class='header-illustration new-user-arm'></div>
 <% end %>
 
-<p><%= t 'user.new.no_auto_account_create' %></p>
-
-<p><%= raw t 'user.new.contact_webmaster' %></p>
+<div class="message">
+  <h1><%= t 'user.new.no_auto_account_create' %></h1>
+  <h2><%= raw t 'user.new.contact_webmaster' %></h2>
+</div>
index 3c9557a..e6efdc5 100644 (file)
@@ -33,7 +33,7 @@
       </fieldset>
 
       <fieldset>
-        <%= check_box_tag "remember_me", "yes", false, :tabindex => 3 %>
+        <%= check_box_tag "remember_me", "yes", params[:remember_me] == "yes", :tabindex => 3 %>
         <label for="remember_me" class="standard-label">
           <%= t 'user.login.remember' %>
         </label>
index 8b61b50..f60064a 100644 (file)
@@ -90,6 +90,11 @@ defaults: &defaults
     - ".*\\.google\\.ru/.*"
   # URL of Overpass instance to use for feature queries
   overpass_url: "//overpass-api.de/api/interpreter"
+  # Routing endpoints
+  graphhopper_url: "//graphhopper.com/api/1/route"
+  mapquest_directions_url: "//open.mapquestapi.com/directions/v2/route"
+  mapzen_valhalla_url: "//valhalla.mapzen.com/route"
+  osrm_url: "//router.project-osrm.org/viaroute"
   # External authentication credentials
   #google_auth_id: ""
   #google_auth_secret: ""
index 5613e0d..89d3845 100644 (file)
@@ -4,7 +4,7 @@ if defined?(ActiveRecord::ConnectionAdaptors::AbstractAdapter)
       class AbstractAdapter
         protected
 
-        alias_method :old_log, :log
+        alias old_log log
 
         def log(sql, name)
           if block_given?
index 7baac7f..f59f608 100644 (file)
@@ -12,7 +12,7 @@ Rails.application.config.assets.paths << Rails.root.join("config")
 # Precompile additional assets.
 # application.js, application.css, and all non-JS/CSS in app/assets folder are already added.
 Rails.application.config.assets.precompile += %w( index.js browse.js welcome.js fixthemap.js )
-Rails.application.config.assets.precompile += %w( user.js diary_entry.js )
+Rails.application.config.assets.precompile += %w( user.js login.js diary_entry.js )
 Rails.application.config.assets.precompile += %w( screen-ltr.css print-ltr.css )
 Rails.application.config.assets.precompile += %w( screen-rtl.css print-rtl.css )
 Rails.application.config.assets.precompile += %w( leaflet-all.css leaflet.ie.css )
@@ -29,3 +29,6 @@ Rails.application.config.assets.precompile += %w( help/introduction.* )
 Rails.application.config.assets.precompile += %w( iD/img/*.svg iD/img/*.png iD/img/*.gif )
 Rails.application.config.assets.precompile += %w( iD/img/pattern/*.png )
 Rails.application.config.assets.precompile += %w( iD/locales/*.json )
+Rails.application.config.assets.precompile += %w( iD/traffico/stylesheets/traffico.css )
+Rails.application.config.assets.precompile += %w( iD/traffico/fonts/traffico_* )
+Rails.application.config.assets.precompile += %w( iD/traffico/string-maps/*.json )
diff --git a/config/initializers/http_accept_language.rb b/config/initializers/http_accept_language.rb
deleted file mode 100644 (file)
index 2e5c92d..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-#
-# Monkey patch HttpAcceptLanguage pending integration of
-# https://github.com/iain/http_accept_language/pull/6
-#
-module HttpAcceptLanguage
-  class Parser
-    def compatible_language_from(available_languages)
-      user_preferred_languages.find do |x|
-        available_languages.find { |y| y.to_s == x.to_s } ||
-          available_languages.find { |y| y.to_s =~ /^#{Regexp.escape(x.to_s)}-/ }
-      end
-    end
-  end
-end
index 91efa25..a94618c 100644 (file)
@@ -8,6 +8,16 @@ module I18n
         ex.entry[:other]
       end
     end
+
+    class Simple
+      def store_translations_with_normalisation(locale, data, options = {})
+        locale = I18n::Locale::Tag::Rfc4646.tag(locale).to_s
+
+        store_translations_without_normalisation(locale, data, options)
+      end
+
+      alias_method_chain :store_translations, :normalisation
+    end
   end
 
   module JS
index e0e659f..07f7966 100644 (file)
@@ -1,5 +1,5 @@
 # This is required otherwise libxml writes out memory errors to
 # the standard output and exits uncleanly
 LibXML::XML::Error.set_handler do |message|
-  fail message
+  raise message
 end
index a654f2a..6100531 100644 (file)
@@ -1,7 +1,7 @@
 require "openid/fetchers"
 require "openid/util"
 
-CA_BUNDLES = ["/etc/ssl/certs/ca-certificates.crt", "/etc/pki/tls/cert.pem"]
+CA_BUNDLES = ["/etc/ssl/certs/ca-certificates.crt", "/etc/pki/tls/cert.pem"].freeze
 
 OpenID.fetcher.ca_file = CA_BUNDLES.find { |f| File.exist?(f) }
 OpenID::Util.logger = Rails.logger
index bad88e1..545d7bc 100644 (file)
@@ -18,4 +18,6 @@ class R2Template < Tilt::Template
   end
 end
 
-Rails.application.assets.register_engine ".r2", R2Template
+Rails.application.config.assets.configure do |env|
+  env.register_engine ".r2", R2Template
+end
index 3db2a55..0c27ba2 100644 (file)
@@ -1,7 +1,7 @@
 # Hack ActionController::DataStreaming to allow streaming from a file handle
 module ActionController
   module DataStreaming
-    alias_method :old_send_file, :send_file
+    alias old_send_file send_file
 
     def send_file(file, options = {})
       if file.is_a?(File) || file.is_a?(Tempfile)
index d329a01..e66a0cd 100644 (file)
@@ -62,7 +62,11 @@ af:
         description: Beskrywing
         languages: Tale
         pass_crypt: Wagwoord
+  editor:
+    id:
+      name: iD
   browse:
+    version: Weergawe
     download_xml: Laai XML af
     view_history: Sien geskiedenis
     view_details: Sien detail
@@ -344,7 +348,7 @@ af:
         historic:
           archaeological_site: Argeologiese werf
           battlefield: Slagveld
-          building: Gebou
+          building: Historiese gebou
           castle: Kasteel
           church: Kerk
           house: Huis
@@ -631,7 +635,7 @@ af:
       failure:
         more_info_2: 'hulle kan gevind word by:'
     signup_confirm:
-      subject: '[OpenStreetMap] Bevestig u e-posadres'
+      subject: '[OpenStreetMap] Welkom by OpenStreetMap'
     email_confirm:
       subject: '[OpenStreetMap] Bevestig u e-posadres'
     email_confirm_plain:
index 01d39c4..ee87120 100644 (file)
@@ -5,6 +5,7 @@
 # Author: Aude
 # Author: Bassem JARKAS
 # Author: Fahad
+# Author: Faris knight
 # Author: Grille chompa
 # Author: Houcinee1
 # Author: Kuwaity26
@@ -176,6 +177,7 @@ ar:
         way: طريق
         relation: علاقة
         changeset: حزمة التغييرات
+        note: ملحوظة
     timeout:
       sorry: عذرًا، بيانات %{type} بالمعرّف %{id} استغرقت وقتًا طويلا للاسترداد.
       type:
@@ -183,6 +185,7 @@ ar:
         way: الطريق
         relation: العلاقة
         changeset: حزمة التغييرات
+        note: ملحوظة
     redacted:
       redaction: التنقيح %{id}
       message_html: لا يمكن إظهار الإصدارة  %{version} من هذا %{type} لأن صياغتها
@@ -262,6 +265,7 @@ ar:
   diary_entry:
     new:
       title: مدخلة يومية جديدة
+      publish_button: نشر
     list:
       title: يوميات المستخدمين
       title_friends: يوميات الأصدقاء
@@ -362,8 +366,10 @@ ar:
             OpenStreetMap
         overpass:
           title: تجاوز API
+          description: تحميل مربع الإحاطة من مرآة قاعدة بيانات خريطة الشارع المفتوحة
         geofabrik:
           title: تنزيلات موقع جيوفابريك
+          description: مقتطفات محدثة بانتظام من القارات والبلدان والمدن المختارة
         other:
           title: مصادر أخرى
       options: خيارات
index c486944..52de58f 100644 (file)
@@ -1,6 +1,8 @@
 # Messages for Asturian (asturianu)
 # Exported from translatewiki.net
 # Export driver: phpyaml
+# Author: Enolp
+# Author: Macofe
 # Author: Xuacu
 ---
 ast:
@@ -10,7 +12,7 @@ ast:
   activerecord:
     models:
       acl: Llista de Control d'Accesu
-      changeset: Conxuntu de cambios
+      changeset: Conxuntu de cambeos
       changeset_tag: Etiqueta del conxuntu de cambeos
       country: País
       diary_comment: Comentariu del diariu
@@ -1435,6 +1437,7 @@ ast:
       table:
         entry:
           motorway: Autopista
+          main_road: Carretera principal
           trunk: Carretera nacional
           primary: Carretera primaria
           secondary: Carretera secundaria
@@ -1823,16 +1826,6 @@ ast:
       use external auth: Alternativamente, usa un terceru p'aniciar sesión
       auth no password: Cola autenticación con un terceru nun fai falta una contraseña,
         pero delles ferramientes estra o sirvidores inda puen necesitala.
-      auth association: |-
-        <p>La to ID inda nun ta asociada con una cuenta d'OpenStreetMap.</p>
-        <ul>
-          <li>Si yes nuevu n'OpenStreetMap, crea una cuenta nueva usando'l formulariu de más abaxo.</li>
-          <li>
-            Si yá tienes una cuenta, pues aniciar sesión con ella usando'l to
-            nome d'usuariu y contraseña y llueu asociar la cuenta cola
-            to ID na configuración d'usuariu.
-          </li>
-        </ul>
       continue: Date d'alta
       terms accepted: ¡Gracies por aceutar les condiciones de collaboración!
       terms declined: Sentimos que decidieras nun aceutar les Condiciones de Collaborador.
@@ -1919,7 +1912,7 @@ ast:
       create_block: bloquiar esti usuariu
       activate_user: activar esti usuariu
       deactivate_user: desactivar esti usuariu
-      confirm_user: confirmar esti usuariu
+      confirm_user: Confirmar esti usuariu
       hide_user: anubrir esti usuariu
       unhide_user: amosar esti usuariu
       delete_user: desaniciar esti usuariu
@@ -2070,6 +2063,15 @@ ast:
       no_authorization_code: Nun hai códigu d'autorización
       unknown_signature_algorithm: Algoritmu de firma desconocíu
       invalid_scope: Ámbitu inválidu
+    auth_association:
+      heading: La to ID inda nun ta asociada con una cuenta d'OpenStreetMap.
+      option_1: |-
+        Si yes nuevu n'OpenStreetMap, crea una cuenta nueva
+        usando'l formulariu de más abaxo.
+      option_2: |-
+        Si yá tienes una cuenta, puedes aniciar sesión nella
+        usando'l to nome d'usuariu y contraseña y llueu asociar
+        la cuenta cola ID nes preferencies d'usuariu.
   user_role:
     filter:
       not_an_administrator: Namái los alministradores pueden xestionar los roles,
index 38b9ca8..5345f31 100644 (file)
@@ -53,7 +53,7 @@ az:
         body: Mətn
       diary_entry:
         user: İstifadəçi
-        title: Başlıq
+        title: Mövzu
         latitude: En dairəsi
         longitude: Uzunluq dairəsi
         language: Dil
@@ -71,7 +71,7 @@ az:
         description: İzah
       message:
         sender: Göndərən
-        title: Başlıq
+        title: Mövzu
         body: Mətn
         recipient: Qəbul edən
       user:
@@ -93,8 +93,10 @@ az:
       name: Uzaqdan idarəetmə
       description: Uzaqdan idarəetmə (JOSM və ya Merkaartor)
   browse:
+    download_xml: XML endir
     changeset:
       title: Dəyişikliklər dəsti
+      belongs_to: Müəllif
       changesetxml: XML dəyişikliklər dəsti
       osmchangexml: osmChange XML
       feed:
index a1f20c5..519d5e9 100644 (file)
@@ -1824,7 +1824,7 @@ be:
       license_agreement: Ствараючы рахунак, вы згаджаецеся з <a href="http://www.osmfoundation.org/wiki/License/Contributor_Terms">умовамі
         удзелу</a>.
       email address: 'Паштовы адрас:'
-      confirm email address: 'Ð\9fаÑ\86веÑ\80джанне Ð¿Ð°Ñ\88Ñ\82овага Ð°Ð´Ñ\80аÑ\81Ñ\83:'
+      confirm email address: 'Ð\9fаÑ\86веÑ\80дзÑ\96Ñ\86е Ñ\8dлекÑ\82Ñ\80оннÑ\8b Ð°Ð´Ñ\80аÑ\81:'
       not displayed publicly: Не паказваецца астатнім (глядзіце <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy"
         title="палітыка неразглашэння на wiki, у тым ліку секцыя пра паштовыя адрасы">палітыку
         неразглашэння</a>)
@@ -1837,16 +1837,6 @@ be:
       use external auth: 'Для альтэрнатыўнага ўваходу, залагіньцеся цераз:'
       auth no password: Пры выкарыстанні знешняй аўтэнтыфікацыі пароль не патрэбны,
         але для некаторых дадатковых інструментаў або сервераў ён усё яшчэ спатрэбіцца.
-      auth association: |-
-        <p>Ваш ID яшчэ не звязаны з рахунакам на OpenStreetMap.</p>
-        <ul>
-          <li>Калі вы пачатковец у OpenStreetMap, калі ласка, стварыце новы рахунак, выкарыстоўваючы форму ніжэй.</li>
-          <li>
-            Калі ў вас ужо ёсць рахунак, вы можаце ўвайсці ў яго,
-            выкарыстоўваючы вашыя імя карыстальніка і пароль, і асацыяваць свой рахунак
-            з вашым ID у наладах карыстальніка.
-        </li>
-        </ul>
       continue: Зарэгістравацца
       terms accepted: Дзякуй за прыняцце новых умоў ўдзелу!
       terms declined: Нам шкада, што Вы вырашылі не прыняць новыя ўмовы супрацоўніцтва.
@@ -1858,8 +1848,8 @@ be:
       read and accept: Калі ласка, пачытайце пагадненне ніжэй і націсніце кнопку «Згодны»,
         каб пацвердзіць што Вы пагаджаецеся з умовамі гэтага пагаднення адносна Вашага
         існуючага і будучых ўнёскаў.
-      consider_pd: Ð£ Ð´Ð°Ð´Ð°Ñ\82ак Ð´Ð° Ð¿Ñ\80Ñ\8bведзенага Ð¿Ð°Ð³Ð°Ð´Ð½ÐµÐ½Ð½Ñ\8f, Ñ\8f Ð¿Ð°Ñ\86вÑ\8fÑ\80джаÑ\8e, Ñ\88Ñ\82о Ð¼Ð¾Ð¹ Ñ\83нÑ\91Ñ\81ак
-        знаходзіцца ў грамадзкім набытку
+      consider_pd: Ð£ Ð´Ð°Ð´Ð°Ñ\82ак Ð´Ð° Ð¿Ñ\80Ñ\8bведзенага Ð¿Ð°Ð³Ð°Ð´Ð½ÐµÐ½Ð½Ñ\8f, Ñ\8f Ð¿Ð°Ñ\86вÑ\8fÑ\80джаÑ\8e, Ñ\88Ñ\82о Ð¼Ð¾Ð¹ Ñ\83клад
+        знаходзіцца ў грамадскім набытку
       consider_pd_why: што гэта?
       guidance: 'Інфармацыя, якая дапаможа зразумець гэтыя ўмовы: <a href="%{summary}">кароткае
         апісанне</a> і некалькі <a href="%{translations}">неафіцыйных перакладаў</a>'
@@ -1968,13 +1958,13 @@ be:
         disabled link text: чаму я не магу рэдагаваць?
       public editing note:
         heading: Агульнае рэдагаванне
-        text: У цяперашні момант Вашыя рэдагаванні з'яўляюцца ананімнымі і людзі не
-          могуць дасылаць Вам паведамленні, ці бачыць Вашае месцазнаходжанне. Каб
-          быў бачны Ваш унёсак і людзі маглі кантактаваць з Вамі праз вэб-сайт, націсніце
-          ÐºÐ½Ð¾Ð¿ÐºÑ\83 Ð½Ñ\96жÑ\8dй. <b>Ð\9fаÑ\81лÑ\8f Ð·Ð¼ÐµÐ½Ð°Ñ\9e API Ð²Ñ\8dÑ\80Ñ\81Ñ\96Ñ\96 0.6, Ñ\82олÑ\8cкÑ\96 Ð´Ð°Ñ\81Ñ\82Ñ\83пнÑ\8bÑ\8f Ð´Ð»Ñ\8f Ñ\81Ñ\83вÑ\8fзÑ\96
-          карыстальнікі могуць рэдагаваць звесткі на карце</b>. (<a href="http://wiki.openstreetmap.org/wiki/Anonymous_edits">даведацца
-          чамуе можа быць адменена і ўсе новыя карыстальнікі цяпер даступныя для сувязі
-          па змоўчванні.</li></ul>
+        text: У цяперашні момант Вашы рэдагаванні з'яўляюцца ананімнымі, і людзі не
+          могуць дасылаць Вам паведамленні, ці бачыць Ваша месцазнаходжанне. Каб быў
+          бачны Ваш уклад, і людзі маглі звязацца з Вамі праз вэб-сайт, націсніце
+          ÐºÐ½Ð¾Ð¿ÐºÑ\83 Ð½Ñ\96жÑ\8dй. <b>Ð\9fаÑ\81лÑ\8f Ð¿ÐµÑ\80аÑ\85одÑ\83 Ð½Ð° API Ð²ÐµÑ\80Ñ\81Ñ\96Ñ\96 0.6, Ñ\82олÑ\8cкÑ\96 Ð´Ð°Ñ\81Ñ\82Ñ\83пнÑ\8bÑ\8f Ð´Ð»Ñ\8f
+          сувязі карыстальнікі могуць рэдагаваць звесткі на карце</b>. (<a href="http://wiki.openstreetmap.org/wiki/Anonymous_edits">даведацца,
+          чаму</a>) <ul><li>Гэта дзеянне не можа быць адменена, а ўсе новыя карыстальнікі
+          цяпер даступныя для сувязі па змаўчанні.</li></ul>
       contributor terms:
         heading: 'Умовы ўдзелу:'
         agreed: Вы пагадзіліся на новыя ўмовы ўдзелу.
@@ -2005,7 +1995,8 @@ be:
       make edits public button: Зрабіць усе мае змены публічнымі
       return to profile: Вярнуцца да профілю
       flash update success confirm needed: Звесткі аб карыстальніку паспяхова абноўленыя.
-        Праверце сваю пошту, вам павінны прыйсці запыт на пацверджанне змены адрасу.
+        Праверце сваю эл.пошту, вам павінен прыйсці запыт на пацвярджэнне вашага новага
+        адраса.
       flash update success: Звесткі аб карыстальніку паспяхова абноўленыя.
     confirm:
       heading: Праверце вашу электронную пошту!
@@ -2028,7 +2019,7 @@ be:
         запыты.
       failure: Карыстальнік %{name} не знойдзены.
     confirm_email:
-      heading: Пацвердзіць змену паштовага адрасу
+      heading: Пацвердзіць змену паштовага адраса
       press confirm button: Націсніце кнопку, каб пацвердзіць ваш новы паштовы адрас.
       button: Пацвердзіць
       success: Змена вамі адраса электроннай пошты пацверджана!
index 327cda1..5bb7df4 100644 (file)
@@ -1458,6 +1458,7 @@ br:
       table:
         entry:
           motorway: Gourhent
+          main_road: Hent pennañ
           trunk: Hent broadel
           primary: Hent bras
           secondary: Hent bihan
@@ -1869,6 +1870,7 @@ br:
       heading: N'eus ket eus an implijer %{user}
       body: Ho tigarez, n'eus implijer ebet en anv %{user}. Gwiriit hag-eñ eo skrivet
         mat, pe marteze hoc'h eus kliket war ul liamm fall.
+      deleted: dilamet
     view:
       my diary: ma deizlevr
       new diary entry: enmoned nevez en deizlevr
@@ -2074,6 +2076,8 @@ br:
       no_authorization_code: Kod aotre ebet
       unknown_signature_algorithm: Kod aotre dianav
       invalid_scope: Astenn dianav
+    auth_association:
+      heading: N'eo ket kevredet ho ID ouzh ur gont OpenStreetMap.
   user_role:
     filter:
       not_an_administrator: N'eus nemet ar verourien a c'hall merañ ar rolloù, ha
@@ -2322,6 +2326,9 @@ br:
         mapquest_car: Karr (MapQuest)
         mapquest_foot: Troad (MapQuest)
         osrm_car: Karr(OSRM)
+        mapzen_bicycle: Marc'h-houarn (Mapzen)
+        mapzen_car: Karr (Mapzen)
+        mapzen_foot: War droad (Mapzen)
       directions: Tuioù
       distance: Hed
       errors:
index c512b54..f8c8f0b 100644 (file)
@@ -673,7 +673,7 @@ bs:
           preserved: Sačuvana pruga
           spur: Pruga
           station: Željeznička stanica
-          subway: Stanica podzemne željeznice
+          subway: Podzemna željeznica
           subway_entrance: Ulaz u podzemnu željezničku stanicu
           switch: Skretnica
           tram: Tramvaj
@@ -1679,7 +1679,7 @@ bs:
       press confirm button: Pritsnite potvrdno dugme ispod da bi ste potvrdili novu
         e-mail adresu.
       button: Potvrditi
-      success: Vaša e-mail adresa je potvrđena, hvala na uključenju!
+      success: Promjena adrese e-pošte je potvrđena!
       failure: E-mail adresa je već potvrđena sa ovom značkom.
     set_home:
       flash success: Matična lokacija uspješno snimljena.
index 06743a9..647875b 100644 (file)
@@ -9,6 +9,7 @@
 # Author: Fitoschido
 # Author: Gemmaa
 # Author: Grondin
+# Author: Jaumeortola
 # Author: Jconstanti
 # Author: Jmontane
 # Author: Macofe
@@ -1115,8 +1116,8 @@ ca:
         href="http://dmca.openstreetmap.org/">formulari en línia.</a>.
       trademarks_title_html: <span id="trademarks"></span>Marques registrades
       trademarks_1_html: OpenStreetMap i el logotip de la lupa són marques registrades
-        de la Fundació OpenStreetMap. Si vostè té preguntes sobre l'ús de les marques,
-        si us plau envieu les vostres preguntes a la <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">Grup
+        de la Fundació OpenStreetMap. Si teniu preguntes sobre l'ús de les marques,
+        si us plau envieu-les vostres al <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">Grup
         de Treball de Llicències</a>.
   welcome_page:
     title: Benvingut!
@@ -1296,8 +1297,8 @@ ca:
       confirm: 'Primer de tot hem de confirmar que aquesta petició ha estat feta per
         vostè, si ha estat així, si us plau, premeu sobre el següent enllaç per tal
         confirmar la vostra petició de creació del compte d''usuari:'
-      welcome: Després que confirmis el teu compte, et donarem més informació per
-        tal que puguis començar amb els coneixements bàsics.
+      welcome: Una vegada hàgiu confirmat el compte, us donarem alguna informació
+        addicional perquè pugueu començar.
     email_confirm:
       subject: '[OpenStreetMap] Confirmeu l''adreça de correu'
     email_confirm_plain:
@@ -1432,9 +1433,9 @@ ca:
       unread_button: Marca com a no llegit
       back: Enrere
       to: Per a
-      wrong_user: Heu iniciat la sessió com a "%{user}", però el missatge que proveu
-        de llegir a no va ser enviat o adreçat a aquest usuari. Si us plau connecteu-vos
-        com l'usuari correcte per poder llegir-ho.
+      wrong_user: Heu iniciat la sessió com a "%{user}", però el missatge que voleu
+        llegir no va ser enviat per o adreçat a aquest usuari. Connecteu-vos com l'usuari
+        correcte per a poder llegir-lo.
     sent_message_summary:
       delete_button: Suprimeix
     mark:
@@ -1456,8 +1457,8 @@ ca:
       remote_failed: L'edició ha fallat. Assegureu-vos que el JOSM, o el Merkaartor,
         esta executant-se i que l'opció de comandament a distància està habilitada
     edit:
-      not_public: No heu fet les configuracions necessàries per tal que les vostres
-        modificacions siguin públiques.
+      not_public: No heu fet les configuracions necessàries perquè les vostres modificacions
+        siguin públiques.
       not_public_description: Ja no podeu modificar el mapa a menys que feu públics
         els vostres canvis. Podeu configurar les modificacions com a públiques a la
         vostra %{user_page}.
@@ -1492,6 +1493,7 @@ ca:
       table:
         entry:
           motorway: Autopista
+          main_road: Carretera principal
           trunk: Autovia de
           primary: Carretera principal
           secondary: Carretera secundària
@@ -1881,14 +1883,6 @@ ca:
       use external auth: Alternativament, inicieu una sessió mitjançant un tercer
       auth no password: Amb l'autentificació per tercers no es requereix una contrasenya,
         però alguns servidors o eines extres poden encara necessitar una.
-      auth association: |-
-        <p>El ID no està associat encara amb cap compte d'OpenStreetMap.</p>
-        <ul>
-         <li>Si sou nou a OpenStreetMap, si us plau creeu un compte utilitzant el formulari següent.</li>
-         <li>
-         Si ja teniu un compte, podeu iniciar la sessió al vostre compte  utilitzant el seu nom d'usuari i contrasenya i, a continuació associar el compte amb el seu ID a la seva configuració d'usuari.
-         </li>
-        </ul>
       continue: Crear un compte
       terms accepted: Gràcies per a l'acceptació de les condicions de col. laborador
         nou!
@@ -1920,6 +1914,7 @@ ca:
       heading: L'usuari %{user} no existeix
       body: No hi ha cap usuari amb el nom %{user}. Comproveu l'ortografia, o potser
         l'enllaç on heu fet clic és incorrecte.
+      deleted: esborrat
     view:
       my diary: El meu diari
       new diary entry: Nova entrada del diari
@@ -1977,7 +1972,7 @@ ca:
       create_block: bloca aquest usuari
       activate_user: activa aquest usuari
       deactivate_user: desactiva aquest usuari
-      confirm_user: confirma aquest usuari
+      confirm_user: Confirma aquest usuari
       hide_user: amagar aquest usuari
       unhide_user: Inamagui's d'aquest usuari
       delete_user: Suprimeix aquest usuari
@@ -2040,7 +2035,7 @@ ca:
       keep image: Conserva la imatge actual
       delete image: Suprimeix la imatge actual
       replace image: Reemplaça la imatge actual
-      image size hint: (Plaça imatges com a mínim 100 x 100 treball millor)
+      image size hint: (val més usar imatges quadrades d'almenys 100x100)
       home location: 'Ubicació inicial:'
       no home location: No heu especificat la ubicació d'origen.
       latitude: 'Latitud:'
@@ -2129,6 +2124,14 @@ ca:
       no_authorization_code: Sense codi d'autorització
       unknown_signature_algorithm: Algorisme de signatura desconegut
       invalid_scope: Àmbit no vàlid
+    auth_association:
+      heading: El teu ID encara no està associat a cap compte a OpenStreetMap
+      option_1: |-
+        Si sou nou a OpenStreetMap, si us plau creeu un compte nou
+        Utilitzant el formulari de sota.
+      option_2: |-
+        Si ja teniu un compte, podeu iniciar sessió al vostre compte
+        utilitzant el vostre nom d'usuari i contrasenya i, a continuació associar el compte amb el ID a la configuració d'usuari.
   user_role:
     filter:
       not_an_administrator: Només els administradors poden realitzar l'administració
@@ -2377,6 +2380,9 @@ ca:
         mapquest_car: Cotxe (MapQuest)
         mapquest_foot: A peu (MapQuest)
         osrm_car: Cotxe (OSRM)
+        mapzen_bicycle: Bicicleta (Mapzen)
+        mapzen_car: Cotxe (Mapzen)
+        mapzen_foot: A peu (Mapzen)
       directions: Indicacions
       distance: Distància
       errors:
index d368571..1516a67 100644 (file)
@@ -1452,6 +1452,7 @@ cs:
       table:
         entry:
           motorway: Dálnice
+          main_road: Hlavní silnice
           trunk: Významná silnice
           primary: Silnice první třídy
           secondary: Silnice druhé třídy
@@ -1694,8 +1695,8 @@ cs:
       submit: Upravit
     show:
       title: Podrobnosti OAuth pro %{app_name}
-      key: 'Uživatelský klíč:'
-      secret: 'Tajný klíč uživatele:'
+      key: 'Klíč konzumenta (consumer key):'
+      secret: 'Tajemství konzumenta (consumer secret):'
       url: 'URL tokenu požadavku:'
       access_url: 'URL přístupového tokenu:'
       authorize_url: 'Autorizační URL:'
@@ -1843,16 +1844,6 @@ cs:
       use external auth: Případně se přihlaste prostřednictvím třetí strany
       auth no password: S autentizací třetí stranou není heslo potřeba, ale některé
         další nástroje nebo servery je mohou přesto potřebovat.
-      auth association: |-
-        <p>Vaše ID dosud nebylo propojeno s účtem na OpenStreetMap.</p>
-        <ul>
-         <li>Pokud jste na OpenStreetMap noví, vytvořte si nový účet pomocí formuláře níže.</li>
-         <li>
-          Pokud již účet máte, můžete se k němu přihlásit
-          pomocí uživatelského jména a hesla a poté ho
-          v uživatelském nastavení propojit se svým ID.
-         </li>
-        </ul>
       continue: Zaregistrovat se
       terms accepted: Děkujeme za odsouhlasení nových podmínek pro přispěvatele!
       terms declined: Je nám líto, že jste se rozhodli nepřijmout nové Podmínky pro
@@ -1883,6 +1874,7 @@ cs:
       heading: Uživatel %{user} neexistuje
       body: Je mi líto, ale uživatel %{user} neexistuje. Zkontrolujte překlepy nebo
         jste možná klikli na chybný odkaz.
+      deleted: smazán
     view:
       my diary: Můj deníček
       new diary entry: nový záznam do deníčku
@@ -1935,16 +1927,16 @@ cs:
         revoke:
           administrator: Odebrat práva správce
           moderator: Odebrat práva moderátora
-      block_history: zablokování
-      moderator_history: udělená zablokování
+      block_history: Účinná zablokování
+      moderator_history: Udělená zablokování
       comments: Komentáře
-      create_block: blokovat tohoto uživatele
-      activate_user: aktivovat tohoto uživatele
-      deactivate_user: deaktivovat tohoto uživatele
-      confirm_user: potvrdit tohoto uživatele
-      hide_user: skrýt tohoto uživatele
-      unhide_user: zobrazit tohoto uživatele
-      delete_user: odstranit tohoto uživatele
+      create_block: Blokovat tohoto uživatele
+      activate_user: Aktivovat tohoto uživatele
+      deactivate_user: Deaktivovat tohoto uživatele
+      confirm_user: Potvrdit tohoto uživatele
+      hide_user: Skrýt tohoto uživatele
+      unhide_user: Zobrazit tohoto uživatele
+      delete_user: Odstranit tohoto uživatele
       confirm: Potvrdit
       friends_changesets: sady změn přátel
       friends_diaries: záznamy v deníčcích přátel
@@ -2089,6 +2081,12 @@ cs:
       no_authorization_code: Bez autorizačního kódu
       unknown_signature_algorithm: Neznámý algoritmus podpisu
       invalid_scope: Neplatný rozsah
+    auth_association:
+      heading: Vaše ID dosud není propojeno s účtem OpenStreetMap.
+      option_1: Pokud jste na OpenStreetMap noví, založte si prosím nový účet pomocí
+        níže zobrazeného formuláře.
+      option_2: Pokud již účet máte, můžete se k němu přihlásit pomocí svého uživatelského
+        jména a hesla a poté v uživatelském nastavení účet propojit s vaším ID.
   user_role:
     filter:
       not_an_administrator: Spravovat role mohou pouze administrátoři. Vy administrátor
index ea1ee31..c909786 100644 (file)
@@ -7,21 +7,29 @@
 cy:
   time:
     formats:
-      friendly: '%e %B %Y am %H:%M'
+      friendly: '%e %B %Y at %H:%M'
   activerecord:
     models:
       acl: Rhestr Rheoli Mynediad
+      changeset: Changeset
+      changeset_tag: Tag Changeset
       country: Gwlad
       diary_comment: Nodyn Dyddiadur
       diary_entry: Cofnod Dyddiadur
       friend: Ffrind
       language: Iaith
       message: Neges
+      node: Nod
+      node_tag: Tag Nod
       notifier: Hysbysydd
+      old_node: Hen Nod
+      old_node_tag: Tag Hen Nod
       old_relation: Hen Berthynas
       old_relation_member: Aelod o Hen Berthynas
       old_relation_tag: Tag Hen Berthynas
       old_way: Hen Lwybr
+      old_way_node: Nod Hen Ffordd
+      old_way_tag: Tag Hen Ffordd
       relation: Perthynas
       session: Sesiwn
       trace: Dargopïo
@@ -71,6 +79,8 @@ cy:
     id:
       name: iD
       description: iD (golygydd y porwr)
+    remote:
+      name: Rheolaeth o bell
   browse:
     created: Crewyd
     closed: Wedi cau
@@ -293,14 +303,20 @@ cy:
     search_osm_nominatim:
       prefix:
         aerialway:
+          cable_car: Car Cebl
           chair_lift: Cadair godi
           drag_lift: Cadair lusg
+          gondola: Lifft Gondola
+          station: Gorsaf Awyr
         aeroway:
           aerodrome: Maesawyr
           apron: Ffedog
           gate: Giat
           helipad: Pad Hofrennydd
+          runway: Rhedfa Awyr
+          terminal: Terfynell
         amenity:
+          animal_shelter: Cysgod Anifeiliaid
           arts_centre: Canolfan Grefftau
           atm: Peiriant Codi Arian
           bank: Banc
@@ -310,6 +326,7 @@ cy:
           bicycle_parking: Man Cadw Beic
           bicycle_rental: Man Llogi Beic
           biergarten: Gardd Gwrw
+          boat_rental: Llogi Cychod
           brothel: Puteindy
           bureau_de_change: Bureau de Change
           bus_station: Gorsaf Fysiau
@@ -319,19 +336,23 @@ cy:
           car_wash: Golchwr Cerbyd
           casino: Casino
           charging_station: Gorsaf Gwefru
+          childcare: Man Gwarchod Plant
           cinema: Sinema
           clinic: Clinic
+          clock: Cloc
           college: Coleg
           community_centre: Canolfan Cymunedol
           courthouse: Llys
           crematorium: Amlosgfa
           dentist: Deintydd
           doctors: Meddygfa
+          dormitory: Noswylfa
           drinking_water: Dŵr Yfed
           driving_school: Ysgol Yrru
           embassy: Llysgenhadaeth
           emergency_phone: Ffôn Argyfwng
           fast_food: Bwyd Parod
+          ferry_terminal: Terfynell Fferi
           fire_station: Gorsaf Dân
           food_court: Cwrt Fwydydd
           fountain: Ffynnon
@@ -345,11 +366,14 @@ cy:
           library: Llyfrgell
           market: Marchnad
           marketplace: Marchnad
+          monastery: Mynachdy
+          motorcycle_parking: Man Parcio Beiciau Modur
           nightclub: Clwb Nôs
           nursery: Meithrinfa
           nursing_home: Cartref Nyrsio
           office: Swyddfa
           parking: Parcio
+          parking_entrance: Mynedfa Man Parcio
           pharmacy: Fferyllfa
           place_of_worship: Man addoli
           police: Heddlu
@@ -394,10 +418,21 @@ cy:
           "yes": Pont
         building:
           "yes": Adeilad
+        craft:
+          brewery: Bragdy
+          carpenter: Saer
+          electrician: Trydanydd
+          gardener: Garddwr
+          painter: Peintiwr
+          photographer: Ffotograffydd
+          plumber: Plymar
+          "yes": Siop Grefftau
         emergency:
+          ambulance_station: Gorsaf Ambiwlans
           phone: Ffôn Argyfwng
         highway:
           bridleway: Llwybr Ceffyl
+          bus_guideway: Lon Bysiau
           bus_stop: Stop Bysiau
           construction: Priffordd yn cael ei Adeiladu
           cycleway: Llwybr Beicio
@@ -414,10 +449,12 @@ cy:
           primary: Priffordd
           primary_link: Priffordd
           proposed: Ffordd Arfaethedig
+          residential: Ffordd
           rest_area: Man Gorffwys
           road: Ffordd
           secondary: Ffordd Eilaidd
           secondary_link: Ffordd Eilaidd
+          service: Ffordd Waith
           services: Gwasanaethau Traffordd
           speed_camera: Camera Cyflymder
           steps: Grisiau
@@ -425,32 +462,41 @@ cy:
           tertiary: Ffordd Trydyddol
           tertiary_link: Ffordd Trydyddol
           track: Trac
+          traffic_signals: Goleuadau Traffig
           trail: Llwybr
           trunk: Cefnffordd
           trunk_link: Cefnffordd
           unclassified: Ffordd Diddosbarth
           unsurfaced: Ffordd Heb Wyneb
+          "yes": Ffordd
         historic:
           archaeological_site: Safle Archaeolegol
           battlefield: Maes Brwydr
           boundary_stone: Maen Terfyn
-          building: Adeilad
+          building: Adeilad Hanesyddol
+          bunker: Byncar
           castle: Castell
           church: Eglwys
+          city_gate: Gat y Ddinas
           citywalls: Waliau Ddinas
           fort: Caer
+          heritage: Safle Dreftadaeth
           house: Tŷ
           icon: Eicon
           manor: Maenor
           memorial: Cofeb
           mine: Mwynfa
           monument: Cofadail
+          roman_road: Ffordd Rufeinig
           ruins: Adfeilion
+          stone: Carreg
           tomb: Beddrod
           tower: Tŵr
           wayside_cross: Croes Min Ffordd
           wayside_shrine: Cysegrfa Min Ffordd
           wreck: Llongddrylliad
+        junction:
+          "yes": Cyffordd
         landuse:
           allotments: Rhandiroedd
           basin: Basn
@@ -481,8 +527,11 @@ cy:
           vineyard: Gwinllan
         leisure:
           beach_resort: Ardal Wyliau
+          club: Clwb
           common: Tir Comin
+          dog_park: Parc Cwn
           fishing: Man Pysgota
+          fitness_centre: Canolfan Gadw'n Heini
           garden: Gardd
           golf_course: Cwrs Golff
           ice_rink: Llawr Sglefrio
@@ -500,6 +549,11 @@ cy:
           swimming_pool: Pwll Nofio
           track: Trac Rhedeg
           water_park: Parc Dŵr
+        man_made:
+          lighthouse: Goleudy
+          pipeline: Pibell
+          works: Ffatri
+          "yes": Wnaed gan Ddyn
         military:
           airfield: Maes Awyr Milwrol
           barracks: Barics
@@ -518,6 +572,7 @@ cy:
           forest: Coedwig
           geyser: Geiser
           glacier: Rhewlif
+          grassland: Caeau
           heath: Rhos
           hill: Bryn
           island: Ynys
@@ -530,7 +585,9 @@ cy:
           reef: Riff
           ridge: Cefn
           rock: Craig
+          sand: Tywod
           scree: Sgri
+          scrub: Llwyni
           spring: Ffynnon
           stone: Carreg
           strait: Culfor
@@ -542,6 +599,7 @@ cy:
           wood: Coed
         office:
           accountant: Cyfrifydd
+          administrative: Gweinyddu
           architect: Pensaer
           company: Cwmni
           employment_agency: Asiantaeth Cyflogi
@@ -593,6 +651,7 @@ cy:
           proposed: Rheilfford Arfaethedig
           spur: Cainc Rheilffordd
           station: Gorsaf Drenau
+          stop: Siop Reilffordd
           subway: Gorsaf Drenau Tanddaearol
           subway_entrance: Mynedfa at Drenau Tanddaearol
           tram: Tramffordd
@@ -681,6 +740,7 @@ cy:
           camp_site: Man Gwersylla
           caravan_site: Parc Carafanau
           chalet: Chalet
+          gallery: Galeri
           guest_house: Llety
           hostel: Hostel
           hotel: Gwesty
@@ -695,6 +755,7 @@ cy:
           culvert: Twnel Ddŵr
           "yes": Twnel
         waterway:
+          boatyard: Iard Gychod
           canal: Camlas
           dam: Argae
           derelict_canal: Camlas Diffaith
@@ -719,6 +780,10 @@ cy:
         level9: Ffin Pentref
         level10: Ffin Maesdref
     description:
+      title:
+        osm_nominatim: Lleoliad o <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+          Nominatim</a>
+        geonames: Lleoliad o <a href="http://www.geonames.org/">GeoNames</a>
       types:
         cities: Dinasoedd
         towns: Trefi
@@ -779,6 +844,7 @@ cy:
       english_link: y Saesneg gwreiddiol
     native:
       title: Ynghylch y dudalen hon
+      native_link: Cymraeg
       mapping_link: dechrau mapio
     legal_babble:
       title_html: Hawlfraint a Thrwydded
index e81d19c..95323c3 100644 (file)
@@ -8,8 +8,11 @@
 # Author: Freek
 # Author: Gnonthgol
 # Author: Gorbi
+# Author: Hede2000
 # Author: Hein0170
 # Author: Hylle
+# Author: Jens Jensen
+# Author: JrOsm
 # Author: Kaare
 # Author: Luckas
 # Author: Nemo bis
@@ -174,6 +177,7 @@ da:
         way: vej
         relation: relation
         changeset: ændringssæt
+        note: bemærk
     timeout:
       sorry: Beklager, data for %{type} med id %{id} tog for lang tid at hente
       type:
@@ -181,6 +185,7 @@ da:
         way: vej
         relation: relation
         changeset: ændringssæt
+        note: bemærk
     redacted:
       redaction: Omarbejdelse %{id}
       message_html: Version %{version} af %{type} kan ikke vises, da den er omarbejdet.
@@ -229,6 +234,7 @@ da:
       title: Forespørgselsfunktioner
       introduction: Klik på kortet for at finde funktioner i nærheden.
       nearby: Funktioner i nærheden
+      enclosing: Indkapslede områder
   changeset:
     changeset_paging_nav:
       showing_page: Side %{page}
@@ -269,6 +275,7 @@ da:
   diary_entry:
     new:
       title: Nyt blogindlæg
+      publish_button: Offentliggør
     list:
       title: Brugerblogs
       title_friends: Venners blogs
@@ -420,6 +427,7 @@ da:
           taxiway: Rullevej
           terminal: Terminal
         amenity:
+          animal_shelter: Dyreinternat
           arts_centre: Kunstcenter
           atm: Pengeautomat
           bank: Bank
@@ -538,7 +546,9 @@ da:
           plumber: Blikkenslager
           shoemaker: Skomager
           tailor: Skrædder
+          "yes": Håndsværksbutik
         emergency:
+          ambulance_station: Ambulancestation
           defibrillator: Hjertestarter
           landing_site: Nødlandingsplads
           phone: Nødtelefon
@@ -578,7 +588,7 @@ da:
           tertiary: Hovedvej
           tertiary_link: Hovedvej
           track: Hjulspor
-          traffic_signals: Traffiklys
+          traffic_signals: Trafiklys
           trail: Spor
           trunk: Motortrafikvej
           trunk_link: Motortrafikvej
@@ -596,6 +606,7 @@ da:
           city_gate: Byport
           citywalls: Bymure
           fort: Skanse
+          heritage: Kulturarvssted
           house: Hus
           icon: Ikon
           manor: Herregård
@@ -651,6 +662,7 @@ da:
           common: Fælles arealer
           dog_park: Hundepark
           fishing: Fiskeområde
+          fitness_centre: Motionscenter
           fitness_station: Udendørs fitness udstyr
           garden: Have
           golf_course: Golfbane
@@ -663,6 +675,7 @@ da:
           pitch: Sportsarena
           playground: Legeplads
           recreation_ground: Idrætsplads
+          resort: Feriested
           sauna: Sauna
           slipway: Bedding
           sports_centre: Sportscenter
@@ -909,12 +922,12 @@ da:
           "yes": Vandvej
       admin_levels:
         level2: Landegrænse
-        level4: Statsgrænse
+        level4: Regionsgrænse
         level5: Regionsgrænse
         level6: Kommunegrænse
         level8: Bygrænse
-        level9: Landsbygrænse
-        level10: Forstadsgrænse
+        level9: Bydelsgrænse
+        level10: Sognegrænse
     description:
       title:
         osm_nominatim: Position fra <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
@@ -991,9 +1004,10 @@ da:
     legal_babble:
       title_html: Ophavsret og licens
       intro_1_html: |-
-        OpenStreetMap er <i>åbne data</i>, licenseret under <a
+        OpenStreetMap<sup><a href="#trademarks">&reg;</a></sup> er <i>åbne data</i>, licenseret under <a
         href="http://opendatacommons.org/licenses/odbl/">Open Data
-        Commons Open Database License</a> (ODbL).
+        Commons Open Database License</a> (ODbL) af <a
+        href="http://osmfoundation.org/">OpenStreetMap Foundation</a> (OSMF).
       intro_2_html: "Du kan frit kopiere, distribuere, overføre og tilpasse vores
         data, \nså længe du angiver OpenStreetMap og dets\nbidragsydere som kilde.
         Hvis du ændrer eller bygger på vores\ndata, må du kun distribuere resultatet
@@ -1022,7 +1036,8 @@ da:
         title: Eksempel på kildeangivelse
       more_title_html: Læs mere
       more_1_html: |-
-        Læs mere om brug af vores data, og hvordan du kreditere os, på den <a
+        Læs mere om brug af vores data, og hvordan du kreditere os, på <a
+        href="http://osmfoundation.org/Licence">OSMF Licenssiden</a> og på den <a
         href="http://wiki.openstreetmap.org/wiki/Legal_FAQ">juridiske
         FAQ</a>.
       more_2_html: |-
@@ -1060,6 +1075,11 @@ da:
         (<a href="http://www.and.com">www.and.com</a>)
       contributors_nz_html: "<strong>New Zealand</strong>: Indeholder data fra \nLand
         Information New Zealand. Crown Copyright reserveret."
+      contributors_si_html: |-
+        <strong>Slovenien</strong>: Indeholder data fra
+        <a href="http://www.gu.gov.si/en/">Opmålings- og Kortlægnings-myndigheden</a> og
+        <a href="http://www.mkgp.gov.si/en/">Ministeriet for Landbrug, Skovbrug og Fødevarer</a>
+        (offentlig information Slovenien).
       contributors_za_html: |-
         <strong>Syd Afrika</strong>: Indeholder data fra
         <a href="http://www.ngi.gov.za/">Chief Directorate:
@@ -1085,6 +1105,10 @@ da:
          føjet til OpenStreetMap databasen eller dette websted, bedes du følge
          vores <a href="http://www.osmfoundation.org/wiki/License/Takedown_procedure">procedure til fjernelse a materiale</a> eller udfyld formular direkte på vores
         <a href="http://dmca.openstreetmap.org/">on-line side</a>.
+      trademarks_title_html: <span id="trademarks"></span>Varemærker
+      trademarks_1_html: OpenStreetMap og forstørrelsesglaslogoet er registrerede
+        varemærker for OpenStreetMap Foundation. Hvis du har spørgsmål om din brug
+        af mærkerne, bedes du sende dine spørgsmål til <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">Licens-arbejdsgruppen</a>.
   welcome_page:
     title: Velkommen!
     introduction_html: Velkommen til OpenStreetMap, det frie brugerredigerede verdenskort.
@@ -1114,6 +1138,14 @@ da:
       tag_html: En <strong>egenskab</strong> er en lille bid information om et "punkt"
         eller en "vej", f.eks. navnet på en restaurant eller hastighedsbegrænsningen
         på en vej.
+    rules:
+      title: Regler!
+      paragraph_1_html: "OpenStreetMap har få formelle regler, men vi forventer, at
+        alle deltagere vil samarbejde\nmed, og kommunikere med fællesskabet. Hvis
+        du overvejer\nandre aktiviteter end manuel redigering af en side, skal du
+        læse og følge retningslinjerne på \n<a href=\"http://wiki.openstreetmap.org/wiki/Import/Guidelines\">Import</a>
+        og \n<a href=\"http://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct\">Automatiserede
+        Redigeringer</a>."
     questions:
       title: Spørgsmål?
       paragraph_1_html: |-
@@ -1160,11 +1192,28 @@ da:
       description: Start med denne hurtige guide der dækker det grundlæggende i OpenStreetMap.
     beginners_guide:
       url: http://wiki.openstreetmap.org/wiki/Da:Beginners%27_guide
+      title: Hjælp for nybegyndere
+      description: Hjælp for nybegyndere, som vedligeholdes af fællesskabet.
     help:
       url: https://help.openstreetmap.org/
       title: help.openstreetmap.org
       description: Stil et spørgsmål eller find et svar på OSMs spørgsmål og svar
         side.
+    mailing_lists:
+      title: Mailinglister
+      description: Stil et spørgsmål eller diskuter interessante spørgsmål på en bred
+        vifte af tematiske eller regionale mailinglister.
+    forums:
+      title: Fora
+      description: Spørgsmål og diskussioner for dem, der foretrækker et opslagstavlelignende
+        interface.
+    irc:
+      title: IRC
+      description: Interaktiv chat på mange forskellige sprog, og om mange emner.
+    switch2osm:
+      title: switch2osm
+      description: Hjælp til virksomheder og organisationer, der skifter til OpenStreetMap
+        baserede kort og andre tjenester.
     wiki:
       url: http://wiki.openstreetmap.org/
       title: wiki.openstreetmap.org
@@ -1172,7 +1221,7 @@ da:
   about_page:
     next: Næste
     copyright_html: <span>&copy;</span>OpenStreetMap<br>bidragsydere
-    used_by: '%{name} stiller kortdata til rådighed for hundredvis af websteder, mobile
+    used_by: '%{name} stiller kortdata til rådighed for tusindvis af websteder, mobile
       apps og hardware-enheder'
     lede_text: OpenStreetMap er bygget af et fællesskab af kortlæggere, der bidrager
       og vedligeholder data om veje, stier, caféer, jernbanestationer og meget mere,
@@ -1196,6 +1245,12 @@ da:
       så længe du nævner OpenStreetMap og dets bidragsydere. Hvis du ændrer eller
       bygger oven på data på bestemte måder, må du kun distribuere resultatet under
       den samme licens. Se siden om <a href='%{copyright_path}'>ophavsret og licens</a> for detaljer.
+    legal_title: Juridisk
+    legal_html: "Dette websted og mange andre relaterede ydelser er formelt drevet
+      af \n<a href=\"http://osmfoundation.org/\">OpenStreetMap Foundation</a> (OSMF)
+      \npå vegne af fællesskabet.\n<br> \nDu bedes <a href=\"http://osmfoundation.org/Contact\">kontakte
+      OSMF</a> \nhvis du har spørgsmål om licenser, ophavsret eller andre juridiske
+      spørgsmål og problemstillinger."
     partners_title: Partnere
   notifier:
     diary_comment_notification:
@@ -1430,6 +1485,7 @@ da:
       table:
         entry:
           motorway: Motorvej
+          main_road: Hovedvej
           trunk: Motortrafikvej
           primary: Hovedvej (primærrute)
           secondary: Hovedvej (sekundærrute)
@@ -1647,6 +1703,7 @@ da:
       allow_read_gpx: læse dine private GPS-spor.
       allow_write_gpx: Upload GPS-spor.
       allow_write_notes: ændre bemærkninger.
+      grant_access: Tillad adgang
     oauthorize_success:
       title: Anmodning om tilladelse godkendt
       allowed: Du har givet programmet %{app_name} adgang til din konto.
@@ -1751,6 +1808,12 @@ da:
         google:
           title: Log på med Google
           alt: Log på med et Google OpenID
+        facebook:
+          title: Log på med Facebook
+          alt: Log på med en Facebook-konto
+        windowslive:
+          title: Log på med Windows Live
+          alt: Log på med en Windows Live-konto
         yahoo:
           title: Log på med Yahoo
           alt: Log på med et Yahoo OpenID
@@ -1809,16 +1872,6 @@ da:
       use external auth: Alternativt kan du bruge en tredjepart for at logge på
       auth no password: Med tredjeparts-godkendelse er en adgangskode ikke påkrævet,
         men nogle ekstra værktøjer eller servere, har muligvis stadig brug for en.
-      auth association: |-
-        <p>Dit ID er endnu ikke tilknyttet en OpenStreetMap konto.</p>
-        <ul>
-        <li>Hvis du er ny på OpenStreetMap, skal du oprette en ny konto ved hjælp af formularen nedenfor.</li>
-        <li>
-            Hvis du allerede har en konto, kan du logge på din konto
-            ved hjælp af dit brugernavn og adgangskode og derefter knytte kontoen
-            med dit ID i dine brugerindstillinger.
-        </li>
-        </ul>
       continue: Opret konto
       terms accepted: Tak for at du accepterede de nye vilkår for bidragsydere!
       terms declined: Vi er kede af at du har besluttet at du ikke kan acceptere de
@@ -1849,6 +1902,7 @@ da:
       heading: Brugeren %{user} findes ikke
       body: Der findes desværre ingen bruger ved navn %{user}. Tjek venligst stavningen,
         ellers kan linket du trykkede på være forkert.
+      deleted: slettet
     view:
       my diary: Min blog
       new diary entry: nyt blogindlæg
@@ -1926,6 +1980,7 @@ da:
       current email address: 'Nuværende e-mailadresse:'
       new email address: 'Ny e-mailadresse:'
       email never displayed publicly: (vises aldrig offentligt)
+      external auth: 'Ekstern godkendelse:'
       openid:
         link: http://wiki.openstreetmap.org/wiki/OpenID
         link text: hvad er dette?
@@ -2044,6 +2099,21 @@ da:
         mistænkelig aktivitet. \n</p>\n<p>\n Denne beslutning vil blive gennemgået
         af en administrator snarest, eller du kan kontakte %{webmaster} hvis du ønsker
         at drøfte det.\n</p>"
+    auth_failure:
+      connection_failed: Forbindelse til godkendelsesudbyder mislykkedes
+      invalid_credentials: Ugyldig godkendelse af legitimationsoplysninger
+      no_authorization_code: Ingen godkendelseskode
+      unknown_signature_algorithm: Ukendt signaturalgoritme
+      invalid_scope: Ugyldigt anvendelsesområde
+    auth_association:
+      heading: Dit ID er ikke forbundet med en OpenStreetMap konto endnu.
+      option_1: |-
+        Hvis du er ny på OpenStreetMap, skal du oprette en ny konto
+        ved hjælp af formularen nedenfor.
+      option_2: |-
+        Hvis du allerede har en konto, kan du logge på din konto
+        ved hjælp af dit brugernavn og adgangskode og derefter knytte den konto
+        med dit ID i dine brugerindstillinger.
   user_role:
     filter:
       not_an_administrator: Kun administratorer kan forvalte brugerroller, og du er
@@ -2159,6 +2229,8 @@ da:
       heading: '%{block_on} blokeret af %{block_by}'
       time_future: Slutter om %{time}
       time_past: Sluttede %{time} siden
+      created: Oprettet
+      ago: '%{time} siden'
       status: Status
       show: Vis
       edit: Redigér
@@ -2209,6 +2281,7 @@ da:
       link: Link eller HTML
       long_link: Link
       short_link: Kort link
+      geo_uri: Geo-URI
       embed: HTML
       custom_dimensions: Angiv brugerdefinerede dimensioner
       format: 'Format:'
@@ -2284,11 +2357,35 @@ da:
         mapquest_car: Bil (MapQuest)
         mapquest_foot: Til fods (MapQuest)
         osrm_car: Bil (OSRM)
+        mapzen_bicycle: Cykel (Mapzen)
+        mapzen_car: Bil (Mapzen)
+        mapzen_foot: Fod (Mapzen)
       directions: Rutevejledning
       distance: Afstand
       errors:
         no_route: Kunne ikke finde en rute mellem de to steder.
         no_place: Beklager - kunne ikke finde det sted.
+      instructions:
+        continue_without_exit: Fortsæt ad %{name}
+        slight_right_without_exit: Svagt til højre ind på %{name}
+        turn_right_without_exit: Drej til højre ind på %{name}
+        sharp_right_without_exit: Skarpt til højre ind på %{name}
+        uturn_without_exit: U-vending langs %{name}
+        sharp_left_without_exit: Skarpt til venstre ind på %{name}
+        turn_left_without_exit: Drej til venstre ind på %{name}
+        slight_left_without_exit: Svagt til venstre ind på %{name}
+        via_point_without_exit: (via punkt)
+        follow_without_exit: Følg %{name}
+        roundabout_without_exit: Ved rundkørslen, tag %{name}
+        leave_roundabout_without_exit: Forlad rundkørslen - %{name}
+        stay_roundabout_without_exit: Bliv i rundkørslen - %{name}
+        start_without_exit: Start ved slutningen af %{name}
+        destination_without_exit: Nå målet
+        against_oneway_without_exit: Kør mod ensretningen på %{name}
+        end_oneway_without_exit: Slutningen af ensretningen på %{name}
+        roundabout_with_exit: Ved rundkørslen, tag afkørsel %{exit} mod %{name}
+        unnamed: unavngiven vej
+        courtesy: Anvisninger stillet til rådighed af %{link}
       time: Tid
     query:
       node: Punkt
index 79faa69..a6f92e8 100644 (file)
@@ -18,6 +18,7 @@
 # Author: GerdP
 # Author: Grille chompa
 # Author: Holger
+# Author: HolgerJeromin
 # Author: Inkowik
 # Author: Jacobbraeutigam
 # Author: John07
 # Author: Katpatuka
 # Author: Kerosin
 # Author: Kghbln
+# Author: Malenki
 # Author: Markobr
 # Author: MarkusHD
 # Author: McDutchie
 # Author: Metalhead64
 # Author: Michi
 # Author: Mormegil
+# Author: P24
 # Author: Pill
+# Author: Predatorix
 # Author: Purodha
 # Author: Raymond
 # Author: Reneman
@@ -39,6 +43,7 @@
 # Author: Snocker15
 # Author: Str4nd
 # Author: Suriyaa Kudo
+# Author: Tehabe
 # Author: The Evil IP address
 # Author: Thomas Bohn
 # Author: Umherirrender
@@ -52,37 +57,37 @@ de:
     models:
       acl: Zugangskontrollliste
       changeset: Änderungssatz
-      changeset_tag: Änderungssatz-Tag
+      changeset_tag: Änderungssatz-Attribut
       country: Staat
       diary_comment: Blog-Kommentar
-      diary_entry: Blogeintrag
+      diary_entry: Blog-Eintrag
       friend: Freund
       language: Sprache
       message: Nachricht
       node: Knoten
-      node_tag: Knoten-Tag
-      notifier: Benachrichtigung
+      node_tag: Knoten-Attribut
+      notifier: Benachrichtiger
       old_node: Alter Knoten
-      old_node_tag: Alter Knoten-Tag
+      old_node_tag: Altes Knoten-Attribut
       old_relation: Alte Relation
-      old_relation_member: Altes Relation-Mitglied
-      old_relation_tag: Alter Relation-Tag
-      old_way: Alter Weg
-      old_way_node: Alter Weg-Knoten
-      old_way_tag: Alter Weg-Tag
+      old_relation_member: Altes Relations-Mitglied
+      old_relation_tag: Altes Relations-Attribut
+      old_way: Alte Linie
+      old_way_node: Alter Linien-Knoten
+      old_way_tag: Altes Linien-Attribut
       relation: Relation
-      relation_member: Relation-Mitglied
-      relation_tag: Relation-Tag
+      relation_member: Relations-Mitglied
+      relation_tag: Relations-Attribut
       session: Sitzung
       trace: Track
       tracepoint: Track-Punkt
-      tracetag: Track-Tag
+      tracetag: Track-Attribut
       user: Benutzer
       user_preference: Benutzer-Einstellungen
       user_token: Benutzer-Token
-      way: Weg
-      way_node: Weg-Knoten
-      way_tag: Weg-Tag
+      way: Linie
+      way_node: Linien-Knoten
+      way_tag: Linien-Attribut
     attributes:
       diary_comment:
         body: Text
@@ -119,7 +124,7 @@ de:
   printable_name:
     with_name_html: '%{name} (%{id})'
   editor:
-    default: Standard (derzeit %{name})
+    default: Voreinstellung (derzeit %{name})
     potlatch:
       name: Potlatch 1
       description: Potlatch 1 (im Browser eingebetteter Editor)
@@ -136,59 +141,60 @@ de:
     created: Erstellt
     closed: Geschlossen
     created_html: Erstellt <abbr title='%{title}'>vor %{time}</abbr>
-    closed_html: Geschlossen <abbr title='%{title}'>%{time}</abbr>
-    created_by_html: Erstellt <abbr title='%{title}'>%{time}</abbr> von %{user}
-    deleted_by_html: Gelöscht <abbr title='%{title}'>%{time}</abbr> von %{user}
+    closed_html: Geschlossen <abbr title='%{title}'>vor %{time}</abbr>
+    created_by_html: Erstellt <abbr title='%{title}'>vor %{time}</abbr> von %{user}
+    deleted_by_html: Gelöscht <abbr title='%{title}'>vor %{time}</abbr> von %{user}
     edited_by_html: Bearbeitet <abbr title='%{title}'>vor %{time}</abbr> von %{user}
     closed_by_html: Geschlossen <abbr title='%{title}'>vor %{time}</abbr> von %{user}
     version: Version
     in_changeset: Änderungssatz
-    anonymous: anonym
+    anonymous: Anonym
     no_comment: (kein Kommentar)
     part_of: Teil von
     download_xml: XML herunterladen
-    view_history: Chronik ansehen
-    view_details: Einzelheiten ansehen
+    view_history: Chronik anzeigen
+    view_details: Details anzeigen
     location: 'Standort:'
     changeset:
       title: 'Änderungssatz: %{id}'
       belongs_to: Autor
       node: Knoten (%{count})
       node_paginated: Knoten (%{x}–%{y} von %{count})
-      way: Wege (%{count})
-      way_paginated: Wege (%{x}–%{y} von %{count})
+      way: Linien (%{count})
+      way_paginated: Linien (%{x}–%{y} von %{count})
       relation: Relationen (%{count})
       relation_paginated: Relationen (%{x}–%{y} von %{count})
       comment: Kommentare (%{count})
-      hidden_commented_by: Versteckter Kommentar von %{user} <abbr title='%{exact_time}'>vor
+      hidden_commented_by: Versteckter Diskussionsbeitrag von %{user} <abbr title='%{exact_time}'>vor
+        %{when}</abbr>
+      commented_by: Diskussionsbeitrag von %{user} <abbr title='%{exact_time}'>vor
         %{when}</abbr>
-      commented_by: Kommentar von %{user} <abbr title='%{exact_time}'>vor %{when}</abbr>
       changesetxml: Änderungssatz-XML
       osmchangexml: osmChange-XML
       feed:
         title: 'Änderungssatz: %{id}'
         title_comment: Änderungssatz %{id} - %{comment}
-      join_discussion: Melde dich an, um der Diskussion beizutreten
+      join_discussion: Anmelden, um mitzudiskutieren
       discussion: Diskussion
     node:
       title: 'Knoten: %{name}'
-      history_title: 'Knotenchronik: %{name}'
+      history_title: 'Chronik des Knotens: %{name}'
     way:
-      title: 'Weg: %{name}'
-      history_title: 'Wegechronik: %{name}'
+      title: 'Linie: %{name}'
+      history_title: 'Chronik der Linie: %{name}'
       nodes: Knoten
       also_part_of:
-        one: Teil des Weges %{related_ways}
-        other: Teil der Wege %{related_ways}
+        one: Teil der Linie %{related_ways}
+        other: Teil der Linien %{related_ways}
     relation:
       title: 'Relation: %{name}'
-      history_title: 'Relationschronik: %{name}'
+      history_title: 'Chronik der Relation: %{name}'
       members: Mitglieder
     relation_member:
       entry_role: '%{type} %{name} als %{role}'
       type:
         node: Knoten
-        way: Weg
+        way: Linie
         relation: Relation
     containing_relation:
       entry: Relation %{relation_name}
@@ -197,7 +203,7 @@ de:
       sorry: '%{type} mit der Nummer %{id} konnte leider nicht gefunden werden.'
       type:
         node: Der Knoten
-        way: Der Weg
+        way: Die Linie
         relation: Die Relation
         changeset: Der Änderungssatz
         note: Hinweis
@@ -206,17 +212,17 @@ de:
         %{id} abzurufen.
       type:
         node: den Knoten
-        way: den Weg
+        way: die Linie
         relation: die Relation
         changeset: den Änderungssatz
         note: Hinweis
     redacted:
-      redaction: Ausblendung %{id}
-      message_html: 'Version %{version} diese%{type} kann nicht angezeigt werden.
-        Weitere Informationen sind hier angegeben: %{redaction_link}.'
+      redaction: Redigierung %{id}
+      message_html: 'Version %{version} diese%{type} kann nicht angezeigt werden,
+        da hier redigiert wurde. Weitere Informationen gibt es hier: %{redaction_link}.'
       type:
         node: s Knotens
-        way: s Wegs
+        way: r Linie
         relation: r Relation
     start_rjs:
       feature_warning: Laden von %{num_features} Funktionen, was deinen Browser langsam
@@ -224,12 +230,12 @@ de:
       load_data: Daten laden
       loading: Lade …
     tag_details:
-      tags: Tags
+      tags: Attribute
       wiki_link:
-        key: Erläuterungsseite für das %{key}-Tag
-        tag: Erläuterungsseite für das %{key}=%{value}-Tag
+        key: Die Wiki-Erläuterungsseite für den Schlüssel %{key}
+        tag: Die Wiki-Erläuterungsseite für das Attribut %{key}=%{value}
       wikidata_link: Das Objekt %{page} auf Wikidata
-      wikipedia_link: Artikel zu %{page} in der Wikipedia
+      wikipedia_link: Der Artikel zu %{page} in der Wikipedia
       telephone_link: '%{phone_number} anrufen'
     note:
       title: 'Kartenfehler: %{id}'
@@ -239,21 +245,21 @@ de:
       closed_title: Erledigter Kartenfehler Nr. %{note_name}
       hidden_title: Versteckter Kartenfehler Nr. %{note_name}
       open_by: Erstellt von %{user} <abbr title='%{exact_time}'>vor %{when}</abbr>
-      open_by_anonymous: Erstellt von anonym <abbr title='%{exact_time}'>vor %{when}</abbr>
+      open_by_anonymous: Erstellt von Anonym <abbr title='%{exact_time}'>vor %{when}</abbr>
       commented_by: Kommentar von %{user} <abbr title='%{exact_time}'>vor %{when}</abbr>
-      commented_by_anonymous: Kommentar von anonym <abbr title='%{exact_time}'>vor
+      commented_by_anonymous: Kommentar von Anonym <abbr title='%{exact_time}'>vor
         %{when}</abbr>
       closed_by: Erledigt von %{user} <abbr title='%{exact_time}'>vor %{when}</abbr>
-      closed_by_anonymous: Erledigt von anonym <abbr title='%{exact_time}'>vor %{when}</abbr>
+      closed_by_anonymous: Erledigt von Anonym <abbr title='%{exact_time}'>vor %{when}</abbr>
       reopened_by: Reaktiviert von %{user} <abbr title='%{exact_time}'>vor %{when}</abbr>
-      reopened_by_anonymous: Reaktiviert von anonym <abbr title='%{exact_time}'>vor
+      reopened_by_anonymous: Reaktiviert von Anonym <abbr title='%{exact_time}'>vor
         %{when}</abbr>
       hidden_by: Versteckt von %{user} <abbr title='%{exact_time}'>vor %{when}</abbr>
     query:
       title: Objektabfrage
       introduction: Klicke auf die Karte, um benachbarte Objekte zu finden.
       nearby: Objekte in der Nähe
-      enclosing: Einschließende Objekte
+      enclosing: Umschließende Objekte
   changeset:
     changeset_paging_nav:
       showing_page: Seite %{page}
@@ -261,8 +267,8 @@ de:
       previous: « Vorige
     changeset:
       anonymous: Anonym
-      no_edits: (keine Bearbeitung)
-      view_changeset_details: Details des Änderungssatzes
+      no_edits: (keine Bearbeitungen)
+      view_changeset_details: Details des Änderungssatzes anzeigen
     changesets:
       id: ID
       saved_at: Gespeichert am
@@ -282,26 +288,27 @@ de:
       no_more_user: Keine weiteren Änderungssätze von diesem Benutzer.
       load_more: Mehr laden
     timeout:
-      sorry: Es hat leider zu lange gedauert, die von dir angeforderten Änderungssätze
+      sorry: Entschuldigung, es hat leider zu lange gedauert, die angeforderten Änderungssätze
         abzurufen.
     rss:
       title_all: Diskussion zum OpenStreetMap-Änderungssatz
       title_particular: Diskussion zum OpenStreetMap-Änderungssatz Nr. %{changeset_id}
-      comment: Neuer Kommentar zum Änderungssatz Nr. %{changeset_id} von %{author}
+      comment: Neuer Diskussionsbeitrag zum Änderungssatz Nr. %{changeset_id} von
+        %{author}
       commented_at_html: vor %{when} aktualisiert
       commented_at_by_html: vor %{when} durch %{user} aktualisiert
       full: Vollständige Diskussion
   diary_entry:
     new:
-      title: Selbst Bloggen
+      title: Neuer Blog-Eintrag
       publish_button: Veröffentlichen
     list:
-      title: Blogs
-      title_friends: Blogs meiner Freunde
+      title: Benutzer-Blogs
+      title_friends: Blogs deiner Freunde
       title_nearby: Blogs von Nutzern in der Nähe
       user_title: Blog von %{user}
-      in_language_title: Blogeinträge in %{language}
-      new: Selbst Bloggen
+      in_language_title: Blog-Einträge in %{language}
+      new: Neuer Blog-Eintrag
       new_title: Blogeintrag erstellen
       no_entries: Dieser Benutzer hat noch kein Blog
       recent_entries: Neueste Einträge
@@ -448,7 +455,7 @@ de:
           terminal: Terminal
         amenity:
           animal_shelter: Tierheim
-          arts_centre: Kulturzentrum
+          arts_centre: Kunstzentrum
           atm: Geldautomat
           bank: Bank
           bar: Bar
@@ -472,7 +479,7 @@ de:
           clinic: Krankenhaus
           clock: Uhr
           college: Hochschule
-          community_centre: Gemeindezentrum
+          community_centre: Gemeinschaftszentrum
           courthouse: Gericht
           crematorium: Krematorium
           dentist: Zahnarzt
@@ -515,7 +522,7 @@ de:
           post_office: Postamt
           preschool: Vorschule
           prison: Gefängnis
-          pub: Pub
+          pub: Kneipe
           public_building: Öffentliches Gebäude
           reception_area: Empfangsbereich
           recycling: Recycling-Center
@@ -539,7 +546,7 @@ de:
           university: Universität
           vending_machine: Selbstbedienungsautomat
           veterinary: Tierarzt
-          village_hall: Gemeindeamt
+          village_hall: Gemeindezentrum
           waste_basket: Mülleimer
           waste_disposal: Abfallentsorgung
           youth_centre: Jugendzentrum
@@ -573,7 +580,7 @@ de:
           landing_site: Notlandeplatz
           phone: Notrufsäule
         highway:
-          abandoned: Verlassene Schnellstraße
+          abandoned: Aufgegebene Straße
           bridleway: Reitweg
           bus_guideway: Busspur
           bus_stop: Bushaltestelle
@@ -605,8 +612,8 @@ de:
           speed_camera: Blitzer
           steps: Treppe
           street_lamp: Straßenlaterne
-          tertiary: Gemeindestraße
-          tertiary_link: Tertiärstraße-Auffahrt
+          tertiary: Hauptstraße
+          tertiary_link: Hauptstraße-Auffahrt
           track: Feldweg
           traffic_signals: Lichtzeichenanlage
           trail: Pfad
@@ -626,7 +633,7 @@ de:
           city_gate: Stadttor
           citywalls: Stadtmauern
           fort: Fort
-          heritage: Bauerbe
+          heritage: Denkmalschutz
           house: Historisches Haus
           icon: Symbol
           manor: Gutshaus
@@ -646,26 +653,26 @@ de:
         landuse:
           allotments: Kleingärten
           basin: Becken
-          brownfield: Brache
+          brownfield: Brachland
           cemetery: Friedhof
           commercial: Gewerbegebiet
           conservation: Naturschutzgebiet
           construction: Baustelle
           farm: Bauernhof
           farmland: Acker
-          farmyard: Bauernhof
+          farmyard: landwirtschaftliche Betriebsfläche
           forest: Wald
           garages: Garagen
           grass: Wiese
-          greenfield: unerschlossene Fläche
+          greenfield: unerschlossenes Bauland
           industrial: Industriegebiet
           landfill: Deponie
           meadow: Wiese
           military: Militärgebiet
           mine: Mine
-          orchard: Obstgarten
+          orchard: Obstplantage
           quarry: Steinbruch
-          railway: Bahnkörper
+          railway: Bahngelände
           recreation_ground: Erholungsgebiet
           reservoir: Reservoir
           reservoir_watershed: Wassereinzugsgebiet
@@ -673,7 +680,7 @@ de:
           retail: Einzelhandel
           road: Straßenfläche
           village_green: Dorfwiese (brit.)
-          vineyard: Weingut
+          vineyard: Weinberg
           "yes": Bodennutzung
         leisure:
           beach_resort: Strandbad
@@ -683,10 +690,10 @@ de:
           dog_park: Hundepark
           fishing: Fischereigrund
           fitness_centre: Fitnessstudio
-          fitness_station: Fitnessstudio
+          fitness_station: Freiluft-Fitnesseinrichtung
           garden: Garten
           golf_course: Golfplatz
-          horse_riding: Reiten
+          horse_riding: Reitanlage
           ice_rink: Eislaufplatz
           marina: Sporthafen
           miniature_golf: Minigolf
@@ -766,7 +773,7 @@ de:
           insurance: Krankenversicherungsbüro
           lawyer: Rechtsanwalt
           ngo: NGO
-          telecommunication: Postamt
+          telecommunication: Telekommunikationsbüro
           travel_agent: Reisebüro
           "yes": Büro
         place:
@@ -798,13 +805,13 @@ de:
           village: Dorf
           "yes": Ort
         railway:
-          abandoned: Aufgelassene Bahnstrecke
+          abandoned: Aufgegebene Bahnstrecke
           construction: Eisenbahn im Bau
           disused: Aufgelassene Bahnstrecke
           disused_station: Aufgelassener Bahnhof
           funicular: Standseilbahn
           halt: Haltepunkt
-          historic_station: Ehemaliger Bahnhof
+          historic_station: Historischer Bahnhof
           junction: Bahnknoten
           level_crossing: Eisenbahnkreuzung
           light_rail: Stadtbahn
@@ -860,7 +867,7 @@ de:
           funeral_directors: Bestattungsunternehmen
           furniture: Möbelgeschäft
           gallery: Galerie
-          garden_centre: Garten-Center
+          garden_centre: Gartenzentrum
           general: Gemischtwarenladen
           gift: Geschenkeladen
           greengrocer: Obst- und Gemüsehändler
@@ -877,10 +884,10 @@ de:
           mobile_phone: Handygeschäft
           motorcycle: Motorradgeschäft
           music: Musikladen
-          newsagent: Zeitschriftenladen
+          newsagent: Zeitungsladen
           optician: Optiker
           organic: Bio-Laden
-          outdoor: Außenbekleidungsladen
+          outdoor: Outdoor-Ausrüster
           pet: Tierhandlung
           pharmacy: Apotheke
           photo: Fotoladen
@@ -899,7 +906,7 @@ de:
           "yes": Geschäft
         tourism:
           alpine_hut: Berghütte
-          apartment: Apartment
+          apartment: Ferienwohnung
           artwork: Kunstwerk
           attraction: Sehenswürdigkeit
           bed_and_breakfast: Bed and Breakfast
@@ -914,7 +921,7 @@ de:
           information: Information
           motel: Motel
           museum: Museum
-          picnic_site: Piknikplatz
+          picnic_site: Picknickplatz
           theme_park: Freizeitpark
           viewpoint: Aussichtspunkt
           zoo: Zoo
@@ -1150,13 +1157,14 @@ de:
         ein paar davon, die nützlich sein dürften.
       editor_html: Ein <strong>Editor</strong> ist ein Programm oder eine Webseite,
         mit der man die Karte bearbeiten kann.
-      node_html: Ein <strong>Node</strong> (Knoten) in OSM ist ein Punkt auf der Karte,
-        z.B. ein Restaurant oder ein Baum.
-      way_html: Ein <strong>Way</strong> ("Weg") in OSM ist eine Linie oder Fläche
-        wie z.B. eine Straße, ein Weg, ein Fluss oder ein Gebäude.
-      tag_html: |-
-        Ein <strong>tag</strong> ist eine Eigenschaft, die man einem Objekt zuweist. Z.B. der Name eines Restaurants
-        oder die maximal erlaubte Geschwindigkeit auf einer Straße.
+      node_html: Ein <strong>Node</strong> ("Knoten") in OSM ist ein Punkt auf der
+        Karte, z.B. ein Restaurant oder ein Baum.
+      way_html: Ein <strong>Way</strong> ("Weg") in OSM ist eine offene Linie wie
+        z.B. eine Straße, ein Weg, ein Fluss oder bildet eine geschlossene Fläche,
+        z.B. ein Gebäude.
+      tag_html: Ein <strong>tag</strong> ("Attribut") ist eine Eigenschaft, die man
+        einem Objekt zuweist. Z.B. der Name eines Restaurants oder die maximal erlaubte
+        Geschwindigkeit auf einer Straße.
     rules:
       title: Regeln!
       paragraph_1_html: "OpenStreetMap hat nur wenige formale Regeln, aber wir erwarten,
@@ -1380,18 +1388,19 @@ de:
     changeset_comment_notification:
       greeting: Hallo,
       commented:
-        subject_own: '[OpenStreetMap] %{commenter} hat zu einem deiner Änderungssätze
-          kommentiert'
+        subject_own: '[OpenStreetMap] %{commenter} hat einen deiner Änderungssätze
+          diskutiert'
         subject_other: '[OpenStreetMap] %{commenter} hat zu einem Änderungssatz kommentiert,
           an dem du interessiert bist'
-        your_changeset: '%{commenter} hinterließ einen Kommentar zu einem deiner Änderungssätze,
-          erstellt am %{time}'
-        commented_changeset: '%{commenter} hinterließ einen Kommentar zu einem Kartenänderungssatz,
-          den du beobachtest, erstellt von %{changeset_author} am %{time}'
-        partial_changeset_with_comment: mit dem Kommentar „%{changeset_comment}“
+        your_changeset: '%{commenter} hinterließ einen Diskussionsbeitrag zu einem
+          deiner Änderungssätze, erstellt am %{time}'
+        commented_changeset: '%{commenter} hinterließ einen Diskussionbeitrag zu einem
+          Kartenänderungssatz, den du beobachtest, erstellt von %{changeset_author}
+          am %{time}'
+        partial_changeset_with_comment: mit der Bemerkung „%{changeset_comment}“
         partial_changeset_without_comment: ohne Kommentar
-      details: Weitere Einzelheiten über den Änderungssatz können gefunden werden
-        unter %{url}.
+      details: Weitere Details über den Änderungssatz können gefunden werden unter
+        %{url}.
   message:
     inbox:
       title: Posteingang
@@ -1490,8 +1499,8 @@ de:
         den Flash Player von Adobe.com herunter</a>. <a href="http://wiki.openstreetmap.org/wiki/DE:Editing">Einige
         andere Möglichkeiten</a>, um OpenStreetMap zu editieren, sind hier beschrieben.
       potlatch_unsaved_changes: Du hast deine Arbeit noch nicht gespeichert. (Um sie
-        in Potlach zu speichern, klicke auf eine leere Fläche bzw. deselektiere den
-        Weg oder Punkt, wenn du im Live-Modus editierst oder klicke auf Speichern,
+        in Potlach zu speichern, klicke auf eine leere Fläche bzw. deselektiere die
+        Linie oder den Knoten, wenn du im Live-Modus editierst oder klicke auf Speichern,
         wenn ein Speicherbutton vorhanden ist.)
       potlatch2_not_configured: Potlatch 2 wurde nicht konfiguriert - Bitte besuche
         http://wiki.openstreetmap.org/wiki/The_Rails_Port
@@ -1516,6 +1525,7 @@ de:
       table:
         entry:
           motorway: Autobahn
+          main_road: Hauptstraße
           trunk: Schnellstraße
           primary: Bundesstraße
           secondary: Landes-, Kreisstraße
@@ -1559,30 +1569,30 @@ de:
           cemetery: Friedhof
           allotments: Kleingartenanlage
           pitch: Spielfeld
-          centre: Sportplatz
+          centre: Sportzentrum
           reserve: Naturschutzgebiet
           military: Militärgebiet
           school:
           - Schule
           - Universität
-          building: Gebäude
+          building: Bedeutendes Gebäude
           station: Bahnhof
           summit:
           - Gipfel
           - Bergspitze
-          tunnel: Strichlierter Rand = Tunnel
-          bridge: Dicker Rand = Brücke
+          tunnel: Gestrichelter Rand = Tunnel
+          bridge: Schwarzer Rand = Brücke
           private: Privater Zugang
           destination: Nur für Anrainer
-          construction: Straße im Bau
+          construction: Straßen im Bau
     richtext_area:
       edit: Bearbeiten
       preview: Vorschau
     markdown_help:
       title_html: Interpretiert mit <a href="http://daringfireball.net/projects/markdown/">Markdown</a>
       headings: Überschriften
-      heading: Hauptüberschrift
-      subheading: Überschrift
+      heading: Überschrift
+      subheading: Zwischenüberschrift
       unordered: Aufzählung
       ordered: Nummerierte Liste
       first: Erstes Element
@@ -1594,13 +1604,13 @@ de:
       url: URL
   trace:
     visibility:
-      private: PRIVAT (werden nur als anonyme, unsortierte Punkte ohne Zeitangaben
+      private: Privat (werden nur als anonyme, unsortierte Punkte ohne Zeitangaben
         gezeigt)
-      public: ÖFFENTLICH (wird in der Trackliste angezeigt, jedoch nur als anonyme,
-        unsortierte Punktfolge ohne Zeitstempel)
-      trackable: VERFOLGBAR (wird in der Trackliste als anonyme, sortierte Punktfolge
+      public: Öffentlich (wird in der Trackliste angezeigt, jedoch nur als anonyme,
+        unsortierte Punktfolge)
+      trackable: Verfolgbar (wird in der Trackliste als anonyme, sortierte Punktfolge
         mit Zeitstempel angezeigt)
-      identifiable: IDENTIFIZIERBAR (wird in der Trackliste als identifizierbare,
+      identifiable: Identifizierbar (wird in der Trackliste als identifizierbare,
         sortierte Punktfolge mit Zeitstempel angezeigt)
     create:
       upload_trace: Lade einen GPS-Track hoch
@@ -1623,20 +1633,20 @@ de:
       tags_help: durch Komma getrennt
       save_button: Speichern
       visibility: 'Sichtbarkeit:'
-      visibility_help: Was heißt das?
+      visibility_help: Was bedeutet das?
     trace_form:
       upload_gpx: 'GPX-Datei hochladen:'
       description: 'Beschreibung:'
       tags: 'Tags:'
-      tags_help: durch Komma ( , ) getrennt
+      tags_help: durch Komma getrennt
       visibility: 'Sichtbarkeit:'
-      visibility_help: Was heißt das?
+      visibility_help: Was bedeutet das?
       upload_button: Hochladen
       help: Hilfe
       help_url: http://wiki.openstreetmap.org/wiki/DE:Upload
     trace_header:
-      upload_trace: Lade einen GPS-Track hoch
-      see_all_traces: Alle GPS-Tracks
+      upload_trace: Lade einen Track hoch
+      see_all_traces: Alle Tracks ansehen
       see_your_traces: Meine Tracks ansehen
       traces_waiting:
         one: Du hast momentan %{count} Track in der Warteschlange. Bitte warte, bis
@@ -1651,7 +1661,7 @@ de:
       pending: WARTEND
       filename: 'Dateiname:'
       download: herunterladen
-      uploaded: 'Hochgeladen am:'
+      uploaded: 'Hochgeladen:'
       points: 'Punkte:'
       start_coordinates: 'Startkoordinate:'
       map: Karte
@@ -1671,9 +1681,9 @@ de:
     trace:
       pending: WARTEND
       count_points: '%{count} Punkte'
-      ago: '%{time_in_words_ago} her'
+      ago: vor %{time_in_words_ago}
       more: Details
-      trace_details: Details des GPS-Tracks anzeigen
+      trace_details: Details des Tracks anzeigen
       view_map: Karte anzeigen
       edit: bearbeiten
       edit_map: Karte bearbeiten
@@ -1911,16 +1921,6 @@ de:
       use external auth: Verwende alternativ eine Drittpartei zur Anmeldung
       auth no password: Mit Drittparteiauthentifikation ist kein Passwort erforderlich,
         jedoch können einige Extrawerkzeuge oder Server eines benötigen.
-      auth association: |-
-        <p>Deine ID ist noch nicht mit einem OpenStreetMap-Benutzerkonto verknüpft.</p>
-        <ul>
-          <li>Falls du neu auf OpenStreetMap bist, erstelle bitte mithilfe des unten stehenden Formulars ein neues Benutzerkonto.</li>
-          <li>
-            Falls du schon ein Benutzerkonto besitzt, kannst du dich bei deinem Konto
-            mit Benutzernamen und Passwort anmelden und anschließend das Benutzerkonto
-            in den Einstellungen mit deiner ID verknüpfen.
-          </li>
-        </ul>
       continue: Registrieren
       terms accepted: Vielen Dank, dass du den neuen Bedingungen für Mitwirkende zugestimmt
         hast!
@@ -1953,6 +1953,7 @@ de:
       heading: Der Benutzer %{user} existiert nicht
       body: Es gibt leider keinen Benutzer mit dem Namen %{user}. Du hast dich möglicherweise
         vertippt oder bist einem ungültigem Link gefolgt.
+      deleted: gelöscht
     view:
       my diary: Mein Blog
       new diary entry: Neuer Blogeintrag
@@ -1978,7 +1979,7 @@ de:
       ct status: 'Bedingungen für Mitwirkende:'
       ct undecided: Unentschlossen
       ct declined: Abgelehnt
-      ct accepted: Vor %{ago} akzeptiert
+      ct accepted: '%{ago} akzeptiert'
       latest edit: 'Letzte Änderung %{ago}:'
       email address: 'E-Mail-Adresse:'
       created from: 'erstellt aus:'
@@ -2005,7 +2006,7 @@ de:
         revoke:
           administrator: Administrator-Rechte entziehen
           moderator: Moderator-Rechte entziehen
-      block_history: Erhaltene Sperren
+      block_history: Aktive Sperren
       moderator_history: Vergebene Sperren
       comments: Kommentare
       create_block: Benutzer sperren
@@ -2017,9 +2018,9 @@ de:
       delete_user: Benutzer löschen
       confirm: Bestätigen
       friends_changesets: Änderungssätze deiner Freunde
-      friends_diaries: Tagebucheinträge deiner Freunde
+      friends_diaries: Blogs deiner Freunde
       nearby_changesets: Änderungssätze von Benutzern in der Nähe
-      nearby_diaries: Tagebucheinträge von Benutzern in der Nähe
+      nearby_diaries: Blogs von Benutzern in der Nähe
     popup:
       your location: Standort
       nearby mapper: Mapper in der Nähe
@@ -2161,6 +2162,15 @@ de:
       no_authorization_code: Kein Autorisierungscode
       unknown_signature_algorithm: Unbekannter Signaturalgorithmus
       invalid_scope: Ungültiger Bereich
+    auth_association:
+      heading: Deine ID ist noch nicht mit einem OpenStreetMap-Konto verknüpft.
+      option_1: |-
+        Falls du neu auf OpenStreetMap bist, erstelle bitte
+        mithilfe des unten stehenden Formulars ein neues Benutzerkonto.
+      option_2: |-
+        Falls du bereits ein Benutzerkonto hast, kannst du dich bei deinem Konto
+        mithilfe deines Benutzernamens und Passwortes anmelden und dann das Benutzerkonto
+        mit deiner ID in deinen Benutzereinstellungen verknüpfen.
   user_role:
     filter:
       not_an_administrator: Benutzerrollen können nur von Administratoren verwaltet
@@ -2297,14 +2307,14 @@ de:
         wird.
   note:
     description:
-      opened_at_html: vor %{when} erstellt
-      opened_at_by_html: vor %{when} von %{user} erstellt
-      commented_at_html: vor %{when} aktualisiert
-      commented_at_by_html: vor %{when} von %{user} aktualisiert
-      closed_at_html: vor %{when} gelöst
-      closed_at_by_html: vor %{when} von %{user} gelöst
-      reopened_at_html: vor %{when} reaktiviert
-      reopened_at_by_html: vor %{when} von %{user} reaktiviert
+      opened_at_html: '%{when} erstellt'
+      opened_at_by_html: '%{when} von %{user} erstellt'
+      commented_at_html: '%{when} aktualisiert'
+      commented_at_by_html: '%{when} von %{user} aktualisiert'
+      closed_at_html: '%{when} gelöst'
+      closed_at_by_html: '%{when} von %{user} gelöst'
+      reopened_at_html: '%{when} reaktiviert'
+      reopened_at_by_html: '%{when} von %{user} reaktiviert'
     rss:
       title: OpenStreetMap Hinweise
       description_area: Übersicht der gemeldeten, kommentierten oder geschlossen Hinweise/Fehler
@@ -2375,7 +2385,7 @@ de:
       donate_link_text: <a class='donate-attr' href='%{donate_url}'>Spenden</a>
     site:
       edit_tooltip: Karte bearbeiten
-      edit_disabled_tooltip: Zum Editieren muss eine höhere Zoomstufe gewählt werden
+      edit_disabled_tooltip: Zum Bearbeiten muss eine höhere Zoomstufe gewählt werden
       createnote_tooltip: Einen Hinweis/Fehler zu den Kartendaten melden
       createnote_disabled_tooltip: Zum Erstellen von Hinweisen muss eine höhere Zoomstufe
         gewählt werden
@@ -2416,7 +2426,7 @@ de:
         mapquest_car: Auto (MapQuest)
         mapquest_foot: Fuß (MapQuest)
         osrm_car: Auto (OSRM)
-        mapzen_bicycle: Rad (Mapzen)
+        mapzen_bicycle: Fahrrad (Mapzen)
         mapzen_car: Auto (Mapzen)
         mapzen_foot: Fuß (Mapzen)
       directions: 'Routenanweisungen:'
@@ -2435,20 +2445,20 @@ de:
         slight_left_without_exit: Leicht links auf %{name}
         via_point_without_exit: (über Punkt)
         follow_without_exit: '%{name} folgen'
-        roundabout_without_exit: Im Kreisverkehr nehme %{name}
+        roundabout_without_exit: Im Kreisverkehr nimm %{name}
         leave_roundabout_without_exit: Kreisverkehr verlassen – %{name}
         stay_roundabout_without_exit: Auf Kreisverkehr bleiben – %{name}
         start_without_exit: Starten beim Ende von %{name}
         destination_without_exit: Ziel erreicht
         against_oneway_without_exit: Gegen die Einbahnstraße gehen auf %{name}
         end_oneway_without_exit: Ende der Einbahnstraße auf %{name}
-        roundabout_with_exit: Beim Kreisverkehr nehme die Ausfahrt %{exit} auf %{name}
+        roundabout_with_exit: Beim Kreisverkehr nimm die Ausfahrt %{exit} auf %{name}
         unnamed: unbekannt
         courtesy: Routenanweisungen stammen von %{link}
       time: Zeit
     query:
       node: Knoten
-      way: Weg
+      way: Linie
       relation: Relation
       nothing_found: Keine Objekte gefunden
       error: 'Fehler beim Kontaktieren von %{server}: %{error}'
index 9d90c82..901f06d 100644 (file)
@@ -82,13 +82,41 @@ diq:
     default: Hesabiyaye (%{name}yo nıkayên)
     potlatch:
       name: Potlatch 1
+      description: Potlatch 1 (browser vurnayoğ)
+    id:
+      name: iD
+      description: iD (browser vurnayoğ)
     potlatch2:
       name: Potlatch 1
+      description: Potlatch 2 (browser vurnayoğ)
+    remote:
+      name: Duri da qontrol
+      description: Duri ra Qonrtol (JOSM yana  Merkaartor)
   browse:
+    created: Vıraziye
+    closed: Racneya
+    created_html: <abbr title='%{title}'>%{time} veror</abbr> vıraziye
+    closed_html: <abbr title='%{title}'>%{time} veror</abbr> racneye
     version: Versiyon
+    anonymous: anonim
+    no_comment: (be vatış)
+    part_of: Letey
+    download_xml: XML ron
+    view_history: Verori bıvin
+    view_details: Teferruati bıvin
+    location: 'Lokasyon:'
     changeset:
       title: 'Koma vurnayışi: %{id}'
       belongs_to: Nuştekar
+      node: '%{count} noqtey'
+      node_paginated: pero piya (%{x}-%{y} - %{count}) noqtey
+      way: '%{count} ray'
+      comment: Mışewreyi (%{count})
+      discussion: Vaten
+    node:
+      title: Noqta:%{name}
+    way:
+      title: Ray:%{name}
     relation:
       members: Ezay
     relation_member:
@@ -133,13 +161,15 @@ diq:
       no_edits: (vurnayış çıniyo)
     changesets:
       id: ID
-      saved_at: Deme qeydi
+      saved_at: Demê qeydi
       user: Karber
       comment: Mışewre
       area: Erz
     list:
       title: Seta vurnayışan
   diary_entry:
+    new:
+      publish_button: Vıla ke
     edit:
       subject: 'Mewzu:'
       body: 'Vêrey mesaci:'
@@ -453,7 +483,7 @@ diq:
       outbox: Rışteyan
       from: Kêra
       subject: Mewzu
-      date: Deme
+      date: Dem
     message_summary:
       reply_button: Cewab bıde
       delete_button: Bestere
@@ -467,10 +497,10 @@ diq:
       outbox: Rışteyan
       to: Kêrê
       subject: Mewzu
-      date: Deme
+      date: Dem
     read:
       subject: Mewzu
-      date: Deme
+      date: Dem
       reply_button: Cewab bıde
       to: Kêrê
     sent_message_summary:
@@ -651,7 +681,7 @@ diq:
       traces: rêçi
       remove as friend: Embazan ra vec
       add as friend: Xo rê embaz ke
-      mapper since: 'Demê Xeritoğiney:'
+      mapper since: 'Demê herdnigarwaniye:'
       ago: (%{time_in_words_ago} veror)
       ct undecided: Darıdeyo
       ct declined: Red kerd
@@ -681,8 +711,8 @@ diq:
           moderator: Hesabê moderatori terkne
       block_history: kılitkerdışê gırewtey
       moderator_history: Bloqanê cı bıgi re
-      comments: vatışi
-      create_block: Ena karber blok bike
+      comments: Mışewreyi
+      create_block: nê karberi kılit ke
       activate_user: Nê karberi aktiv ke
       deactivate_user: Nê karberi aktiv meke
       confirm_user: nê karberi tesdiq ke
@@ -801,6 +831,9 @@ diq:
       revoke: Terkne!
       confirm: Vac welay?
       revoker: 'Terkner:'
+  note:
+    entry:
+      comment: Mışewre
   javascripts:
     map:
       base:
@@ -809,6 +842,12 @@ diq:
         transport_map: Xeritay Resnayışi
     site:
       edit_tooltip: Xeriti timar ke
+    changesets:
+      show:
+        comment: Mışewre
+    notes:
+      show:
+        comment: Mışewre
   redaction:
     edit:
       description: Şınasnayış
index 81a5106..f48deb0 100644 (file)
 # Author: Protnet
 # Author: Ruila
 # Author: Shirayuki
+# Author: SkarmoutsosV
 # Author: Stam.nikos
+# Author: SucreRouge
 # Author: Zserdx
 # Author: 아라
 ---
 el:
+  html:
+    dir: ltr
   time:
     formats:
       friendly: '%e %B %Y στις %H:%M'
   activerecord:
     models:
-      acl: Î Ï\81Ï\8cÏ\83βαÏ\83η Ï\83Ï\84η Î\9bίÏ\83Ï\84α Î\95λέγÏ\87οÏ\85
-      changeset: Î\9fμάδα Î\91λλαγών
-      changeset_tag: Î§Î±Ï\81ακÏ\84ηÏ\81ιÏ\83Ï\84ικÏ\8c Î\9fμάδαÏ\82 Î\91λλαγών
+      acl: Î\9bίÏ\83Ï\84α ÎµÎ»Î­Î³Ï\87οÏ\85 Ï\80Ï\81Ï\8cÏ\83βαÏ\83ηÏ\82
+      changeset: Î\9fμάδα Î±λλαγών
+      changeset_tag: Î\95Ï\84ικέÏ\84α Î¿Î¼Î¬Î´Î±Ï\82 Î±λλαγών
       country: Χώρα
-      diary_comment: Î£Ï\87Ï\8cλιο Î\97μερολογίου
-      diary_entry: Î\9aαÏ\84αÏ\87Ï\8eÏ\81ηÏ\83η Î\97μερολογίου
+      diary_comment: Î£Ï\87Ï\8cλιο Î·μερολογίου
+      diary_entry: Î\9aαÏ\84αÏ\87Ï\8eÏ\81ηÏ\83η Î·μερολογίου
       friend: Φίλος
       language: Γλώσσα
       message: Μήνυμα
       node: Κόμβος
-      node_tag: Î§Î±Ï\81ακÏ\84ηÏ\81ιÏ\83Ï\84ικÏ\8c Î\9aόμβου
+      node_tag: Î\95Ï\84ικέÏ\84α Îºόμβου
       notifier: Ειδοποιητής
-      old_node: Î Î±Î»Î¹Ï\8cÏ\82 Î\9aόμβος
-      old_node_tag: Î Î±Î»Î¹Î¬ Î§Î±Ï\81ακÏ\84ηÏ\81ιÏ\83Ï\84ικÏ\8c Î\9aόμβου
-      old_relation: Παλιά Σχέση
-      old_relation_member: Î Î±Î»Î¹Ï\8c Î\9cέλοÏ\82 Ï\84ηÏ\82 Î£χέσης
-      old_relation_tag: Παλιό Χαρακτηριστικό Σχέσης
-      old_way: Î Î±Î»Î¹Î¬ Î\94ιαδρομή
-      old_way_node: Κόμβος Παλιάς Διαδρομής
-      old_way_tag: Î§Î±Ï\81ακÏ\84ηÏ\81ιÏ\83Ï\84ικÏ\8c Î Î±Î»Î¹Î¬Ï\82 Î\94ιαδρομής
+      old_node: Î Î±Î»Î¹Ï\8cÏ\82 Îºόμβος
+      old_node_tag: Î Î±Î»Î¹Î¬ ÎµÏ\84ικέÏ\84α Îºόμβου
+      old_relation: Παλιά σχέση
+      old_relation_member: Î Î±Î»Î¹Ï\8c Î¼Î­Î»Î¿Ï\82 Ï\84ηÏ\82 Ï\83χέσης
+      old_relation_tag: Παλιά ετικέτα της σχέσης
+      old_way: Î Î±Î»Î¹Î¬ Î´ιαδρομή
+      old_way_node: Κόμβος παλιάς διαδρομής
+      old_way_tag: Î\95Ï\84ικέÏ\84α Ï\80αλιάÏ\82 Î´ιαδρομής
       relation: Σχέση
-      relation_member: Μέλος της Σχέσης
-      relation_tag: Î§Î±Ï\81ακÏ\84ηÏ\81ιÏ\83Ï\84ικÏ\8c Î£χέσης
+      relation_member: Μέλος της σχέσης
+      relation_tag: Î\95Ï\84ικέÏ\84α Ï\84ηÏ\82 Ï\83χέσης
       session: Συνεδρία
       trace: Ίχνος
-      tracepoint: Î£Î·Î¼ÎµÎ¯Î¿ Î\8aχνους
-      tracetag: Î§Î±Ï\81ακÏ\84ηÏ\81ιÏ\83Ï\84ικÏ\8c Î\8aχνους
+      tracepoint: Î£Î·Î¼ÎµÎ¯Î¿ Î¯χνους
+      tracetag: Î\95Ï\84ικέÏ\84α Î¯χνους
       user: Χρήστης
-      user_preference: Προτιμήσεις Χρήστη
-      user_token: Διακριτικό Χρήστη
+      user_preference: Προτιμήσεις χρήστη
+      user_token: Διακριτικό χρήστη
       way: Διαδρομή
-      way_node: Î\9aÏ\8cμβοÏ\82 Î\94ιαδρομής
-      way_tag: Î§Î±Ï\81ακÏ\84ηÏ\81ιÏ\83Ï\84ικÏ\8c Î\94ιαδρομής
+      way_node: Î\9aÏ\8cμβοÏ\82 Î´ιαδρομής
+      way_tag: Î\95Ï\84ικέÏ\84α Î´ιαδρομής
     attributes:
       diary_comment:
         body: Σώμα
@@ -86,9 +90,9 @@ el:
         body: Σώμα
         recipient: Παραλήπτης
       user:
-        email: Î\94ιεÏ\8dθÏ\85νÏ\83η Î\97λ. Î¤αχυδρομείου
+        email: Î\94ιεÏ\8dθÏ\85νÏ\83η Î·Î». Ï\84αχυδρομείου
         active: Ενεργό
-        display_name: Εμφανιζόμενο Î\8cνομα
+        display_name: Εμφανιζόμενο Ï\8cνομα
         description: Περιγραφή
         languages: Γλώσσες
         pass_crypt: Κωδικός
@@ -107,28 +111,28 @@ el:
       description: Potlatch 2 (επεξεργαστής εντός του περιηγητή)
     remote:
       name: Εξωτερικό πρόγραμμα
-      description: Îµξωτερικό πρόγραμμα (JOSM ή Merkaartor)
+      description: Î\95ξωτερικό πρόγραμμα (JOSM ή Merkaartor)
   browse:
     created: Δημιουργήθηκε
     closed: Έκλεισε
     created_html: Δημιουργήθηκε <abbr title='%{title}'>πριν από %{time}</abbr>
     closed_html: Κλείστηκε <abbr title='%{title}'>πριν από %{time}</abbr>
     created_by_html: Δημιουργήθηκε <abbr title='%{title}'>πριν από %{time}</abbr>
-      από χρήστη %{user}
-    deleted_by_html: Î\94ιεγÏ\81άÏ\86η <abbr title='%{title}'>Ï\80Ï\81ιν Î±Ï\80Ï\8c %{time}</abbr> Î±Ï\80Ï\8c Ï\87Ï\81ήÏ\83Ï\84η
-      %{user}
+      Î±Ï\80Ï\8c Ï\84ον Ï\87Ï\81ήÏ\83Ï\84η %{user}
+    deleted_by_html: Î\94ιεγÏ\81άÏ\86η <abbr title='%{title}'>Ï\80Ï\81ιν Î±Ï\80Ï\8c %{time}</abbr> Î±Ï\80Ï\8c Ï\84ον
+      χρήστη %{user}
     edited_by_html: Επεξεργάστηκε <abbr title='%{title}'>πριν από %{time}</abbr> από
+      τον χρήστη %{user}
+    closed_by_html: Κλείστηκε <abbr title='%{title}'>πριν από %{time}</abbr> από τον
       χρήστη %{user}
-    closed_by_html: Κλείστηκε <abbr title='%{title}'>πριν από %{time}</abbr> από χρήστη
-      %{user}
     version: Έκδοση
     in_changeset: Ομάδα αλλαγών
     anonymous: ανώνυμος
     no_comment: (χωρίς σχόλιο)
     part_of: Μέρος του
     download_xml: Λήψη XML
-    view_history: Î Ï\81οβολή Î\99στορικού
-    view_details: Î Ï\81οβολή Î\9bεπτομερειών
+    view_history: Î Ï\81οβολή Î¹στορικού
+    view_details: Î Ï\81οβολή Î»επτομερειών
     location: 'Τοποθεσία:'
     changeset:
       title: 'Ομάδα αλλαγών: %{id}'
@@ -140,8 +144,10 @@ el:
       relation: Σχέσεις (%{count})
       relation_paginated: Σχέσεις (%{x}-%{y} από %{count})
       comment: Σχόλια (%{count})
-      commented_by: Σχόλιο από χρήστη %{user} <abbr title='%{exact_time}'>πριν από
-        %{when}</abbr>
+      hidden_commented_by: Κρυμμένο σχόλιο του %{user} <abbr title='%{exact_time}'>%{when}
+        πριν</abbr>
+      commented_by: Σχόλιο από τον χρήστη %{user} <abbr title='%{exact_time}'>πριν
+        από %{when}</abbr>
       changesetxml: Ομάδας αλλαγών XML
       osmchangexml: osmChange XML
       feed:
@@ -151,17 +157,17 @@ el:
       discussion: Συζήτηση
     node:
       title: 'Κόμβος: %{name}'
-      history_title: 'Î\99Ï\83Ï\84οÏ\81ικÏ\8c Î\9aόμβου: %{name}'
+      history_title: 'Î\99Ï\83Ï\84οÏ\81ικÏ\8c Îºόμβου: %{name}'
     way:
       title: 'Διαδρομή: %{name}'
-      history_title: 'Î\99Ï\83Ï\84οÏ\81ικÏ\8c Î\94ιαδρομής: %{name}'
+      history_title: 'Î\99Ï\83Ï\84οÏ\81ικÏ\8c Î´ιαδρομής: %{name}'
       nodes: Κόμβοι
       also_part_of:
         one: τμήμα της διαδρομής %{related_ways}
         other: τμήμα των διαδρομών %{related_ways}
     relation:
       title: 'Σχέση: %{name}'
-      history_title: 'Ιστορικό Σχέσης: %{name}'
+      history_title: 'Ιστορικό σχέσης: %{name}'
       members: Μέλη
     relation_member:
       entry: '%{type} %{name}'
@@ -182,8 +188,8 @@ el:
         changeset: ομάδα αλλαγών
         note: σημείωση
     timeout:
-      sorry: Λυπάμαι, τα δεδομένα για το/τη %{type} με αναγνωριστικό %{id}, χρειάστηκε
-        Ï\80ολÏ\8d Ï\87Ï\81Ï\8cνο Î³Î¹Î± Î½Î± Î±Î½Î±ÎºÏ\84ηθεί.
+      sorry: Λυπάμαι, τα δεδομένα για το %{type} με αναγνωριστικό %{id}, χρειάστηκαν
+        Ï\80ολÏ\8d Ï\87Ï\81Ï\8cνο Î³Î¹Î± Î½Î± Î±Î½Î±ÎºÏ\84ηθοÏ\8dν.
       type:
         node: κόμβος
         way: διαδρομή
@@ -199,22 +205,22 @@ el:
         way: διαδρομή
         relation: σχέση
     start_rjs:
-      feature_warning: Î¦Î¿Ï\81Ï\84Ï\8eνοÏ\85ν %{num_features} Ï\87αÏ\81ακÏ\84ηÏ\81ιÏ\83Ï\84ικά. Î\91Ï\85Ï\84ή Î· ÎµÎ½Î­Ï\81γεια ÎµÎ½Î´Î­Ï\87εÏ\84αι
-        να προκαλέσει τον περιηγητή σας να γίνει αργός ή να μην αντιδρά. Σίγουρα θέλετε
-        να εμφανίσετε αυτά τα δεδομένα;
-      load_data: Î¦Ï\8cÏ\81Ï\84Ï\89Ï\83η Î\94εδομένων
+      feature_warning: Î\97 Ï\86Ï\8cÏ\81Ï\84Ï\89Ï\83η %{num_features} Ï\87αÏ\81ακÏ\84ηÏ\81ιÏ\83Ï\84ικÏ\8eν ÎµÎ½Î´Î­Ï\87εÏ\84αι Î½Î± ÎºÎ±Ï\84αÏ\83Ï\84ήÏ\83ει
+        τον περιηγητή σας αργό ή να μην αντιδρά. Σίγουρα θέλετε να εμφανίσετε αυτά
+        τα δεδομένα;
+      load_data: Î¦Ï\8cÏ\81Ï\84Ï\89Ï\83η Î´εδομένων
       loading: Φόρτωση σε εξέλιξη...
     tag_details:
-      tags: Î§Î±Ï\81ακÏ\84ηÏ\81ιÏ\83Ï\84ικά
+      tags: Î\95Ï\84ικέÏ\84εÏ\82
       wiki_link:
-        key: Î\97 Ï\83ελίδα Ï\80εÏ\81ιγÏ\81αÏ\86ήÏ\82 Î³Î¹Î± Ï\84ο Ï\87αÏ\81ακÏ\84ηÏ\81ιÏ\83Ï\84ικÏ\8c %{key}
-        tag: Î\97 Ï\83ελίδα Ï\80εÏ\81ιγÏ\81αÏ\86ήÏ\82 Î³Î¹Î± Ï\84ο Ï\87αÏ\81ακÏ\84ηÏ\81ιÏ\83Ï\84ικÏ\8c %{key}=%{value}
+        key: Î\97 Ï\83ελίδα Ï\80εÏ\81ιγÏ\81αÏ\86ήÏ\82 Î³Î¹Î± Ï\84ην ÎµÏ\84ικέÏ\84α %{key}
+        tag: Î\97 Ï\83ελίδα Ï\80εÏ\81ιγÏ\81αÏ\86ήÏ\82 Î³Î¹Î± Ï\84ην ÎµÏ\84ικέÏ\84α %{key}=%{value}
       wikidata_link: Το αντικείμενο %{page} στο Wikidata
       wikipedia_link: Το άρθρο %{page} στη Βικιπαίδεια
       telephone_link: Καλέστε %{phone_number}
     note:
       title: 'Σημείωση: %{id}'
-      new_note: Νέα Σημείωση
+      new_note: Νέα σημείωση
       description: Περιγραφή
       open_title: 'Ανοικτή σημείωση #%{note_name}'
       closed_title: 'Επιλυμένη σημείωση: #%{note_name}'
@@ -236,9 +242,10 @@ el:
       hidden_by: Έγινε κρυφή από τον %{user} <abbr title='%{exact_time}'>πριν από
         %{when}</abbr>
     query:
-      title: Πληροφορίες Χαρακτηριστικών
+      title: Πληροφορίες χαρακτηριστικών
       introduction: Κάντε κλικ στον χάρτη για να βρείτε κοντινά χαρακτηριστικά.
       nearby: Κοντινά χαρακτηριστικά
+      enclosing: Περικλείει τα χαρακτηριστικά
   changeset:
     changeset_paging_nav:
       showing_page: Σελίδα %{page}
@@ -270,25 +277,28 @@ el:
       sorry: Λυπάμαι, ο κατάλογος των ομάδων αλλαγών που ζήτησες χρειάστηκε πολύ χρόνο
         για να ανακτηθεί.
     rss:
+      title_all: OpenStreetMap συζήτηση ομάδας αλλαγών
+      title_particular: 'OpenStreetMap συζήτηση ομάδας αλλαγών #%{changeset_id}'
+      comment: 'Νέο σχόλιο σχετικά με την ομάδα αλλαγών #%{changeset_id} από τον %{author}'
       commented_at_html: Ενημερώθηκε %{when} πριν
       commented_at_by_html: Ενημερώθηκε %{when} πριν από τον %{user}
       full: Πλήρης συζήτηση
   diary_entry:
     new:
-      title: Î\9dέα Î\9aαÏ\84αÏ\87Ï\8eÏ\81ηÏ\83η Î\97μερολογίου
+      title: Î\9dέα ÎºÎ±Ï\84αÏ\87Ï\8eÏ\81ηÏ\83η Î·μερολογίου
       publish_button: Δημοσίευση
     list:
       title: Ημερολόγια χρηστών
       title_friends: Ημερολόγια φίλων
-      title_nearby: Î\97μεÏ\81ολÏ\8cγια Î\9aονÏ\84ινÏ\8eν Î§ρηστών
+      title_nearby: Î\97μεÏ\81ολÏ\8cγια ÎºÎ¿Î½Ï\84ινÏ\8eν Ï\87ρηστών
       user_title: ημερολόγιο του %{user}
-      in_language_title: Î\9aαÏ\84αÏ\87Ï\89Ï\81ήÏ\83ειÏ\82 Î\97μερολογίων στα %{language}
-      new: Î\9dέα Î\9aαÏ\84αÏ\87Ï\8eÏ\81ηÏ\83η Î\97μερολογίου
-      new_title: Συνθέστε μια νέα καταχώρηση στο ημερολόγιο χρήστη σας
+      in_language_title: Î\9aαÏ\84αÏ\87Ï\89Ï\81ήÏ\83ειÏ\82 Î·μερολογίων στα %{language}
+      new: Î\9dέα ÎºÎ±Ï\84αÏ\87Ï\8eÏ\81ηÏ\83η Î·μερολογίου
+      new_title: Συντάξτε μια νέα καταχώρηση στο ημερολόγιο χρήστη σας
       no_entries: Δεν βρέθηκαν καταχωρήσεις στο ημερολόγιο
       recent_entries: Πρόσφατες καταχωρίσεις ημερολογίου
-      older_entries: Î Î±Î»Î¹Ï\8cÏ\84εÏ\81εÏ\82 Î\9aαταχωρήσεις
-      newer_entries: Î\9dεÏ\8cÏ\84εÏ\81εÏ\82 Î\9aαταχωρήσεις
+      older_entries: Î Î±Î»Î¹Ï\8cÏ\84εÏ\81εÏ\82 Îºαταχωρήσεις
+      newer_entries: Î\9dεÏ\8cÏ\84εÏ\81εÏ\82 Îºαταχωρήσεις
     edit:
       title: Επεξεργασία καταχώρησης ημερολογίου
       subject: 'Θέμα:'
@@ -312,7 +322,7 @@ el:
       heading: 'Καμία καταχώρηση με τη ταυτότητα: %{id}'
       body: Συγγνώμη, δεν υπάρχει καταχώρηση ημερολογίου ή σχόλιο με τη ταυτότητα
         %{id}. Είναι πιθανό να υπάρχουν ορθογραφικά λάθη ή να είναι λάθος ο σύνδεσμος
-        μέσο του οπίου φτάσατε σε αυτήν την σελίδα.
+        μέσω του οποίου φτάσατε σε αυτήν την σελίδα.
     diary_entry:
       posted_by: Γράφτηκε από το χρήστη %{link_user} στις %{created} στα %{language_link}
       comment_link: Σχολιάστε την καταχώρηση
@@ -355,11 +365,11 @@ el:
   export:
     title: Εξαγωγή
     start:
-      area_to_export: Î ÎµÏ\81ιοÏ\87ή Ï\80Ï\81οÏ\82 Î\95ξαγωγή
+      area_to_export: Î ÎµÏ\81ιοÏ\87ή Ï\80Ï\81οÏ\82 Îµξαγωγή
       manually_select: Χειροκίνητη επιλογή διαφορετικής περιοχής
-      format_to_export: Î\9cοÏ\81Ï\86ή Ï\80Ï\81οÏ\82 Î\95ξαγωγή
+      format_to_export: Î\9cοÏ\81Ï\86ή Ï\80Ï\81οÏ\82 Îµξαγωγή
       osm_xml_data: Δεδομένα OpenStreetMap σε μορφή XML
-      map_image: Εικόνα Χάρτη (δείχνει τυπικό στρώμα)
+      map_image: Εικόνα χάρτη (δείχνει τυπικό στρώμα)
       embeddable_html: Ενσωματούμενη HTML
       licence: Άδεια
       export_details: Τα δεδομένα του OpenStreetMap είναι αδειοδοτημένα υπό την <a
@@ -377,6 +387,8 @@ el:
             OpenStreetMap
         overpass:
           title: Overpass API
+          description: Λήψη αυτού του πλαισίου οριοθέτησης από ένα καθρέφτη της βάσης
+            δεδομένων του OpenStreetMap
         geofabrik:
           title: Λήψεις Geofabrik
           description: Τακτικά-ενημερωμένες εξαγωγές ηπείρων, χωρών και επιλεγμένων
@@ -385,13 +397,13 @@ el:
           title: Εξαγωγές Metro
           description: Χάρτες για τις μεγάλες πόλεις του κόσμου και της γύρω περιοχές
         other:
-          title: Άλλες Πηγές
+          title: Άλλες πηγές
           description: Επιπλέον πηγές απαριθμούνται στο wiki του OpenStreetMap
       options: Επιλογές
       format: Μορφοποίηση
       scale: Κλίμακα
       max: μεγ
-      image_size: Î\9cέγεθοÏ\82 Î\95ικόνας
+      image_size: Î\9cέγεθοÏ\82 Îµικόνας
       zoom: Εστίαση
       add_marker: Προσθέστε ένα δείκτη στο χάρτη
       latitude: 'Γεω. Πλ:'
@@ -418,63 +430,68 @@ el:
       prefix_format: '%{name}'
       prefix:
         aerialway:
-          chair_lift: τελεφερίκ με καθίσματα
+          cable_car: Τελεφερίκ
+          chair_lift: Αναβατήρας με κάθισμα
+          drag_lift: Συρόμενος αναβατήρας
+          gondola: Τελεφερίκ-Γόνδολα
+          station: Σταθμός εναέριου δρόμου
         aeroway:
           aerodrome: Αεροδρόμιο
-          apron: Î§Ï\8eÏ\81οÏ\82 Î\95λιγμών
+          apron: Î§Ï\8eÏ\81οÏ\82 Îµλιγμών
           gate: Πύλη
           helipad: Ελικοδρόμιο
           runway: Διάδρομος
           taxiway: Τροχιόδρομος
-          terminal: Τερματικός Σταθμός
+          terminal: Τερματικός σταθμός
         amenity:
-          animal_shelter: Î\9aαÏ\84αÏ\86Ï\8dγιο Î\96ώων
-          arts_centre: Κέντρο Τεχνών
+          animal_shelter: Î\9aαÏ\84αÏ\86Ï\8dγιο Îώων
+          arts_centre: Κέντρο τεχνών
           atm: ΑΤΜ
           bank: Τράπεζα
           bar: Μπαρ
           bbq: Ψησταριά
           bench: Πάγκος
-          bicycle_parking: Στάθμευση Ποδηλάτων
-          bicycle_rental: Ενοικίαση Ποδηλάτων
-          biergarten: Î¥Ï\80αίθÏ\81ια Î\9cπυραρία
-          boat_rental: Ενοικίαση Σκαφών
-          brothel: Î\9fίκοÏ\82 Î\91νοχής
-          bureau_de_change: Ανταλλακτήριο Συναλλάγματος
-          bus_station: Î£Ï\84αθμÏ\8cÏ\82 Î\9bεωφορείου
+          bicycle_parking: Στάθμευση ποδηλάτων
+          bicycle_rental: Ενοικίαση ποδηλάτων
+          biergarten: Î¥Ï\80αίθÏ\81ια Î¼πυραρία
+          boat_rental: Ενοικίαση σκαφών
+          brothel: Î\9fίκοÏ\82 Î±νοχής
+          bureau_de_change: Ανταλλακτήριο συναλλάγματος
+          bus_station: Î£Ï\84αθμÏ\8cÏ\82 Î»εωφορείου
           cafe: Καφετέρια
-          car_rental: Î\95νοικίαÏ\83η Î\91Ï\85Ï\84οκινήÏ\84οÏ\85
-          car_sharing: Κοινή Χρήση Αυτοκινήτων
-          car_wash: Î Î»Ï\8dÏ\83ιμο Î\91υτοκινήτων
+          car_rental: Î\95νοικίαÏ\83η Î±Ï\85Ï\84οκινήÏ\84Ï\89ν
+          car_sharing: Κοινή χρήση αυτοκινήτων
+          car_wash: Î Î»Ï\8dÏ\83ιμο Î±υτοκινήτων
           casino: Καζίνο
           charging_station: Σταθμός Φόρτισης
+          childcare: Φροντίδα παιδιών
           cinema: Κινηματογράφος
           clinic: Κλινική
           clock: Ρολόι
           college: Κολέγιο
-          community_centre: Î\9aοινοÏ\84ικÏ\8c Î\9aέντρο
+          community_centre: Î\9aοινοÏ\84ικÏ\8c Îºέντρο
           courthouse: Δικαστήριο
           crematorium: Κρεματόριο
           dentist: Οδοντίατρος
           doctors: Ιατροί
           dormitory: Κοιτώνας
-          drinking_water: Î Ï\8cÏ\83ιμο Î\9dερό
-          driving_school: Î£Ï\87ολή Î\9fδηγών
+          drinking_water: Î Ï\8cÏ\83ιμο Î½ερό
+          driving_school: Î£Ï\87ολή Î¿δηγών
           embassy: Πρεσβεία
-          emergency_phone: Î¤Î·Î»Î­Ï\86Ï\89νο Î\88κÏ\84ακÏ\84ηÏ\82 Î\91νάγκης
+          emergency_phone: Î¤Î·Î»Î­Ï\86Ï\89νο Î­ÎºÏ\84ακÏ\84ηÏ\82 Î±νάγκης
           fast_food: Ταχυφαγείο
-          ferry_terminal: Σταθμός Πορθμείων
-          fire_hydrant: Κρουνός Πυροσβεστικής
-          fire_station: Πυροσβεστικός Σταθμός
-          food_court: Προαύλιο Φαγητού
+          ferry_terminal: Σταθμός πορθμείων
+          fire_hydrant: Κρουνός πυροσβεστικής
+          fire_station: Πυροσβεστικός σταθμός
+          food_court: Προαύλιο φαγητού
           fountain: Συντριβάνι
           fuel: Καύσιμα
           gambling: Τυχερά παιχνίδια
           grave_yard: Νεκροταφείο
           gym: Γυμναστήριο
-          health_centre: Κέντρο Υγείας
+          health_centre: Κέντρο υγείας
           hospital: Νοσοκομείο
-          hunting_stand: Î\9aÏ\85νηγηÏ\84ικÏ\8c Î\9aιόσκι
+          hunting_stand: Î\9aÏ\85νηγηÏ\84ικÏ\8c Îºιόσκι
           ice_cream: Παγωτό
           kindergarten: Νηπιαγωγείο
           library: Βιβλιοθήκη
@@ -482,23 +499,23 @@ el:
           marketplace: Αγορά
           monastery: Μοναστήρι
           motorcycle_parking: Χώρος στάθμευσης μοτοσικλετών
-          nightclub: Î\9dÏ\85Ï\87Ï\84εÏ\81ινÏ\8c Î\9aέντρο
-          nursery: Παιδικός Σταθμός
-          nursing_home: Î\9fίκοÏ